Kami nagpalambo sa labing kombenyente nga interface sa kalibutan * alang sa pagtan-aw sa mga troso

Kami nagpalambo sa labing kombenyente nga interface sa kalibutan * alang sa pagtan-aw sa mga troso Kung nakagamit ka na sa mga interface sa web aron matan-aw ang mga troso, nan tingali nakamatikod ka kung giunsa, ingon usa ka lagda, kini nga mga interface lisud ug (kasagaran) dili kaayo kombenyente ug mosanong. Ang uban mahimo nimong maanad, ang uban hingpit nga makalilisang, apan alang kanako ang hinungdan sa tanan nga mga problema mao nga giduol namon ang tahas sa pagtan-aw sa mga troso nga dili husto: gisulayan namon ang paghimo og web interface diin ang CLI (command line interface) mas maayo ang pagtrabaho. Ako sa personal komportable kaayo nga magtrabaho uban sa ikog, grep, awk ug uban pa, ug busa alang kanako ang sulundon nga interface alang sa pagtrabaho sa mga troso mahimong susama sa ikog ug grep, apan mahimo usab nga gamiton sa pagbasa sa mga troso nga gikan sa daghang mga server . Kana mao, siyempre, basaha sila gikan sa ClickHouse!

*sumala sa personal nga opinyon sa tiggamit sa habra imong ROCK

Himamata ang logscli

Wala ako makahimo og usa ka ngalan alang sa akong interface, ug, sa tinuod, kini anaa sa porma sa usa ka prototype, apan kung gusto nimo nga makita dayon ang source code, nan welcome ka: https://github.com/YuriyNasretdinov/logscli (350 ka linya sa pinili nga Go code).

Mga Feature

Ang akong tumong mao ang paghimo ug interface nga daw pamilyar sa mga naanad sa tail/grep, nga mao, sa pagsuporta sa mosunod nga mga butang:

  1. Tan-awa ang tanang mga log, nga walay pagsala.
  2. Biyai ang mga linya nga adunay pirmi nga substring (flag -F у grep).
  3. Biyai ang mga linya nga motakdo sa regular nga ekspresyon (flag -E у grep).
  4. Sa kasagaran, ang pagtan-aw anaa sa balik-balik nga kronolohikal nga pagkahan-ay, tungod kay ang pinakabag-o nga mga troso kasagaran sa interes una.
  5. Ipakita ang konteksto sunod sa matag linya (mga opsyon -A, -B и -C у grep, pag-imprenta sa N nga mga linya sa wala pa, pagkahuman, ug palibot sa matag linya nga magkaparehas, matag usa).
  6. Tan-awa ang umaabot nga mga log sa tinuud nga oras, adunay o wala ang pagsala (sa tinuud tail -f | grep).
  7. Ang interface kinahanglan nga compatible sa less, head, tail ug uban pa - sa default, ang mga resulta kinahanglan ibalik nga walay mga pagdili sa ilang gidaghanon; Ang mga linya giimprinta isip usa ka sapa basta interesado ang tiggamit sa pagdawat niini; signal SIGPIPE kinahanglan nga hilom nga makabalda sa log streaming, sama sa ilang gibuhat tail, grep ug uban pang UNIX utilities.

Pagpatuman

Akong hunahunaon nga nahibal-an na nimo kung giunsa ang paghatud sa mga troso sa ClickHouse. Kung dili, girekomenda nako nga sulayan kini LSD и balay sa kutingUg kini nga artikulo bahin sa pagpadala sa log.

Una kinahanglan nimo nga magdesisyon sa base nga laraw. Tungod kay kasagaran gusto nimo nga makadawat og mga troso nga gisunod sa panahon, morag makatarunganon nga tipigan kini sa ingon nga paagi. Kung adunay daghang mga kategorya sa log ug parehas silang tanan, mahimo ka maghimo usa ka kategorya nga log ingon ang una nga kolum sa panguna nga yawe - kini magtugot kanimo nga adunay usa ka lamesa imbis nga daghang, nga mahimong usa ka dako nga dugang kung pagsulod sa ClickHouse (sa mga server nga adunay mga hard drive, girekomenda nga magsal-ot sa datos nga dili molapas sa ~1 ka beses matag segundo alang sa tibuok server).

