Mamolavola ny interface tsara indrindra eran'izao tontolo izao izahay mba hijerena log

Mamolavola ny interface tsara indrindra eran'izao tontolo izao izahay mba hijerena log Raha efa nampiasa interface tsara amin'ny Internet ianao mba hijerena ny logs, dia mety ho tsikaritrao fa, amin'ny ankapobeny, ireo fifandraisana ireo dia saro-takarina ary (matetika) tsy dia mety loatra ary tsy mandray andraikitra. Ny sasany azonao zatra, ny sasany dia tena mahatsiravina, fa ny fahitako azy dia ny antony mahatonga ny olana rehetra dia ny fanatonana ny asa amin'ny fijerena logs tsy araka ny tokony ho izy: manandrana mamorona tranonkala iray izay misy ny CLI (command line interface). miasa tsara kokoa. Izaho manokana dia mahazo aina miasa amin'ny rambony, grep, awk ary ny hafa, ary noho izany amiko ny interface tsara indrindra amin'ny fiasana amin'ny logs dia mety ho zavatra mitovy amin'ny rambony sy grep, fa azo ampiasaina koa hamakiana logs izay avy amin'ny server maro. Izany hoe, mazava ho azy, mamaky azy ireo ao amin'ny ClickHouse!

*araka ny hevitra manokan'ny mpampiasa habra ny ROCK

Hihaona amin'ny logscli

Tsy namorona anarana ho an'ny interface-ko aho, ary, raha ny marina, dia misy amin'ny endrika prototype izy io, fa raha te-hahita avy hatrany ny code source ianao dia raisina an-tanan-droa: https://github.com/YuriyNasretdinov/logscli (andalana 350 amin'ny kaody Go voafantina).

fahafahana

Ny tanjoko dia ny hanao interface tsara ho an'ireo izay zatra amin'ny rambony/grep, izany hoe manohana ireto zavatra manaraka ireto:

  1. Jereo ny diary rehetra, tsy misy sivana.
  2. Avelao ny tsipika misy zana-tsipika raikitra (saina -F у grep).
  3. Avelao ny tsipika mifanaraka amin'ny fomba fiteny mahazatra (saina -E у grep).
  4. Amin'ny alàlan'ny default, ny fijerena dia ao anatin'ny filaharan'ny vanim-potoana mifamadika, satria matetika ny diary vao haingana no mahaliana voalohany.
  5. Asehoy ny teny manodidina eo akaikin'ny andalana tsirairay (safidy -A, -B и -C у grep, manonta andalana N mialoha, aorian'ny, ary manodidina ny andalana mifanandrify tsirairay).
  6. Jereo amin'ny fotoana tena izy ny logs ho avy, misy na tsy misy sivana (amin'ny ankapobeny tail -f | grep).
  7. Ny interface dia tsy maintsy mifanaraka amin'ny less, head, tail sy ny hafa - amin'ny alàlan'ny default, ny valiny dia tokony haverina tsy misy famerana ny isany; ny andalana dia atao pirinty toy ny renirano raha mbola liana amin'ny fandraisana azy ireo ny mpampiasa; famantarana SIGPIPE tokony hanapaka mangina ny fandefasana log, toy ny ataon'izy ireo tail, grep ary fitaovana hafa UNIX.

fanatanterahana

Heveriko fa efa fantatrao ny fomba fandefasana logs amin'ny ClickHouse. Raha tsy izany dia manoro hevitra aho hanandrana izany LSD и trano kitten, ary koa ity lahatsoratra ity momba ny fandefasana log.

Voalohany dia mila manapa-kevitra momba ny rafitra fototra ianao. Satria matetika ianao no te-hahazo logs voasokajy araka ny fotoana, dia toa mitombina ny mitahiry azy ireo amin'izany fomba izany. Raha misy sokajy lozisialy maro ary mitovy karazana izy rehetra, dia azonao atao ny manao sokajy log ho tsanganana voalohany amin'ny fanalahidy fototra - izany dia ahafahanao manana latabatra iray fa tsy maromaro, izay ho tombony lehibe rehefa fampidirana ao amin'ny ClickHouse (amin'ny lohamilina misy kapila mafy dia asaina mampiditra angona tsy mihoatra ny ~1 isan-tsegondra ho an'ny mpizara manontolo).

