Qed niżviluppaw l-aktar interface konvenjenti fid-dinja* biex naraw ir-zkuk

Qed niżviluppaw l-aktar interface konvenjenti fid-dinja* biex naraw ir-zkuk Jekk qatt użajt interfaces tal-web biex tara zkuk, allura probabilment innotajt kif, bħala regola, dawn l-interfaces huma ingombranti u (spiss) mhux konvenjenti ħafna u jirrispondu. Xi wħud li tista 'tidra, xi wħud huma assolutament terribbli, imma jidhirli li r-raġuni għall-problemi kollha hija li nersqu lejn il-kompitu li naraw ir-zkuk b'mod żbaljat: nippruvaw noħolqu interface tal-web fejn is-CLI (interface tal-linja tal-kmand) jaħdem aħjar. Jien personalment inħossni komdu ħafna naħdem ma 'tail, grep, awk u oħrajn, u għalhekk għalija l-interface ideali biex taħdem ma' zkuk tkun xi ħaġa simili għal tail u grep, iżda li tista 'tintuża wkoll biex taqra zkuk li ġew minn ħafna servers . Jiġifieri, ovvjament, aqrahom minn ClickHouse!

*skond l-opinjoni personali tal-utent tal-habra yourROCK

Iltaqa' ma' logscli

Ma ħriġtx isem għall-interface tiegħi, u, biex inkun onest, pjuttost teżisti fil-forma ta 'prototip, imma jekk trid tara immedjatament il-kodiċi tas-sors, allura inti merħba: https://github.com/YuriyNasretdinov/logscli (350 linja tal-kodiċi Go magħżula).

Kapaċitajiet

L-għan tiegħi kien li nagħmel interface li tkun tidher familjari għal dawk li huma mdorrijin tail/grep, jiġifieri, biex tappoġġja l-affarijiet li ġejjin:

  1. Ara zkuk kollha, mingħajr filtrazzjoni.
  2. Ħalli linji li jkun fihom substring fiss (bandiera -F у grep).
  3. Ħalli linji li jaqblu mal-espressjoni regolari (bandiera -E у grep).
  4. B'mod awtomatiku, il-wiri huwa f'ordni kronoloġika inversa, peress li l-aktar zkuk reċenti huma ġeneralment ta 'interess l-ewwel.
  5. Uri l-kuntest ħdejn kull linja (għażliet -A, -B и -C у grep, stampar N linji qabel, wara, u madwar kull linja tqabbil, rispettivament).
  6. Ara zkuk li deħlin f'ħin reali, bi jew mingħajr filtrazzjoni (essenzjalment tail -f | grep).
  7. L-interface għandha tkun kompatibbli ma ' less, head, tail u oħrajn - b'mod awtomatiku, ir-riżultati għandhom jintbagħtu lura mingħajr restrizzjonijiet fuq in-numru tagħhom; il-linji huma stampati bħala fluss sakemm l-utent ikun interessat li jirċievihom; sinjal SIGPIPE għandhom jinterrompu skiet streaming log, bħalma jagħmlu tail, grep u utilitajiet UNIX oħra.

Реализация

Se nassumi li diġà b'xi mod taf kif twassal zkuk lil ClickHouse. Jekk le, nirrakkomanda li tipprovaha LSD и kittenhouseU dan l-artikolu dwar il-kunsinna taz-zkuk.

L-ewwel trid tiddeċiedi dwar l-iskema bażi. Peress li s-soltu trid tirċievi zkuk magħżula skont il-ħin, jidher loġiku li taħżinhom b'dan il-mod. Jekk hemm ħafna kategoriji ta’ zkuk u huma kollha tal-istess tip, allura tista’ tagħmel kategorija ta’ zkuk bħala l-ewwel kolonna taċ-ċavetta primarja - dan jippermettilek li jkollok tabella waħda minflok diversi, li tkun vantaġġ kbir meta daħħal f'ClickHouse (fuq servers b'hard drives, huwa rakkomandat li ddaħħal id-dejta mhux aktar minn ~ 1 darba kull sekonda għas-server kollu).

Jiġifieri, neħtieġu bejn wieħed u ieħor l-iskema tat-tabella li ġejja:

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

Sfortunatament, ma stajtx immedjatament insib sorsi miftuħa bi zkuk realistiċi li stajt naqbad u niżżel, għalhekk ħadt dan minflok bħala eżempju reviżjonijiet tal-prodotti mill-Amazon qabel l-2015. Naturalment, l-istruttura tagħhom mhix eżattament l-istess bħal dik tar-zkuk tat-test, iżda għal skopijiet ta 'illustrazzjoni dan mhux importanti.

istruzzjonijiet għat-tlugħ tar-reviżjonijiet tal-Amazon fuq ClickHouse

Ejja noħolqu tabella:

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

Fis-sett tad-dejta tal-Amazon hemm biss data għal reviżjoni, iżda m'hemm l-ebda ħin eżatt, allura ejja nimlew din id-dejta b'randon.

M'għandekx għalfejn tniżżel il-fajls tsv kollha u tillimita lilek innifsek għall-ewwel ~ 10-20 sabiex tikseb sett pjuttost kbir ta 'dejta li ma tidħolx f'16 GB ta' RAM. Biex ittella' fajls TSV użajt il-kmand li ġej:

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

Fuq Disk Persistenti standard (li huwa HDD) f'Google Cloud b'daqs ta' 1000 GB (ħadt dan id-daqs prinċipalment biex il-veloċità kienet ftit ogħla, għalkemm forsi SSD tad-daqs meħtieġ kien ikun irħas) it-upload il-veloċità kienet ta 'madwar ~ 75 MB/sec fuq 4 qlub.

  • Irrid nagħmel riżerva li naħdem fil-Google, imma użajt kont personali u dan l-artikolu m'għandu x'jaqsam xejn max-xogħol tiegħi fil-kumpanija

Se nipproduċi l-illustrazzjonijiet kollha b'dan is-sett tad-dejta partikolari, peress li dan huwa dak kollu li kelli f'idejna.

Uri l-progress tal-iskannjar tad-dejta

Peress li f'ClickHouse se nużaw skan sħiħ fuq tabella bi zkuk, u din l-operazzjoni tista' tieħu ammont sinifikanti ta' żmien u tista' ma tipproduċi l-ebda riżultat għal żmien twil jekk jinstabu ftit logħbiet, huwa rakkomandabbli li tkun tista' turi l- progress tal-mistoqsija sakemm jiġu riċevuti l-ewwel ringieli bir-riżultat. Biex tagħmel dan, hemm parametru fl-interface HTTP li jippermettilek li tibgħat progress fl-intestaturi HTTP: send_progress_in_http_headers=1. Sfortunatament, il-librerija standard Go ma tistax taqra headers hekk kif jiġu riċevuti, iżda l-interface HTTP 1.0 (ma tridx tiġi konfuża ma '1.1!) hija appoġġjata minn ClickHouse, sabiex tkun tista' tiftaħ konnessjoni TCP mhux maħduma għal ClickHouse u tibgħatha hemm GET /?query=... HTTP/1.0nn u tirċievi l-headers tar-rispons u l-korp mingħajr ebda ħarba jew encryption, għalhekk f'dan il-każ lanqas biss għandna bżonn nużaw il-librerija standard.

