Rydym yn datblygu'r rhyngwyneb mwyaf cyfleus yn y byd* ar gyfer gwylio logiau

Rydym yn datblygu'r rhyngwyneb mwyaf cyfleus yn y byd* ar gyfer gwylio logiau Os ydych chi erioed wedi defnyddio rhyngwynebau gwe i weld logiau, yna mae'n debyg eich bod wedi sylwi sut, fel rheol, mae'r rhyngwynebau hyn yn feichus ac (yn aml) ddim yn gyfleus ac yn ymatebol iawn. Mae rhai y gallwch chi ddod i arfer â nhw, mae rhai yn hollol ofnadwy, ond mae'n ymddangos i mi mai'r rheswm am yr holl broblemau yw ein bod ni'n mynd at y dasg o edrych ar logiau yn anghywir: rydyn ni'n ceisio creu rhyngwyneb gwe lle mae'r CLI (rhyngwyneb llinell orchymyn) yn gweithio'n well. Yn bersonol, rydw i'n gyfforddus iawn yn gweithio gyda chynffon, grep, awk ac eraill, ac felly i mi y rhyngwyneb delfrydol ar gyfer gweithio gyda boncyffion fyddai rhywbeth tebyg i gynffon a grep, ond y gellid ei ddefnyddio hefyd i ddarllen logiau a ddaeth o lawer o weinyddion. Hynny yw, wrth gwrs, darllenwch nhw o ClickHouse!

*yn ôl barn bersonol y defnyddiwr habra dy ROCK

Cyfarfod logscli

Wnes i ddim dod o hyd i enw ar gyfer fy rhyngwyneb, ac, a bod yn onest, mae'n bodoli yn hytrach ar ffurf prototeip, ond os ydych chi am weld y cod ffynhonnell ar unwaith, yna mae croeso i chi: https://github.com/YuriyNasretdinov/logscli (350 llinell o god Go dethol).

Galluoedd

Fy nod oedd gwneud rhyngwyneb a fyddai'n ymddangos yn gyfarwydd i'r rhai sydd wedi arfer â chynffon/grep, hynny yw, i gefnogi'r pethau canlynol:

  1. Gweld pob log, heb hidlo.
  2. Gadael llinellau sy'n cynnwys is-linyn sefydlog (baner -F у grep).
  3. Gadewch linellau sy'n cyfateb i'r mynegiant arferol (baner -E у grep).
  4. Yn ddiofyn, mae gwylio mewn trefn gronolegol o chwith, gan mai'r logiau diweddaraf fel arfer sydd o ddiddordeb yn gyntaf.
  5. Dangos cyd-destun wrth ymyl pob llinell (opsiynau -A, -B и -C у grep, argraffu llinellau N cyn, ar ôl, ac o amgylch pob llinell gyfateb, yn y drefn honno).
  6. Gweld logiau sy'n dod i mewn mewn amser real, gyda neu heb hidlo (yn y bôn tail -f | grep).
  7. Rhaid i'r rhyngwyneb fod yn gydnaws â less, head, tail ac eraill - yn ddiofyn, dylid dychwelyd canlyniadau heb gyfyngiadau ar eu rhif; caiff llinellau eu hargraffu fel ffrwd cyn belled â bod gan y defnyddiwr ddiddordeb yn eu derbyn; signal SIGPIPE dylent dorri ar draws ffrydio logiau yn dawel, yn union fel y maent tail, grep a chyfleustodau UNIX eraill.

Gweithredu

Byddaf yn cymryd yn ganiataol eich bod eisoes rywsut yn gwybod sut i ddosbarthu logiau i ClickHouse. Os na, rwy'n argymell rhoi cynnig arni LSD и gath fachAc yr erthygl hon am ddosbarthu boncyffion.

