کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

یہ مضمون اس منصوبے پر بحث کرے گا nginx-log-colector، جو nginx لاگز کو پڑھے گا اور انہیں Clickhouse کلسٹر میں بھیجے گا۔ عام طور پر نوشتہ جات کے لیے ElasticSearch استعمال کیا جاتا ہے۔ کلک ہاؤس کو کم وسائل کی ضرورت ہوتی ہے (ڈسک کی جگہ، RAM، CPU)۔ کلک ہاؤس ڈیٹا کو تیزی سے ریکارڈ کرتا ہے۔ کلک ہاؤس ڈیٹا کو کمپریس کرتا ہے، جس سے ڈسک پر موجود ڈیٹا اور بھی کمپیکٹ ہوتا ہے۔ کلک ہاؤس کے فوائد رپورٹ کی 2 سلائیڈوں میں دکھائی دے رہے ہیں۔ VK کس طرح دسیوں ہزار سرورز سے کلک ہاؤس میں ڈیٹا داخل کرتا ہے۔

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

لاگز پر مبنی تجزیات دیکھنے کے لیے، ہم گرافانا کے لیے ایک ڈیش بورڈ بنائیں گے۔

کوئی بھی دلچسپی رکھتا ہے، بلی میں خوش آمدید۔

nginx، گرافانا کو معیاری طریقے سے انسٹال کریں۔

جوابی پلے بک کا استعمال کرتے ہوئے کلک ہاؤس کلسٹر انسٹال کرنا ڈینس پروسکورین.

کلک ہاؤس میں ڈیٹا بیس اور ٹیبل بنانا

اس میں فائل کلک ہاؤس میں nginx-log-collector کے لیے ڈیٹا بیس اور ٹیبل بنانے کے لیے SQL سوالات بیان کیے گئے ہیں۔

ہم کلک ہاؤس کلسٹر میں ہر سرور پر ایک ایک کرکے ہر درخواست کرتے ہیں۔

اہم نوٹ. اس لائن میں، "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 نہیں ہے۔ یہاں https://github.com/patsevanton/nginx-log-collector-rpm اس کے لیے 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

تشکیل میں ترمیم کریں /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 سے میکسم اگناٹینکو

Nodejs-stub-server میں rpm نہیں ہے۔ یہاں https://github.com/patsevanton/nodejs-stub-server اس کے لیے rpm بنائیں۔ rpm کا استعمال کرتے ہوئے مرتب کیا جائے گا۔ Fedora Copr

اپ اسٹریم 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

گرافانا ترتیب دینا

آپ کو گرافانا کی آفیشل ویب سائٹ پر ڈیش بورڈ نہیں ملے گا۔

لہذا، ہم اسے ہاتھ سے کریں گے.

آپ میرا محفوظ کردہ ڈیش بورڈ تلاش کر سکتے ہیں۔ یہاں.

آپ کو مواد کے ساتھ ٹیبل متغیر بنانے کی بھی ضرورت ہے۔ nginx.access_log.
کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

سنگل اسٹیٹ کل درخواستیں:

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

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

سنگل اسٹیٹ کی ناکام درخواستیں:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

سنگل اسٹیٹ میں ناکامی کا فیصد:

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

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

سنگل اسٹیٹ اوسط جوابی وقت:

SELECT
 1, avg(request_time) FROM $table
 WHERE $timeFilter GROUP BY 1

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

سنگل اسٹیٹ زیادہ سے زیادہ رسپانس ٹائم:

SELECT
 1 as t, max(request_time) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

شمار کی حیثیت:

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

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

پائی کی طرح ڈیٹا آؤٹ پٹ کرنے کے لیے، آپ کو پلگ ان انسٹال کرنے اور گرافانا کو دوبارہ شروع کرنے کی ضرورت ہے۔

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

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

مزید میں اسکرین شاٹس کے بغیر درخواستیں دوں گا:

شمار 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

اپ اسٹریم رسپانس ٹائم (پہلا اپ اسٹریم ریسپانس ٹائم):

$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table

تمام vhost کے لیے ٹیبل کاؤنٹ اسٹیٹس:

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

ڈیش بورڈ کا عمومی منظر

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

اوسط () اور مقدار () کا موازنہ

اوسط()
کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی
مقدار ()
کلک ہاؤس کو nginx لاگ بھیجنے کے لیے Avito سے Nginx-log-collector یوٹیلیٹی

: اختتام

مجھے امید ہے کہ کمیونٹی nginx-log-colector کو تیار کرنے/ٹیسٹ کرنے اور استعمال کرنے میں شامل ہو جائے گی۔
اور جب کوئی nginx-log-colector کو لاگو کرتا ہے، تو وہ آپ کو بتائے گا کہ انہوں نے ڈسک، RAM، اور CPU پر کتنی بچت کی ہے۔

ٹیلیگرام چینلز:

ملی سیکنڈز:

جس کے لیے ملی سیکنڈز اہم ہیں، براہ کرم اس میں لکھیں یا ووٹ دیں۔ مسئلہ.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں