Kita ngembangake antarmuka sing paling trep ing donya * kanggo ndeleng log

Kita ngembangake antarmuka sing paling trep ing donya * kanggo ndeleng log Yen sampeyan wis nate nggunakake antarmuka web kanggo ndeleng log, mula sampeyan bisa uga ngerteni kepiye, minangka aturan, antarmuka kasebut rumit lan (asring) ora trep lan responsif. Sawetara sampeyan bisa digunakake kanggo, sawetara pancen elek, nanging misale jek kula sing alesan kanggo kabeh masalah iku kita nyedhaki tugas kanggo ndeleng log salah: kita nyoba kanggo nggawe antarmuka web ngendi CLI (antarmuka baris printah). dianggo luwih apik. Aku wong seneng banget nggarap buntut, grep, awk lan liya-liyane, lan mulane kanggo kula antarmuka sing cocog kanggo nggarap log bakal dadi kaya buntut lan grep, nanging uga bisa digunakake kanggo maca log sing teka saka akeh server . Sing, mesthi, maca saka ClickHouse!

*miturut panemu pribadi panganggo habra kowe sangar

Ketemu logscli

Aku ora nggawe jeneng kanggo antarmukaku, lan, jujur, ana ing wangun prototipe, nanging yen sampeyan pengin langsung ndeleng kode sumber, mula sampeyan seneng: https://github.com/YuriyNasretdinov/logscli (350 baris kode Go sing dipilih).

Fitur

Tujuanku yaiku nggawe antarmuka sing katon akrab karo wong-wong sing biasa nganggo buntut / grep, yaiku ndhukung perkara ing ngisor iki:

  1. Deleng kabeh log, tanpa nyaring.
  2. Ninggalake garis sing ngemot substring tetep (flag -F у grep).
  3. Ninggalake garis sing cocog karo ekspresi reguler (flag -E у grep).
  4. Kanthi gawan, ndeleng ing urutan kronologis mbalikke, amarga log paling anyar biasane kapentingan pisanan.
  5. Tampilake konteks ing jejere saben baris (opsi -A, -B и -C у grep, printing N garis sadurunge, sawise, lan watara saben baris cocog, mungguh).
  6. Deleng log mlebu ing wektu nyata, kanthi utawa tanpa nyaring (utamane tail -f | grep).
  7. Antarmuka kudu kompatibel karo less, head, tail lan liya-liyane - kanthi gawan, asil kudu bali tanpa watesan ing nomer; garis dicithak minangka stream anggere pangguna kasengsem ing nampa; sinyal SIGPIPE kudu meneng ngganggu streaming log, kaya sing ditindakake tail, grep lan keperluan UNIX liyane.

Реализация

Aku bakal nganggep yen sampeyan wis ngerti carane ngirim log menyang ClickHouse. Yen ora, aku nyaranake nyoba LSD и omah kucingLan artikel iki babagan pangiriman log.

Pisanan sampeyan kudu mutusake skema dhasar. Amarga sampeyan biasane pengin nampa log sing diurutake miturut wektu, misale jek logis kanggo nyimpen kanthi cara kasebut. Yen ana akeh kategori log lan kabeh jinis sing padha, sampeyan bisa nggawe kategori log minangka kolom pisanan saka kunci utama - iki bakal ngidini sampeyan duwe tabel siji tinimbang sawetara, sing bakal dadi plus gedhe nalika nglebokake menyang ClickHouse (ing server karo hard drive, disaranake nglebokake data ora luwih saka ~1 kaping per detik kanggo kabeh server).

Dadi, kita butuh kira-kira skema tabel ing ngisor iki:

CREATE TABLE logs(
    category LowCardinality(String), -- категория логов (опционально)
    time DateTime, -- время события
    millis UInt16, -- миллисекунды (могут быть и микросекунды, и т.д.): рекомендуется хранить, если событий много, чтобы было легче различать события между собой
    ..., -- ваши собственные поля, например имя сервера, уровень логирования, и так далее
    message String -- текст сообщения
) ENGINE=MergeTree()
ORDER BY (category, time, millis)

Sayange, aku ora bisa langsung nemokake sumber terbuka kanthi log realistis sing bisa dicekel lan didownload, mula aku njupuk iki minangka conto. review produk saka Amazon nganti 2015. Mesthine, strukture ora padha karo log teks, nanging kanggo ilustrasi, iki ora penting.

instruksi kanggo ngunggah review Amazon kanggo ClickHouse

Ayo nggawe 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

Ing dataset Amazon mung ana tanggal kanggo review, nanging ora ana wektu sing tepat, supaya ngisi data iki nganggo randon.

Sampeyan ora kudu ndownload kabeh file tsv lan matesi dhewe ing ~ 10-20 pisanan supaya bisa entuk data sing cukup gedhe sing ora cocog karo 16 GB RAM. Kanggo ngunggah file TSV aku nggunakake printah ing ngisor iki:

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

Ing Disk Persistent standar (yaiku HDD) ing Google Cloud kanthi ukuran 1000 GB (Aku njupuk ukuran iki utamane supaya kacepetan rada luwih dhuwur, sanajan bisa uga SSD ukuran sing dibutuhake bakal luwih murah) upload. kacepetan kira-kira ~ 75 MB / detik ing 4 intine.

  • Aku kudu nggawe reservasi yen aku kerja ing Google, nanging aku nggunakake akun pribadi lan artikel iki ora ana hubungane karo karyaku ing perusahaan

