Kami ngembangkeun antarbeungeut anu pangmerenahna di dunya * pikeun ningali log

Kami ngembangkeun antarbeungeut anu pangmerenahna di dunya * pikeun ningali log 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 anjeunROCK

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: https://github.com/YuriyNasretdinov/logscli (350 baris kode Go dipilih).

kasempetan

Tujuanana kuring nyaéta ngadamel antarbeungeut anu sigana wawuh ka jalma anu biasa buntut / grep, nyaéta, pikeun ngadukung hal-hal ieu:

  1. Tempo sadaya log, tanpa nyaring.
  2. Ninggalkeun garis anu ngandung substring tetep (bandéra -F у grep).
  3. Ninggalkeun garis anu cocog sareng ekspresi biasa (bandéra -E у grep).
  4. Sacara standar, nempoan dina urutan kronologis sabalikna, sabab log panganyarna biasana dipikaresep munggaran.
  5. 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).
  6. Ningali log asup sacara real waktos, nganggo atanapi tanpa nyaring (dasarna tail -f | grep).
  7. 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; sinyal SIGPIPE kedah cicingeun ngaganggu streaming log, sapertos aranjeunna tail, 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 lsd и imah anak ucingjeung artikel ieu ngeunaan pangiriman log.

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. ulasan produk ti Amazon saméméh 2015. Tangtosna, strukturna henteu persis sami sareng log téks, tapi pikeun tujuan ilustrasi ieu henteu penting.

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 10persis 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, eta narima sinyal SIGPIPE, nu cicingeun terminates program sacara standar.

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 https://github.com/YuriyNasretdinov/logscli. Abdi bakal bungah ngadangu pikiran anjeun dina pamanggih kuring pikeun panganteur konsol pikeun nempo log dumasar kana ClickHouse.

sumber: www.habr.com

Tambahkeun komentar