క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

ఈ వ్యాసం ప్రాజెక్ట్ గురించి చర్చిస్తుంది nginx-log-కలెక్టర్, ఇది nginx లాగ్‌లను చదువుతుంది, వాటిని క్లిక్‌హౌస్ క్లస్టర్‌కు పంపుతుంది. సాధారణంగా సాగే శోధన లాగ్‌ల కోసం ఉపయోగించబడుతుంది. క్లిక్‌హౌస్‌కి తక్కువ వనరులు అవసరం (డిస్క్ స్థలం, RAM, CPU). క్లిక్‌హౌస్ డేటాను వేగంగా వ్రాస్తుంది. క్లిక్‌హౌస్ డేటాను కుదిస్తుంది, ఇది డిస్క్‌లోని డేటాను మరింత కాంపాక్ట్ చేస్తుంది. క్లిక్‌హౌస్ యొక్క ప్రయోజనాలను నివేదిక నుండి 2 స్లయిడ్‌లలో చూడవచ్చు VK పదివేల సర్వర్‌ల నుండి క్లిక్‌హౌస్‌లోకి డేటాను ఎలా ఇన్‌సర్ట్ చేస్తుంది.

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

లాగ్‌ల ద్వారా విశ్లేషణలను వీక్షించడానికి, గ్రాఫానా కోసం డ్యాష్‌బోర్డ్‌ను రూపొందిద్దాం.

ఎవరు పట్టించుకుంటారు, పిల్లి కింద స్వాగతం.

ప్రామాణిక మార్గంలో nginx, grafanaని ఇన్‌స్టాల్ చేయండి.

నుండి ansible-playbook తో క్లిక్‌హౌస్ క్లస్టర్‌ను ఇన్‌స్టాల్ చేయండి డెనిస్ ప్రోస్కురిన్.

క్లిక్‌హౌస్‌లో డేటాబేస్ మరియు పట్టికలను సృష్టిస్తోంది

ఇందులో ఫైల్ క్లిక్‌హౌస్‌లో nginx-log-collector కోసం డేటాబేస్‌లు మరియు పట్టికలను సృష్టించడం కోసం SQL ప్రశ్నలు వివరించబడ్డాయి.

క్లిక్‌హౌస్ క్లస్టర్‌లోని ప్రతి సర్వర్‌లో మేము ప్రతి అభ్యర్థనను చేస్తాము.

ముఖ్య గమనిక. ఈ లైన్‌లో, "remote_servers" మరియు "shard" మధ్య clickhouse_remote_servers.xml ఫైల్ నుండి logs_cluster మీ క్లస్టర్ పేరుతో భర్తీ చేయబడాలి.

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

nginx-log-collector-rpmని ఇన్‌స్టాల్ చేయడం మరియు కాన్ఫిగర్ చేయడం

Nginx-log-కలెక్టర్‌కి rpm లేదు. ఇక్కడ https://github.com/patsevanton/nginx-log-collector-rpm దాని కోసం rpm సృష్టించండి. rpm ఉపయోగించి నిర్మించబడుతుంది ఫెడోరా Copr

rpm ప్యాకేజీ 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

config /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ని సెటప్ చేస్తోంది

సాధారణ nginx కాన్ఫిగరేషన్:

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

వర్చువల్ హోస్ట్ ఒకటి:

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

/etc/hosts ఫైల్‌కు వర్చువల్ హోస్ట్‌లను జోడించండి:

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

HTTP సర్వర్ ఎమ్యులేటర్

HTTP సర్వర్ ఎమ్యులేటర్‌గా మేము ఉపయోగిస్తాము nodejs-stub-server от మాగ్జిమ్ ఇగ్నాటెంకో

nodejs-stub-serverకి rpm లేదు. ఇక్కడ https://github.com/patsevanton/nodejs-stub-server దాని కోసం rpm సృష్టించండి. rpm ఉపయోగించి నిర్మించబడుతుంది ఫెడోరా Copr

అప్‌స్ట్రీమ్ nginx rpmలో 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_server

ఒత్తిడి పరీక్ష

అపాచీ బెంచ్‌మార్క్ ఉపయోగించి పరీక్ష జరుగుతుంది.

దీన్ని ఇన్‌స్టాల్ చేయండి:

yum install -y httpd-tools

మేము 5 విభిన్న సర్వర్‌ల నుండి అపాచీ బెంచ్‌మార్క్‌ని ఉపయోగించి పరీక్షించడం ప్రారంభిస్తాము:

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

గ్రాఫానాను ఏర్పాటు చేస్తోంది

మీరు అధికారిక గ్రాఫానా వెబ్‌సైట్‌లో డాష్‌బోర్డ్‌ను కనుగొనలేరు.

అందువల్ల, మేము దీన్ని చేతితో చేస్తాము.

మీరు నా సేవ్ చేసిన డాష్‌బోర్డ్‌ను కనుగొనవచ్చు ఇక్కడ.

మీరు కంటెంట్‌తో టేబుల్ వేరియబుల్‌ను కూడా సృష్టించాలి nginx.access_log.
క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

సింగిల్‌స్టాట్ మొత్తం అభ్యర్థనలు:

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

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

సింగిల్‌స్టాట్ విఫలమైన అభ్యర్థనలు:

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

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

సింగిల్‌స్టాట్ విఫలమైన శాతం:

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 లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

Singlestat సగటు ప్రతిస్పందన సమయం:

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

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

Singlestat గరిష్ట ప్రతిస్పందన సమయం:

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

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

గణన స్థితి:

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

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

పై వంటి డేటాను అవుట్‌పుట్ చేయడానికి, మీరు ప్లగ్‌ఇన్‌ని ఇన్‌స్టాల్ చేసి గ్రాఫానాని రీలోడ్ చేయాలి.

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

పై టాప్ 5 స్థితి:

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

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

ఇంకా నేను స్క్రీన్‌షాట్‌లు లేకుండా అభ్యర్థనలు ఇస్తాను:

కౌంట్ http_user_agent:

$columns(http_user_agent, count(*) c) FROM $table

మంచి రేటు/చెడు రేటు:

$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 లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

సగటు() మరియు క్వాంటైల్() పోల్చడం

సగటు()
క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ
పరిమాణ ()
క్లిక్‌హౌస్‌కి nginx లాగ్‌లను పంపడానికి Avito నుండి Nginx-log-కలెక్టర్ యుటిలిటీ

తీర్మానం:

ఆశాజనక సంఘం nginx-log-collectorని అభివృద్ధి చేయడం/పరీక్షించడం మరియు ఉపయోగించడంలో పాల్గొంటుందని ఆశిస్తున్నాము.
మరియు ఎవరైనా nginx-log-collectorని అమలు చేసినప్పుడు, అతను డిస్క్, RAM, CPU ఎంత సేవ్ చేసాడో అతను మీకు చెప్తాడు.

టెలిగ్రామ్ ఛానెల్‌లు:

మిల్లీసెకన్లు:

మిల్లీసెకన్ల గురించి ఎవరు పట్టించుకుంటారు, వ్రాయండి లేదా ఓటు వేయండి, దయచేసి ఇందులో సమస్య.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి