Π£ΡΠΈΠ»ΠΈΡΠ° 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 ΡΠ°ΡΠΎΠ² Π°ΠΊΡΠΈΠ²Π½ΠΈΡΠ°Π»ΠΈ Π±ΠΎΡΡ.
Π‘ΡΠ΅Π΄Π½ΡΡ Π΄Π½Π΅Π²Π½Π°Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΏΠΎ Π½Π΅Π΄Π΅Π»ΡΠΌ
Π‘ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΡ ΠΈ ΡΡΠ°ΡΠΈΠΊΠΎΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ. Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ Π²ΠΎΠΏΡΠΎΡΠΎΠΌ Π±ΡΠ»Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΡΠ°ΠΌΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠ»Ρ ΡΠ°ΠΊΠΎΠΉ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½Ρ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΏΠ΅ΡΠΈΠΎΠ΄Ρ Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅Π΄Π΅Π»Ρ.
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, Π³Π΄Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ°
‘SELECT COALESCE(MAX(EVENT_DT), ‘3600’) AS LAST_EVENT_EPOCH FROM FCT_ACCESS_USER_AGENT_DD’
Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ Π·Π°Π³ΡΡΠ·ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π½ΡΠΉ Π΄Π΅Π½Ρ: CAST(STG.EVENT_DT AS INTEGER) < strftime(‘%s’, date(‘now’, ‘start of day’))
ΠΠΎΠ΄ΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΡΠΎΡΠΊΠΈ.
ΠΡΡΡΡΡ
Π ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠ΅ΡΠ°-ΠΌΠΎΠ΄Π΅Π»Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΈΠ»ΡΡΡΠ°ΠΌΠΈ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ. Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΡΡΠ΅, Π²ΡΠ΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡ SQL Π·Π°ΠΏΡΠΎΡ.
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠ΅ SQL Π·Π°ΠΏΡΠΎΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΠΌ ΠΈΡ Π² Π²ΠΈΠ΄Π΅ Π²ΡΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ β ΡΡΠΎ ΠΈ Π΅ΡΡΡ ΠΎΡΡΡΡΡ.
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ Bluff: Beautiful graphs in 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.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com