Streaming ta' zkuk minn ClickHouse

ClickHouse kellha ottimizzazzjoni għal mistoqsijiet b'ORDER BY għal żmien relattivament twil (mill-2019?), Allura mistoqsija bħal

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

Immedjatament jibda jirritorna linji li għandhom is-substring "xi ħaġa" fil-messaġġ tagħhom, mingħajr ma tistenna li l-iskan jispiċċa.

Ukoll, ikun konvenjenti ħafna jekk ClickHouse stess ikkanċella t-talba meta l-konnessjoni magħha tkun magħluqa, iżda din mhix l-imġieba default. Il-kanċellazzjoni awtomatika tat-talba tista 'tiġi attivata billi tuża l-għażla cancel_http_readonly_queries_on_client_close=1.

Immaniġġjar korrett ta' SIGPIPE f'Go

Meta tesegwixxi, ngħidu aħna, il-kmand some_cmd | head -n 10, eżattament kif il-kmand some_cmd iwaqqaf l-eżekuzzjoni meta head naqqas 10 linji? It-tweġiba hija sempliċi: meta head jispiċċa, il-pajp jagħlaq, u l-stdout tal-kmand some_cmd jibda jindika, b'kondizzjoni, "li mkien". Meta some_cmd jipprova jikteb lil pajp magħluq, jirċievi sinjal SIGPIPE, li siekta jtemm il-programm awtomatikament.

F'Go dan jiġri wkoll b'mod awtomatiku, iżda l-handler tas-sinjali SIGPIPE jistampa wkoll "sinjal: SIGPIPE" jew messaġġ simili fl-aħħar, u biex inaddaf dan il-messaġġ għandna bżonn biss li nittrattaw SIGPIPE aħna nfusna kif irridu, jiġifieri, bis-skiet. ħruġ:

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

Uri l-kuntest tal-messaġġ

Ħafna drabi trid tara l-kuntest li fih seħħ xi żball (pereżempju, liema talba ikkawżat paniku, jew liema problemi relatati kienu viżibbli qabel il-ħabta), u grep Dan isir bl-użu tal-għażliet -A, -B, u -C, li juru n-numru speċifikat ta 'linji wara, qabel, u madwar il-messaġġ, rispettivament.

Sfortunatament, ma sibtx mod faċli biex nagħmel l-istess f'ClickHouse, għalhekk biex turi l-kuntest, tintbagħat talba addizzjonali bħal din lil kull linja tar-riżultat (id-dettalji jiddependu fuq l-issortjar u jekk il-kuntest huwiex muri qabel jew wara):

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

Peress li t-talba tintbagħat kważi immedjatament wara li ClickHouse tirritorna l-linja korrispondenti, tispiċċa fil-cache u b'mod ġenerali t-talba titwettaq pjuttost malajr u tikkonsma ftit CPU (ġeneralment it-talba tieħu madwar ~ 6 ms fuq il-magna virtwali tiegħi).

Uri messaġġi ġodda f'ħin reali

Sabiex nuru l-messaġġi deħlin fi (kważi) ħin reali, aħna sempliċiment neżegwixxu t-talba darba kull ftit sekondi, filwaqt li niftakru l-aħħar timestamp li ltqajna magħhom qabel.

Eżempji ta' kmand

Kif jidhru l-kmandi logscli tipiċi fil-prattika?

Jekk niżżilt is-sett tad-dejta tal-Amazon li semmejt fil-bidu tal-artikolu, tista 'tmexxi l-kmandi li ġejjin:

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

referenzi

Il-kodiċi tal-utilità (mingħajr dokumentazzjoni) huwa disponibbli fuq github fuq https://github.com/YuriyNasretdinov/logscli. Inkun ferħan li nisma' l-ħsibijiet tiegħek dwar l-idea tiegħi għal interface tal-console biex tara zkuk ibbażati fuq ClickHouse.

Sors: www.habr.com

Żid kumment