Yn gyntaf mae angen i chi benderfynu ar y cynllun sylfaenol. Gan eich bod fel arfer am dderbyn logiau wedi'u didoli yn ôl amser, mae'n ymddangos yn rhesymegol eu storio felly. Os oes yna lawer o gategorïau log a'u bod i gyd o'r un math, yna gallwch chi wneud categori log fel colofn gyntaf yr allwedd gynradd - bydd hyn yn caniatáu ichi gael un tabl yn lle sawl un, a fydd yn fantais fawr pan fydd mewnosod i ClickHouse (ar weinyddion gyda gyriannau caled, argymhellir mewnosod data dim mwy na ~1 gwaith yr eiliad ar gyfer y gweinydd cyfan).

Hynny yw, mae angen tua'r cynllun tabl canlynol arnom:

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

Yn anffodus, ni allwn ddod o hyd i unrhyw ffynonellau agored ar unwaith gyda logiau realistig y gallwn eu cydio a'u lawrlwytho, felly cymerais hwn yn lle fel enghraifft adolygiadau o gynhyrchion o Amazon tan 2015. Wrth gwrs, nid yw eu strwythur yn union yr un fath â strwythur logiau testun, ond at ddibenion darlunio nid yw hyn yn bwysig.

cyfarwyddiadau ar gyfer uwchlwytho adolygiadau Amazon i ClickHouse

Gadewch i ni greu tabl:

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

Yn set ddata Amazon dim ond dyddiad ar gyfer adolygiad sydd, ond nid oes union amser, felly gadewch i ni lenwi'r data hwn gyda hap.

Nid oes rhaid i chi lawrlwytho'r holl ffeiliau tsv a chyfyngu'ch hun i'r ~ 10-20 cyntaf er mwyn cael set eithaf mawr o ddata na fydd yn ffitio i 16 GB o RAM. I uwchlwytho ffeiliau TSV defnyddiais y gorchymyn canlynol:

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

