موږ د لاګونو لیدو لپاره په نړۍ کې ترټولو اسانه انٹرفیس رامینځته کوو

موږ د لاګونو لیدو لپاره په نړۍ کې ترټولو اسانه انٹرفیس رامینځته کوو که تاسو کله هم د لاګونو لیدو لپاره ویب انٹرفیسونه کارولي وي ، نو تاسو شاید لیدلي وي چې څنګه ، د یوې قاعدې په توګه ، دا انٹرفیسونه پیچلي دي او (اکثرا) خورا اسانه او ځواب ویونکي ندي. ځینې ​​​​تاسو عادت کولی شئ، ځینې یې خورا ډارونکي دي، مګر ماته داسې ښکاري چې د ټولو ستونزو لامل دا دی چې موږ د لاګونو لیدلو دندې ته په غلط ډول رسیدو: موږ هڅه کوو یو ویب انٹرفیس رامینځته کړو چیرې چې CLI (د کمانډ لاین انٹرفیس) ښه کار کوي. زه په شخصي توګه د tail، grep، awk او نورو سره کار کولو کې ډیر راحته یم، او له همدې امله زما لپاره د لاګونو سره کار کولو لپاره مثالی انٹرفیس به د tail او grep سره ورته وي، مګر دا د لاګونو لوستلو لپاره هم کارول کیدی شي چې د ډیری سرورونو څخه راغلي. دا، البته، دوی د ClickHouse څخه ولولئ!

* د هابرا کارونکي د شخصي نظر له مخې youROCK

د logscli سره لیدنه وکړئ

زه د خپل انٹرفیس لپاره د نوم سره نه یم راغلی، او د ریښتینې په توګه، دا د پروټوټایپ په بڼه شتون لري، مګر که تاسو غواړئ سمدستي د سرچینې کوډ وګورئ، نو تاسو ته ښه راغلاست ویل کیږي: https://github.com/YuriyNasretdinov/logscli (د ټاکل شوي Go کوډ 350 کرښې).

ځانګړتیاوې

زما هدف دا و چې یو داسې انٹرفیس رامینځته کړم چې هغه چا ته پیژندل کیږي چې د tail/grep لپاره کارول کیږي ، دا د لاندې شیانو ملاتړ کول دي:

  1. د فلټر کولو پرته ټول لاګونه وګورئ.
  2. لینونه پریږدئ چې یو ثابت فرعي سټینګ ولري (بیرغ -F у grep).
  3. هغه کرښې پریږدئ چې د منظم بیان سره سمون لري (بیرغ -E у grep).
  4. په ډیفالټ ډول، لیدل د کرونولوژیکي ترتیب په بدل کې دي، ځکه چې ډیری وروستي لاګونه معمولا لومړی د ګټو وي.
  5. د هرې کرښې تر څنګ شرایط ښکاره کړئ (اختیارونه -A, -B и -C у grep, په ترتیب سره د هرې ملنې کرښې څخه مخکې، وروسته، او شاوخوا N کرښې چاپ کول).
  6. راتلونکی لاګونه په ریښتیني وخت کې وګورئ ، د فلټر کولو سره یا پرته (په لازمي ډول tail -f | grep).
  7. انٹرفیس باید سره مطابقت ولري less, head, tail او نور - د ډیفالټ په واسطه، پایلې باید د دوی شمیر محدودیت پرته بیرته راستانه شي؛ لینونه د جریان په توګه چاپ شوي تر هغه چې کاروونکي د دوی ترلاسه کولو کې لیوالتیا ولري؛ سیګنال SIGPIPE باید په خاموشۍ سره د لاګ سټرینګ مخه ونیسي، لکه څنګه چې دوی کوي tail, grep او د UNIX نورې اسانتیاوې.

پلي کول

زه به فرض کړم چې تاسو دمخه یو څه پوهیږئ چې څنګه ClickHouse ته لاګونه وړاندې کړئ. که نه، زه سپارښتنه کوم چې دا هڅه وکړم ایل ایس ایس и د کبانو خونهاو همدارنګه دا مقاله د لاګ تحویلۍ په اړه.

