Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Þessi grein mun fjalla um verkefnið nginx-log-collector, sem mun lesa nginx logs og senda þá til Clickhouse þyrpingarinnar. Venjulega er ElasticSearch notað fyrir logs. Clickhouse krefst minna fjármagns (diskapláss, vinnsluminni, CPU). Clickhouse skráir gögn hraðar. Clickhouse þjappar gögnum saman, sem gerir gögnin á disknum enn þéttari. Kostir Clickhouse eru sýnilegir í 2 glærum úr skýrslunni Hvernig VK setur gögn inn í ClickHouse frá tugþúsundum netþjóna.

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Til að skoða greiningar byggðar á annálum munum við búa til mælaborð fyrir Grafana.

Allir sem hafa áhuga, velkomnir í kött.

Settu upp nginx, grafana á venjulegan hátt.

Að setja upp smellhúsklasa með því að nota ansible-playbook frá Denis Proskurin.

Að búa til gagnagrunna og töflur í Clickhouse

Í þessu skrá Lýst er SQL fyrirspurnum til að búa til gagnagrunna og töflur fyrir nginx-log-collector í Clickhouse.

Við gerum hverja beiðni eina af annarri á hverjum netþjóni í Clickhouse klasanum.

Mikilvæg athugasemd. Í þessari línu þarf að skipta út logs_cluster fyrir klasanafnið þitt úr clickhouse_remote_servers.xml skránni á milli "remote_servers" og "shard".

ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())

Að setja upp og stilla nginx-log-collector-rpm

Nginx-log-collector er ekki með rpm. Hérna https://github.com/patsevanton/nginx-log-collector-rpm búa til rpm fyrir það. rpm verður sett saman með því að nota Fedora Copr

Settu upp rpm pakkann 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-collector

Breyttu stillingunni /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/

Að setja upp nginx

Almenn nginx stilling:

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;
}

Einn sýndargestgjafi:

vhost1.conf:

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;
    }
}

Bættu sýndarhýsingum við /etc/hosts skrána:

ip-адрес-сервера-с-nginx vhost1

HTTP miðlara keppinautur

Sem HTTP miðlara keppinautur sem við munum nota nodejs-stub-þjónn frá Maxim Ignatenko

Nodejs-stub-þjónninn er ekki með snúning á mínútu. Hérna https://github.com/patsevanton/nodejs-stub-server búa til rpm fyrir það. rpm verður sett saman með því að nota Fedora Copr

Settu upp nodejs-stub-server pakka á andstreymis nginx rpm

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_server

Streitupróf

Við framkvæmum próf með því að nota Apache viðmið.

Settu það upp:

yum install -y httpd-tools

Við byrjum að prófa að nota Apache viðmið frá 5 mismunandi netþjónum:

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; done

Uppsetning Grafana

Þú finnur ekki mælaborð á opinberu Grafana vefsíðunni.

Þess vegna munum við gera það í höndunum.

Þú getur fundið vistað mælaborðið mitt hér.

Þú þarft líka að búa til töflubreytu með innihaldinu nginx.access_log.
Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Singlestat heildarbeiðnir:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Singlestat mistókst beiðnir:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Bilunarprósenta 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

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Singlestat meðalsvarstími:

SELECT
 1, avg(request_time) FROM $table
 WHERE $timeFilter GROUP BY 1

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Singlestat Hámarks viðbragðstími:

SELECT
 1 as t, max(request_time) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Talningarstaða:

$columns(status, count(*) as c) from $table

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Til að gefa út gögn eins og köku þarftu að setja upp viðbótina og endurræsa grafana.

grafana-cli plugins install grafana-piechart-panel
service grafana-server restart

TOP 5 staða baka:

SELECT
    1, /* fake timestamp value */
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Ennfremur mun ég gefa beiðnir án skjámynda:

Telja 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

Tímasetning svars:

$rate(avg(request_time) as request_time) FROM $table

Uppstreymisviðbragðstími (1. andstreymisviðbragðstími):

$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table

Staða töflutalningar fyrir alla vhost:

$columns(status, count(*) as c) from $table

Almenn mynd af mælaborðinu

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Samanburður á avg() og quantile()

meðaltal()
Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse
magn ()
Nginx-log-collector tól frá Avito til að senda nginx logs til Clickhouse

Ályktun:

Ég vona að samfélagið muni taka þátt í að þróa/prófa og nota nginx-log-collector.
Og þegar einhver útfærir nginx-log-collector, mun hann segja þér hversu mikið hann sparaði á diski, vinnsluminni og örgjörva.

Telegram rásir:

Millisúndur:

Fyrir hverja millisekúndur skipta máli, vinsamlegast skrifið eða kjósið í þessu mál.

Heimild: www.habr.com

Bæta við athugasemd