Nginx-log-collector կոմունալ Avito-ից՝ nginx տեղեկամատյանները Clickhouse ուղարկելու համար
Այս հոդվածում կքննարկվի նախագիծը nginx-log-կոլեկցիոներ, որը կկարդա nginx տեղեկամատյանները, դրանք կուղարկի Clickhouse կլաստերին։ Սովորաբար ElasticSearch-ն օգտագործվում է տեղեկամատյանների համար: Clickhouse-ը պահանջում է ավելի քիչ ռեսուրսներ (սկավառակի տարածք, RAM, CPU): Clickhouse-ն ավելի արագ է գրում տվյալներ: Clickhouse-ը սեղմում է տվյալները, ինչն էլ ավելի կոմպակտ է դարձնում սկավառակի տվյալները: Clickhouse-ի առավելությունները կարելի է տեսնել զեկույցից 2 սլայդներում Ինչպես է VK-ն տվյալները մտցնում ClickHouse-ում տասնյակ հազարավոր սերվերներից:
Վերլուծություններն ըստ տեղեկամատյանների դիտելու համար եկեք ստեղծենք Grafana-ի համար վահանակ:
upstream backend {
server ip-адрес-сервера-с-stub_http_server:8080;
server ip-адрес-сервера-с-stub_http_server:8080;
server ip-адрес-сервера-с-stub_http_server:8080;
server ip-адрес-сервера-с-stub_http_server:8080;
server ip-адрес-сервера-с-stub_http_server:8080;
}
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://backend;
}
}
Անհրաժեշտ է նաև բովանդակությամբ աղյուսակի փոփոխական ստեղծել nginx.access_log.
Singlestat Ընդհանուր հարցումները.
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Singlestat ձախողված հարցումները.
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Singlestat ձախողման տոկոսը.
SELECT
1 as t, (sum(status = 500 or status = 499)/sum(status = 200 or status = 201 or status = 401))*100 FROM $table
WHERE $timeFilter GROUP BY t
Singlestat միջին արձագանքման ժամանակը.
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Singlestat Max արձագանքման ժամանակը.
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Հաշվի կարգավիճակը:
$columns(status, count(*) as c) from $table
Կարկանդակի նման տվյալներ դուրս բերելու համար հարկավոր է տեղադրել փլագինը և վերաբեռնել grafana-ն:
grafana-cli plugins install grafana-piechart-panel
service grafana-server restart
Pie TOP 5 կարգավիճակը:
SELECT
1, /* fake timestamp value */
status,
sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5
Հետագայում ես հարցումներ կտամ առանց սքրինշոթերի.
Հաշվել http_user_agent:
$columns(http_user_agent, count(*) c) FROM $table
GoodRate/BadRate:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table
արձագանքման ժամանակը.
$rate(avg(request_time) as request_time) FROM $table
Վերին հոսքի արձագանքման ժամանակը (1-ին հոսանքին հակառակ արձագանքման ժամանակը).
$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table
Սեղանի քանակի կարգավիճակը բոլոր vhost-ների համար.
$columns(status, count(*) as c) from $table
Վահանակի ընդհանուր տեսքը
Համեմատելով միջին () և քանակական ()
միջին ()
քվանտիլ ()
Եզրակացություն.
Հուսով ենք, որ համայնքը կներգրավվի nginx-log-collector-ի մշակման/փորձարկման և օգտագործման մեջ:
Իսկ երբ ինչ-որ մեկը ներդրում է nginx-log-collector, նա ձեզ կասի, թե որքան է խնայել սկավառակը, RAM-ը, CPU-ն։