ہم لاگز دیکھنے کے لیے دنیا کا سب سے آسان انٹرفیس تیار کر رہے ہیں۔

ہم لاگز دیکھنے کے لیے دنیا کا سب سے آسان انٹرفیس تیار کر رہے ہیں۔ اگر آپ نے لاگز دیکھنے کے لیے کبھی ویب انٹرفیس کا استعمال کیا ہے، تو آپ نے شاید محسوس کیا ہوگا کہ یہ انٹرفیس کیسے، ایک اصول کے طور پر، بوجھل ہوتے ہیں اور (اکثر) زیادہ آسان اور جوابدہ نہیں ہوتے۔ کچھ کی آپ عادت ڈال سکتے ہیں، کچھ بالکل خوفناک ہیں، لیکن مجھے لگتا ہے کہ تمام مسائل کی وجہ یہ ہے کہ ہم لاگس کو دیکھنے کے کام کو غلط طریقے سے دیکھتے ہیں: ہم ایک ویب انٹرفیس بنانے کی کوشش کرتے ہیں جہاں CLI (کمانڈ لائن انٹرفیس) بہتر کام کرتا ہے. میں ذاتی طور پر ٹیل، گریپ، اوک اور دیگر کے ساتھ کام کرنے میں بہت آرام دہ ہوں، اور اس وجہ سے میرے لیے لاگز کے ساتھ کام کرنے کا مثالی انٹرفیس ٹیل اور گریپ جیسا ہی ہوگا، لیکن جو بہت سے سرورز سے آنے والے لاگز کو پڑھنے کے لیے بھی استعمال کیا جا سکتا ہے۔ یہ ہے، یقینا، انہیں کلک ہاؤس سے پڑھیں!

*حبرا صارف کی ذاتی رائے کے مطابق آپ راک

logscli سے ملو

میں اپنے انٹرفیس کے لیے کوئی نام نہیں لے کر آیا، اور سچ پوچھیں تو یہ ایک پروٹو ٹائپ کی شکل میں موجود ہے، لیکن اگر آپ فوری طور پر سورس کوڈ دیکھنا چاہتے ہیں، تو آپ کا استقبال ہے: https://github.com/YuriyNasretdinov/logscli (منتخب گو کوڈ کی 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 کو لاگز کیسے پہنچانا ہے۔ اگر نہیں، تو میں اسے آزمانے کی سفارش کرتا ہوں۔ ایل ایس ڈی и بلی کا گھراور لاگ ڈیلیوری کے بارے میں یہ مضمون.

سب سے پہلے آپ کو بیس سکیم پر فیصلہ کرنے کی ضرورت ہے. چونکہ آپ عام طور پر وقت کے لحاظ سے ترتیب شدہ لاگز وصول کرنا چاہتے ہیں، اس لیے انہیں اس طرح ذخیرہ کرنا منطقی معلوم ہوتا ہے۔ اگر لاگ کی بہت سی کیٹیگریز ہیں اور وہ سب ایک ہی قسم کے ہیں، تو آپ پرائمری کلید کے پہلے کالم کے طور پر لاگ کیٹیگری بنا سکتے ہیں - یہ آپ کو کئی کی بجائے ایک ٹیبل رکھنے کی اجازت دے گا، جو ایک بڑا پلس ہوگا جب کلک ہاؤس میں داخل کرنا (ہارڈ ڈرائیوز والے سرورز پر، یہ سفارش کی جاتی ہے کہ فی سیکنڈ ~ 1 بار سے زیادہ ڈیٹا داخل نہ کیا جائے پورے سرور کے لیے).

یعنی، ہمیں تقریباً درج ذیل ٹیبل اسکیم کی ضرورت ہے:

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

بدقسمتی سے، مجھے فوری طور پر حقیقت پسندانہ لاگز کے ساتھ کوئی کھلا ذریعہ نہیں مل سکا جسے میں پکڑ کر ڈاؤن لوڈ کر سکتا ہوں، اس لیے میں نے اسے بطور مثال لیا 2015 سے پہلے ایمیزون کی مصنوعات کے جائزے. بلاشبہ، ان کی ساخت ٹیکسٹ لاگز جیسی نہیں ہے، لیکن مثال کے مقاصد کے لیے یہ اہم نہیں ہے۔

ایمیزون کے جائزے کلک ہاؤس پر اپ لوڈ کرنے کے لیے ہدایات

آئیے ایک ٹیبل بنائیں:

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 RAM میں فٹ نہیں ہو گی۔ 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

