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
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:
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:
- Tan-awa ang tanang mga log, nga walay pagsala.
- Biyai ang mga linya nga adunay pirmi nga substring (flag
-F
уgrep
). - Biyai ang mga linya nga motakdo sa regular nga ekspresyon (flag
-E
уgrep
). - 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.
- 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). - Tan-awa ang umaabot nga mga log sa tinuud nga oras, adunay o wala ang pagsala (sa tinuud
tail -f | grep
). - 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; signalSIGPIPE
kinahanglan nga hilom nga makabalda sa log streaming, sama sa ilang gibuhattail
,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
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 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,
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
Source: www.habr.com