рдпрд╣ рдЖрд▓реЗрдЦ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛
рд▓реЙрдЧ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдПрдВред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ nginx, рдЧреНрд░рд╛рдлрд╛рдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
Ansible-playbook рдХреЗ рд╕рд╛рде рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
Clickhouse рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЯреЗрдмрд▓ рдмрдирд╛рдирд╛
рдЗрд╕рдореЗрдВ
рд╣рдо рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдкрд░ рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЗрдЦред рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ, logs_cluster рдХреЛ "remote_servers" рдФрд░ "shard" рдХреЗ рдмреАрдЪ clickhouse_remote_servers.xml рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдирд╛рдо рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
nginx-log-рдХрд▓реЗрдХреНрдЯрд░-рдЖрд░рдкреАрдПрдо рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
Nginx-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдореЗрдВ rpm рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ
рдЖрд░рдкреАрдПрдо рдкреИрдХреЗрдЬ nginx-log-рдХрд▓реЗрдХреНрдЯрд░-рдЖрд░рдкреАрдПрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
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
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ /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 рд╕рд░реНрд╡рд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
рдиреЛрдбрдЬ-рд╕реНрдЯрдм-рд╕рд░реНрд╡рд░ рдореЗрдВ рдЖрд░рдкреАрдПрдо рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ
рдЕрдкрд╕реНрдЯреНрд░реАрдо 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
рдЕрдЪреНрдЫреА рджрд░/рдЦрд░рд╛рдм рджрд░:
$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
рд╕рднреА рд╡реАрд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдЧрдгрдирд╛ рд╕реНрдерд┐рддрд┐:
$columns(status, count(*) as c) from $table
рдбреИрд╢рдмреЛрд░реНрдб рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп
рдФрд╕рдд() рдФрд░ рдХреНрд╡рд╛рдВрдЯрд╛рдЗрд▓() рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛
рдФрд╕рдд()
рдорд╛рддреНрд░рд╛()
рдирд┐рд╖реНрдХрд░реНрд╖:
рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдореБрджрд╛рдп nginx-log-рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕/рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред
рдФрд░ рдЬрдм рдХреЛрдИ nginx-log-рдХрд▓реЗрдХреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕рдиреЗ рдбрд┐рд╕реНрдХ, рд░реИрдо, рд╕реАрдкреАрдпреВ рдХреЛ рдХрд┐рддрдирд╛ рдмрдЪрд╛рдпрд╛ред
рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдирд▓:
clickhouse nginx рдЪрд░реНрдЪ рдСрдл рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧреНрд░рд╛рдлрд╛рдирд╛
рдорд┐рд▓реАрд╕реЗрдХрдВрдб:
рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреА рдХрд┐рд╕реЗ рдкрд░рд╡рд╛рд╣ рд╣реИ, рдХреГрдкрдпрд╛ рдЗрд╕рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдпрд╛ рд╡реЛрдЯ рдХрд░реЗрдВ
рд╕реНрд░реЛрдд: www.habr.com