Webalizer ΠΈ Google Analytics ΠΌΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Π° Π΄Π° Π΄ΠΎΠ±ΠΈΡΠ°ΠΌ ΡΠ²ΠΈΠ΄ Π²ΠΎ ΠΎΠ½Π° ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π½Π° Π²Π΅Π±-Π»ΠΎΠΊΠ°ΡΠΈΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ. Π‘Π΅Π³Π° ΡΠ°Π·Π±ΠΈΡΠ°ΠΌ Π΄Π΅ΠΊΠ° ΡΠΈΠ΅ Π΄Π°Π²Π°Π°Ρ ΠΌΠ½ΠΎΠ³Ρ ΠΌΠ°Π»ΠΊΡ ΠΊΠΎΡΠΈΡΠ½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΠΌΠ°ΡΡΠΈ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π²Π°ΡΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° access.log, ΠΌΠ½ΠΎΠ³Ρ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π°Ρ ΡΠΎΡΠ΅ΠΌΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π°Π»Π°ΡΠΊΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ sqlite, html, ΡΠ°Π·ΠΈΠΊΠΎΡ sql ΠΈ ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ Π·Π° ΡΠΊΡΠΈΠΏΡΠΈΡΠ°ΡΠ΅.
ΠΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° Webalizer Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° access.log Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ. ΠΠ°ΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄Π°Π°Ρ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΡΠΈΠΏΠΊΠΈ ΠΈ Π±ΡΠΎΡΠΊΠΈ ΠΎΠ΄ ΠΊΠΎΠΈ Π΅ ΡΠ°ΡΠ΅Π½ ΡΠ°ΠΌΠΎ Π²ΠΊΡΠΏΠ½ΠΈΠΎΡ ΠΎΠ±Π΅ΠΌ Π½Π° ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ:
ΠΠ»Π°ΡΠΊΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ Google Analytics ΡΠ°ΠΌΠΈΡΠ΅ ΡΠΎΠ±ΠΈΡΠ°Π°Ρ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ Π²ΡΠΈΡΠ°Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°. Π’ΠΈΠ΅ Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π°Π°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄ΠΈΡΠ°Π³ΡΠ°ΠΌΠΈ ΠΈ Π»ΠΈΠ½ΠΈΠΈ, Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΊΠΎΠΈ ΡΠ΅ΡΡΠΎ Π΅ ΡΠ΅ΡΠΊΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΠ°Ρ ΡΠΎΡΠ½ΠΈ Π·Π°ΠΊΠ»ΡΡΠΎΡΠΈ. ΠΠΎΠΆΠ΅Π±ΠΈ ΡΡΠ΅Π±Π°ΡΠ΅ Π΄Π° ΡΠ΅ Π²Π»ΠΎΠΆΠ°Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π°ΠΏΠΎΡΠΈ? ΠΠ΅ Π·Π½Π°ΠΌ.
ΠΠ½Π°ΡΠΈ, ΡΡΠΎ ΡΠ°ΠΊΠ°Π² Π΄Π° Π²ΠΈΠ΄Π°ΠΌ Π²ΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°?
ΠΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΈ Π±ΠΎΡ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ
Π§Π΅ΡΡΠΎΠΏΠ°ΡΠΈ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°ΡΠΎΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΈ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΠΊΠΎΠ»ΠΊΡ ΠΊΠΎΡΠΈΡΠ΅Π½ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π°ΠΊΠ°:
SQL Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ°Ρ
SELECT
1 as 'StackedArea: Traffic generated by Users and Bots',
strftime('%d.%m', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Day',
SUM(CASE WHEN USG.AGENT_BOT!='n.a.' THEN FCT.BYTES ELSE 0 END)/1000 AS 'Bots, KB',
SUM(CASE WHEN USG.AGENT_BOT='n.a.' THEN FCT.BYTES ELSE 0 END)/1000 AS 'Users, KB'
FROM
FCT_ACCESS_USER_AGENT_DD FCT,
DIM_USER_AGENT USG
WHERE FCT.DIM_USER_AGENT_ID=USG.DIM_USER_AGENT_ID
AND datetime(FCT.EVENT_DT, 'unixepoch') >= date('now', '-14 day')
GROUP BY strftime('%d.%m', datetime(FCT.EVENT_DT, 'unixepoch'))
ORDER BY FCT.EVENT_DT
ΠΡΠ°ΡΠΈΠΊΠΎΠ½ΠΎΡ ΡΠ° ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° ΠΏΠΎΡΡΠΎΡΠ°Π½Π°ΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡ Π½Π° Π±ΠΎΡΠΎΠ²ΠΈ. ΠΠΈ Π±ΠΈΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΄Π΅ΡΠ°Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΡΠ°Ρ Π½Π°ΡΠ°ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π½ΠΈΡΠΈ.
ΠΠΎΡΠ°Π΄Π½ΠΈ Π±ΠΎΡΠΎΠ²ΠΈ
ΠΠΈΠ΅ Π³ΠΈ ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ Π±ΠΎΡΠΎΠ²ΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ Π°Π³Π΅Π½ΡΠΈ. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠΈΡΠΊΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° Π΄Π½Π΅Π²Π½ΠΈΠΎΡ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ, Π±ΡΠΎΡΠΎΡ Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΈ ΠΈ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΈ Π±Π°ΡΠ°ΡΠ° Π΄Π°Π²Π°Π°Ρ Π΄ΠΎΠ±ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π·Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠ° Π½Π° Π±ΠΎΡΠΎΡ.
SQL Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ°Ρ
SELECT
1 AS 'Table: Annoying Bots',
MAX(USG.AGENT_BOT) AS 'Bot',
ROUND(SUM(FCT.BYTES)/1000 / 14.0, 1) AS 'KB per Day',
ROUND(SUM(FCT.IP_CNT) / 14.0, 1) AS 'IPs per Day',
ROUND(SUM(CASE WHEN STS.STATUS_GROUP IN ('Client Error', 'Server Error') THEN FCT.REQUEST_CNT / 14.0 ELSE 0 END), 1) AS 'Error Requests per Day',
ROUND(SUM(CASE WHEN STS.STATUS_GROUP IN ('Successful', 'Redirection') THEN FCT.REQUEST_CNT / 14.0 ELSE 0 END), 1) AS 'Success Requests per Day',
USG.USER_AGENT_NK AS 'Agent'
FROM FCT_ACCESS_USER_AGENT_DD FCT,
DIM_USER_AGENT USG,
DIM_HTTP_STATUS STS
WHERE FCT.DIM_USER_AGENT_ID = USG.DIM_USER_AGENT_ID
AND FCT.DIM_HTTP_STATUS_ID = STS.DIM_HTTP_STATUS_ID
AND USG.AGENT_BOT != 'n.a.'
AND datetime(FCT.EVENT_DT, 'unixepoch') >= date('now', '-14 day')
GROUP BY USG.USER_AGENT_NK
ORDER BY 3 DESC
LIMIT 10
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΎΠ΄ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠ° Π±Π΅ΡΠ΅ ΠΎΠ΄Π»ΡΠΊΠ°ΡΠ° Π΄Π° ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈ ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ Π΄ΠΎ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΡΠΎ Π½Π΅ΡΠ·ΠΈΠ½ΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° robots.txt
User-agent: AhrefsBot
Disallow: /
User-agent: dotbot
Disallow: /
User-agent: bingbot
Crawl-delay: 5
ΠΡΠ²ΠΈΡΠ΅ Π΄Π²Π° Π±ΠΎΡΠ° ΠΈΡΡΠ΅Π·Π½Π°Π° ΠΎΠ΄ ΡΠ°Π±Π΅Π»Π°ΡΠ°, Π° ΡΠΎΠ±ΠΎΡΠΈΡΠ΅ MS ΡΠ΅ ΠΏΡΠ΅ΡΠ΅Π»ΠΈΡΠ° Π½Π°Π΄ΠΎΠ»Ρ ΠΎΠ΄ ΠΏΡΠ²ΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²ΠΈ.
ΠΠ΅Π½ ΠΈ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½Π°ΡΠ³ΠΎΠ»Π΅ΠΌΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡ
ΠΠΎ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°ΡΠΎΡ ΡΠ΅ Π²ΠΈΠ΄Π»ΠΈΠ²ΠΈ ΠΏΠΎΠ΄Π΅ΠΌΠΈ. ΠΠ° Π΄Π΅ΡΠ°Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΡΠ°Ρ, Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΈΡΡΠ°ΠΊΠ½Π΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° Π½ΠΈΠ²Π½ΠΎΡΠΎ ΠΏΠΎΡΠ°Π²ΡΠ²Π°ΡΠ΅, Π° Π½Π΅ Π΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Ρ ΡΠΈΡΠ΅ ΡΠ°ΡΠΎΠ²ΠΈ ΠΈ Π΄Π΅Π½ΠΎΠ²ΠΈ Π½Π° ΠΌΠ΅ΡΠ΅ΡΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ. ΠΠ²Π° ΡΠ΅ Π³ΠΎ ΠΎΠ»Π΅ΡΠ½ΠΈ Π½Π°ΠΎΡΠ°ΡΠ΅ΡΠΎ ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½ΠΈ Π±Π°ΡΠ°ΡΠ° Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ° Π΄ΠΎΠΊΠΎΠ»ΠΊΡ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½Π° Π΄Π΅ΡΠ°Π»Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°.
SQL Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ°Ρ
SELECT
1 AS 'Line: Day and Hour of Hits from Users and Bots',
strftime('%d.%m-%H', datetime(EVENT_DT, 'unixepoch')) AS 'Date Time',
HIB AS 'Bots, Hits',
HIU AS 'Users, Hits'
FROM (
SELECT
EVENT_DT,
SUM(CASE WHEN AGENT_BOT!='n.a.' THEN LINE_CNT ELSE 0 END) AS HIB,
SUM(CASE WHEN AGENT_BOT='n.a.' THEN LINE_CNT ELSE 0 END) AS HIU
FROM FCT_ACCESS_REQUEST_REF_HH
WHERE datetime(EVENT_DT, 'unixepoch') >= date('now', '-14 day')
GROUP BY EVENT_DT
ORDER BY SUM(LINE_CNT) DESC
LIMIT 10
) ORDER BY EVENT_DT
ΠΠΈ Π½Π°Π±ΡΡΠ΄ΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠ°ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ ΡΠ°ΡΠΎΠ²ΠΈ 11, 14 ΠΈ 20 ΠΎΠ΄ ΠΏΡΠ²ΠΈΠΎΡ Π΄Π΅Π½ Π½Π° ΡΠ°Π±Π΅Π»Π°ΡΠ°. ΠΠΎ, ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ Π΄Π΅Π½ Π²ΠΎ 13:XNUMX ΡΠ°ΡΠΎΡ Π±Π΅Π° Π°ΠΊΡΠΈΠ²Π½ΠΈ Π±ΠΎΡΠΎΠ²ΠΈ.
ΠΡΠΎΡΠ΅ΡΠ½Π° Π΄Π½Π΅Π²Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡ ΠΏΠΎ Π½Π΅Π΄Π΅Π»Π°
ΠΠ°Π»ΠΊΡ Π³ΠΈ ΡΡΠ΅Π΄ΠΈΠΌΠ΅ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡ ΠΈ ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ. Π‘Π»Π΅Π΄Π½ΠΎΡΠΎ ΠΏΡΠ°ΡΠ°ΡΠ΅ Π±Π΅ΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠ° Π½Π° ΡΠ°ΠΌΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ. ΠΠ° ΡΠ°ΠΊΠ²Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°, ΠΏΠΎΠΆΠ΅Π»Π½ΠΈ ΡΠ΅ Π΄ΠΎΠ»Π³ΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈ Π½Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ°, ΠΊΠ°ΠΊΠΎ Π΅Π΄Π½Π° Π½Π΅Π΄Π΅Π»Π°.
SQL Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ°Ρ
SELECT
1 as 'Line: Average Daily User Activity by Week',
strftime('%W week', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Week',
ROUND(1.0*SUM(FCT.PAGE_CNT)/SUM(FCT.IP_CNT),1) AS 'Pages per IP per Day',
ROUND(1.0*SUM(FCT.FILE_CNT)/SUM(FCT.IP_CNT),1) AS 'Files per IP per Day'
FROM
FCT_ACCESS_USER_AGENT_DD FCT,
DIM_USER_AGENT USG,
DIM_HTTP_STATUS HST
WHERE FCT.DIM_USER_AGENT_ID=USG.DIM_USER_AGENT_ID
AND FCT.DIM_HTTP_STATUS_ID = HST.DIM_HTTP_STATUS_ID
AND USG.AGENT_BOT='n.a.' /* users only */
AND HST.STATUS_GROUP IN ('Successful') /* good pages */
AND datetime(FCT.EVENT_DT, 'unixepoch') > date('now', '-3 month')
GROUP BY strftime('%W week', datetime(FCT.EVENT_DT, 'unixepoch'))
ORDER BY FCT.EVENT_DT
ΠΠ΅Π΄Π΅Π»Π½ΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π°Π°Ρ Π΄Π΅ΠΊΠ° Π²ΠΎ ΠΏΡΠΎΡΠ΅ΠΊ Π΅Π΄Π΅Π½ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΠΎΡΠ²ΠΎΡΠ° 1,6 ΡΡΡΠ°Π½ΠΈΡΠΈ Π΄Π½Π΅Π²Π½ΠΎ. ΠΡΠΎΡΠΎΡ Π½Π° Π±Π°ΡΠ°Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΏΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°.
Π‘ΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° ΠΈ Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΡΡΠ°ΡΡΡΠΈ
Webalizer ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π°ΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠ°ΠΊΠ°Π² Π΄Π° Π³ΠΎ Π²ΠΈΠ΄Π°ΠΌ ΡΠ°ΠΌΠΎ Π±ΡΠΎΡΠΎΡ Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΈ Π±Π°ΡΠ°ΡΠ° ΠΈ Π³ΡΠ΅ΡΠΊΠΈ.
SQL Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ°Ρ
SELECT
1 as 'Line: All Requests by Status',
strftime('%d.%m', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Day',
SUM(CASE WHEN STS.STATUS_GROUP='Successful' THEN FCT.REQUEST_CNT ELSE 0 END) AS 'Success',
SUM(CASE WHEN STS.STATUS_GROUP='Redirection' THEN FCT.REQUEST_CNT ELSE 0 END) AS 'Redirect',
SUM(CASE WHEN STS.STATUS_GROUP='Client Error' THEN FCT.REQUEST_CNT ELSE 0 END) AS 'Customer Error',
SUM(CASE WHEN STS.STATUS_GROUP='Server Error' THEN FCT.REQUEST_CNT ELSE 0 END) AS 'Server Error'
FROM
FCT_ACCESS_USER_AGENT_DD FCT,
DIM_HTTP_STATUS STS
WHERE FCT.DIM_HTTP_STATUS_ID=STS.DIM_HTTP_STATUS_ID
AND datetime(FCT.EVENT_DT, 'unixepoch') >= date('now', '-14 day')
GROUP BY strftime('%d.%m', datetime(FCT.EVENT_DT, 'unixepoch'))
ORDER BY FCT.EVENT_DT
ΠΠ·Π²Π΅ΡΡΠ°ΡΠΎΡ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° Π±Π°ΡΠ°ΡΠ°, Π° Π½Π΅ ΠΊΠ»ΠΈΠΊΠΎΠ²ΠΈ (ΠΏΠΎΠ³ΠΎΠ΄ΠΎΡΠΈ), Π·Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΠ΄ LINE_CNT, ΠΌΠ΅ΡΡΠΈΠΊΠ°ΡΠ° REQUEST_CNT ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π° ΠΊΠ°ΠΊΠΎ COUNT(DISTINCT STG.REQUEST_NK). Π¦Π΅Π»ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Ρ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ Π½Π°ΡΡΠ°Π½ΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, MS Π±ΠΎΡΠΎΠ²ΠΈ ΡΠ° Π°Π½ΠΊΠ΅ΡΠΈΡΠ°Π°Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° robots.txt ΡΡΠΎΡΠΈΡΠΈ ΠΏΠ°ΡΠΈ Π½Π° Π΄Π΅Π½ ΠΈ, Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠ°ΠΊΠ²ΠΈΡΠ΅ Π°Π½ΠΊΠ΅ΡΠΈ ΡΠ΅ ΡΠ΅ Π±ΡΠΎΡΠ°Ρ Π΅Π΄Π½Π°Ρ. ΠΠ²Π° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π³ΠΈ ΠΈΠ·ΠΌΠ°Π·Π½ΠΈΡΠ΅ ΡΠΊΠΎΠΊΠΎΠ²ΠΈΡΠ΅ Π²ΠΎ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΎΡ.
ΠΠ΄ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΎΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π³ΡΠ΅ΡΠΊΠΈ - ΡΠΎΠ° ΡΠ΅ Π½Π΅ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ. Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΎΠ΄ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠ° Π±Π΅ΡΠ΅ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ Π½Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΡΠ²Π°ΡΠ° ΠΎΠ΄ ΠΎΠ΄Π΄Π°Π»Π΅ΡΠ΅Π½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ.
ΠΠΎΡΠΈ Π±Π°ΡΠ°ΡΠ°
ΠΠ° Π΄Π΅ΡΠ°Π»Π½ΠΎ Π΄Π° Π³ΠΈ ΠΈΡΠΏΠΈΡΠ°ΡΠ΅ Π±Π°ΡΠ°ΡΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΠΊΠ°ΠΆΠ΅ΡΠ΅ Π΄Π΅ΡΠ°Π»Π½Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°.
SQL Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ°Ρ
SELECT
1 AS 'Table: Top Error Requests',
REQ.REQUEST_NK AS 'Request',
'Error' AS 'Request Status',
ROUND(SUM(FCT.LINE_CNT) / 14.0, 1) AS 'Hits per Day',
ROUND(SUM(FCT.IP_CNT) / 14.0, 1) AS 'IPs per Day',
ROUND(SUM(FCT.BYTES)/1000 / 14.0, 1) AS 'KB per Day'
FROM
FCT_ACCESS_REQUEST_REF_HH FCT,
DIM_REQUEST_V_ACT REQ
WHERE FCT.DIM_REQUEST_ID = REQ.DIM_REQUEST_ID
AND FCT.STATUS_GROUP IN ('Client Error', 'Server Error')
AND datetime(FCT.EVENT_DT, 'unixepoch') >= date('now', '-14 day')
GROUP BY REQ.REQUEST_NK
ORDER BY 4 DESC
LIMIT 20
ΠΠ²Π°Π° Π»ΠΈΡΡΠ° ΡΠ΅ Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠΈ ΠΈ ΡΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π±Π°ΡΠ°ΡΠ΅ Π΄ΠΎ /wp-login.php Π‘ΠΎ ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΏΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π±Π°ΡΠ°ΡΠ° ΠΎΠ΄ ΡΠ΅ΡΠ²Π΅ΡΠΎΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅Π°ΠΊΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Π½Π° ΡΠ°ΠΊΠ²ΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° ΠΈ Π΄Π° Π³ΠΈ ΠΈΡΠΏΡΠ°ΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠ½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°.
ΠΠ½Π°ΡΠΈ, Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ°ΠΈ Π·Π°ΡΠ½ΠΎΠ²Π°Π½ΠΈ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Π΄Π°Π²Π°Π°Ρ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΡΠ΅Π»ΠΎΡΠ½Π° ΡΠ»ΠΈΠΊΠ° Π·Π° ΡΠΎΠ° ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°.
ΠΠ°ΠΊΠΎ Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ?
ΠΠΎΠ²ΠΎΠ»Π½Π° Π΅ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ sqlite. ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΠ°Π±Π΅Π»ΠΈ: ΠΏΠΎΠΌΠΎΡΠ½ΠΈ Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ° Π½Π° ETL ΠΏΡΠΎΡΠ΅ΡΠΈ.
Π€Π°Π·Π° Π½Π° ΡΠ°Π±Π΅Π»Π° ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠ΅ ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π·Π° Π΄Π½Π΅Π²Π½ΠΈΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ PHP. ΠΠ²Π΅ Π·Π±ΠΈΡΠ½ΠΈ ΡΠ°Π±Π΅Π»ΠΈ. ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π΄Π½Π΅Π²Π½Π° ΡΠ°Π±Π΅Π»Π° ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ Π°Π³Π΅Π½ΡΠΈ ΠΈ ΡΡΠ°ΡΡΡΠΈ Π½Π° Π±Π°ΡΠ°ΡΠ°. ΠΠ° ΡΠ°Ρ ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π·Π° Π±Π°ΡΠ°ΡΠ°, ΡΡΠ°ΡΡΡΠ½ΠΈ Π³ΡΡΠΏΠΈ ΠΈ Π°Π³Π΅Π½ΡΠΈ. Π§Π΅ΡΠΈΡΠΈ ΡΠ°Π±Π΅Π»ΠΈ ΡΠΎ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΠΈ ΠΌΠ΅ΡΠ΅ΡΠ°.
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ Π΅ ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ ΡΠ΅Π»Π°ΡΠΈΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»:
ΠΠΎΠ΄Π΅Π» Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ
Π‘ΠΊΡΠΈΠΏΡΠ° Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ sqlite:
ΠΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π° DDL ΠΎΠ±ΡΠ΅ΠΊΡ
DROP TABLE IF EXISTS DIM_USER_AGENT;
CREATE TABLE DIM_USER_AGENT (
DIM_USER_AGENT_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
USER_AGENT_NK TEXT NOT NULL DEFAULT 'n.a.',
AGENT_OS TEXT NOT NULL DEFAULT 'n.a.',
AGENT_ENGINE TEXT NOT NULL DEFAULT 'n.a.',
AGENT_DEVICE TEXT NOT NULL DEFAULT 'n.a.',
AGENT_BOT TEXT NOT NULL DEFAULT 'n.a.',
UPDATE_DT INTEGER NOT NULL DEFAULT 0,
UNIQUE (USER_AGENT_NK)
);
INSERT INTO DIM_USER_AGENT (DIM_USER_AGENT_ID) VALUES (-1);
Π€Π°Π·Π°
ΠΠΎ ΡΠ»ΡΡΠ°ΡΠΎΡ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° access.log, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°Π°Ρ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π°Ρ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π°Ρ ΡΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈΠ»ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ°Π·ΠΈΠΊ Π·Π° ΡΠΊΡΠΈΠΏΡΠΈΡΠ°ΡΠ΅ ΠΈΠ»ΠΈ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π°Π»Π°ΡΠΊΠΈ sqlite.
Π€ΠΎΡΠΌΠ°Ρ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°:
//67.221.59.195 - - [28/Dec/2012:01:47:47 +0100] "GET /files/default.css HTTP/1.1" 200 1512 "https://project.edu/" "Mozilla/4.0"
//host ident auth time method request_nk protocol status bytes ref browser
$log_pattern = '/^([^ ]+) ([^ ]+) ([^ ]+) ([[^]]+]) "(.*) (.*) (.*)" ([0-9-]+) ([0-9-]+) "(.*)" "(.*)"$/';
Π Π°Π·ΠΌΠ½ΠΎΠΆΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠ»ΡΡΠΎΡ
ΠΠΎΠ³Π° Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ΅ Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΈ ΡΡΠΎ Π³ΠΈ Π½Π΅ΠΌΠ° Π²ΠΎ ΡΠ°Π±Π΅Π»ΠΈΡΠ΅ Π·Π° ΠΌΠ΅ΡΠ΅ΡΠ΅. Π’ΠΎΠ³Π°Ρ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ° Π·Π° ΠΌΠ΅ΡΠ΅ΡΠ°ΡΠ°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° DIM_REFERRER, ΠΊΠ»ΡΡΠΎΡ Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΠ° ΠΎΠ΄ ΡΡΠΈ ΠΏΠΎΠ»ΠΈΡΠ°.
ΠΠ°ΡΠ°ΡΠ΅ Π·Π° ΡΠΈΡΠ΅ΡΠ΅ Π½Π° ΠΊΠ»ΡΡΠΎΡ SQL
/* Propagate the referrer from access log */
INSERT INTO DIM_REFERRER (HOST_NK, PATH_NK, QUERY_NK, UPDATE_DT)
SELECT
CLS.HOST_NK,
CLS.PATH_NK,
CLS.QUERY_NK,
STRFTIME('%s','now') AS UPDATE_DT
FROM (
SELECT DISTINCT
REFERRER_HOST AS HOST_NK,
REFERRER_PATH AS PATH_NK,
CASE WHEN INSTR(REFERRER_QUERY,'&sid')>0 THEN SUBSTR(REFERRER_QUERY, 1, INSTR(REFERRER_QUERY,'&sid')-1) /* ΠΎΡΡΠ΅Π·Π°Π΅ΠΌ sid - ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ° ΡΠΌΡ */
ELSE REFERRER_QUERY END AS QUERY_NK
FROM STG_ACCESS_LOG
) CLS
LEFT OUTER JOIN DIM_REFERRER TRG
ON (CLS.HOST_NK = TRG.HOST_NK AND CLS.PATH_NK = TRG.PATH_NK AND CLS.QUERY_NK = TRG.QUERY_NK)
WHERE TRG.DIM_REFERRER_ID IS NULL
ΠΡΠΎΠΏΠ°Π³ΠΈΡΠ°ΡΠ΅ΡΠΎ Π²ΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° ΡΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ Π°Π³Π΅Π½ΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠΎΠ΄ΡΠΆΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° Π±ΠΎΡ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΡ sql:
CASE
WHEN INSTR(LOWER(CLS.BROWSER),'yandex.com')>0
THEN 'yandex'
WHEN INSTR(LOWER(CLS.BROWSER),'googlebot')>0
THEN 'google'
WHEN INSTR(LOWER(CLS.BROWSER),'bingbot')>0
THEN 'microsoft'
WHEN INSTR(LOWER(CLS.BROWSER),'ahrefsbot')>0
THEN 'ahrefs'
WHEN INSTR(LOWER(CLS.BROWSER),'mj12bot')>0
THEN 'majestic-12'
WHEN INSTR(LOWER(CLS.BROWSER),'compatible')>0 OR INSTR(LOWER(CLS.BROWSER),'http')>0
OR INSTR(LOWER(CLS.BROWSER),'libwww')>0 OR INSTR(LOWER(CLS.BROWSER),'spider')>0
OR INSTR(LOWER(CLS.BROWSER),'java')>0 OR INSTR(LOWER(CLS.BROWSER),'python')>0
OR INSTR(LOWER(CLS.BROWSER),'robot')>0 OR INSTR(LOWER(CLS.BROWSER),'curl')>0
OR INSTR(LOWER(CLS.BROWSER),'wget')>0
THEN 'other'
ELSE 'n.a.' END AS AGENT_BOT
ΠΠ±ΠΈΡΠ½ΠΈ ΡΠ°Π±Π΅Π»ΠΈ
ΠΠ° ΠΊΡΠ°ΡΠΎΡ, ΡΠ΅ Π³ΠΈ Π²ΡΠΈΡΠ°ΠΌΠ΅ Π·Π±ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°Π±Π΅Π»ΠΈ; Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π½Π΅Π²Π½Π°ΡΠ° ΡΠ°Π±Π΅Π»Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΡΠΈΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΠΎΠ² Π½Π°ΡΠΈΠ½:
SQL Π±Π°ΡΠ°ΡΠ΅ Π·Π° Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° Π°Π³ΡΠ΅Π³Π°Ρ
/* Load fact from access log */
INSERT INTO FCT_ACCESS_USER_AGENT_DD (EVENT_DT, DIM_USER_AGENT_ID, DIM_HTTP_STATUS_ID, PAGE_CNT, FILE_CNT, REQUEST_CNT, LINE_CNT, IP_CNT, BYTES)
WITH STG AS (
SELECT
STRFTIME( '%s', SUBSTR(TIME_NK,9,4) || '-' ||
CASE SUBSTR(TIME_NK,5,3)
WHEN 'Jan' THEN '01' WHEN 'Feb' THEN '02' WHEN 'Mar' THEN '03' WHEN 'Apr' THEN '04' WHEN 'May' THEN '05' WHEN 'Jun' THEN '06'
WHEN 'Jul' THEN '07' WHEN 'Aug' THEN '08' WHEN 'Sep' THEN '09' WHEN 'Oct' THEN '10' WHEN 'Nov' THEN '11'
ELSE '12' END || '-' || SUBSTR(TIME_NK,2,2) || ' 00:00:00' ) AS EVENT_DT,
BROWSER AS USER_AGENT_NK,
REQUEST_NK,
IP_NR,
STATUS,
LINE_NK,
BYTES
FROM STG_ACCESS_LOG
)
SELECT
CAST(STG.EVENT_DT AS INTEGER) AS EVENT_DT,
USG.DIM_USER_AGENT_ID,
HST.DIM_HTTP_STATUS_ID,
COUNT(DISTINCT (CASE WHEN INSTR(STG.REQUEST_NK,'.')=0 THEN STG.REQUEST_NK END) ) AS PAGE_CNT,
COUNT(DISTINCT (CASE WHEN INSTR(STG.REQUEST_NK,'.')>0 THEN STG.REQUEST_NK END) ) AS FILE_CNT,
COUNT(DISTINCT STG.REQUEST_NK) AS REQUEST_CNT,
COUNT(DISTINCT STG.LINE_NK) AS LINE_CNT,
COUNT(DISTINCT STG.IP_NR) AS IP_CNT,
SUM(BYTES) AS BYTES
FROM STG,
DIM_HTTP_STATUS HST,
DIM_USER_AGENT USG
WHERE STG.STATUS = HST.STATUS_NK
AND STG.USER_AGENT_NK = USG.USER_AGENT_NK
AND CAST(STG.EVENT_DT AS INTEGER) > $param_epoch_from /* load epoch date */
AND CAST(STG.EVENT_DT AS INTEGER) < strftime('%s', date('now', 'start of day'))
GROUP BY STG.EVENT_DT, HST.DIM_HTTP_STATUS_ID, USG.DIM_USER_AGENT_ID
ΠΠ°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ sqlite Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΏΡΠ°ΡΠ°ΡΠ°. WITH ΡΠΎΠ΄ΡΠΆΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΈ. ΠΠ»Π°Π²Π½ΠΎΡΠΎ Π±Π°ΡΠ°ΡΠ΅ Π³ΠΈ ΡΠΎΠ±ΠΈΡΠ° ΡΠΈΡΠ΅ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈ Π·Π° Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΠΈΡΠ΅.
Π£ΡΠ»ΠΎΠ²ΠΎΡ Π½Π΅ΠΌΠ° Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΈΡΡΠΎΡΠΈΡΠ°ΡΠ°: CAST(STG.EVENT_DT AS INTEGER) > $param_epoch_from, ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°ΡΠΎΡ Π΅ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° Π±Π°ΡΠ°ΡΠ΅ΡΠΎ
βΠΠΠΠΠ ΠΠ’Π Π‘ΠΠΠ£ΠΠΠΠ (MAX(EVENT_DT), β3600β) ΠΠΠΠ ΠΠΠ‘ΠΠΠΠΠ_EVENT_EPOCH ΠΠ FCT_ACCESS_USER_AGENT_DDβ
Π£ΡΠ»ΠΎΠ²ΠΎΡ ΡΠ΅ ΡΠ΅ Π²ΡΠΈΡΠ° ΡΠ°ΠΌΠΎ ΡΠ΅Π» Π΄Π΅Π½: CAST(STG.EVENT_DT ΠΠΠΠ ΠΠΠΠΠ£ ΠΠΠΠΠ£) < strftime('%s', Π΄Π°ΡΡΠΌ ('ΡΠ΅Π³Π°', 'ΠΏΠΎΡΠ΅ΡΠΎΠΊ Π½Π° Π΄Π΅Π½ΠΎΡ'))
ΠΡΠΎΠ΅ΡΠ΅ΡΠΎ ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈΠ»ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠ΅ Π²ΡΡΠΈ Π½Π° ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π΅Π½ Π½Π°ΡΠΈΠ½, ΡΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΎΡΠΊΠ°.
ΠΠ·Π²Π΅ΡΡΠ°ΠΈ
ΠΠΎ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ°, ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π΅ ΠΌΠ΅ΡΠ°-ΠΌΠΎΠ΄Π΅Π» Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π΄ΠΈΠ½Π°ΠΌΠΈΡΠΊΠΈ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π° ΡΠΎ ΡΠΈΠ»ΡΡΠΈ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅. ΠΠ° ΠΊΡΠ°ΡΠΎΡ Π½Π° ΠΊΡΠ°ΠΈΡΡΠ°ΡΠ°, ΡΠΈΡΠ΅ ΠΏΡΠΈΡΡΠΎΡΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π°Ρ SQL Π±Π°ΡΠ°ΡΠ΅.
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ SQL Π±Π°ΡΠ°ΡΠ° ΠΈ ΡΠ΅ Π³ΠΈ Π·Π°ΡΡΠ²Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΠΏΡΠ΅Π³Π»Π΅Π΄ΠΈ Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ - ΡΠΎΠ° ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ°ΠΈ.
ΠΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ°
ΠΠ»Π΅Ρ: ΠΡΠ΅ΠΊΡΠ°ΡΠ½ΠΈ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΈ Π²ΠΎ JavaScript Π±Π΅Π° ΠΊΠΎΡΠΈΡΡΠ΅Π½ΠΈ ΠΊΠ°ΠΊΠΎ Π°Π»Π°ΡΠΊΠ° Π·Π° Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ°
ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π°, Π±Π΅ΡΠ΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠΌΠΈΠ½Π°Ρ ΡΠΈΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ°ΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° PHP ΠΈ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° html-Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ ΡΠ°Π±Π΅Π»ΠΈ.
$sqls = array(
'SELECT * FROM RPT_ACCESS_USER_VS_BOT',
'SELECT * FROM RPT_ACCESS_ANNOYING_BOT',
'SELECT * FROM RPT_ACCESS_TOP_HOUR_HIT',
'SELECT * FROM RPT_ACCESS_USER_ACTIVE',
'SELECT * FROM RPT_ACCESS_REQUEST_STATUS',
'SELECT * FROM RPT_ACCESS_TOP_REQUEST_PAGE',
'SELECT * FROM RPT_ACCESS_TOP_REQUEST_REFERRER',
'SELECT * FROM RPT_ACCESS_NEW_REQUEST',
'SELECT * FROM RPT_ACCESS_TOP_REQUEST_SUCCESS',
'SELECT * FROM RPT_ACCESS_TOP_REQUEST_ERROR'
);
ΠΠ»Π°ΡΠΊΠ°ΡΠ° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·ΠΈΡΠ° ΡΠ°Π±Π΅Π»ΠΈ ΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ.
ΠΠ·Π»Π΅Π·
ΠΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° Π²Π΅Π±-Π°Π½Π°Π»ΠΈΠ·Π°ΡΠ° ΠΊΠ°ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΏΠΈΡΠΎΡ Π³ΠΈ ΠΎΠΏΠΈΡΡΠ²Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈΡΠ΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°Π΄Π±Π° Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ°ΠΊΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅, Π½Π°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΡΠ΅ Π°Π»Π°ΡΠΊΠΈ ΡΠ΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ Π·Π° Π΄Π»Π°Π±ΠΎΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅.
ΠΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΎΠ²Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ ΠΊΠ°ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΊΠ²ΠΈ ΡΡΡΡΠΊΡΡΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΏΠΎΠ»Π΅ΠΊΠ° ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ Π½Π° Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΠΈΡΠ΅, ΠΌΠ΅ΡΠ°ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅, Π½ΠΈΠ²ΠΎΠ°ΡΠ° Π½Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ° ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΎΠ΄ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΈΠ·Π²ΠΎΡΠΈ.
ΠΡΡΠΎ ΡΠ°ΠΊΠ°, Π°ΡΠ΄Π΅ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π°ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π°ΡΠ° Π°Π»Π°ΡΠΊΠ° Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π½Π° ETL Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π΅Π΄Π½Π° ΡΠ°Π±Π΅Π»Π°.
ΠΠ° ΡΠ΅ ββΠ²ΡΠ°ΡΠΈΠΌΠ΅ Π½Π° ΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΌΠ΅ΡΠ΅ΡΠ΅ Π½Π° ΠΊΠ²Π°Π»ΠΈΡΠ΅ΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Ρ.
ΠΠ΅ Π³ΠΈ ΠΏΡΠΎΡΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π½Π° ΡΠ΅Ρ
Π½ΠΈΡΠΊΠ°ΡΠ° ΡΡΠ΅Π΄ΠΈΠ½Π° ΠΈ ΠΎΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π·Π° ΡΡΠΎ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ΡΠ²Π΅Ρ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Raspberry Pi.
ΠΠ·Π²ΠΎΡ: www.habr.com