á ááá² ááááᣠᚠMKB ášáášá áŽáááááᜠá³áá¬áá¶á¬áµ ášáááµ á áááááµ á»ááᜠášá¥ááµ áá¥ášá ááá
ášá€áᬠááá (ElasticSearch, Logstash, Kibana) á¥áá° á áá«á áš ClickHouse á³á³á€á ášáááᥠááµá³áá»ááœá á¥áá° ášááᥠáášáá» áµááá áá áááá á¥á«á°ášáá ááá¢
á áá áœáá ááµá¥ áµá ClickHouse á³á³á€á áµááá áá á«ááá áááµ á¥á ášá á¥á«áª á¥á« ášááááªá« áá€á¶áœá ááááá á¥ááááááᢠáá€á¶á¹ á áµá°áá á¥áá°áá á© áá²á«áá áᥠáá£á ááá£á.
á ááá á, ášá¥á áµáááµ á¥ááŽáµ á¥áá°áááá, á¥á áá á áááµ á á«ááµá á¥áá°áá«á«áµáµ á á áá áááá á¥áááááá. á áá áá áµááá
ášááᥠáá³ á á á ááá áµáᜠááá«áµ á¥ááááá, á¥á ááá áµá©ášáµ ááµá áµ á¥áá³áá áµ. áš ClickHouse á³á³á€á áš Yandex ášáá°á á áá»ážá á«áá ášáµáá³á áááµ á³á³á€á ááᢠá Yandex á ááááá¶áœ ááµá¥ á¥á
á áá áááá, ááááªá« áá á Yandex.Metrica ááá ášááᥠáášáá» áá. áááµ ááá áµááᵠᣠááᢠášááᢠá¥áá³ á áá»áᣠá¥ááŽáµ á¥áá°á°áá á©áµ áááá á áµá¥ áá áᣠáááá«á±á á áá«áµá°áá
ááá³ áµáá
áášá á áᢠá¥á ášááµáªááµ ášá°á áá á áááᜠá«á± á á£á á°áááá á¥á áá£á ááᢠášáá
ášáášá ááµ áá áááááªá« áá á²á«áá ᣠáááá€á âá°á
á ᣠá áášášá»! áá
áᥠášá°á°á«! ášáá«á áá°á± ááá® á¥á á ááá á¥á«áááœá á«á áá.
áá ášááᥠáá³ á á£á áá á°á ášááá¢á« áá°á¥ á ááᢠá áá«á áœáá³ á«áá ááᢠá¥áá³á áá á á³á³á€á á á¥ááµ á°áááᜠááµá¥ áá áá áá áááá ááœááᢠááá ááá á ááᜠáá°á«á. áááááµ á á²áµ ášáá á°áᜠá¥áá³á áá«áá á áá¥ááµ ááµá°áááµ á¥á ááá áµá«ááœá áášááá ááœááᢠáá°á á²á ᣠá¢á á³á³ ᣠáá±á ᣠááá á¢á áŽá¥á ᣠá€áœá²á€áá€áµ á áááµ áááµ á ááµ á°á« ááᢠáµá á áá³ááµ áŽá«á£áᵠᣠáá³á£áᵠᣠá áá³ááµ ášá°á á áá ášáá á°áᜠáá¥ááá áµááá¶áœ á áá á¶áœ á¥á áááµ ááµá¥ áá³á°áá ášáá áá³á¥ áá ášá ᣠášáá« áš ClickHouse ááá£áµ ááᢠášááᥠáá³á£ ášáá áá°á áá°ášáµ ášáááœááá ášá°áá£á á¥ááµ ááá³áµ ášááœáá áµ ááá á¥á ááášá³áµ ášáá»á áá³áªá« á ááá°ááᢠááá«á á ááµ áµáááá á áá«á ááœá á¥á á ááµáµ á°áá á¥á» áá ášáááµá°áᢠá«á áááµ á¥áá° MySql á«á ášááᥠáá³ á ááá°áá ááá áá á á¢áá®áᜠášááá á© ááááŠáœá ááášáážáµ á¥á» áá! ášSQL ááá áá ášá°áá°á ááá-áááᥠá€áµá¢ á°áᜠášá£ááµ áŠá áá³áªá« á¥áá°á°á°á£ážá ááá¢
áµá á¥á ášáááᥠááµá³áá» áµáááµ
áášáá ááá°á¥á°á¥ áš IIS áá áááᜠáá°á á á áážáµ ášáµá áá°áá áªá«áᜠá¥á á áá áááá (á á áá áá ášáá°áá áªá« áááᥠááµá³áá»ááœá á¥ášá°ááášáµá áá ááá áá á áášá« á°ášá áá á«áá ááá áᥠᚠIIS áááᥠááµá³áá»ááœá áá°á¥á°á¥ áá)á¢
á á°áá«á© áááá«á¶áœ áš ELK ááá áá á áá áá°á á áá»áááᣠá¥á á¥á«á³ážáá á ááᣠá«ášááá¡ á¥á á áµááá ášáá°á©áµá LogStash á¥á Filebeat ááááœá áá áááœáá áá¥áááá¢
á á ááá ášáááᣠá¥á áµ ášáá á á³áœ á£áá áµá¥á ááµá¥ áá³á«áá¢
áá° ClickHouse á³á³á€á ááᥠášááá á£á
᪠á¥á áá (á áŽá®ááµ á ááµ áá) ááááŠáœá á áµááá
áµá¥áµáŠáœ ááµá¥ ááµáá£áµ ááᢠáá
ášááá áááµ á³á³á€á áá áááááªá« áá á²á°á© ášáá«áá¥ááµ á á£á âáœáá á«áá áµâ ááá ááá¡ á¥á
á± áµáᜠášá°áá³á°á ááááá¢
áš LogStash áááá ᣠáášáá á áá¥á³ áá° ClickHouse ášáá«áµáᣠᣠá¥áá
á¥á ášáµá·áᢠáá
á á«á á¥áá° á³á³á€á á«á± á á°áá³á³á á áááá áá á°áááá·áᢠáµááá
, á á á ááá á áááá, á á°áá³á³á á áááá áá á áá°á«áá áµ áá ášá°áá«á© á áááá®áœá á¥áá³á«ááá±, ášá°áá£á«á á¥áá³ á áá»á áá á¥áá²á«á°áááµ á ááášáá. ášáášá áá± áá ááá á áááµ ááµáá¶áœ ááá ášáá¥ášáµ ááá¶áœ á áášááᢠá á°ášááªá, áááá áµá
á°á¶áœ á«á á¥áá°áá ášááášá áᎠá¥áá³áá áᥠáá£á ááá£á. á¥á áµá
á°á¶áœ á«á, áááá ááᣠášáááœá ášááᥠáµá¥áµá¥ áá° á²áµá ááœáá (ášááá á
áážá± áá¹ áá: ášá ááµááµ á áá ášá°áµá°á«ášááá ááá á€áµ-á°áá áá á áá áá á ááá ááµáá£áµ ááœáá).
á á¥á á± ááµá¥ á¥á á áá ášáá ášá¶ááµáá áá áááá á á áá ášá¥ ááµá¥ ááá§á-
á«áááá á¶ááµáá®áœ áááá
áááµ
áááá«
ášáµáááµ á ááá
NGINX
á áá°áŠáœ áá³ášá»á áááá°á¥ á¥á áááµá ááá°á«ááµ á ááá£á á°áª
á á áá áá á á¥á á± ááµá¥ á¥á á áá á áááá
FileBeat
ášááá ááááŠáœá ááµá°ááá.
logstash
ášáááᥠááµá³áá» á°á¥á³á¢.
áááᥠááµá³áá»ááœá ášáááá¢áµ ááá°á¥á°á¥á£ á¥áá²áá áš RabbitMQ áášá (á á²á€ááá€áµ ááµá¥ áá á áááá®áœ) áááᥠááµá³áá»ááœá ááá°á¥á°á¥ áá á ááá¢
Logstash-áá€áµ-ááá áááµ
Loagstash plugin áááᥠááµá³áá»ááœá áá° ClickHouse á³á³á€á á á¡áµá ááááá
/usr/share/logstash/bin/logstash-plugin logstash-output-clickhouse á«á
/usr/share/logstash/bin/logstash-plugin á«á logstash-filter-prune
/usr/share/logstash/bin/logstash-plugin logstash-filter-multiline á«á
á á á³ á€áµ
ášáááᥠááµá³áá» áášáá»
ááµá³áá». ášáŠááµáµ 2018 ááá® á RHEL "áá°á á" rpm áááá£á á Yandex áášáá» ááµá¥ á³áš, áµááá á¥áá±á ááá áá ááášá ááœáá. á áá«á áá á á áá²áá² ášá°ááá¡ á¥á ááœá á¥áá áá áá á.
áá«áá
ášáááᥠááµá³áá» á¥áá³. á³áœáŠáá¶áœá á áááááµ áá
Redhat & Centos(64 á¢áµ) - ášá áᥠáá áµáªáµ
ClickHouse ášááᥠááá á Grafana 4.6+
á Grafana á°á°áª á ClickHouse ášááᥠááá
logstash
á«áá°áá ášáááá¢áµ áá° RabbitMQ áášá á«áµáá¡á¢
ááµá³áá». á¥áá° á ááá³á°á áá, FileBeat á áá¥á³ áá° RabbitMQ áá ááµ ášááá, áµááá á Logstash ááá áá«ášáá á ááá á«áµáááá.
RabbitMQ
ášáááááµ áášá. áá á DMZ ááµá¥ á«áá ášáááᥠááµá³áá» ááµ ááá¢
Erlang Runtime (á RabbitMQ á«áµáááá)
ášá€áááá á©á« ááᢠRabbitMQ á¥áá²á°á« á«áµáááá
áš ClickHouse á³á³á€á áá á«áá ášá áááá áá á á áášá°áá á áá ášá¥ ááá§áá¢
áááµ
áá
á ááášá°
áá á
HDD: 40GB
á«á: 8 áá£
áá®á°á°á: á®á 2 2Ghz
áš ClickHouse á³á³á€á (ááááááµ) ášáášá áá±á áááµá¬áµ ááá®áœá áµá©ášáµ ááµá áµ á«áµáááá á¢
á á ááá ášáµáááµ á¶ááµáá
áµááá° áááá¡ Red Hat Enterprise Linux Server (Maipo)
áá áá á (áá« 8)
á¥áá°áááášá±áµ, áá á°á« ášáµá« áŠá³ áá.
ášáááᥠááµá³áá»ááœá ááášáážáµ ášá°áá ášá¡ ááá á á¥áá°áášá°áá áá.
log_web.sql
CREATE TABLE log_web (
logdate Date,
logdatetime DateTime CODEC(Delta, LZ4HC),
fld_log_file_name LowCardinality( String ),
fld_server_name LowCardinality( String ),
fld_app_name LowCardinality( String ),
fld_app_module LowCardinality( String ),
fld_website_name LowCardinality( String ),
serverIP LowCardinality( String ),
method LowCardinality( String ),
uriStem String,
uriQuery String,
port UInt32,
username LowCardinality( String ),
clientIP String,
clientRealIP String,
userAgent String,
referer String,
response String,
subresponse String,
win32response String,
timetaken UInt64
, uriQuery__utm_medium String
, uriQuery__utm_source String
, uriQuery__utm_campaign String
, uriQuery__utm_term String
, uriQuery__utm_content String
, uriQuery__yclid String
, uriQuery__region String
) Engine = MergeTree()
PARTITION BY toYYYYMM(logdate)
ORDER BY (fld_app_name, fld_app_module, logdatetime)
SETTINGS index_granularity = 8192;
áá£áª ááááá (á áá) á¥á ášáášá á ááá á¥áá áááá ᢠááá ááµá®áœ áš http á¥á«áááœá áááááᥠᚠIIS áááᥠááµá³áá»áᜠáá áááá³áᢠá á°áá á, utm-tags ááášáážáµ ášá°áá© ááµá®áœ á¥áá³á á¥ááµá°áááá (ášá¥á«áá áá¥ášááá ááµá áá° á ášáŽáá ááµá¥ á áá«áµáá¡á áµ á°ášá áá ááá áá).
á¥áá²áá áµá áµááá¶áœ, á á«ááµ, á áááá®áœ áášáá ááášáážáµ á¥á ášáµáááµ ááµá®áœ áá° á ášáŽáá á°ášáášáá. ášá¥ááá á ááµá®áœ áááá« áááááµ ášáá á á³áœ á«ááá á°áá ášá¥ áááášá±á¢ á á ááµ á áá ášá¥ ááµá¥ áá¥á áµááá¶áœ áááᥠááµá³áá»ááœá á¥áášáá»áá.
áááµ
áááá«
ááá³á:
fld_app_áµá
ášáá°áá áªá« / ášáµáááµ áµá
áµáááá á¥áŽá¶áœá¡-
- site1.domain.com áá«á á£á¢á« 1
- site2.domain.com áá«á á£á¢á« 2
- internal-site1.domain.local Internal site 1
site1.domain.com
fld_app_module
ášáµáááµ ááá
áµáááá á¥áŽá¶áœá¡-
- áµá - áµá á£á¢á«
- svc - ášáµá á£á¢á« á áááááµ
- intgr - ášáá á°áµ áµá á áááááµ
- አ- á áµá°á³á³áª (BackOffice)
ášáµá
fld_áµáš-ááœ_áµá
á IIS ááµá¥ ášá£á¢á« áµá
á¥á áµááá¶áœ á á ááµ á áááá áá áá°áá© ááœááᣠááá á á ááµ ášáµáááµ ááá ááµá¥ á¥á á áá£áááœ
ášáµá áá
fld_á áááá_áµá
ášá áááá áµá
web1.domain.com
fld_log_ááá_áµá
á á áááá© áá áá° ášáááᥠááµá³áá» ááá ášáááµá°á ááááµ
áá¡ inetpublogsLogFiles
W3SVC1u_ex190711.áá
áá á áá«áá ááµá¥ áá«ááœá á á¥ááµ á¥áá²ááá¡ á«áµáœááá³áᢠááá³áᣠášá ááµ ášá°áá°á áµáááµ ááµ áááµ ášááá¡ á¥á«áááœá áááášá±á¢ áá á Yandex.Metrica ááµá¥ á«áá ášá£á¢á« áá£áª áá á°áá³á³á ááá¢
ááááµ áá«áµ á«á á ášááᥠáá³ á á áááá á á°ááášá° á áá³ááµ áµá³á²áµá²ááµ á¥ááá¢
á áµááá¶áœ á¥á áááá»ážá ášá°ášááá ááááŠáœ á¥ááµ
SELECT
fld_app_name,
fld_app_module,
count(fld_app_name) AS rows_count
FROM log_web
GROUP BY
fld_app_name,
fld_app_module
WITH TOTALS
ORDER BY
fld_app_name ASC,
rows_count DESC
ââfld_app_nameââââââ¬âfld_app_moduleââ¬ârows_countââ
â site1.domain.ru â web â 131441 â
â site2.domain.ru â web â 1751081 â
â site3.domain.ru â web â 106887543 â
â site3.domain.ru â svc â 44908603 â
â site3.domain.ru â intgr â 9813911 â
â site4.domain.ru â web â 772095 â
â site5.domain.ru â web â 17037221 â
â site5.domain.ru â intgr â 838559 â
â site5.domain.ru â bo â 7404 â
â site6.domain.ru â web â 595877 â
â site7.domain.ru â web â 27778858 â
ââââââââââââââââââââŽâââââââââââââââââŽâââââââââââââ
Totals:
ââfld_app_nameââ¬âfld_app_moduleââ¬ârows_countââ
â â â 210522593 â
ââââââââââââââââŽâââââââââââââââââŽâââââââââââââ
11 rows in set. Elapsed: 4.874 sec. Processed 210.52 million rows, 421.67 MB (43.19 million rows/s., 86.51 MB/s.)
á á²áµá áá á«áá ášááᥠáá á
SELECT
formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed,
formatReadableSize(sum(data_compressed_bytes)) AS compressed,
sum(rows) AS total_rows
FROM system.parts
WHERE table = 'log_web'
ââuncompressedââ¬âcompressedââ¬âtotal_rowsââ
â 54.50 GiB â 4.86 GiB â 211427094 â
ââââââââââââââââŽâââââââââââââŽâââââââââââââ
1 rows in set. Elapsed: 0.035 sec.
á á áá¶áœ ááµá¥ ášááᥠáášááªá« á°ášá
SELECT
name,
formatReadableSize(data_uncompressed_bytes) AS uncompressed,
formatReadableSize(data_compressed_bytes) AS compressed,
data_uncompressed_bytes / data_compressed_bytes AS compress_ratio
FROM system.columns
WHERE table = 'log_web'
âânameââââââââââââââââââââ¬âuncompressedââ¬âcompressedââ¬âââââcompress_ratioââ
â logdate â 401.53 MiB â 1.80 MiB â 223.16665968777315 â
â logdatetime â 803.06 MiB â 35.91 MiB â 22.363966401202305 â
â fld_log_file_name â 220.66 MiB â 2.60 MiB â 84.99905736932571 â
â fld_server_name â 201.54 MiB â 50.63 MiB â 3.980924816977078 â
â fld_app_name â 201.17 MiB â 969.17 KiB â 212.55518183686877 â
â fld_app_module â 201.17 MiB â 968.60 KiB â 212.67805817411906 â
â fld_website_name â 201.54 MiB â 1.24 MiB â 162.7204926761546 â
â serverIP â 201.54 MiB â 50.25 MiB â 4.010824061219731 â
â method â 201.53 MiB â 43.64 MiB â 4.617721053304486 â
â uriStem â 5.13 GiB â 832.51 MiB â 6.311522291936919 â
â uriQuery â 2.58 GiB â 501.06 MiB â 5.269731450124478 â
â port â 803.06 MiB â 3.98 MiB â 201.91673864241824 â
â username â 318.08 MiB â 26.93 MiB â 11.812513794583598 â
â clientIP â 2.35 GiB â 82.59 MiB â 29.132328640073343 â
â clientRealIP â 2.49 GiB â 465.05 MiB â 5.478382297052563 â
â userAgent â 18.34 GiB â 764.08 MiB â 24.57905114484208 â
â referer â 14.71 GiB â 1.37 GiB â 10.736792723669906 â
â response â 803.06 MiB â 83.81 MiB â 9.582334090987247 â
â subresponse â 399.87 MiB â 1.83 MiB â 218.4831068635027 â
â win32response â 407.86 MiB â 7.41 MiB â 55.050315514606815 â
â timetaken â 1.57 GiB â 402.06 MiB â 3.9947395692010637 â
â uriQuery__utm_medium â 208.17 MiB â 12.29 MiB â 16.936148912472955 â
â uriQuery__utm_source â 215.18 MiB â 13.00 MiB â 16.548367623199912 â
â uriQuery__utm_campaign â 381.46 MiB â 37.94 MiB â 10.055156353418509 â
â uriQuery__utm_term â 231.82 MiB â 10.78 MiB â 21.502540454070672 â
â uriQuery__utm_content â 441.34 MiB â 87.60 MiB â 5.038260760449327 â
â uriQuery__yclid â 216.88 MiB â 16.58 MiB â 13.07721335008116 â
â uriQuery__region â 204.35 MiB â 9.49 MiB â 21.52661903446796 â
ââââââââââââââââââââââââââŽâââââââââââââââŽâââââââââââââŽâââââââââââââââââââââ
28 rows in set. Elapsed: 0.005 sec.
á¥á á áá ášáá á á«ááµ áááá«
FileBeat ášááá ááááŠáœá á ááµá°ááá áá
áá á á«á á á²áµá áá ááááœá áááááᥠáááŠáœá áášá³á°áá á¥á áášááá áá° LogStash á«áµá°ááááᢠášáááᥠááµá³áá» áááᜠá á°á»áá£ážá ááá á áááá®áœ áá á°ááá (á¥ááá áá IIS)ᢠá á á«áµ ááá³ áá°á«á (áááµá ášá°ášáá©áµá ááááŠáœ áá° ááá á¥á» á«áµá°áááá). ááá áá á á°áá¥á áááá áááᜠáááµá°ááá áááá ááœáá. á«áááµ áá«áµ ááᥠááášáµ á²ááá áá á áá ááᢠášáá áááá áá° áá á°á ááµáá£áµ á¥á» áá á¥á áá á áá á«áá ááá¢
á ááááá± á²áá ááá¡ ášá áá á áá áá° áášáá»á á áá°ááááá¢
ášáá³á áá á áá á áááµááá¢
filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- C:/inetpub/logs/LogFiles/W3SVC1/*.log
exclude_files: ['.gz$','.zip$']
tail_files: true
ignore_older: 24h
fields:
fld_server_name: "site1.domain.ru"
fld_app_name: "site1.domain.ru"
fld_app_module: "web"
fld_website_name: "web-main"
- type: log
enabled: true
paths:
- C:/inetpub/logs/LogFiles/__Import/access_log-*
exclude_files: ['.gz$','.zip$']
tail_files: false
fields:
fld_server_name: "site2.domain.ru"
fld_app_name: "site2.domain.ru"
fld_app_module: "web"
fld_website_name: "web-main"
fld_logformat: "logformat__apache"
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
reload.period: 2s
output.logstash:
hosts: ["log.domain.com:5044"]
ssl.enabled: true
ssl.certificate_authorities: ["C:/filebeat/certs/ca.pem", "C:/filebeat/certs/ca-issuing.pem"]
ssl.certificate: "C:/filebeat/certs/site1.domain.ru.cer"
ssl.key: "C:/filebeat/certs/site1.domain.ru.key"
#================================ Processors =====================================
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
logstash. ášáááᥠááµá³áá» á°á¥á³á¢
áá á á«á ášá°áá°áá ášáááá¢áµ (ááá á RabbitMQ áášá) ášáááᥠááµá³áá»ááœá áááá á ááᣠá ClickHouse ášááᥠáá³ ááµá¥ á¥á ááœá áá°áá°á á¥á ááµáá£áµá¢
áá° ClickHouse áááµáá£áµ áš Logstash-output-clickhouse á°á°áª á¥á á áá ááááᢠᚠLogstash áááá ášá¥á«á áᎠá áá ᣠáá á áá°á áááµ áááᵠᣠá ááááá±á á á«á± ááá ášá°á»á ááᢠá²áá ááá¥áá¶áœ á RabbitMQ áášá ááµá¥ áášáá»á, áµááá áááá«á áášá á áá ášáá, á á áááá®á¹ áá Filebeats á ááá ášá°á»á áá. RabbitMQ á¥á á áá á ááááá áµ á¥á áµ (á á á«á£á¢á á áá³ášáášá¥ áá, Filebeat á áá¥á³ áá° Logstash áááᥠááµá³áá»ááœá ááá«á), Filebeats á á£á á°áá£áááµ á«áá á¥á á°á ááá± á á°á á á ááá³ áá°á«á, áµááá áá¥áá± ášáá€áµ á áááááµ á«áááá ááá á«ááá.
ášáá³á áá á áá á áááµááá¢
log_web__filebeat_clickhouse.conf
input {
beats {
port => 5044
type => 'iis'
ssl => true
ssl_certificate_authorities => ["/etc/logstash/certs/ca.cer", "/etc/logstash/certs/ca-issuing.cer"]
ssl_certificate => "/etc/logstash/certs/server.cer"
ssl_key => "/etc/logstash/certs/server-pkcs8.key"
ssl_verify_mode => "peer"
add_field => {
"fld_server_name" => "%{[fields][fld_server_name]}"
"fld_app_name" => "%{[fields][fld_app_name]}"
"fld_app_module" => "%{[fields][fld_app_module]}"
"fld_website_name" => "%{[fields][fld_website_name]}"
"fld_log_file_name" => "%{source}"
"fld_logformat" => "%{[fields][fld_logformat]}"
}
}
rabbitmq {
host => "queue.domain.com"
port => 5671
user => "q-reader"
password => "password"
queue => "web_log"
heartbeat => 30
durable => true
ssl => true
#ssl_certificate_path => "/etc/logstash/certs/server.p12"
#ssl_certificate_password => "password"
add_field => {
"fld_server_name" => "%{[fields][fld_server_name]}"
"fld_app_name" => "%{[fields][fld_app_name]}"
"fld_app_module" => "%{[fields][fld_app_module]}"
"fld_website_name" => "%{[fields][fld_website_name]}"
"fld_log_file_name" => "%{source}"
"fld_logformat" => "%{[fields][fld_logformat]}"
}
}
}
filter {
if [message] =~ "^#" {
drop {}
}
if [fld_logformat] == "logformat__iis_with_xrealip" {
grok {
match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken} %{NOTSPACE:xrealIP} %{NOTSPACE:xforwarderfor}"]
}
} else {
grok {
match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken}"]
}
}
date {
match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
timezone => "Etc/UTC"
remove_field => [ "log_timestamp", "@timestamp" ]
target => [ "log_timestamp2" ]
}
ruby {
code => "tstamp = event.get('log_timestamp2').to_i
event.set('logdatetime', Time.at(tstamp).strftime('%Y-%m-%d %H:%M:%S'))
event.set('logdate', Time.at(tstamp).strftime('%Y-%m-%d'))"
}
if [bytesSent] {
ruby {
code => "event['kilobytesSent'] = event['bytesSent'].to_i / 1024.0"
}
}
if [bytesReceived] {
ruby {
code => "event['kilobytesReceived'] = event['bytesReceived'].to_i / 1024.0"
}
}
ruby {
code => "event.set('clientRealIP', event.get('clientIP'))"
}
if [xrealIP] {
ruby {
code => "event.set('clientRealIP', event.get('xrealIP'))"
}
}
if [xforwarderfor] {
ruby {
code => "event.set('clientRealIP', event.get('xforwarderfor'))"
}
}
mutate {
convert => ["bytesSent", "integer"]
convert => ["bytesReceived", "integer"]
convert => ["timetaken", "integer"]
convert => ["port", "integer"]
add_field => {
"clientHostname" => "%{clientIP}"
}
}
useragent {
source=> "useragent"
prefix=> "browser"
}
kv {
source => "uriQuery"
prefix => "uriQuery__"
allow_duplicate_values => false
field_split => "&"
include_keys => [ "utm_medium", "utm_source", "utm_campaign", "utm_term", "utm_content", "yclid", "region" ]
}
mutate {
join => { "uriQuery__utm_source" => "," }
join => { "uriQuery__utm_medium" => "," }
join => { "uriQuery__utm_campaign" => "," }
join => { "uriQuery__utm_term" => "," }
join => { "uriQuery__utm_content" => "," }
join => { "uriQuery__yclid" => "," }
join => { "uriQuery__region" => "," }
}
}
output {
#stdout {codec => rubydebug}
clickhouse {
headers => ["Authorization", "Basic abcdsfks..."]
http_hosts => ["http://127.0.0.1:8123"]
save_dir => "/etc/logstash/tmp"
table => "log_web"
request_tolerance => 1
flush_size => 10000
idle_flush_time => 1
mutations => {
"fld_log_file_name" => "fld_log_file_name"
"fld_server_name" => "fld_server_name"
"fld_app_name" => "fld_app_name"
"fld_app_module" => "fld_app_module"
"fld_website_name" => "fld_website_name"
"logdatetime" => "logdatetime"
"logdate" => "logdate"
"serverIP" => "serverIP"
"method" => "method"
"uriStem" => "uriStem"
"uriQuery" => "uriQuery"
"port" => "port"
"username" => "username"
"clientIP" => "clientIP"
"clientRealIP" => "clientRealIP"
"userAgent" => "userAgent"
"referer" => "referer"
"response" => "response"
"subresponse" => "subresponse"
"win32response" => "win32response"
"timetaken" => "timetaken"
"uriQuery__utm_medium" => "uriQuery__utm_medium"
"uriQuery__utm_source" => "uriQuery__utm_source"
"uriQuery__utm_campaign" => "uriQuery__utm_campaign"
"uriQuery__utm_term" => "uriQuery__utm_term"
"uriQuery__utm_content" => "uriQuery__utm_content"
"uriQuery__yclid" => "uriQuery__yclid"
"uriQuery__region" => "uriQuery__region"
}
}
}
pipelines.yml
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: log_web__filebeat_clickhouse
path.config: "/etc/logstash/log_web__filebeat_clickhouse.conf"
á á á³ á€áµ. ášáááᥠááµá³áá» áášáá»
ášááá áµááá¶áœ áááᥠááµá³áá»áᜠá á ááµ á áá ášá¥ ááµá¥ áááá£á (á áœáá ááááªá« áá áááášá±). áµá á¥á«ááᜠáášáá ááášáážáµ ášá³á°á áá-ááá áááªá«áᜠáá°áá«á© á áážá¶áœ á°áá³á³á áážá, á¥áá° IIS ááááœ, apache á¥á nginx logs. ááá°áá áªá« áááᥠááµá³áá»ááœ, ááá³á, áµá á°á¶áœ, ášáášá ááááá¶áœ, ááµá áááá«áᜠášá°áááá¡á áµ, ášá°ááš á áá ášá¥ á á°áá¢á ááá á (á á áá áá á ááµá á°ášá) áááá£á.
á ášáŽáá á²ááµá áááá ááá ááá°á á á£á á áµááá áá (á áášáá»á áá
áµ áášáá ášááášá) ᢠášááᥠáášááá« á¥á ášáá áá
áá¥ááµ áá á á áá
áá ášá°áá°ášá° áá. á á¥á áá³á, ááá ááá áá
áµá¥áá á (fld_app_nameᣠfld_app_moduleᣠlogdatetime)
áá
á áááµ á áµááá± áµá, ášáµááá± á á«á áµá á¥á ášááá
á± áá. ááááªá« áá ášááµá°á± áá ááááªá« áá£. áá° áášášá»á áŠá³ ášá°áááš á ááᣠáá ááᜠá á¥á¥á áá¥ááµ ááµá«áµ ááá©á¢ áááá ááá ááášá á°áá ášá¡á á¥áá°áá ááá á á¥á ááá¡á á¥áá°áá áá«á á«áµááááá ClickHouse á á²áµá áá á«ááá áášá á¥áá°áá ááá°áá°á. áá
ášá£áµ ááá ááá£áµááá
á áá°áá°á ááá ááµá¥ áá áá«á°áµ á¥áá³áá áµ á¥á áá°á¥ á¥á© áá³á¥ ááá¢
á á°ášááªá ášááá«áá²ááá² ášááᥠá áááµ á á áá»á«áááµ á á áᥠáá áµáªá¶áœ ááµá¥ á¥áá°á³áš áᥠáá£á ááá£á. á áá ááá áµ áá áá á°á á«áá²áá² (á¥ááµ á áá«á®áœ) ááážá ááµá®áœ ášá³áá áášá áá á á á¥á á áááá³á.
áµáªáµ 19.6 á á áá áá á¥á á áá ášáá á²áá áá° á á²á± áµáªáµ ááááá á á á°ááᢠá¥áá° Adaptive GranularityᣠSkipping Indices á¥á DoubleDelta Codecᣠááá³á áµáá á£á áªá«áµ á áážáá¢
á áá£áª, á áá«á áá, ášááá¢á« á°ášá ááášá³á°á á°ááá¥á¯á. ááááŠá¹ ááœášášášá«á á¥á áááá£á, áá á á°áá³á³á áá á¥áµáš ááá£ááµ áµášáµ áá°áá. ááá ááááµ ášáá, ášááµá áááá« á°ášááá áááááµ ááœáá, ášáá« ášáááᥠááµá³áá»á áá á á ášáá°á ááá³ áááá³á. ášáááᥠááµá³áá»á á config.xml ááá ááµá¥ á°ááá á·áá¡
<!-- Possible levels: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger. h#L105 -->
<level>warning</level>
á áá³ááµ á áá áµááááœ
ÐПÑкПлÑÐºÑ ÐŸÑОгОМалÑÐœÑе пакеÑÑ ÑÑÑаМПвкО ÑПбОÑаÑÑÑÑ Ð¿ÐŸ Debian, ÑП ÐŽÐ»Ñ ÐŽÑÑгОÑ
веÑÑОй Linux МеПбÑ
ПЎОЌП ОÑпПлÑзПваÑÑ Ð¿Ð°ÐºÐµÑÑ ÑПбÑаММÑе кПЌпаМОей Altinity.
ÐÐŸÑ Ð¿ÐŸ ÑÑПй ÑÑÑлке еÑÑÑ ÐžÐœÑÑÑÑкÑОО Ñ ÑÑÑлкаЌО Ма ОÑ
ÑепПзОÑПÑОй: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch
1. пÑПвеÑка ÑÑаÑÑÑа
sudo systemctl status clickhouse-server
2. ПÑÑаМПвка ÑеÑвеÑа
sudo systemctl stop clickhouse-server
3. запÑÑк ÑеÑвеÑа
sudo systemctl start clickhouse-server
ÐапÑÑк ÐŽÐ»Ñ Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÑ Ð·Ð°Ð¿ÑПÑПв в ЌМПгПÑÑÑПÑМПЌ ÑежОЌе (вÑпПлМеМОе пПÑле зМака ";")
clickhouse-client --multiline
clickhouse-client --multiline --host 127.0.0.1 --password pa55w0rd
clickhouse-client --multiline --host 127.0.0.1 --port 9440 --secure --user default --password pa55w0rd
ÐлагОМ клОклаÑза ÐŽÐ»Ñ Ð»ÐŸÐ³ÑÑÐµÑ Ð² ÑлÑÑае ПÑОбкО в ПЎМПй ÑÑÑПке ÑПÑ
ÑаМÑÐµÑ Ð²ÑÑ Ð¿Ð°ÑÐºÑ Ð² Ñайл /tmp/log_web_failed.json
ÐПжМП вÑÑÑÐœÑÑ ÐžÑпÑавОÑÑ ÑÑÐŸÑ Ñайл О пПпÑПбПваÑÑ Ð·Ð°Ð»ÐžÑÑ ÐµÐ³ÐŸ в ÐРвÑÑÑÐœÑÑ:
clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed.json /etc/logstash/tmp/log_web_failed__fixed.json
sudo chown user_dev /etc/logstash/tmp/log_web_failed__fixed.json
sudo clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /etc/logstash/tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed__fixed.json /etc/logstash/tmp/log_web_failed__fixed_.json
вÑÑ
ПЎ Оз кПЌаМЎМПй ÑÑÑПкО
quit;
## ÐаÑÑÑПйка TLS
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2
openssl s_client -connect log.domain.com:9440 < /dev/null
logstash. á«áá°áá ášáááá¢áµ áá° RabbitMQ áášá á«áµáá¡
áá á á«á ášáááá¢áµ ášááá¡áµá áááᥠááµá³áá»áᜠáá° RabbitMQ áášá áááá«áµ áá á ááᢠá¥áá áááµ áá¥áŠáœ á á.
- á¥áá° á ááá³á°á áá FileBeat á áá¥á³ áá° RabbitMQ ášááœá ášáá€áµ á°á°áª ášáááᢠá¥á á¥áá°áá á áááµ á°áá£á«áááµ, á github áá á£áá áá³á áá á áááá, ááµáá á« ášá³áá° á áá°áá. áá«áá« áááá á áᣠáá á áá áááá«áµ á á€áµ ááµá¥ ááá ááá áµ á ááœááá¢
- á DMZ ááµá¥ áááᥠááµá³áá»ááœá ááá°á¥á°á¥ ááµááá¶áœ á á. á á¥áá± áá á áááµášáµ, áááᥠááµá³áá»áá¹ ááááªá« áá° áášáá áášáá á áá£ážá ášáá«á LogStash ááááŠá¹á ášáášáá ášáá á«áá£á.
áµááá , á ááµ á°á áµáᜠášá°áá³á°á á¥á áµ áá áá á«áá áµ á á²á€áá€áµ ááµá¥ á áááá®áœ á áááá áµ áá áá. ášáá³á áá á áá á áááµááá¢
iis_w3c_logs__filebeat_rabbitmq.conf
input {
beats {
port => 5044
type => 'iis'
ssl => true
ssl_certificate_authorities => ["/etc/pki/tls/certs/app/ca.pem", "/etc/pki/tls/certs/app/ca-issuing.pem"]
ssl_certificate => "/etc/pki/tls/certs/app/queue.domain.com.cer"
ssl_key => "/etc/pki/tls/certs/app/queue.domain.com-pkcs8.key"
ssl_verify_mode => "peer"
}
}
output {
#stdout {codec => rubydebug}
rabbitmq {
host => "127.0.0.1"
port => 5672
exchange => "monitor.direct"
exchange_type => "direct"
key => "%{[fields][fld_app_name]}"
user => "q-writer"
password => "password"
ssl => false
}
}
RabbitMQ ášáááááµ áášá
áá á á«á á DMZ ááµá¥ ášáááᥠááµá³áá»ááœá áááµááᥠáá á ááᢠáášá» ášáášáááá á áááá¢áµ â LogStash áµá¥áµá¥ ááᢠááá ᥠášáá«áá°á ášDMZ á᪠á LogStash á á©á ááᢠá RabboitMQ á á©á á²á°á« á á°ášááµ áá° 4 áºá ášáá á ááá¥áá¶áœ ááµá°ááá³áá¢
ášááá¥ááµ ááááá á áµáááµ áµá ášá°áááš ááᣠáááµá á áááá¢áµ áá á ááᥠáá á áááµášáµá¢ ááá ááááá¶áœ áá° á ááµ áášá ááá³áᢠá áá áááá«áµ ášáášá á áááááµ ášáá áá áá° ááá¥áá¶áœ áá¥ááµ á ááá«á: FileBeats ášáááááµ áµá á°á¶áœá ááá áá á¥á áááá áááá á«ááá. á¥á LogStash ášáášáá áá ášáá«áᥠášá áá³áš áášá¥ áµá á°á¶áœá ááá áá á¥á ááááá± áá°áá ášá áµ á¥áµáªáááµ áµášáµ áá á¥ááᢠá áá ááá³, ááá¡, á á¥ááá¥, ášá áá á áá áá° ášááᥠáá³ á áá»áá.
ášáášá°ááµ áááªá«áᜠáášáááœá áááá á á¥á ááááá á¥á á áá ááááá¢
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare exchange --vhost=/ name=monitor.direct type=direct sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare queue --vhost=/ name=web_log durable=true
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site1.domain.ru"
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site2.domain.ru"
áá«áá á³áœáŠáá¶áœ
áá á á«á ášááµáµá ááá¥á á ááµá ááá³ášáµ á«áááááᢠá áá á áá£á ááá«áá 4.6+ áááá áš ClickHouse á³á³ áááá áá«á á ááŠáµá¢ á á³áœáŠáá± áá ášSQL áá£áªá«ááœá ášááµá¬áµ á áá¥ááá ááá»á»á áµáᜠááµá°á«ášá áá ášá¥áá¢
ááá³á, á°áááá®áœá á¥áá áááá, á¥á á áá£áªá«á ááµá ááµá¥ á«áá°ááá©, á á á¹ WHERE ( uriStem = » AND uriStem ! = ») ááµá¥ ááá³á á¥áá³á«áᣠá¥áááááá. á áá á áá£á ClickHouse áš uriStem á ááµ á«áá£áᢠá á á áááᣠášá°áá«á© á áá«á®áœá ááášá á áášášá» á°á°áªáá á áµá°á«áááá (áš$valueIfEmpty ááá®) á£á¶ á¥áŽáµ ášáá áá á áá±á á³áá á áµ 1 áááá³áá¢
á¥á á áá áá áá áá áá ááá«á áá áá ááœááá¢
$columns(response, count(*) c) from $table where $adhoc
and $valueIfEmpty($fld_app_name, 1, fld_app_name = '$fld_app_name')
and $valueIfEmpty($fld_app_module, 1, fld_app_module = '$fld_app_module') and $valueIfEmpty($fld_server_name, 1, fld_server_name = '$fld_server_name') and $valueIfEmpty($uriStem, 1, uriStem like '%$uriStem%')
and $valueIfEmpty($clientRealIP, 1, clientRealIP = '$clientRealIP')
áá° SQL á¥áá°áá áá°ášááá (á£á¶ áš uriStem ááµá®áœ áá° 1 á¥á» á¥áá°á°áášá© áᥠáá á)
SELECT
t,
groupArray((response, c)) AS groupArr
FROM (
SELECT
(intDiv(toUInt32(logdatetime), 60) * 60) * 1000 AS t, response,
count(*) AS c FROM default.log_web
WHERE (logdate >= toDate(1565061982)) AND (logdatetime >= toDateTime(1565061982)) AND 1 AND (fld_app_name = 'site1.domain.ru') AND (fld_app_module = 'web') AND 1 AND 1 AND 1
GROUP BY
t, response
ORDER BY
t ASC,
response ASC
)
GROUP BY t ORDER BY t ASC
áá°áá°áá«
áš ClickHouse á³á³á€á ááœá³ á áá á«á ááµá¥ áµáá áŠá³ ášáá°á á ááµá°áµ áááᢠáá á áá ášááá« áá á áá á áœá áµ ášáµáá áášá áá áááµá«áµ áááá á¥á á°áá£á«á áá³áªá« á¥áá°á«áá ááááµ ášá£áµ áá áᢠá¥ááᥠááᣠáááá¶áœ á¥ášášáá© á²áá± (ááá³áᣠááá«áµ á¥á áá° á¥á á áááá®áœ áá£ááµ) á¥á á± áá áᥠášá°áá³á°á ááááᢠáá á ááááªá« áááá€áᜠᣠášáá ášááᥠáá³ áá á á¥á® áá¥á«áµ á á£á á áµá°á³áœ ááᢠááá± "áá°ááœ" ášá°á°á« áááá áášáµ áá»áá.
áš ElasticSearch áá á²áááá ášáášáá» á¥á ášáááá£á áªá« áá ášá ááµáµ á¥áµáš á áµá á¥á¥á á¥áá°ááááµ áááá³áᢠá áá á áááá á áá ááá ášáášá áá á ášá áá«á³ ááœáᜠáááµá°á áááááµ á«áá¥á ClickHouse áµáá áá á ááµ á ááµá°á ááá á«áá ááœá áá áááᢠá áᣠá á¥ááá¥á£ ElasticSearch á á²áµá áá ášáášá áášááªá« ááŽáᜠá¥á ááᜠášáá¥áµ ááá³á á á¥á á ášáááá± á£á áªá«áµ á ááµá£ ááá áá áš ClickHouse áá á²áá³á°á áá ášá áá ááµ ááááá¢
á á¥á á á©á ááá áá© ááá»ážáµ ášáá á áá£áª á áá á¶áœ áá, ááá¥á áá«á á¥á ášáášá ááµ ááµá¥ ááášá¥ á áá«áµá°áá áá¥ááµ áá°á«á. á¥áµá«áá á¥á áášá ášááá (áá° 200 ááá®á ááááŠáœ) ᣠáá á áááá© á«á± á°á«á ááᢠáá áá áá³áªá« ááá°áá± áááᥠááµá³áá»ááœá ášáá á«áá áá áá°á«á«á ááᜠááááᜠááá ááá áµ á¥ááœááá. ááá³á, ášá«á á¥áµáš á«á áµáá³á, á á°á áááµ ááµá, ášááœá áµáá ááµ.
á áášášá» ᣠáµá á¥á áá¹ á¥á áá³á¶áœ áµááœá¢
ÐОМÑÑÑ
- á áµááá áµá¥áµáŠáœ ááááŠáœá á áá«á áá. á á ááµ á á©á, áá á£á ᪠áá, ááá áá á ááá á°ášá᪠ááááœá á ááááŠáœ ááá« áá áá á áá¥ááµ. áá á°áá£á áááá ááá á áá°áá, áá á ááá ááá³ ášááœá áá. á¥á á¥á á±á ááá ááµášá á¥ááááá.
- á áá³ááµ á«áá°ááá± á°áá£á«áµ ááá á á²áµ á£á áªá«áµ á¥ááá áá á á á²áµ áµáªá¶áœ ááµá¥ áá°á á«á. áá ááááµá á«áµášáµáá, áá° á á²áµ áµáªáµ ášáá»á»á ááááµ áááá³á. ááá³á, ášá«áá« ášá ášáŽá áá°á ážááŸáœá á³áá°áá á© ášá«áá« ááµá°á¶áœá á áá¥á³ á¥áá²á«áá¡ ášáá«áµáœáá á á£á á áá á£á ᪠áá. ááá áá á github áá á£á áá³á®áœ á¥ááµ á áááá áá áá áá°á á áááµ ááµá¥ á¥áá³áá áá á ááá á¥áá áááááᢠááá áµááá°á áááá¶áœá áá° áá á«áá°ášá á¥á áááá á°áá£á á«áá°á áá ášáá« á á°ášáá ááá³ áá°á«áá¢
á°áá
- á áááááá¢
- áá á°á ášááá¢á« áá°á¥á¢
- áááµ ááá.
- ááá.
- áááᜠá á°áᥠ(ášá³á¥á ááµá¥ áášááá/áá£ááµ)
- á á®ááá¬áœá áááµáŽá ášá°á ááá ášá©áµá« á¶ááµáá áááᥠááµá¥ á°á«áµá·á.
- áš Yandex áŠááŽáá áµáá ááááµ.
ááá: hab.com