рд╣рд╛ рд▓реЗрдЦ рдкреНрд░рдХрд▓реНрдкрд╛рд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрд▓
рд▓реЙрдЧрджреНрд╡рд╛рд░реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА, Grafana рд╕рд╛рдареА рдбреЕрд╢рдмреЛрд░реНрдб рддрдпрд╛рд░ рдХрд░реВрдпрд╛.
рдХреЛрдг рдХрд╛рд│рдЬреА рдШреЗрддреЗ, рдорд╛рдВрдЬрд░реАрдЪреНрдпрд╛ рдЦрд╛рд▓реА рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.
рдорд╛рдирдХ рдкрджреНрдзрддреАрдиреЗ nginx, grafana рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛.
рдХрдбреВрди рдЙрддреНрддрд░рджрд╛рдпреА-рдкреНрд▓реЗрдмреБрдХрд╕рд╣ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛
рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдордзреНрдпреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдЯреЗрдмрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ
рдпрд╛рдордзреНрдпреЗ
рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХреНрд▓рд╕реНрдЯрд░рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдирдВрддреА рдмрджрд▓реНрдпрд╛рдд рдХрд░рддреЛ.
рдорд╣рддреНрд╡рд╛рдЪреА рдиреЛрдВрдж. рдпрд╛ рдУрд│реАрдд, "remote_servers" рдЖрдгрд┐ "shard" рдордзреАрд▓ clickhouse_remote_servers.xml рдлрд╛рдЗрд▓рдордзреВрди logs_cluster рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдиреЗ рдмрджрд▓рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ.
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
nginx-log-collector-rpm рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ
Nginx-log-colector рдордзреНрдпреЗ rpm рдирд╛рд╣реА. рдпреЗрдереЗ
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
рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рд╛ /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 рдордзреНрдпреЗ rpm рдирд╛рд╣реА. рдпреЗрдереЗ
рдЕрдкрд╕реНрдЯреНрд░реАрдо 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
рддрд╛рдг рдЪрд╛рдЪрдгреА
Apache рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╡рд╛рдкрд░реВрди рдЪрд╛рдЪрдгреА рдХреЗрд▓реА рдЬрд╛рддреЗ.
рддреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛:
yum install -y httpd-tools
рдЖрдореНрд╣реА 5 рднрд┐рдиреНрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди Apache рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╡рд╛рдкрд░реВрди рдЪрд╛рдЪрдгреА рд╕реБрд░реВ рдХрд░рддреЛ:
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
рдЧреНрд░рд╛рдлрд╛рдирд╛ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ
рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдзрд┐рдХреГрдд Grafana рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░ рдбреЕрд╢рдмреЛрд░реНрдб рд╕рд╛рдкрдбрдгрд╛рд░ рдирд╛рд╣реА.
рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рддреЗ рд╣рд╛рддрд╛рдиреЗ рдХрд░реВ.
рддреБрдореНрд╣реА рдорд╛рдЭрд╛ рд╕реЗрд╡реНрд╣ рдХреЗрд▓реЗрд▓рд╛ рдбреЕрд╢рдмреЛрд░реНрдб рд╢реЛрдзреВ рд╢рдХрддрд╛
рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рд╛рдордЧреНрд░реАрд╕рд╣ рдЯреЗрдмрд▓ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ 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
рд╕рд░реНрд╡ vhosts рд╕рд╛рдареА рд╕рд╛рд░рдгреА рдЧрдгрдирд╛ рд╕реНрдерд┐рддреА:
$columns(status, count(*) as c) from $table
рдбреЕрд╢рдмреЛрд░реНрдбрдЪреЗ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп
рд╕рд░рд╛рд╕рд░реА() рдЖрдгрд┐ рдХреНрд╡рд╛рдВрдЯрд╛рдЗрд▓() рдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рдгреЗ
рд╕рд░рд╛рд╕рд░реА()
рдкрд░рд┐рдорд╛рдг()
рдирд┐рд╖реНрдХрд░реНрд╖:
рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╕рдореБрджрд╛рдп nginx-log-colector рд╡рд┐рдХрд╕рд┐рдд/рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рдд рд╕рд╣рднрд╛рдЧреА рд╣реЛрдИрд▓.
рдЖрдгрд┐ рдЬреЗрд╡реНрд╣рд╛ рдХреЛрдгреА nginx-log-collecter рд▓рд╛рдЧреВ рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рддреЛ рддреБрдореНрд╣рд╛рд▓рд╛ рдбрд┐рд╕реНрдХ, RAM, CPU рдХрд┐рддреА рд╕реЗрд╡реНрд╣ рдХреЗрд▓рд╛ рд╣реЗ рд╕рд╛рдВрдЧреЗрд▓.
рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреЕрдиреЗрд▓:
рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ Nginx рдЪрд░реНрдЪ рдСрдл рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢рд╛рдВрдЪреЗ рд╕рдВрдХрд▓рди рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧреНрд░рд╛рдлрд╛рдирд╛
рдорд┐рд▓реАрд╕реЗрдХрдВрдж:
рдорд┐рд▓реАрд╕реЗрдХрдВрджрд╛рдВрдЪреА рдХрд╛рд│рдЬреА рдХреЛрдгрд╛рд▓рд╛ рдЖрд╣реЗ, рдХреГрдкрдпрд╛ рдпрд╛рдд рд▓рд┐рд╣рд╛ рдХрд┐рдВрд╡рд╛ рдордд рджреНрдпрд╛
рд╕реНрддреНрд░реЛрдд: www.habr.com