1000 جی بی کے سائز کے ساتھ گوگل کلاؤڈ میں ایک معیاری پرسسٹنٹ ڈسک (جو کہ ایک HDD ہے) پر (میں نے یہ سائز بنیادی طور پر اس لیے لیا تاکہ رفتار تھوڑی زیادہ ہو، حالانکہ شاید مطلوبہ سائز کا SSD سستا ہوتا) اپ لوڈ رفتار 75 کوروں پر تقریباً ~ 4 MB/sec تھی۔

  • مجھے ایک ریزرویشن کرنا ضروری ہے کہ میں گوگل میں کام کرتا ہوں، لیکن میں نے ایک ذاتی اکاؤنٹ استعمال کیا ہے اور اس مضمون کا کمپنی میں میرے کام سے کوئی تعلق نہیں ہے۔

میں اس مخصوص ڈیٹاسیٹ کے ساتھ تمام عکاسی پیش کروں گا، کیونکہ میرے ہاتھ میں یہی ہے۔

ڈیٹا اسکیننگ کی پیشرفت دکھائیں۔

چونکہ کلک ہاؤس میں ہم نوشتہ جات کے ساتھ میز پر مکمل اسکین استعمال کریں گے، اور اس آپریشن میں کافی وقت لگ سکتا ہے اور اگر کچھ مماثلتیں پائی جاتی ہیں تو زیادہ دیر تک کوئی نتیجہ نہیں نکل سکتا، اس لیے یہ مشورہ دیا جاتا ہے کہ وہ اسے دکھانے کے قابل ہوں۔ سوال کی پیشرفت جب تک کہ نتیجہ کے ساتھ پہلی قطاریں موصول نہ ہو جائیں۔ ایسا کرنے کے لیے، HTTP انٹرفیس میں ایک پیرامیٹر ہے جو آپ کو HTTP ہیڈر میں پیش رفت بھیجنے کی اجازت دیتا ہے: send_progress_in_http_headers=1. بدقسمتی سے، معیاری گو لائبریری ہیڈرز کو موصول ہونے کے ساتھ نہیں پڑھ سکتی، لیکن HTTP 1.0 انٹرفیس (1.1 کے ساتھ الجھن میں نہ پڑے!) ClickHouse کے ذریعے سپورٹ کیا جاتا ہے، لہذا آپ 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.

گو میں SIGPIPE کی درست ہینڈلنگ

جب آپ عملدرآمد کرتے ہیں، تو حکم دیں some_cmd | head -n 10، بالکل کس طرح حکم some_cmd عملدرآمد روکتا ہے جب head 10 لائنوں کو منہا کیا؟ جواب آسان ہے: کب head ختم ہوتا ہے، پائپ بند ہو جاتا ہے، اور some_cmd کمانڈ کا stdout اشارہ کرنا شروع کر دیتا ہے، مشروط طور پر، "کہیں نہیں"۔ کب some_cmd بند پائپ پر لکھنے کی کوشش کرتا ہے، اسے ایک SIGPIPE سگنل ملتا ہے، جو خاموشی سے پروگرام کو بطور ڈیفالٹ ختم کر دیتا ہے۔.

گو میں یہ ڈیفالٹ کے طور پر بھی ہوتا ہے، لیکن SIGPIPE سگنل ہینڈلر آخر میں "سگنل: SIGPIPE" یا اس سے ملتا جلتا پیغام بھی پرنٹ کرتا ہے، اور اس پیغام کو صاف کرنے کے لیے ہمیں صرف SIGPIPE کو خود اس طرح سے ہینڈل کرنے کی ضرورت ہے جس طرح ہم چاہتے ہیں، یعنی خاموشی سے۔ باہر نکلیں:

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

پیغام کا سیاق و سباق دکھائیں۔

اکثر آپ اس سیاق و سباق کو دیکھنا چاہتے ہیں جس میں کچھ خرابی واقع ہوئی ہے (مثال کے طور پر، کون سی درخواست کی وجہ سے گھبراہٹ ہوئی، یا حادثے سے پہلے کون سے متعلقہ مسائل دکھائی دے رہے تھے)، اور grep یہ -A، -B، اور -C آپشنز کا استعمال کرتے ہوئے کیا جاتا ہے، جو بالترتیب پیغام کے بعد، اس سے پہلے اور اس کے آس پاس لائنوں کی مخصوص تعداد کو ظاہر کرتے ہیں۔

بدقسمتی سے، مجھے کلک ہاؤس میں ایسا کرنے کا کوئی آسان طریقہ نہیں ملا، لہذا سیاق و سباق کو ظاہر کرنے کے لیے، اس طرح کی ایک اضافی درخواست نتیجے کی ہر سطر پر بھیجی جاتی ہے (تفصیلات چھانٹنے پر منحصر ہیں اور آیا سیاق و سباق کو پہلے دکھایا گیا ہے۔ یا اس کے بعد):

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. مجھے ClickHouse پر مبنی لاگز دیکھنے کے لیے کنسول انٹرفیس کے لیے اپنے خیال پر آپ کے خیالات سن کر خوشی ہوگی۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں