Denne artikel vil diskutere projektet
For at se analyser baseret på logfiler, vil vi oprette et dashboard til Grafana.
Alle interesserede, velkommen til kat.
Installer nginx, grafana på standard måde.
Installation af en klikhusklynge ved hjælp af ansible-playbook fra
Oprettelse af databaser og tabeller i Clickhouse
i denne
Vi laver hver anmodning en efter en på hver server i Clickhouse-klyngen.
Vigtig note. På denne linje skal logs_cluster erstattes med dit klyngenavn fra filen clickhouse_remote_servers.xml mellem "remote_servers" og "shard".
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
Installation og konfiguration af nginx-log-collector-rpm
Nginx-log-collector har ikke en rpm. Her
Installer rpm-pakken 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
Rediger konfigurationen /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/
Opsætning af nginx
Generel nginx-konfiguration:
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;
}
Én virtuel vært:
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;
}
}
Tilføj virtuelle værter til filen /etc/hosts:
ip-адрес-сервера-с-nginx vhost1
HTTP server emulator
Som en HTTP-serveremulator vil vi bruge
Nodejs-stub-server har ikke en rpm. Her
Installer nodejs-stub-server-pakken på upstream 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
Stresstest
Vi udfører test ved hjælp af Apache benchmark.
Installer det:
yum install -y httpd-tools
Vi begynder at teste med Apache benchmark fra 5 forskellige servere:
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
Opsætning af Grafana
Du finder ikke et dashboard på det officielle Grafana-websted.
Derfor vil vi gøre det i hånden.
Du kan finde mit gemte dashboard
Du skal også oprette en tabelvariabel med indholdet nginx.access_log
.
Singlestat samlede anmodninger:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Singlestat mislykkede anmodninger:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Singlestat-fejlprocent:
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
Singlestat gennemsnitlig responstid:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Singlestat Max responstid:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Optællingsstatus:
$columns(status, count(*) as c) from $table
For at udlæse data som en kage skal du installere plugin'et og genstarte grafana.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restart
Tærte TOP 5-status:
SELECT
1, /* fake timestamp value */
status,
sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5
Yderligere vil jeg give anmodninger uden skærmbilleder:
Tæl http_bruger_agent:
$columns(http_user_agent, count(*) c) FROM $table
GoodRate/BadRate:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table
Svartidspunkt:
$rate(avg(request_time) as request_time) FROM $table
Upstream-svartid (1. upstream-svartid):
$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table
Status for tabeltælling for alle vhost:
$columns(status, count(*) as c) from $table
Generel visning af instrumentbrættet
Sammenligning af avg() og quantile()
gennemsnit()
kvantil()
Konklusion:
Jeg håber, at fællesskabet vil blive involveret i at udvikle/teste og bruge nginx-log-collector.
Og når nogen implementerer nginx-log-collector, vil de fortælle dig, hvor meget de har sparet på disk, RAM og CPU.
Telegram kanaler:
Millisekunder:
For hvem millisekunder betyder noget, bedes du skrive eller stemme i dette
Kilde: www.habr.com