الأداة المساعدة Nginx-log-collector من Avito لإرسال سجلات nginx إلى Clickhouse

تناقش هذه المقالة مشروع جامع سجل nginx ، والذي سيقرأ سجلات nginx ويرسلها إلى نظام Clickhouse. عادة ما تستخدم لسجلات استخدام ElasticSearch. Clickhouse يتطلب موارد أقل (مساحة القرص ، RAM ، وحدة المعالجة المركزية). Clickhouse يسجل البيانات بشكل أسرع. Clickhouse يضغط البيانات ، مما يجعل بيانات القرص أكثر إحكاما. تكون فوائد Clickhouse مرئية في شريحتين من التقرير. كيف تقوم VK بإدراج البيانات في ClickHouse من عشرات الآلاف من الخوادم.




لعرض تحليلات السجل ، أنشئ لوحة معلومات لـ Grafana.


من يهتم ، مرحبا بكم في القط.


تثبيت nginx ، grafana بالطريقة القياسية.


قم بتثبيت مجموعة clickhouse باستخدام ansible-playbook بواسطة Denis Proskurin .


إنشاء قواعد البيانات والجداول في Clickhouse


يصف هذا الملف استعلامات SQL لإنشاء قواعد البيانات والجداول لجامع سجل nginx في 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 على دورة في الدقيقة. هنا https://github.com/patsevanton/nginx-log-collector-rpm ، قم بإنشاء rpm لذلك. سيتم جمع دورة في الدقيقة باستخدام Fedora Copr


قم بتثبيت حزمة 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 من Maxim Ignatenko


لا يحتوي Nodejs-stub-server على عدد دورات في الدقيقة. هنا https://github.com/patsevanton/nodejs-stub-server إنشاء دورة في الدقيقة لذلك. سيتم جمع دورة في الدقيقة باستخدام Fedora Copr


قم بتثبيت حزمة 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 

اختبار الحمل


تم الاختبار باستخدام معيار Apache.


تثبيته:


 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 .


إجمالي طلبات Singlestat:


 SELECT 1 as t, count(*) as c FROM $table WHERE $timeFilter GROUP BY t 


طلبات Singlestat الفاشلة:


 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 

حالة عدد الجدول لجميع vhost:


 $columns(status, count(*) as c) from $table 

منظر عام للوحة القيادة





مقارنة متوسط ​​() والكمية ()


متوسط ​​()

كمية ()


الاستنتاج:


نأمل أن يشارك المجتمع في تطوير / اختبار واستخدام nginx-log-collector.
وسيخبرك شخص ما ، عندما ينفذ أداة تجميع سجل nginx ، كم أنقذ القرص وذاكرة الوصول العشوائي ووحدة المعالجة المركزية.


قنوات البرق



مللي ثانية:


إلى من يهم ميلي ثانية ، اكتب أو صوت ، من فضلك ، في هذه المسألة .

Source: https://habr.com/ru/post/ar484640/


All Articles