Aku bakal gawé kabeh ilustrasi karo dataset tartamtu iki, awit iki kabeh aku wis ing tangan.

Nuduhake kemajuan mindhai data

Wiwit ing ClickHouse kita bakal nggunakake scan lengkap ing meja karo log, lan operasi iki bisa njupuk jumlah pinunjul saka wektu lan bisa uga ora ngasilake asil apa-apa kanggo dangu yen sawetara cocog ditemokake, iku saranake kanggo bisa nuduhake kemajuan query nganti baris pisanan karo asil ditampa. Kanggo nindakake iki, ana parameter ing antarmuka HTTP sing ngidini sampeyan ngirim kemajuan ing header HTTP: send_progress_in_http_headers=1. Sayange, perpustakaan Go standar ora bisa maca header nalika ditampa, nanging antarmuka HTTP 1.0 (ora bakal bingung karo 1.1!) Didhukung dening ClickHouse, supaya sampeyan bisa mbukak sambungan TCP mentah menyang ClickHouse lan ngirim menyang kono. GET /?query=... HTTP/1.0nn lan nampa header respon lan awak tanpa uwal utawa enkripsi, supaya ing kasus iki kita malah ora perlu nggunakake perpustakaan standar.

Streaming log saka ClickHouse

ClickHouse wis optimasi kanggo pitakon kanthi ORDER BY kanggo wektu sing relatif suwe (wiwit 2019?), Dadi pitakon kaya

SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC

Bakal langsung miwiti bali baris sing duwe substring "soko" ing pesen, tanpa ngenteni pindai rampung.

Uga, bakal trep banget yen ClickHouse dhewe mbatalake panjaluk kasebut nalika sambungan ditutup, nanging iki dudu prilaku standar. Pembatalan panjalukan otomatis bisa diaktifake kanthi nggunakake pilihan kasebut cancel_http_readonly_queries_on_client_close=1.

Penanganan SIGPIPE sing bener ing Go

Nalika sampeyan nglakokaké, ngomong, printah some_cmd | head -n 10, persis carane printah some_cmd mandheg eksekusi nalika head dikurangi 10 baris? Jawaban iki prasaja: nalika head ends, pipe nutup, lan stdout saka some_cmd printah wiwit titik, kondisional, "kanggo ora ono". kapan some_cmd nyoba nulis menyang pipa sing ditutup, iku nampa sinyal SIGPIPE, kang meneng terminates program minangka standar.

Ing Go iki uga kedadeyan kanthi standar, nanging panangan sinyal SIGPIPE uga nyithak "sinyal: SIGPIPE" utawa pesen sing padha ing pungkasan, lan kanggo mbusak pesen iki, kita mung kudu nangani SIGPIPE kanthi cara sing dikarepake, yaiku, mung meneng. metu:

ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
    <-ch
    os.Exit(0)
}()

Tampilake konteks pesen

Asring sampeyan pengin ndeleng konteks sing kedadeyan sawetara kesalahan (contone, panjaluk sing nyebabake gupuh, utawa masalah sing ana gandhengane sing katon sadurunge kacilakan), lan ing grep Iki ditindakake kanthi nggunakake opsi -A, -B, lan -C, sing nuduhake nomer garis sing ditemtokake sawise, sadurunge, lan watara pesen.

Sayange, aku durung nemokake cara sing gampang kanggo nindakake perkara sing padha ing ClickHouse, supaya kanggo nampilake konteks, panyuwunan tambahan kaya iki dikirim menyang saben baris asil (rincian gumantung saka ngurutake lan apa konteks ditampilake sadurunge utawa sawise):

SELECT time,millis,review_body FROM amazon
WHERE (time = 'ВРЕМЯ_СОБЫТИЯ' AND millis < МИЛЛИСЕКУНДЫ_СОБЫТИЯ) OR (time < 'ВРЕМЯ_СОБЫТИЯ')
ORDER BY time DESC, millis DESC
LIMIT КОЛИЧЕСТВО_СТРОК_КОНТЕКСТА
SETTINGS max_threads=1

Wiwit panjalukan dikirim meh sanalika sawise ClickHouse ngasilake baris sing cocog, bakal rampung ing cache lan umume panjaluk kasebut ditindakake kanthi cepet lan nggunakake CPU sethithik (biasane panyuwunan njupuk kira-kira ~ 6 ms ing mesin virtualku).

Tampilake pesen anyar ing wektu nyata

Kanggo nuduhake pesen sing mlebu ing (meh) wektu nyata, kita mung nglakokake panjalukan sapisan saben sawetara detik, ngelingi cap wektu pungkasan sing ditemoni sadurunge.

Conto printah

Apa printah logscli khas katon ing laku?

Yen sampeyan ndownload dataset Amazon sing dakkandhakake ing wiwitan artikel, sampeyan bisa nindakake perintah ing ngisor iki:

# Показать строки, где встречается слово 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

referensi

Kode sarana (tanpa dokumentasi) kasedhiya ing github ing https://github.com/YuriyNasretdinov/logscli. Aku bakal bungah krungu pikirane ing idea kanggo antarmuka console kanggo ndeleng log adhedhasar ClickHouse.

Source: www.habr.com

Add a comment