لومړی تاسو اړتیا لرئ د اساس سکیم په اړه پریکړه وکړئ. له هغه ځایه چې تاسو معمولا غواړئ د وخت له مخې ترتیب شوي لاګونه ترلاسه کړئ ، نو دا منطقي ښکاري چې دوی ورته ذخیره کړئ. که چیرې د لاګ ډیری کټګورۍ شتون ولري او دا ټول یو ډول وي ، نو تاسو کولی شئ د لومړني کیلي د لومړي کالم په توګه د لاګ کټګورۍ رامینځته کړئ - دا به تاسو ته اجازه درکړي د څو پرځای یو میز ولرئ ، کوم چې به لوی پلس وي کله چې ClickHouse ته داخلول (په هارډ ډرایو سره سرورونو کې، دا سپارښتنه کیږي چې په هره ثانیه کې د ~ 1 ځله څخه زیات معلومات داخل کړئ د ټول سرور لپاره).

دا دی، موږ نږدې لاندې جدول سکیم ته اړتیا لرو:

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

له بده مرغه، ما سمدلاسه د ریښتیني لاګونو سره هیڅ خلاصې سرچینې ونه موندلې چې زه یې ترلاسه او ډاونلوډ کولی شم ، نو ما دا د مثال په توګه واخیست د 2015 څخه دمخه د ایمیزون څخه د محصولاتو بیاکتنې. البته، د دوی جوړښت دقیقا د متن لاګونو سره ورته نه دی، مګر د انځور کولو موخو لپاره دا مهم ندي.

ClickHouse ته د ایمیزون بیاکتنې اپلوډ کولو لپاره لارښوونې

راځئ چې یو میز جوړ کړو:

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

د ایمیزون ډیټاسیټ کې د بیاکتنې لپاره یوازې نیټه شتون لري ، مګر دقیق وخت شتون نلري ، نو راځئ چې دا ډاټا د رینډون سره ډک کړو.

تاسو اړتیا نلرئ ټول tsv فایلونه ډاونلوډ کړئ او خپل ځان لومړی ~ 10-20 پورې محدود کړئ ترڅو د ډیټا خورا لوی سیټ ترلاسه کړئ چې د 16 GB رام کې به مناسب نه وي. د TSV فایلونو اپلوډ کولو لپاره ما لاندې کمانډ کارولی:

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

په معیاري دوامداره ډیسک کې (کوم چې HDD دی) په ګوګل کلاوډ کې د 1000 GB اندازې سره (ما دا اندازه په عمده ډول اخیستې ترڅو سرعت یو څه لوړ وي ، که څه هم شاید د اړتیا وړ اندازې SSD به ارزانه وي) اپلوډ سرعت په 75 کورونو کې نږدې ~ 4 MB/sec و.

  • زه باید یو ریزرویشن وکړم چې زه په ګوګل کې کار کوم، مګر ما یو شخصي حساب کارولی او دا مقاله په شرکت کې زما د کار سره هیڅ تړاو نلري

زه به د دې ځانګړي ډیټا سیټ سره ټول توضیحات تولید کړم ، ځکه چې دا ټول هغه څه دي چې ما په لاس کې درلودل.

د معلوماتو سکین کولو پرمختګ وښایاست

له هغه ځایه چې په کلیک هاؤس کې موږ به د لاګونو سره په میز کې بشپړ سکین وکاروو، او دا عملیات کولی شي د پام وړ وخت ونیسي او ممکن د اوږدې مودې لپاره کومه پایله ونه کړي که چیرې یو څو میچونه وموندل شي، نو دا مشوره ورکول کیږي چې د ښودلو وړ وي. د پوښتنې پرمختګ تر هغه وخته پورې چې د پایلې سره لومړی قطارونه ترلاسه نشي. د دې کولو لپاره ، د HTTP انٹرفیس کې یو پیرامیټر شتون لري چې تاسو ته اجازه درکوي د HTTP سرلیکونو کې پرمختګ واستوئ: send_progress_in_http_headers=1. له بده مرغه، معیاري Go کتابتون نشي کولی سرلیکونه ولولي لکه څنګه چې دوی ترلاسه شوي، مګر د HTTP 1.0 انٹرفیس (د 1.1 سره ګډوډ نه وي!) د ClickHouse لخوا ملاتړ کیږي، نو تاسو کولی شئ د کلک هاوس لپاره خام TCP پیوستون خلاص کړئ او هلته یې واستوئ. GET /?query=... HTTP/1.0nn او د ځواب سرلیکونه او بدن پرته له کومې تیښتې یا کوډ کولو ترلاسه کړئ ، نو پدې حالت کې موږ حتی د معیاري کتابتون کارولو ته اړتیا نلرو.

د ClickHouse څخه د لاګونو جریان کول

