рдирд┐рдЧреЛрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдПрд╡рд┐рдЯреЛ рд╕реЗ рдирдЧреНрдиреЗрдХреНрд╕ рд▓реЙрдЧ рдХреЛ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП

рдпрд╣ рд▓реЗрдЦ nginx- log- рдХрд▓реЗрдХреНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛, рдЬреЛ nginx рд▓реЙрдЧ рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ Clickhouse рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рднреЗрдЬреЗрдЧрд╛ред рдЖрдорддреМрд░ рдкрд░ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рдХрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди, рд░реИрдо, рд╕реАрдкреАрдпреВ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбрд┐рд╕реНрдХ рдбреЗрдЯрд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред Clickhouse рдХреЗ рд▓рд╛рдн рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ 2 рд╕реНрд▓рд╛рдЗрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ VK рд╣рдЬрд╛рд░реЛрдВ рд╕рд░реНрд╡рд░ рд╕реЗ ClickHouse рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред




рд▓реЙрдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдПрдВред


рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


рд╕реНрдЯреИрдгреНрдбрд░реНрдб рддрд░реАрдХреЗ рд╕реЗ рдиреЗрдЧреНрдиреЗрдХреНрд╕, рдЧреНрд░рд╛рдлрд╛рдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред


рдбреЗрдирд┐рд╕ рдкреНрд░реЛрд╕реНрдХреБрд░рд┐рди рджреНрд╡рд╛рд░рд╛ ansible-playbook рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред


рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЯреЗрдмрд▓реНрд╕ рдмрдирд╛рдирд╛


рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдореЗрдВ nginx-log-рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред


рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВред


рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯред рдЗрд╕ рдкрдВрдХреНрддрд┐ рдкрд░, log_cluster рдХреЛ рдЖрдкрдХреЗ рджреВрд░рд╕реНрде рдирд╛рдо рд╕реЗ clickhouse_remote_servers.xml рдлрд╝рд╛рдЗрд▓ рд╕реЗ "Remote_servers" рдФрд░ "shard" рдХреЗ рдмреАрдЪ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


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

Nginx-log-рдХрд▓реЗрдХреНрдЯрд░-рдЖрд░рдкреАрдПрдо рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


рдирдЧреНрдиреЗрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдореЗрдВ рдЖрд░рдкреАрдПрдо рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ https://github.com/patsevanton/nginx-log-collector-rpm рдЗрд╕рдХреЗ рд▓рд┐рдП rpm рдмрдирд╛рдПрдБред Rpm рдХреЛ Fedora Copr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛


Rpm рдкреИрдХреЗрдЬ nginx-log-рд╕рдВрдЧреНрд░рд╛рд╣рдХ-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 рд╕реЗрдЯрдЕрдк


рд╕рд╛рдорд╛рдиреНрдп рдирдЧреАрди рд╡рд┐рдиреНрдпрд╛рд╕:


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

/ / / рдореЗрдЬрдмрд╛рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реЛрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ:


 ip----nginx vhost1 

HTTP рд╕рд░реНрд╡рд░ рдПрдореБрд▓реЗрдЯрд░


рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдореИрдХреНрд╕рд┐рдо рдЗрдЧреНрдирд╛рдЯреЗрдВрдХреЛ рд╕реЗ рдиреЛрдбрдЬ-рд╕реНрдЯрдм-рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ


рдиреЛрдбреЛрдбреНрд╕-рд╕реНрдЯрдм-рд╕рд░реНрд╡рд░ рдореЗрдВ рдЖрд░рдкреАрдПрдо рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ https://github.com/patsevanton/nodejs-stub-server рдЗрд╕рдХреЗ рд▓рд┐рдП rpm рдмрдирд╛рдПрдБред Rpm рдХреЛ Fedora Copr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛


рдЕрдкрд╕реНрдЯреНрд░реАрдо 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 

рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг


рдЕрдкрд╛рдЪреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред


рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


 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 рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЪрд░ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдХреБрд▓ рдЕрдиреБрд░реЛрдз:


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


рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз:


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


рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдлреЗрд▓рд┐рдВрдЧ рдкреНрд░рддрд┐рд╢рдд:


 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 


рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдФрд╕рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп:


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


рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдореИрдХреНрд╕ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдЯрд╛рдЗрдо:


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


рдЧрдгрдирд╛ рдХреА рд╕реНрдерд┐рддрд┐:


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


рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


 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 


рдЖрдЧреЗ рдореИрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдз рджреВрдВрдЧрд╛:


рдЧрдгрдирд╛ 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 

рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп (рдкрд╣рд▓реА рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп):


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

рд╕рднреА vhost рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдЧрдгрдирд╛ рд╕реНрдерд┐рддрд┐:


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

рдбреИрд╢рдмреЛрд░реНрдб рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп





рддреБрд▓рдирд╛ рдЕрд╡рдЧ () рдФрд░ рдорд╛рддреНрд░рд╛рддреНрдордХ ()


рдЕрд╡рдЧ ()

рдорд╛рддреНрд░рд╛рддреНрдордХ ()


рдирд┐рд╖реНрдХрд░реНрд╖:


рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдореБрджрд╛рдп рдирдЧреАрдиреЗрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ / рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐, рдЬрдм рд╡рд╣ рдирдЧреНрдиреЗрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕рдиреЗ рдбрд┐рд╕реНрдХ, рд░реИрдо, рд╕реАрдкреАрдпреВ рдХреЛ рдХрд┐рддрдирд╛ рдмрдЪрд╛рдпрд╛ред


рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдирд▓:



рдорд┐рд▓реАрд╕реЗрдХреЗрдВрдб:


рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд▓рд┐рдЦреЗрдВ рдпрд╛ рд╡реЛрдЯ рдХрд░реЗрдВ, рдХреГрдкрдпрд╛ рдЗрд╕ рдЕрдВрдХ рдореЗрдВ ред

Source: https://habr.com/ru/post/hi484640/


All Articles