Ar Ddisg Parhaus safonol (sef HDD) yn Google Cloud gyda maint o 1000 GB (cymerais y maint hwn yn bennaf fel bod y cyflymder ychydig yn uwch, er efallai y byddai SSD o'r maint gofynnol wedi bod yn rhatach) y llwytho i fyny roedd y cyflymder oddeutu ~ 75 MB/eiliad ar 4 craidd.

  • Rhaid i mi gadw lle fy mod yn gweithio yn Google, ond defnyddiais gyfrif personol ac nid oes gan yr erthygl hon unrhyw beth i'w wneud â fy ngwaith yn y cwmni

Byddaf yn cynhyrchu pob darlun gyda'r set ddata benodol hon, gan mai dyma'r cyfan oedd gennyf wrth law.

Dangos cynnydd sganio data

Oherwydd yn ClickHouse byddwn yn defnyddio sgan llawn ar fwrdd gyda logiau, a gall y llawdriniaeth hon gymryd cryn dipyn o amser ac efallai na fydd yn cynhyrchu unrhyw ganlyniadau am amser hir os canfyddir ychydig o gemau, fe'ch cynghorir i allu dangos y cynnydd yr ymholiad hyd nes y derbynnir y rhesi cyntaf gyda'r canlyniad. I wneud hyn, mae paramedr yn y rhyngwyneb HTTP sy'n eich galluogi i anfon cynnydd mewn penawdau HTTP: send_progress_in_http_headers=1. Yn anffodus, ni all y llyfrgell Go safonol ddarllen penawdau wrth iddynt gael eu derbyn, ond mae'r rhyngwyneb HTTP 1.0 (na ddylid ei gymysgu â 1.1!) yn cael ei gefnogi gan ClickHouse, felly gallwch agor cysylltiad TCP amrwd i ClickHouse a'i anfon yno GET /?query=... HTTP/1.0nn a derbyn y penawdau ymateb a'r corff heb unrhyw ddianc nac amgryptio, felly yn yr achos hwn nid oes angen i ni hyd yn oed ddefnyddio'r llyfrgell safonol.

Ffrydio logiau o ClickHouse

Mae ClickHouse wedi cael optimeiddio ar gyfer ymholiadau gyda ORDER BY ers amser cymharol hir (ers 2019?), felly ymholiad fel

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

Bydd yn dechrau dychwelyd llinellau sydd â'r is-linyn "rhywbeth" yn eu neges ar unwaith, heb aros i'r sgan orffen.

Hefyd, byddai'n gyfleus iawn pe bai ClickHouse ei hun yn canslo'r cais pan gaewyd y cysylltiad ag ef, ond nid dyma'r ymddygiad diofyn. Gellir galluogi canslo cais yn awtomatig gan ddefnyddio'r opsiwn cancel_http_readonly_queries_on_client_close=1.

Trin SIGPIPE yn gywir yn Go

Pan fyddwch yn gweithredu, dywedwch, y gorchymyn some_cmd | head -n 10, yn union sut y gorchymyn some_cmd yn stopio dienyddio pan head tynnu 10 llinell? Mae'r ateb yn syml: pryd head yn gorffen, mae'r bibell yn cau, ac mae stdout y gorchymyn some_cmd yn dechrau pwyntio, yn amodol, “i unman”. Pryd some_cmd yn ceisio ysgrifennu at bibell gaeedig, mae'n derbyn signal SIGPIPE, sy'n terfynu'r rhaglen yn dawel yn ddiofyn.

Yn Go mae hyn hefyd yn digwydd yn ddiofyn, ond mae'r triniwr signal SIGPIPE hefyd yn argraffu "signal: SIGPIPE" neu neges debyg ar y diwedd, ac i glirio'r neges hon mae angen i ni drin SIGPIPE ein hunain yn y ffordd rydyn ni eisiau, hynny yw, dim ond yn dawel allanfa:

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

Dangos cyd-destun y neges

Yn aml, rydych chi eisiau gweld y cyd-destun y digwyddodd rhywfaint o wall ynddo (er enghraifft, pa gais a achosodd banig, neu ba broblemau cysylltiedig oedd yn weladwy cyn y ddamwain), ac yn grep Gwneir hyn gan ddefnyddio'r opsiynau -A, -B, a -C, sy'n dangos y nifer penodedig o linellau ar ôl, cyn, ac o amgylch y neges, yn y drefn honno.

Yn anffodus, nid wyf wedi dod o hyd i ffordd hawdd o wneud yr un peth yn ClickHouse, felly i ddangos y cyd-destun, anfonir cais ychwanegol fel hyn i bob llinell o'r canlyniad (mae'r manylion yn dibynnu ar y didoli ac a yw'r cyd-destun yn cael ei ddangos o'r blaen neu ar ôl):

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

Gan fod y cais yn cael ei anfon bron yn syth ar ôl i ClickHouse ddychwelyd y llinell gyfatebol, mae'n dod i ben yn y storfa ac yn gyffredinol mae'r cais yn cael ei weithredu'n eithaf cyflym ac yn defnyddio ychydig o CPU (fel arfer mae'r cais yn cymryd tua ~6 ms ar fy mheiriant rhithwir).

Dangos negeseuon newydd mewn amser real

Er mwyn dangos negeseuon sy'n dod i mewn mewn amser real (bron), rydym yn syml yn gweithredu'r cais unwaith bob ychydig eiliadau, gan gofio'r stamp amser olaf y daethom ar ei draws o'r blaen.

Enghreifftiau gorchymyn

Sut olwg sydd ar orchmynion logscli nodweddiadol yn ymarferol?

Os gwnaethoch chi lawrlwytho set ddata Amazon a grybwyllais ar ddechrau'r erthygl, gallwch redeg y gorchmynion canlynol:

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

cyfeiriadau

Mae'r cod cyfleustodau (heb ddogfennaeth) ar gael ar github yn https://github.com/YuriyNasretdinov/logscli. Byddwn yn falch o glywed eich barn am fy syniad am ryngwyneb consol ar gyfer gwylio logiau yn seiliedig ar ClickHouse.

Ffynhonnell: hab.com

Ychwanegu sylw