Tha sinn a’ leasachadh an eadar-aghaidh as freagarraiche san t-saoghal * airson coimhead air logaichean

Tha sinn a’ leasachadh an eadar-aghaidh as freagarraiche san t-saoghal * airson coimhead air logaichean Ma tha thu a-riamh air eadar-aghaidh lìn a chleachdadh airson logaichean fhaicinn, is dòcha gu bheil thu air mothachadh mar a tha, mar riaghailt, na h-eadar-aghaidh sin duilich agus (gu tric) chan eil iad gu math goireasach agus freagairteach. Faodaidh cuid a gheibh thu cleachdte ris, tha cuid gu tur uamhasach, ach tha e coltach riumsa gur e an adhbhar airson na duilgheadasan gu lèir gu bheil sinn a’ dèiligeadh ris a ’ghnìomh a bhith a’ coimhead air logaichean gu ceàrr: bidh sinn a ’feuchainn ri eadar-aghaidh lìn a chruthachadh far am bi an CLI (eadar-aghaidh loidhne-àithne) ag obair nas fheàrr. Tha mi gu pearsanta gu math comhfhurtail ag obair le earball, grep, awk agus feadhainn eile, agus mar sin dhòmhsa bhiodh an eadar-aghaidh air leth freagarrach airson a bhith ag obair le logaichean rudeigin coltach ri earball is grep, ach a dh’ fhaodadh a bhith air a chleachdadh cuideachd airson logaichean a thàinig bho iomadh seirbheisiche a leughadh. Is e sin, gu dearbh, leugh iad bho ClickHouse!

* a rèir beachd pearsanta an neach-cleachdaidh habra do ROCK

Coinnich logscli

Cha do nochd mi ainm airson an eadar-aghaidh agam, agus, a bhith onarach, tha e ann an cruth prototype, ach ma tha thu airson an còd stòr fhaicinn sa bhad, tha fàilte ort: https://github.com/YuriyNasretdinov/logscli (350 loidhne de chòd Go taghte).

Feartan

B’ e an t-amas a bh’ agam eadar-aghaidh a dhèanamh a bhiodh eòlach air an fheadhainn a tha cleachdte ri earball/grep, is e sin, taic a thoirt dha na rudan a leanas:

  1. Thoir sùil air a h-uile log, gun sìoladh.
  2. Fàg loidhnichean anns a bheil fo-thalamh stèidhichte (bratach -F у grep).
  3. Fàg loidhnichean a tha a rèir an abairt àbhaisteach (bratach -E у grep).
  4. Gu gnàthach, tha coimhead ann an òrdugh àraid, oir mar as trice bidh ùidh anns na clàran as ùire an-toiseach.
  5. Seall an co-theacsa ri taobh gach loidhne (roghainnean -A, -B и -C у grep, clò-bhualadh N loidhnichean ro, às deidh, agus timcheall air gach loidhne maidsidh, fa leth).
  6. Thoir sùil air logaichean a tha a’ tighinn a-steach ann an àm fìor, le no às aonais sìoladh (gu bunaiteach tail -f | grep).
  7. Feumaidh an eadar-aghaidh a bhith co-chòrdail ris less, head, tail agus feadhainn eile - gu bunaiteach, bu chòir toraidhean a thilleadh gun chuingealachaidhean air an àireamh aca; tha loidhnichean air an clò-bhualadh mar shruth fhad's a tha ùidh aig an neach-cleachdaidh ann a bhith gam faighinn; comharradh SIGPIPE bu chòir dhaibh casg a chuir air sruthadh logaichean gu sàmhach, dìreach mar a nì iad tail, grep agus goireasan UNIX eile.

Реализация

Gabhaidh mi ris gu bheil fios agad mu thràth air dòigh air choireigin mar a lìbhrigeas tu logaichean gu ClickHouse. Mura h-eil, tha mi a 'moladh feuchainn air lsd и taigh-ciseag, a bharrachd air an artaigil seo mu lìbhrigeadh log.