ClickHouse د نسبتا اوږدې مودې لپاره د ORDER BY سره د پوښتنو لپاره اصلاح کړی دی (له 2019 راهیسې؟)، نو یوه پوښتنه لکه

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

دا به سمدلاسه بیرته راستنیدونکي لینونه پیل کړي چې د دوی په پیغام کې "یو څه" فرعي سټرینګ لري ، پرته لدې چې د سکین پای ته رسیدو انتظار وکړي.

همچنان ، دا به خورا اسانه وي که چیرې کلیک هاوس پخپله غوښتنه فسخه کړي کله چې دې سره اړیکه وتړل شوه ، مګر دا ډیفالټ چلند ندی. د اتوماتیک غوښتنې لغوه کول د اختیار په کارولو سره فعال کیدی شي cancel_http_readonly_queries_on_client_close=1.

په Go کې د SIGPIPE سمه اداره کول

کله چې تاسو اجرا کوئ، ووایاست، امر some_cmd | head -n 10په سمه توګه څنګه امر some_cmd کله چې اعدام ودروي head 10 کرښې کمې شوې؟ ځواب ساده دی: کله head پای ته رسیږي، پایپ بندیږي، او د some_cmd کمانډ stdout په مشروط ډول "هیڅ ځای" ته اشاره کوي. كله some_cmd په تړل شوي پایپ کې د لیکلو هڅه کوي دا د SIGPIPE سیګنال ترلاسه کوي، کوم چې په خاموشۍ سره د ډیفالټ پروګرام پای ته رسوي.

په Go کې دا هم په ډیفالټ ډول پیښیږي ، مګر د SIGPIPE سیګنال هینډلر په پای کې "سګنال: SIGPIPE" یا ورته پیغام هم چاپ کوي ، او د دې پیغام پاکولو لپاره موږ اړتیا لرو چې پخپله SIGPIPE هغه ډول اداره کړو چې موږ یې غواړو ، دا یوازې په خاموشۍ سره. وتون:

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

د پیغام شرایط ښکاره کړئ

ډیری وختونه تاسو غواړئ هغه شرایط وګورئ په کوم کې چې کومه تېروتنه رامنځ ته شوې (د مثال په توګه، کومې غوښتنې د اضطراب لامل شوی، یا کومې اړوندې ستونزې د حادثې دمخه لیدل شوي)، او grep دا د -A، -B، او -C اختیارونو په کارولو سره ترسره کیږي، کوم چې په ترتیب سره د پیغام وروسته، مخکې او شاوخوا د لینونو مشخص شمیر ښیي.

له بده مرغه، ما په ClickHouse کې د ورته کولو لپاره اسانه لاره نه ده موندلې، نو د شرایطو ښودلو لپاره، د دې په څیر اضافي غوښتنه د پایلې هرې کرښې ته لیږل کیږي (تفصیلات په ترتیب کولو پورې اړه لري او ایا شرایط مخکې ښودل شوي. یا وروسته):

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

څرنګه چې غوښتنه نږدې سمدلاسه وروسته له هغه لیږل کیږي کله چې د ClickHouse ورته کرښه بیرته راوباسي ، دا په کیچ کې پای ته رسیږي او په عموم کې غوښتنه خورا ګړندي اجرا کیږي او یو څه CPU مصرفوي (معمولا غوښتنه زما په مجازی ماشین کې شاوخوا ~ 6 ms اخلي).

په ریښتیني وخت کې نوي پیغامونه وښایاست

د راتلونکو پیغامونو د ښودلو لپاره (تقریبا) په ریښتیني وخت کې، موږ په ساده ډول په هرو څو ثانیو کې یو ځل غوښتنه اجرا کوو، د وروستي مهال ویش په یادولو سره چې موږ مخکې ورسره مخ شوي یو.

د قوماندې مثالونه

د logscli عادي حکمونه په عمل کې څه ډول ښکاري؟

که تاسو د ایمیزون ډیټاسیټ ډاونلوډ کړی چې ما د مقالې په پیل کې یادونه کړې ، تاسو کولی شئ لاندې کمانډونه پرمخ وړئ:

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

مرجع

د کارونې کوډ (پرته له اسنادو) په ګیتوب کې شتون لري https://github.com/YuriyNasretdinov/logscli. زه به خوښ شم چې د کلیک هاوس پراساس د لاګونو لیدو لپاره د کنسول انٹرفیس لپاره زما د نظر په اړه ستاسو نظرونه واورم.

سرچینه: www.habr.com

Add a comment