Sa ato pa, kinahanglan namon ang gibanabana nga mosunud nga laraw sa lamesa:

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

Ikasubo, dili dayon ko makakita og bisan unsang bukas nga mga tinubdan nga adunay realistiko nga mga troso nga akong makuha ug ma-download, mao nga gikuha ko kini isip usa ka pananglitan mga review sa mga produkto gikan sa Amazon sa wala pa ang 2015. Siyempre, ang ilang istruktura dili parehas sa mga log sa teksto, apan alang sa mga katuyoan sa paghulagway dili kini hinungdanon.

mga panudlo alang sa pag-upload sa mga review sa Amazon sa ClickHouse

Magbuhat ta ug lamesa:

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

Sa dataset sa Amazon adunay usa lamang ka petsa alang sa usa ka pagrepaso, apan walay eksaktong oras, busa atong pun-on kini nga datos sa usa ka randon.

Dili nimo kinahanglan nga i-download ang tanan nga mga file sa tsv ug limitahan ang imong kaugalingon sa una nga ~ 10-20 aron makakuha usa ka medyo dako nga set sa datos nga dili mohaum sa 16 GB nga RAM. Sa pag-upload sa mga TSV files akong gigamit ang mosunod nga sugo:

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

Sa usa ka standard Persistent Disk (nga usa ka HDD) sa Google Cloud nga adunay gidak-on nga 1000 GB (gikuha nako kini nga gidak-on sa panguna aron ang katulin mas taas, bisan kung ang usa ka SSD sa gikinahanglan nga gidak-on mas barato) ang pag-upload ang katulin kay gibana-bana nga ~ 75 MB/sec sa 4 ka mga cores.

  • Kinahanglan kong maghimo og reserbasyon nga nagtrabaho ko sa Google, apan migamit ko og personal nga account ug kining artikuloha walay kalabotan sa akong trabaho sa kompanya

Maghimo ako sa tanan nga mga ilustrasyon nga adunay kini nga partikular nga dataset, tungod kay kini ra ang akong naa sa kamot.

Ipakita ang pag-uswag sa pag-scan sa datos

Tungod kay sa ClickHouse mogamit kami usa ka bug-os nga pag-scan sa usa ka lamesa nga adunay mga troso, ug kini nga operasyon mahimo’g daghang oras ug mahimo’g dili makahatag bisan unsang mga sangputanan sa dugay nga panahon kung pipila ka mga posporo ang makit-an, maayo nga mahimo’g ipakita ang pag-uswag sa pangutana hangtod madawat ang unang mga laray nga adunay resulta. Aron mahimo kini, adunay usa ka parameter sa interface sa HTTP nga nagtugot kanimo sa pagpadala sa pag-uswag sa mga header sa HTTP: send_progress_in_http_headers=1. Ikasubo, ang standard nga librarya sa Go dili makabasa sa mga ulohan ingon nga kini nadawat, apan ang HTTP 1.0 interface (dili malibog sa 1.1!) Gisuportahan sa ClickHouse, aron mahimo nimong maablihan ang hilaw nga koneksyon sa TCP sa ClickHouse ug ipadala kini didto GET /?query=... HTTP/1.0nn ug makadawat sa mga tubag nga mga ulohan ug lawas agig tubag nga wala’y bisan unsang pag-ikyas o pag-encrypt, mao nga sa kini nga kaso dili na naton kinahanglan nga gamiton ang sukaranan nga librarya.

Pag-stream sa mga log gikan sa ClickHouse

Ang ClickHouse adunay pag-optimize alang sa mga pangutana nga adunay ORDER BY sa medyo dugay nga panahon (sukad sa 2019?), mao nga usa ka pangutana sama sa

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

