Ĉi tiu artikolo diskutos pri la projekto
Por vidi analizojn per protokoloj, ni kreu instrumentpanelon por Grafana.
Kiu zorgas, bonvenon sub kato.
Instalu nginx, grafana laŭ la norma maniero.
Instalu clickhouse cluster kun ansible-playbook de
Kreante datumbazon kaj tabelojn en Clickhouse
En ĉi tio
Ni faras ĉiun peton laŭvice sur ĉiu servilo de la Clickhouse-grupo.
Grava noto. En ĉi tiu linio, logs_cluster devus esti anstataŭigita per via clusternomo de la clickhouse_remote_servers.xml dosiero inter "remote_servers" kaj "shard".
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
Instalado kaj agordo de nginx-log-collector-rpm
Nginx-log-collector ne havas rpm. Jen
Instalu rpm-pakaĵon 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
Redaktu agordon /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/
Agordo de nginx
Ĝenerala nginx-agordo:
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;
}
Virtuala gastiganto unu:
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;
}
}
Aldonu virtualajn gastigantojn al la /etc/hosts dosiero:
ip-адрес-сервера-с-nginx vhost1
HTTP-servila emulilo
Kiel HTTP-servila emulilo ni uzos
nodejs-stub-server ne havas rpm. Jen
Instalu nodejs-stub-server pakaĵon sur kontraŭflua 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
Streĉa Testado
Testado estas farita per Apache-komparnormo.
Instalu ĝin:
yum install -y httpd-tools
Ni komencas testi uzante Apache-komparnormon de 5 malsamaj serviloj:
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
Starigante Grafana
Vi ne trovos panelon en la oficiala Grafana retejo.
Tial ni faros ĝin mane.
Vi povas trovi mian konservitan instrumentpanelon
Vi ankaŭ devas krei tabelvariablon kun la enhavo nginx.access_log
.
Singlestat Totalaj Petoj:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Singlestat Malsukcesaj Petoj:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Malsukcesa Procento de Singlestat:
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
Meza Respondtempo de Singlestat:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Singlestat Maksimuma Respondtempo:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Statuso de kalkulo:
$columns(status, count(*) as c) from $table
Por eligi datumojn kiel kukaĵon, vi devas instali la kromprogramon kaj reŝargi grafana.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restart
Torto TOP 5 Statuso:
SELECT
1, /* fake timestamp value */
status,
sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5
Plue mi donos petojn sen ekrankopioj:
Nombri http_user_agent:
$columns(http_user_agent, count(*) c) FROM $table
Bona Prezo/Malbona Indico:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table
tempo de respondo:
$rate(avg(request_time) as request_time) FROM $table
Kontraŭflua respondtempo (respondtempo de la unua kontraŭflua):
$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table
Tabelo-nombra stato por ĉiuj vhosts:
$columns(status, count(*) as c) from $table
Ĝenerala vido de la panelo
Komparante avg() kaj quantile()
mezumo ()
Kvantilo ()
Konkludo:
Espereble la komunumo okupiĝos pri evoluado/testado kaj uzado de nginx-log-collector.
Kaj kiam iu efektivigas nginx-log-collector, li diros al vi kiom li ŝparis diskon, RAM, CPU.
Telegram-kanaloj:
Milisekundoj:
Kiu zorgas pri milisekundoj, skribu aŭ voĉdoni, bonvolu, en ĉi tio
fonto: www.habr.com