An toiseach feumaidh tu co-dhùnadh mun sgeama bunaiteach. Leis gu bheil thu mar as trice ag iarraidh logaichean fhaighinn air an òrdachadh a rèir ùine, tha e coltach gu bheil e reusanta an stòradh san dòigh sin. Ma tha mòran roinnean log ann agus gu bheil iad uile den aon sheòrsa, faodaidh tu roinn log a dhèanamh mar a’ chiad cholbh den phrìomh iuchair - leigidh seo leat aon chlàr a bhith agad an àite grunn, rud a bhios na bhuannachd mhòr nuair a cuir a-steach gu ClickHouse (air frithealaichean le draibhearan cruaidh, thathas a’ moladh dàta a chuir a-steach gun a bhith nas fhaide na ~ 1 uair san diog airson an fhrithealaiche gu lèir).

Is e sin, feumaidh sinn timcheall air an sgeama clàr a leanas:

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

Gu mì-fhortanach, cha b’ urrainn dhomh stòran fosgailte sam bith a lorg sa bhad le logaichean reusanta a b’ urrainn dhomh a ghlacadh agus a luchdachadh sìos, agus mar sin ghabh mi seo na àite mar eisimpleir lèirmheasan air toraidhean bho Amazon ro 2015. Gu dearbh, chan eil an structar aca dìreach mar a tha ann an logaichean teacsa, ach airson adhbharan mìneachaidh chan eil seo cudromach.

stiùireadh airson lèirmheasan Amazon a luchdachadh suas gu ClickHouse

Cruthaichidh sinn clàr:

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

Ann an stòr-dàta Amazon chan eil ann ach ceann-latha airson ath-sgrùdadh, ach chan eil dearbh àm ann, mar sin lìon sinn a-steach an dàta seo le Randon.

Cha leig thu leas na faidhlichean tsv gu lèir a luchdachadh sìos agus thu fhèin a chuingealachadh ris a’ chiad ~ 10-20 gus seata dàta meadhanach mòr fhaighinn nach gabh a-steach do 16 GB de RAM. Gus faidhlichean TSV a luchdachadh suas chleachd mi an òrdugh a leanas:

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

Air diosc seasmhach àbhaisteach (is e sin HDD) ann an Google Cloud le meud 1000 GB (ghabh mi am meud seo sa mhòr-chuid gus am biodh an astar beagan nas àirde, ged is dòcha gum biodh SSD den mheud riatanach air a bhith na bu shaoire) an luchdachadh suas bha astar timcheall air ~ 75 MB / diog air 4 cores.

  • Feumaidh mi glèidheadh ​​​​a dhèanamh gu bheil mi ag obair aig Google, ach chleachd mi cunntas pearsanta agus chan eil gnothach aig an artaigil seo ris an obair agam aig a’ chompanaidh

Bheir mi a-mach a h-uile dealbh leis an t-seata shònraichte seo, oir is e seo a h-uile rud a bha agam ri làimh.

Seall adhartas sganadh dàta

Leis ann an ClickHouse cleachdaidh sinn làn scan air clàr le logaichean, agus faodaidh an gnìomhachd seo tòrr ùine a thoirt agus is dòcha nach toir e toradh sam bith airson ùine mhòr ma lorgar glè bheag de gheamannan, tha e ciallach a bhith comasach air na adhartas na ceiste gus am faighear a’ chiad sreathan leis an toradh. Gus seo a dhèanamh, tha paramadair anns an eadar-aghaidh HTTP a leigeas leat adhartas a chuir ann an cinn HTTP: send_progress_in_http_headers=1. Gu mì-fhortanach, chan urrainn don leabharlann àbhaisteach Go cinn-cinn a leughadh mar a gheibhear iad, ach tha an eadar-aghaidh HTTP 1.0 (gun a bhith air a mheasgadh le 1.1!) a’ faighinn taic bho ClickHouse, gus an urrainn dhut ceangal TCP amh fhosgladh gu ClickHouse agus a chuir an sin GET /?query=... HTTP/1.0nn agus faigh na cinn-cinn freagairt agus am bodhaig gun teicheadh ​​​​no crioptachadh, agus mar sin anns a’ chùis seo chan fheum sinn eadhon an leabharlann àbhaisteach a chleachdadh.

A’ sruthadh logaichean bho ClickHouse

Tha optimization air a bhith aig ClickHouse airson ceistean le ORDER BY airson ùine gu math fada (bho 2019?), Mar sin ceist mar

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

