เช เชฒเซเช เชชเซเชฐเซเชเซเชเซเช เชตเชฟเชถเซ เชเชฐเซเชเชพ เชเชฐเชถเซ
เชฒเซเช เชฆเซเชตเชพเชฐเชพ เชตเชฟเชถเซเชฒเซเชทเชฃ เชเซเชตเชพ เชฎเชพเชเซ, เชเชพเชฒเซ 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
เชคเชฃเชพเชต เชชเชฐเซเชเซเชทเชฃ
เช เชชเชพเชเซ เชฌเซเชจเซเชเชฎเชพเชฐเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชชเชฐเซเชเซเชทเชฃ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชคเซเชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ:
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
Grafana เชธเซเชฏเซเชเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เชคเชฎเชจเซ เช เชงเชฟเชเซเชค 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
เช เชชเชธเซเชเซเชฐเซเชฎ เชชเซเชฐเชคเชฟเชญเชพเชต เชธเชฎเชฏ (1เชฒเซ เช เชชเชธเซเชเซเชฐเซเชฎเชจเซ เชชเซเชฐเชคเชฟเชญเชพเชต เชธเชฎเชฏ):
$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-colector เชจเซ เชฒเชพเชเซ เชเชฐเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชคเซ เชคเชฎเชจเซ เชเชนเซเชถเซ เชเซ เชคเซเชฃเซ เชกเชฟเชธเซเช, RAM, CPU เชเซเชเชฒเซ เชธเซเชต เชเชฐเซ เชเซ.
เชเซเชฒเชฟเชเซเชฐเชพเชฎ เชเซเชจเชฒเซ:
เชเซเชฒเชฟเชเชนเชพเชเชธ Nginx เชฎเซเชเซเชฐเชฟเชเซเชธ เชเชฐเซเช เชธเชฟเชธเซเชเชฎ เชธเชเชฆเซเชถเชพเชเชจเซเช เชธเชเชเซเชฐเชน เช เชจเซ เชตเชฟเชถเซเชฒเซเชทเชฃ เชเซเชฐเชพเชซเชจเชพ
เชฎเชฟเชฒเชฟเชธเซเชเชจเซเชกเซเชธ:
เชฎเชฟเชฒเชฟเชธเซเชเชจเซเชก เชตเชฟเชถเซ เชเซเชฃ เชงเซเชฏเชพเชจ เชฐเชพเชเซ เชเซ, เชเซเชชเชพ เชเชฐเซเชจเซ เชเชฎเชพเช เชฒเชเซ เช
เชฅเชตเชพ เชฎเชค เชเชชเซ
เชธเซเชฐเซเชธ: www.habr.com