Сайттын статистикасы жана өзүңүздүн кичинекей сактагычыңыз

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, мында параметр сурамдын натыйжасы
'COALESCE(MAX(EVENT_DT), '3600') FCT_ACCESS_USER_AGENT_DDДЕН АКЫРКЫ_EVENT_EPOCH КАТЫП ТАНДОО'

Шарт толук күн бою гана жүктөлөт: CAST(STG.EVENT_DT AS INTEGER) < strftime('%s', дата('азыр', 'күндүн башталышы'))

Барактарды же файлдарды эсептөө примитивдүү түрдө, чекит издөө менен жүргүзүлөт.

Отчеттор

Татаал визуализация системаларында маалымат базасынын объектилеринин негизинде мета-моделди түзүүгө, чыпкаларды жана топтоо эрежелерин динамикалык башкарууга болот. Акыр-аягы, бардык татыктуу куралдар SQL сурамын жаратат.

Бул мисалда биз даяр SQL сурамдарын түзүп, аларды маалымат базасында көрүнүш катары сактайбыз - бул отчеттор.

Визуализация

Bluff: 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 негизинде.

Source: www.habr.com

Комментарий кошуу