Upami anjeun kantos nganggo antarmuka wéb pikeun ningali log, maka anjeun panginten perhatikeun kumaha, biasana, antarmuka ieu pajeujeut sareng (sering) henteu merenah sareng responsif. Sababaraha anjeun tiasa biasa, sababaraha leres pisan pikasieuneun, tapi sigana kuring yén alesan pikeun sadaya masalah nyaéta yén urang ngadeukeutan tugas ningali log anu teu leres: urang nyobian nyiptakeun antarmuka wéb dimana CLI (antarmuka garis paréntah). jalan hadé. Kuring pribadi pisan nyaman gawé bareng buntut, grep, awk jeung nu lianna, sarta ku kituna pikeun kuring panganteur idéal pikeun gawé bareng log bakal jadi hal sarupa buntut na grep, tapi nu ogé bisa dipaké pikeun maca log nu datang ti loba server . Maksudna, tangtosna, baca aranjeunna tina ClickHouse!
*numutkeun pendapat pribadi pangguna habra
Papanggih logscli
Kuring henteu mendakan nami pikeun antarmuka kuring, sareng, jujur, éta aya dina bentuk prototipe, tapi upami anjeun hoyong langsung ningali kode sumber, maka anjeun wilujeng sumping:
kasempetan
Tujuanana kuring nyaéta ngadamel antarbeungeut anu sigana wawuh ka jalma anu biasa buntut / grep, nyaéta, pikeun ngadukung hal-hal ieu:
- Tempo sadaya log, tanpa nyaring.
- Ninggalkeun garis anu ngandung substring tetep (bandéra
-F
уgrep
). - Ninggalkeun garis anu cocog sareng ekspresi biasa (bandéra
-E
уgrep
). - Sacara standar, nempoan dina urutan kronologis sabalikna, sabab log panganyarna biasana dipikaresep munggaran.
- Témbongkeun kontéks gigireun unggal baris (options
-A
,-B
и-C
уgrep
, nyitak garis N saméméh, sanggeus, jeung sabudeureun unggal garis cocog, mungguh). - Ningali log asup sacara real waktos, nganggo atanapi tanpa nyaring (dasarna
tail -f | grep
). - Antarbeungeut kedah cocog sareng
less
,head
,tail
sareng anu sanésna - sacara standar, hasilna kedah dipulangkeun tanpa larangan dina jumlahna; garis anu dicitak salaku stream a salami pamaké kabetot dina narima aranjeunna; sinyalSIGPIPE
kedah cicingeun ngaganggu streaming log, sapertos aranjeunnatail
,grep
jeung Utiliti UNIX séjén.
Реализация
Kuring bakal nganggap yén anjeun parantos terang kumaha nganteurkeun log ka ClickHouse. Lamun henteu, abdi nyarankeun nyobian eta
Kahiji maneh kudu mutuskeun dina skéma dasar. Kusabab anjeun biasana hoyong nampi log anu diurutkeun dumasar kana waktos, sigana logis pikeun nyimpen éta ku cara éta. Upami aya seueur kategori log sareng aranjeunna sadayana jinis anu sami, maka anjeun tiasa ngadamel kategori log salaku kolom mimiti konci primér - ieu bakal ngamungkinkeun anjeun gaduh hiji méja tibatan sababaraha, anu bakal janten tambah ageung nalika nyelapkeun kana ClickHouse (dina server sareng hard drive, disarankeun pikeun ngalebetkeun data henteu langkung ti ~1 kali per detik pikeun sakabéh server).
Hartina, urang peryogi kira-kira skéma tabel di handap ieu:
CREATE TABLE logs(
category LowCardinality(String), -- категория логов (опционально)
time DateTime, -- время события
millis UInt16, -- миллисекунды (могут быть и микросекунды, и т.д.): рекомендуется хранить, если событий много, чтобы было легче различать события между собой
..., -- ваши собственные поля, например имя сервера, уровень логирования, и так далее
message String -- текст сообщения
) ENGINE=MergeTree()
ORDER BY (category, time, millis)
Hanjakalna, kuring henteu langsung mendakan sumber kabuka kalayan log anu réalistis anu tiasa dicandak sareng diunduh, janten kuring nyandak ieu salaku conto.
parentah pikeun unggah ulasan Amazon ka ClickHouse
Hayu urang nyieun tabel:
CREATE TABLE amazon(
review_date Date,
time DateTime DEFAULT toDateTime(toUInt32(review_date) * 86400 + rand() % 86400),
millis UInt16 DEFAULT rand() % 1000,
marketplace LowCardinality(String),
customer_id Int64,
review_id String,
product_id LowCardinality(String),
product_parent Int64,
product_title String,
product_category LowCardinality(String),
star_rating UInt8,
helpful_votes UInt32,
total_votes UInt32,
vine FixedString(1),
verified_purchase FixedString(1),
review_headline String,
review_body String
)
ENGINE=MergeTree()
ORDER BY (time, millis)
SETTINGS index_granularity=8192
Dina susunan data Amazon ngan ukur aya tanggal pikeun ulasan, tapi henteu aya waktos anu pasti, janten hayu urang ngeusian data ieu nganggo randon.
Anjeun teu kedah ngaunduh sadaya file tsv sareng ngawatesan diri ka anu munggaran ~ 10-20 pikeun kéngingkeun set data anu lumayan ageung anu henteu cocog sareng 16 GB RAM. Pikeun unggah file TSV kuring nganggo paréntah di handap ieu:
for i in *.tsv; do
echo $i;
tail -n +2 $i | pv |
clickhouse-client --input_format_allow_errors_ratio 0.5 --query='INSERT INTO amazon(marketplace,customer_id,review_id,product_id,product_parent,product_title,product_category,star_rating,helpful_votes,total_votes,vine,verified_purchase,review_headline,review_body,review_date) FORMAT TabSeparated'
done
Dina Persistent Disk standar (anu mangrupikeun HDD) dina Google Cloud kalayan ukuran 1000 GB (Kuring nyandak ukuran ieu utamina supados lajuna rada luhur, sanaos SSD tina ukuran anu diperyogikeun bakal langkung mirah) unggah. speed éta kira ~ 75 MB / detik dina 4 cores.
- Abdi kedah ngadamel reservasi yén kuring damel di Google, tapi kuring nganggo akun pribadi sareng tulisan ieu henteu aya hubunganana sareng padamelan kuring di perusahaan.
Kuring bakal ngahasilkeun sagala ilustrasi kalawan dataset tinangtu ieu, saprak ieu téh sadayana kuring kungsi on leungeun.
Témbongkeun kamajuan scanning data
Kusabab di ClickHouse kami bakal ngagunakeun scan pinuh dina méja kalayan log, sareng operasi ieu tiasa nyandak waktos anu ageung sareng moal ngahasilkeun hasil anu lami upami sababaraha patandingan kapanggih, disarankeun pikeun nunjukkeun kamajuan query nepi ka baris kahiji jeung hasilna narima. Jang ngalampahkeun ieu, aya parameter dina panganteur HTTP nu ngidinan Anjeun pikeun ngirim kamajuan dina headers HTTP: send_progress_in_http_headers=1
. Hanjakal, perpustakaan Go standar teu bisa maca header sakumaha aranjeunna nampi, tapi HTTP 1.0 panganteur (teu aya patalina jeung 1.1!) Dirojong ku ClickHouse, jadi Anjeun bisa muka sambungan TCP atah mun ClickHouse sarta ngirimkeunana ka dinya. GET /?query=... HTTP/1.0nn
sarta nampa lulugu respon jeung awak tanpa escaping atawa enkripsi, jadi dina hal ieu urang malah teu kedah nganggo perpustakaan baku.
Streaming log ti ClickHouse
ClickHouse geus miboga optimasi pikeun queries kalawan ORDER BY pikeun lila (ti 2019?), Jadi query kawas
SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC
Bakal langsung ngawitan balik garis nu boga substring "hal" dina pesen maranéhanana, tanpa ngantosan scan nepi ka rengse.
Ogé, éta bakal pisan merenah lamun ClickHouse sorangan ngabolaykeun pamundut teh nalika sambungan ka dinya ditutup, tapi ieu teu kabiasaan standar. Pembatalan pamundut otomatis tiasa diaktipkeun nganggo pilihan cancel_http_readonly_queries_on_client_close=1
.
Penanganan anu leres tina SIGPIPE di Go
Lamun anjeun ngaéksekusi, sebutkeun, paréntah some_cmd | head -n 10
persis kumaha paréntah some_cmd
eureun palaksanaan nalika head
dikurangan 10 garis? Dina jawaban eta basajan: iraha head
tungtung, pipa nutup, sarta stdout paréntah some_cmd mimiti nunjuk, conditionally, "ka nowhere". Iraha some_cmd
nyobian nyerat kana pipa anu ditutup,
Dina Go ieu ogé kajantenan sacara standar, tapi panangan sinyal SIGPIPE ogé nyitak "sinyal: SIGPIPE" atanapi pesen anu sami dina tungtungna, sareng pikeun mupus pesen ieu kami ngan ukur kedah nanganan SIGPIPE ku cara anu dipikahoyong, nyaéta, ngan cicingeun. Kaluar:
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
<-ch
os.Exit(0)
}()
Témbongkeun kontéks pesen
Sering anjeun hoyong ningali kontéks anu aya sababaraha kasalahan (contona, pamundut anu nyababkeun panik, atanapi masalah naon waé anu katingali sateuacan kacilakaan), sareng dina grep
Hal ieu dilakukeun nganggo pilihan -A, -B, sareng -C, anu nunjukkeun jumlah garis anu ditangtukeun masing-masing saatos, sateuacan, sareng sakitar pesen.
Hanjakalna, kuring henteu acan mendakan cara anu gampang pikeun ngalakukeun hal anu sami di ClickHouse, ku kituna pikeun nampilkeun kontéksna, pamundut tambahan sapertos kieu dikirim ka unggal garis hasilna (detailna gumantung kana asihan sareng naha kontéksna dipidangkeun sateuacanna. atanapi saatos):
SELECT time,millis,review_body FROM amazon
WHERE (time = 'ВРЕМЯ_СОБЫТИЯ' AND millis < МИЛЛИСЕКУНДЫ_СОБЫТИЯ) OR (time < 'ВРЕМЯ_СОБЫТИЯ')
ORDER BY time DESC, millis DESC
LIMIT КОЛИЧЕСТВО_СТРОК_КОНТЕКСТА
SETTINGS max_threads=1
Kusabab pamundut ieu dikirim ampir langsung saatos ClickHouse mulih garis pakait, éta ends up dina cache sarta sacara umum pamundut ieu dieksekusi rada gancang sarta meakeun CPU saeutik (biasana pamundut nyokot ngeunaan ~ 6 mdet dina mesin virtual kuring).
Tampilkeun pesen anyar sacara real waktos
Pikeun nunjukkeun pesen anu asup dina (ampir) waktos nyata, urang ngan ukur ngalaksanakeun pamundut sakali unggal sababaraha detik, nginget cap waktos anu terakhir anu urang tepang sateuacanna.
Conto paréntah
Naon parentah logscli has kasampak kawas dina prakna?
Upami anjeun ngaunduh set data Amazon anu kuring nyarios dina awal tulisan, anjeun tiasa ngajalankeun paréntah di handap ieu:
# Показать строки, где встречается слово walmart
$ logscli -F 'walmart' | less
# Показать самые свежие 10 строк, где встречается "terrible"
$ logscli -F terrible -limit 10
# То же самое без -limit:
$ logscli -F terrible | head -n 10
# Показать все строки, подходящие под /times [0-9]/, написанные для vine и у которых высокий рейтинг
$ logscli -E 'times [0-9]' -where="vine='Y' AND star_rating>4" | less
# Показать все строки со словом "panic" и 3 строки контекста вокруг
$ logscli -F 'panic' -C 3 | less
# Непрерывно показывать новые строки со словом "5-star"
$ logscli -F '5-star' -tailf
rujukan
Kodeu utilitas (tanpa dokuméntasi) sayogi dina github di
sumber: www.habr.com