рдпрд╣ рд▓реЗрдЦ nginx- log- рдХрд▓реЗрдХреНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛, рдЬреЛ nginx рд▓реЙрдЧ рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ Clickhouse рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рднреЗрдЬреЗрдЧрд╛ред рдЖрдорддреМрд░ рдкрд░ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рдХрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди, рд░реИрдо, рд╕реАрдкреАрдпреВ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбрд┐рд╕реНрдХ рдбреЗрдЯрд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред Clickhouse рдХреЗ рд▓рд╛рдн рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ 2 рд╕реНрд▓рд╛рдЗрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ VK рд╣рдЬрд╛рд░реЛрдВ рд╕рд░реНрд╡рд░ рд╕реЗ ClickHouse рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред


рд▓реЙрдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдПрдВред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рд╕реНрдЯреИрдгреНрдбрд░реНрдб рддрд░реАрдХреЗ рд╕реЗ рдиреЗрдЧреНрдиреЗрдХреНрд╕, рдЧреНрд░рд╛рдлрд╛рдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдбреЗрдирд┐рд╕ рдкреНрд░реЛрд╕реНрдХреБрд░рд┐рди рджреНрд╡рд╛рд░рд╛ ansible-playbook рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЯреЗрдмрд▓реНрд╕ рдмрдирд╛рдирд╛
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдореЗрдВ nginx-log-рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯред рдЗрд╕ рдкрдВрдХреНрддрд┐ рдкрд░, log_cluster рдХреЛ рдЖрдкрдХреЗ рджреВрд░рд╕реНрде рдирд╛рдо рд╕реЗ clickhouse_remote_servers.xml рдлрд╝рд╛рдЗрд▓ рд╕реЗ "Remote_servers" рдФрд░ "shard" рдХреЗ рдмреАрдЪ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
Nginx-log-рдХрд▓реЗрдХреНрдЯрд░-рдЖрд░рдкреАрдПрдо рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рдирдЧреНрдиреЗрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдореЗрдВ рдЖрд░рдкреАрдПрдо рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ https://github.com/patsevanton/nginx-log-collector-rpm рдЗрд╕рдХреЗ рд▓рд┐рдП rpm рдмрдирд╛рдПрдБред Rpm рдХреЛ Fedora Copr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
Rpm рдкреИрдХреЗрдЬ nginx-log-рд╕рдВрдЧреНрд░рд╛рд╣рдХ-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 рд╕реЗрдЯрдЕрдк
рд╕рд╛рдорд╛рдиреНрдп рдирдЧреАрди рд╡рд┐рдиреНрдпрд╛рд╕:
user nginx; worker_processes auto;
рд╡рд░реНрдЪреБрдЕрд▓ рд╣реЛрд╕реНрдЯ рдПрдХ рд╣реИ:
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; } }
/ / / рдореЗрдЬрдмрд╛рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реЛрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ:
ip----nginx vhost1
HTTP рд╕рд░реНрд╡рд░ рдПрдореБрд▓реЗрдЯрд░
рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдореИрдХреНрд╕рд┐рдо рдЗрдЧреНрдирд╛рдЯреЗрдВрдХреЛ рд╕реЗ рдиреЛрдбрдЬ-рд╕реНрдЯрдм-рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
рдиреЛрдбреЛрдбреНрд╕-рд╕реНрдЯрдм-рд╕рд░реНрд╡рд░ рдореЗрдВ рдЖрд░рдкреАрдПрдо рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ https://github.com/patsevanton/nodejs-stub-server рдЗрд╕рдХреЗ рд▓рд┐рдП rpm рдмрдирд╛рдПрдБред Rpm рдХреЛ Fedora Copr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдЕрдкрд╕реНрдЯреНрд░реАрдо 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
рд╣рдо 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
рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЪрд░ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдХреБрд▓ рдЕрдиреБрд░реЛрдз:
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

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдлреЗрд▓рд┐рдВрдЧ рдкреНрд░рддрд┐рд╢рдд:
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

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдФрд╕рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп:
SELECT 1, avg(request_time) FROM $table WHERE $timeFilter GROUP BY 1

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреИрдЯ рдореИрдХреНрд╕ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдЯрд╛рдЗрдо:
SELECT 1 as t, max(request_time) as c FROM $table WHERE $timeFilter GROUP BY t

рдЧрдгрдирд╛ рдХреА рд╕реНрдерд┐рддрд┐:
$columns(status, count(*) as c) from $table

рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
grafana-cli plugins install grafana-piechart-panel service grafana-server restart
рдкрд╛рдИ рд╢реАрд░реНрд╖ 5 рд╕реНрдерд┐рддрд┐:
SELECT 1, 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
рдбреИрд╢рдмреЛрд░реНрдб рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп



рддреБрд▓рдирд╛ рдЕрд╡рдЧ () рдФрд░ рдорд╛рддреНрд░рд╛рддреНрдордХ ()
рдЕрд╡рдЧ ()

рдорд╛рддреНрд░рд╛рддреНрдордХ ()

рдирд┐рд╖реНрдХрд░реНрд╖:
рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдореБрджрд╛рдп рдирдЧреАрдиреЗрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ / рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐, рдЬрдм рд╡рд╣ рдирдЧреНрдиреЗрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕рдиреЗ рдбрд┐рд╕реНрдХ, рд░реИрдо, рд╕реАрдкреАрдпреВ рдХреЛ рдХрд┐рддрдирд╛ рдмрдЪрд╛рдпрд╛ред
рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдирд▓:
рдорд┐рд▓реАрд╕реЗрдХреЗрдВрдб:
рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд▓рд┐рдЦреЗрдВ рдпрд╛ рд╡реЛрдЯ рдХрд░реЗрдВ, рдХреГрдкрдпрд╛ рдЗрд╕ рдЕрдВрдХ рдореЗрдВ ред