Magsugod dayon kini pagbalik sa mga linya nga adunay substring nga "usa ka butang" sa ilang mensahe, nga wala maghulat nga matapos ang pag-scan.

Usab, kini mahimong sayon ​​​​kaayo kung ang ClickHouse mismo nagkansela sa hangyo kung ang koneksyon niini gisira, apan dili kini ang default nga pamatasan. Ang awtomatikong pagkansela sa hangyo mahimong magamit gamit ang kapilian cancel_http_readonly_queries_on_client_close=1.

Husto nga pagdumala sa SIGPIPE sa Go

Kung gipatuman nimo, ingna, ang mando some_cmd | head -n 10, eksakto kung giunsa ang mando some_cmd mihunong sa pagpatay sa dihang head gikuha ang 10 ka linya? Simple ra ang tubag: kanus-a head matapos, ang tubo magsira, ug ang stdout sa some_cmd nga sugo nagsugod sa pagtudlo, sa kondisyon, "sa bisan asa". Kanus-a some_cmd misulay sa pagsulat sa usa ka sirado nga tubo, nakadawat kini og signal sa SIGPIPE, nga hilom nga nagtapos sa programa pinaagi sa default.

Sa Go mahitabo usab kini pinaagi sa default, apan ang tigdumala sa signal sa SIGPIPE nagpatik usab sa "signal: SIGPIPE" o parehas nga mensahe sa katapusan, ug aron malimpyohan kini nga mensahe kinahanglan lang naton dumalahon ang SIGPIPE sa paagi nga gusto naton, kana, hilom lang. paggawas:

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

Ipakita ang konteksto sa mensahe

Kasagaran gusto nimong tan-awon ang konteksto kung diin nahitabo ang pipila ka sayup (pananglitan, kung unsang hangyo ang hinungdan sa usa ka kalisang, o kung unsang mga problema nga adunay kalabotan ang makita sa wala pa ang pagkahagsa), ug sa grep Gihimo kini gamit ang -A, -B, ug -C nga mga opsyon, nga nagpakita sa espesipikong gidaghanon sa mga linya pagkahuman, sa wala pa, ug sa palibot sa mensahe, matag usa.

Ikasubo, wala ako'y nakit-an nga sayon ​​​​nga paagi sa pagbuhat sa sama sa ClickHouse, aron ipakita ang konteksto, usa ka dugang nga hangyo nga sama niini gipadala sa matag linya sa resulta (ang mga detalye nagdepende sa paghan-ay ug kung ang konteksto gipakita sa wala pa o pagkahuman):

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

Tungod kay ang hangyo gipadala hapit diha-diha dayon pagkahuman sa ClickHouse ibalik ang katugbang nga linya, kini natapos sa cache ug sa kinatibuk-an ang hangyo dali nga gipatuman ug nag-ut-ot sa gamay nga CPU (kasagaran ang hangyo mokabat sa ~6 ms sa akong virtual machine).

Ipakita ang bag-ong mga mensahe sa tinuud nga oras

Aron mapakita ang umaabot nga mga mensahe sa (halos) tinuod nga oras, ipatuman lang namo ang hangyo kausa sa matag pipila ka segundo, hinumdoman ang kataposang timestamp nga among nasugatan kaniadto.

Mga pananglitan sa sugo

Unsa ang hitsura sa kasagaran nga mga mando sa logscli sa praktis?

Kung imong gi-download ang dataset sa Amazon nga akong gihisgutan sa sinugdanan sa artikulo, mahimo nimong ipadagan ang mosunod nga mga sugo:

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

mga pakisayran

Ang utility code (walay dokumentasyon) anaa sa github sa https://github.com/YuriyNasretdinov/logscli. Malipay ako nga madungog ang imong mga hunahuna sa akong ideya alang sa usa ka interface sa console alang sa pagtan-aw sa mga troso base sa ClickHouse.

Source: www.habr.com

Idugang sa usa ka comment