Бтатистика сайта ΠΈ своё малСнькоС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° 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