Tòisichidh e sa bhad a’ tilleadh loidhnichean aig a bheil an fho-thalamh “rudeigin” san teachdaireachd aca, gun a bhith a’ feitheamh gus an tig an scan gu crìch.

Cuideachd, bhiodh e gu math goireasach nan cuireadh ClickHouse fhèin stad air an iarrtas nuair a chaidh an ceangal ris a dhùnadh, ach chan e seo an giùlan bunaiteach. Faodar cuir dheth iarrtas fèin-ghluasadach leis an roghainn seo cancel_http_readonly_queries_on_client_close=1.

Làimhseachadh ceart air SIGPIPE ann an Go

Nuair a nì thu, abair, an àithne some_cmd | head -n 10, dìreach mar a tha an àithne some_cmd stad air cur gu bàs nuair head thoir air falbh 10 loidhnichean? Tha am freagairt sìmplidh: cuin head a’ tighinn gu crìch, bidh a’ phìob a’ dùnadh, agus tha stdout na h-àithne some_cmd a’ tòiseachadh a’ comharrachadh, gun chumhachan, “gu àite sam bith”. Cuin some_cmd feuchainn ri sgrìobhadh gu pìob dùinte, bidh e a’ faighinn comharra SIGPIPE, a chuireas crìoch air a’ phrògram gu sàmhach gu bunaiteach.

Ann an Go bidh seo cuideachd a’ tachairt gu bunaiteach, ach bidh inneal-làimhseachaidh chomharran SIGPIPE cuideachd a’ clò-bhualadh “signal: SIGPIPE” no teachdaireachd coltach ris aig an deireadh, agus airson an teachdaireachd seo a ghlanadh feumaidh sinn dìreach SIGPIPE a làimhseachadh mar a tha sinn ag iarraidh, is e sin, dìreach gu sàmhach fàgail:

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

Seall co-theacs teachdaireachd

Gu tric bidh thu airson an co-theacsa fhaicinn anns an do thachair mearachd (mar eisimpleir, dè an t-iarrtas a dh’ adhbhraich clisgeadh, no dè na duilgheadasan co-cheangailte a bha rim faicinn ron tubaist), agus ann an grep Tha seo air a dhèanamh leis na roghainnean -A, -B, agus -C, a sheallas an àireamh de loidhnichean ainmichte às deidh, roimhe, agus timcheall air an teachdaireachd, fa leth.

Gu mì-fhortanach, cha do lorg mi dòigh furasta air an aon rud a dhèanamh ann an ClickHouse, mar sin gus an co-theacsa a thaisbeanadh, thèid iarrtas a bharrachd mar seo a chuir gu gach loidhne den toradh (tha am mion-fhiosrachadh an urra ris an t-seòrsachadh agus a bheil an co-theacsa air a shealltainn roimhe seo. no às deidh):

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

Leis gu bheil an t-iarrtas air a chuir cha mhòr sa bhad às deidh ClickHouse an loidhne fhreagarrach a thilleadh, thig e gu crìch san tasgadan agus san fharsaingeachd tha an t-iarrtas air a chuir gu bàs gu math luath agus ag ithe beagan CPU (mar as trice bidh an t-iarrtas a’ toirt timcheall air ~ 6 ms air an inneal brìgheil agam).

Seall teachdaireachdan ùra ann an àm fìor

Gus teachdaireachdan a tha a’ tighinn a-steach a nochdadh ann an (cha mhòr) fìor-ùine, bidh sinn dìreach a’ cur an gnìomh an iarrtais aon uair a h-uile diog, a’ cuimhneachadh air an clàr-ama mu dheireadh a thachair sinn roimhe.

Eisimpleirean àithne

Cò ris a tha òrdughan àbhaisteach logscli coltach ann an cleachdadh?

Ma luchdaich thu sìos an stòr-dàta Amazon air an tug mi iomradh aig toiseach an artaigil, faodaidh tu na h-òrdughan a leanas a ruith:

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

iomraidhean

Tha an còd goireis (às aonais sgrìobhainnean) ri fhaighinn air github aig https://github.com/YuriyNasretdinov/logscli. Bhithinn toilichte do bheachdan a chluinntinn air mo bheachd airson eadar-aghaidh tòcan airson coimhead air logaichean stèidhichte air ClickHouse.

Source: www.habr.com

Cuir beachd ann