هذه المقالة سوف تناقش المشروع
لعرض التحليلات من خلال السجلات ، دعنا ننشئ لوحة تحكم لـ Grafana.
من يهتم ، أهلا بك تحت القط.
قم بتثبيت nginx، grafana بالطريقة القياسية.
قم بتثبيت مجموعة clickhouse مع دليل التشغيل الثابت من
إنشاء قاعدة بيانات وجداول في Clickhouse
في هذا
نقوم بإجراء كل طلب بدوره على كل خادم من مجموعة Clickhouse.
ملاحظة مهمة. في هذا السطر ، يجب استبدال logs_cluster باسم المجموعة الخاصة بك من ملف clickhouse_remote_servers.xml بين "remote_servers" و "shard".
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
تثبيت وتكوين nginx-log-collector-rpm
لا يحتوي Nginx-log-Collector على دورة في الدقيقة. هنا
قم بتثبيت حزمة 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
تحرير config /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. هنا
قم بتثبيت حزمة nodejs-stub-server على 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
نبدأ الاختبار باستخدام معيار Apache من 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 الرسمي.
لذلك ، سنفعل ذلك باليد.
يمكنك العثور على لوحة القيادة المحفوظة الخاصة بي
تحتاج أيضًا إلى إنشاء متغير جدول بالمحتوى 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
نسبة فشل 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
متوسط وقت استجابة Singlestat:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
وقت استجابة Singlestat Max:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
حالة العد:
$columns(status, count(*) as c) from $table
لإخراج البيانات مثل فطيرة ، تحتاج إلى تثبيت المكون الإضافي وإعادة تحميل grafana.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restart
حالة الفطيرة TOP 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
GoodRate / BadRate:
$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-Collector.
وعندما يقوم شخص ما بتنفيذ nginx-log-Collector ، فسوف يخبرك عن مقدار ما وفره على القرص ، وذاكرة الوصول العشوائي ، ووحدة المعالجة المركزية.
قنوات Telegram:
ميلي ثانية:
من يهتم بالمللي ثانية ، اكتب أو صوت ، من فضلك ، في هذا
المصدر: www.habr.com