Selles artiklis räägitakse projektist , mis loeb nginx logisid ja saadab need Clickhouse'i klastrisse. Tavaliselt kasutatakse logide jaoks ElasticSearchi. Clickhouse'i jaoks on vaja vähem ressursse (ketta ruumi, RAM-i, CPU-d). Clickhouse kirjutab andmeid kiiremini. Clickhouse tihendab andmeid, mis muudab andmed kettal veel kompaktsemaks. Clickhouse'i eelised on nähtavad kahel selle esitluse slaidil.


Logide analüütika vaatamiseks loome Grafana jaoks juhtpaneeli.
Kellele see huvi pakub, olete teretulnud lugema edasi.
Installime nginx ja grafana standardmeetodil.
Installime Clickhouse'i klastrit ansible-playbooki abil, mida on koostanud .
Andmebaasi ja tabelite loomine Clickhouse'is
Selles on kirjeldatud SQL-küsimused andmebaasi ja tabelite loomiseks nginx-log-collector'i jaoks Clickhouse'is.
Iga päring teeme kordamööda iga serveri jaoks Clickhouse'i klastri kaupa.
Oluline märkus. Selles reas tuleb logs_cluster asendada teie klastrinimega failis clickhouse_remote_servers.xml sõnade "remote_servers" ja "shard" vahel.
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())Nginx-log-collector'i rpm-i installimine ja seadistamine
Nginx-log-collector'il ei ole rpm-i. Siin loome tale rpm. RPM koguneb abil
Paigaldame rpm paketi nginx-log-collector-rpm
yum -y install yum-plugin-copr
yum copr enable antonpatsev/nginx-log-collector-rpm
yum -y install nginx-log-collector
systemctl start nginx-log-collectorMuutame konfiguratsiooni /etc/nginx-log-collector/config.yaml:
.......
upload:
table: nginx.access_log
dsn: http://ip- адрес-кластера-clickhouse:8123/
- tag: "nginx_error:"
format: error # access | error
buffer_size: 1048576
upload:
table: nginx.error_log
dsn: http://ip-адрес-кластера-clickhouse:8123/nginx seadistus
Üksikasjalik nginx konfigureerimine:
user nginx;
worker_processes auto;
#error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format avito_json escape=json
'{'
'"event_datetime": "$time_iso8601", '
'"server_name": "$server_name", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"http_x_real_ip": "$http_x_real_ip", '
'"status": "$status", '
'"scheme": "$scheme", '
'"request_method": "$request_method", '
'"request_uri": "$request_uri", '
'"server_protocol": "$server_protocol", '
'"body_bytes_sent": $body_bytes_sent, '
'"http_referer": "$http_referer", '
'"http_user_agent": "$http_user_agent", '
'"request_bytes": "$request_length", '
'"request_time": "$request_time", '
'"upstream_addr": "$upstream_addr", '
'"upstream_response_time": "$upstream_response_time", '
'"hostname": "$hostname", '
'"host": "$host"'
'}';
access_log syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx avito_json; #ClickHouse
error_log syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx_error; #ClickHouse
#access_log /var/log/nginx/access.log main;
proxy_ignore_client_abort on;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
Virtuaalne host üks:
vhost1.conf:
upstream backend {
server ip-aadress-serveri-stub_http_server:8080;
server ip-aadress-serveri-stub_http_server:8080;
server ip-aadress-serveri-stub_http_server:8080;
server ip-aadress-serveri-stub_http_server:8080;
server ip-aadress-serveri-stub_http_server:8080;
}
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://backend;
}
}Lisame faili /etc/hosts virtuaalsed hostid:
ip-aadress-serveri-nginx vhost1HTTP serveri emulaator
Kuna HTTP serveri emulaatorina kasutame alates
Nodejs-stub-server'il ei ole rpm. Siin loome tale rpm. RPM koguneb abil
Paigaldame upstream nginx rpm paketi nodejs-stub-server
yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_serverKoormustestimine
Testime Apache benchmarki abil.
Paigaldame selle:
yum install -y httpd-toolsAlustame testimist Apache benchmarkiga 5 erinevast serverist:
while true; do ab -H "User-Agent: 1server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 2server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 3server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 4server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 5server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; doneGrafana seadistamine
Grafana ametlikul veebilehel ei leia te juhtpaneeli.
Seega teeme seda käsitsi.
Minu salvestatud armatuurlauda leiate .
Samuti peate looma muutuja table sisuga nginx.access_log.

Singlestat Kokkuvõttes Päringud:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Singlestat Ebaõnnestunud Päringud:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Singlestat Ebaregulaarsete Protsent:
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 Keskmine Vastamisaeg:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Singlestat Maksimaalne Vastamisaeg:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Loenduse Oleku:
$columns(status, count(*) as c) from $table
Andmete kuvamiseks kui pirukaks, tuleb installida plugina ning taaskäivitada grafana.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restartPiruka TOP 5 Oleku:
SELECT
1, /* vale ajamärk */
status,
sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5
Edasi toodan päringud ilma ekraanipiltideta:
Loenda http_user_agent:
$columns(http_user_agent, count(*) c) FROM $tableHeaMäär/EbaMäär:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $tableVastamise Aeg:
$rate(avg(request_time) as request_time) FROM $tableProovin aega (esimese upstreami vastamise aeg):
$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $tableTabel Loenduse Oleku kõigi vhostide jaoks:
$columns(status, count(*) as c) from $tableÜlevaade armatuurlaud



Keskmise ja kvantiilide võrdlemine
avg()

quantile()

Väljund:
Loodan, et kogukond liitub nginx-log-collectori arendamise, testimise ja kasutamisega.
Ja keegi, kes implementeerib nginx-log-collectori, räägib, kui palju kõvakettaruumi, RAM-i ja CPU-d kokku hoiti.
Telegrami kanalid:
Millisekundid:
Kes peab millisekundeid oluliseks, palun kirjutage või hääletage selle eest. .
Allikas: habr.com