Izany hoe, mila manodidina ny rafitra tabilao manaraka isika:

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

Indrisy anefa fa tsy hitako avy hatrany izay loharano misokatra miaraka amin'ny diary tena misy azo alaina sy alaina, ka izany no noraisiko ho ohatra. famerenana ny vokatra avy amin'ny Amazon alohan'ny 2015. Mazava ho azy fa tsy mitovy amin'ny an'ny diarin'ny lahatsoratra ny firafitr'izy ireo, fa tsy zava-dehibe ho an'ny fanoharana izany.

torolalana amin'ny fampiakarana hevitra Amazon amin'ny ClickHouse

Andao hamorona latabatra:

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

Ao amin'ny angon-drakitra Amazon dia tsy misy afa-tsy daty hanaovana famerenana, saingy tsy misy ny fotoana marina, koa andao hameno ity angona ity amin'ny randon.

Tsy mila misintona ny rakitra tsv rehetra ianao ary mametra ny tenanao amin'ny voalohany ~ 10-20 mba hahazoana angon-drakitra marobe izay tsy mifanaraka amin'ny 16 GB an'ny RAM. Mba hampidirana rakitra TSV dia nampiasa ity baiko manaraka ity aho:

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

Amin'ny Kapila Persistent mahazatra (izay HDD) ao amin'ny Google Cloud miaraka amin'ny haben'ny 1000 GB (noraisiko io habe io indrindra mba hahatonga ny hafainganam-pandeha ambony kokoa, na dia mety ho mora kokoa aza ny SSD amin'ny habeny ilaina) ny fampidinana. Ny hafainganam-pandeha dia manodidina ny ~ 75 MB/sec amin'ny 4 cores.

  • Tsy maintsy manao famandrihana aho fa miasa ao amin'ny Google aho, saingy nampiasa kaonty manokana aho ary tsy misy ifandraisany amin'ny asako ao amin'ny orinasa ity lahatsoratra ity

Hamokatra fanoharana rehetra miaraka amin'ity angon-drakitra manokana ity aho, satria io ihany no nananako.

Asehoy ny fivoaran'ny fitarafana angona

Koa satria ao amin'ny ClickHouse dia hampiasa scan feno amin'ny latabatra misy kitay izahay, ary mety haka fotoana be io fandidiana io ary mety tsy hamokatra vokatra mandritra ny fotoana maharitra raha toa ka vitsy ny lalao hita, dia tsara ny mampiseho ny fandrosoan'ny fangatahana mandra-pahazoana ny laharana voalohany misy ny valiny. Mba hanaovana izany dia misy paramètre ao amin'ny interface HTTP izay ahafahanao mandefa fandrosoana amin'ny lohatenin'ny HTTP: send_progress_in_http_headers=1. Indrisy anefa, ny tranomboky Go mahazatra dia tsy afaka mamaky lohapejy rehefa raisina, fa ny interface HTTP 1.0 (tsy tokony hafangaro amin'ny 1.1!) dia tohanan'ny ClickHouse, mba hahafahanao manokatra fifandraisana TCP manta amin'ny ClickHouse ary mandefa azy any. GET /?query=... HTTP/1.0nn ary raiso ny lohatenin'ny valinteny sy ny vatana tsy misy fandosirana na fanafenana, ka amin'ity tranga ity dia tsy mila mampiasa ny tranomboky mahazatra akory isika.

Streaming logs avy amin'ny ClickHouse

ClickHouse dia nanana fanatsarana ho an'ny fanontaniana miaraka amin'ny ORDER BY nandritra ny fotoana ela (hatramin'ny 2019?), Ka misy fanontaniana toy ny

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

Hanomboka hamerina andalana avy hatrany izay misy ny zana-tsipika "zavatra" ao amin'ny hafany izy io, tsy miandry ny faran'ny scan.

Ary koa, mety ho tena mety raha ny ClickHouse mihitsy no nanafoana ny fangatahana rehefa nakatona ny fifandraisana aminy, saingy tsy izany no fihetsika mahazatra. Ny fanafoanana ny fangatahana mandeha ho azy dia azo atao amin'ny fampiasana ny safidy cancel_http_readonly_queries_on_client_close=1.

Fikarakarana tsara ny SIGPIPE ao amin'ny Go

Rehefa manatanteraka, lazao, ny baiko some_cmd | head -n 10, ahoana marina ny baiko some_cmd mijanona ny famonoana rehefa head nesorina andalana 10? Tsotra ny valiny: rehefa head Mifarana, mihidy ny fantsona, ary ny stdout amin'ny baiko some_cmd dia manomboka manondro, amin'ny fepetra, "na aiza na aiza". Rahoviana some_cmd miezaka manoratra amin'ny fantsona mihidy, dia mahazo famantarana SIGPIPE, izay mamarana mangina ny fandaharana amin'ny alàlan'ny default.

Ao amin'ny Go dia mitranga izany amin'ny alàlan'ny default, fa ny mpandrindra famantarana SIGPIPE dia manonta "signal: SIGPIPE" na hafatra mitovy amin'izany amin'ny farany, ary mba hanadio ity hafatra ity dia mila mitantana ny SIGPIPE amin'ny fomba tiany isika, izany hoe mangina fotsiny. Fivoahana:

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

Asehoy ny contexte hafatra

Matetika ianao no te-hahita ny teny manodidina izay nitrangan'ny fahadisoana sasany (ohatra, izay fangatahana niteraka korontana, na inona no olana mifandray hita talohan'ny fianjerana), ary amin'ny grep Izany dia atao amin'ny fampiasana ny safidy -A, -B, ary -C, izay mampiseho ny isan'ny andalana voatondro aorian'ny, alohan'ny ary manodidina ny hafatra.

Indrisy anefa fa tsy nahita fomba mora hanaovana izany tao amin'ny ClickHouse aho, ka mba hampisehoana ny contexte, dia misy fangatahana fanampiny toy izany alefa any amin'ny andalana tsirairay amin'ny valiny (ny antsipiriany dia miankina amin'ny fanasokajiana ary raha aseho eo aloha ny contexte. na aorian'izay):

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

Koa satria ny fangatahana dia alefa saika avy hatrany aorian'ny namerenan'ny ClickHouse ny tsipika mifanaraka amin'izany, dia miafara amin'ny cache izany ary amin'ny ankapobeny dia tanterahina haingana ny fangatahana ary mandany CPU kely (matetika ny fangatahana dia mila ~ 6 ms amin'ny milina virtoaly).

Mampiseho hafatra vaovao amin'ny fotoana tena izy

Mba hampisehoana ireo hafatra tonga ao anatin'ny fotoana tena izy (saika) dia manatanteraka ny fangatahana indray mandeha isaky ny segondra vitsy izahay, mitadidy ny mari-pamantarana farany hitanay taloha.

Ohatra baiko

Inona no endrik'ireo baiko logscli mahazatra amin'ny fampiharana?

Raha naka ny tahiry Amazon izay nolazaiko tany am-piandohan'ny lahatsoratra ianao dia azonao atao ny manatanteraka ireto baiko manaraka ireto:

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

soratra masina

Ny code utility (tsy misy antontan-taratasy) dia hita ao amin'ny github at https://github.com/YuriyNasretdinov/logscli. Faly aho mandre ny hevitrao momba ny hevitro momba ny interface tsara amin'ny fijerena logs mifototra amin'ny ClickHouse.

Source: www.habr.com

Add a comment