گرافانا لوکی (Grafana Loki) یک سیستم لاگگذاری متنباز است که توسط تیم Grafana Labs توسعه داده شده. Loki برای جمعآوری، ذخیره و جستجوی لاگها طراحی شده است و به طور خاص برای استفاده با Grafana بهینهسازی شده است.
Grafana Loki چیست؟
گرافانا لوکی یک سیستم جمعآوری لاگ متنباز است که وظیفه آن جمعآوری، ذخیره و کوئری لاگها است. Grafana Loki لاگ را فشرده و لاگها را در چانکهایی ذخیره نموده و آنها را در فایل سیستمها یا فضای ذخیرهسازی بکاند مانند AWS S3 ذخیره میکند.
chunk ، یک فایل فشرده شامل ورودیهای لاگ بر اساس حجم لاگها است، بنابراین وقتی اندازه یک چانک به حد مجاز خود میرسد، لاگ را در چانک دیگری ذخیره میکند.
هر زمان که یک چانک ذخیره میشود، برای هر چانک یک اندیس ایجاد میکند. این فهرست شامل محتوای لاگ نیست، بلکه فقط شامل تایم استمپ، لیبلهای chunk و مکان آن است.
مدت زمان نگهداری پیشفرض لاگها ۲۴ ساعت است، حداقل مدت ۱ ساعت و میتواند تا حداکثر ۳۰ روز تمدید شود. لوکی به صورت افقی مقیاسپذیر است و زبان کوئری خود را LogQL دارد.
معماری گرافانا لوکی
نمودار زیر معماری گرافانا لوکی و همچنین گردش کار آن در نحوه جمعآوری لاگها را نشان میدهد.
- حال، بیایید ببینیم که ثبت لاگهای گرافانا لوکی چگونه کار میکند. نمودار نشان میدهد که گرافانا لوکی چگونه لاگها را جمعآوری، ذخیره، پرسوجو و تجسم میکند.
- در گرافانا لوکی، عامل آن مسئول جمعآوری لاگها از فایلها، کانتینرها، پادها، برنامهها و ژورنالهای سیستم است.
- لوکی از یک ایجنت log-collecting برای جمعآوری لاگها استفاده میکند. اگر از لوکی در Kubernetes استفاده میکنید، عامل به عنوان یک مجموعه سرویس (daemonset) مستقر خواهد شد زیرا ما به لاگها از هر گره موجود در کلاستر نیاز داریم.
- Promtail عاملی است که در این معماری استفاده میشود. Promtail هر لاگ موجود را جمعآوری و سپس لاگها را برای صرفهجویی در فضای ذخیرهسازی فیلتر و فشرده میکند.
- پس از فشردهسازی لاگها، یک label برای لاگها ایجاد کرده و آن را برای Loki ارسال میکند.
- پس از دریافت لاگها از ایجنت جمعآوریکننده Promtail، Loki هر لاگ را به عنوان یک چانک ذخیره نموده که پیامهای لاگ را در یک فایل واحد جمعآوری میکند تا فضای ذخیرهسازی را صرفهجویی کرده و بازیابی موثر را انجام دهد.
- همچنین یک لیبل و تایم استمپ به چانک میدهد. هر زمان که یک چانک ذخیره میشود، برای هر چانک یک ایندکس ایجاد میکند که شامل یک تایم استمپ، برچسب و مکان chunk است.
- Loki با استفاده از زبان کوئری LogQL از لاگها پرسوجو میکند. LogQL به ما امکان میدهد لاگها را بر اساس برچسب و مقادیری که انتخاب میکنیم، فیلتر، جمعآوری و تجزیه و تحلیل کنیم.
- با افزودن Loki به Grafana میتوانید لاگهای پرسوجو شده را تجسم کنید یا از LogCLI برای پرسوجوی لاگها از CLI خود استفاده کنید.
کامپوننتهای گرافانا لوکی
گرافیانا لوکی از کامپوننتهایی مانند promtail، distributor، ingester، querier، ruler، query frontend و Grafana تشکیل شده است. بیایید نگاهی به این کامپوننتها بیندازیم.
Promtail
Promtail یک کامپوننت مهم است که به عنوان یک ایجنت ثبت وقایع برای Loki عمل میکند. وظیفه آن جمعآوری هر گزارش از یک سیستم، برچسبگذاری آن و ارسال آن به Loki است. Loki گزارشها را از فایلهای گزارش محلی و ژورنال سیستم جمعآوری میکند.
شما باید Promtail را در هر سیستمی که میخواهید گزارشها را جمعآوری کنید نصب کنید، به همین ترتیب، اگر از Loki در Kubernenets استفاده میکنید، باید Promtail را در هر گره به عنوان یک daemonset مستقر کنید.
Distributor
Distributor یک کامپوننت بدون وضعیت (stateless ) است که وظیفه مدیریت و اعتبارسنجی گزارشهای دریافتی از عوامل گزارش مانند Promtail و توزیع گزارشها به ingester را بر عهده دارد.
وقتی توزیعکننده لاگها را دریافت میکند، ابتدا لاگ را اعتبارسنجی میکند، اگر همه چیز مطابق با پیکربندی باشد، مثلا برچسبهای معتبر داشته باشد، تایم استمپ قدیمی نداشته باشد و لاگ خیلی طولانی نباشد.
پس از اتمام اعتبارسنجی، توزیعکننده لاگها را بر اساس طرح هشینگ سازگار بین هر ingester توزیع میکند تا مطمئن شود که به طور مساوی بین هر اینجستر موجود توزیع میشود.
ingester
اینجستر مسئول ذخیره و فهرستبندی لاگهای دریافتی از توزیعکننده در سیستم فایل خود و انتقال منظم لاگها به ذخیرهسازی پایدار ( long-term storage مانند S#)
اینجستر یک سیاست نگهداری (automatic log deletion time) را طبق پیکربندی تعیین میکند.
اینجستر از یک دیتابیس time-series برای ذخیره لاگ در یک فرمت ساختاری خاص استفاده میکند که فرآیند پرسوجوی کارآمد و حذف لاگها را آسان میکند.
Ruler
رولر یک جزء مانیتورینگ و هشداردهنده Loki است که نقش آن ثبت معیارها و ایجاد هشدارها بر اساس دادههای لاگ دریافتی است. رولر مستقیم معیارها را اندازهگیری نمیکند، بلکه دادههای لاگ را به معیارها (metric) تبدیل میکند.
Ruler لاگها را رصد میکند و در صورت تشخیص هرگونه مشکل، از طریق ایمیل یا Slack اطلاع میدهد.
Querier
همانطور که از نامش پیداست، Querier مسئول پرسوجو از لاگها از حافظه و ورودیها با استفاده از زبان پرسوجوی LogQL است. این ابزار لاگها را بر اساس پرسوجوهای کاربر مانند تایم استمپ، برچسبها و غیره فیلتر و تجمیع میکند.
Querierها پرسوجوهای قبلی را ذخیره میکنند تا از پرسوجوی مکرر در مورد یک لاگ جلوگیری کنند. این ابزار لاگ را با مهرهای زمانی، برچسبها و پیام لاگ یکسان، فقط یک بار پرسوجو میکند.
Query Frontend
Query Frontend یک کامپوننت بدون وضعیت (stateless) است که با کاربر تعامل دارد و مسئول مدیریت درخواستهای پرسوجو، اجرای پرسوجوها و مصورسازی لاگها از طریق داشبورد Grafana است.
Query Frontend پرسوجوهای بزرگ را به چندین پرسوجوی کوچکتر تقسیم میکند و همه پرسوجوها را همزمان اجرا میکند، این کار از ایجاد مشکلات حافظه توسط پرسوجوهای بزرگ در یک پرسوجوی واحد جلوگیری میکند و به اجرای سریعتر کمک میکند.
Grafana
Grafana یک ابزار متنباز است که به پرسوجوها، مصورسازی و مانیتور بر لاگها کمک میکند. ما میتوانیم Loki را با Grafana ادغام کنیم و دادههای لاگ را در داشبورد، نمودارها یا هر قالب مصورسازی دیگری که در Grafana موجود است، مصورسازی کنیم.
Grafana از زبان پرسوجوی LogQL برای ادغام با Grafana استفاده میکند و همچنین میتوانیم پرسوجوهای LogQL را در Grafana برای فیلتر کردن و پرسوجوی لاگها بنویسیم.
Log Storage
Loki دادههای لاگ را ذخیره میکند تا کارایی پرسوجو و دریافت لاگها را افزایش دهد. دادههای لاگ را در چانکهایی فشرده میکند، آنها را بر اساس زمان سازماندهی میکند و به آنها برچسب و تایم استمپ میدهد.
سپس برای هر چانک، یک فهرست در قالب جفت کلید با ورودیهای لاگ آنها به همراه تایم استمپ و لیبل چانک ایجاد میکند.
به عنوان مثال، ایندکس یک چانک را مانند فهرست یک کتاب در نظر بگیرید.
چانکها و ایندکسها را میتوان در آبجکت استوریجهای backend یا فایل سیستمهای مختلف ذخیره کرد.
پس از ذخیره چانکها، یک دوره نگهداری برای دادهها ایجاد میشود و به طور خودکار بر اساس دوره نگهداری حذف میشود.
اگر از یک فایل سیستم به عنوان حافظه استفاده میکنید، مسیرهای ذخیرهسازی پیشفرض برای چانکها و ایندکسها /var/lib/loki/chunks و /var/lib/loki/index هستند.
برای پروژههای مهم خود به دنبال سرور مطمئن هستید؟ خرید سرور مجازی با IP ثابت و سرعت بالا در پارسدو، گزینهای ایدهآل است.
مثالی از نحوه ذخیره چانک و ایندکس در Loki
به عنوان مثال، تصور کنید که از یک وب سرور استفاده میکنید که یک گزارش حاوی برچسب زمانی، روش درخواست HTTP، URL و کد پاسخ ایجاد میکند.
هر مجموعه از ورودیهای لاگ با بخشهایی مانند فرمت JSON زیر مقایسه میشوند.
{ "timestamp": "2023-11-20T1:02:33.456Z", "labels": { "method": "GET", "url": "/products", "status": 200 }, "entry": "Request received for /products, responded with 200 OK" }
نام فایل بخش به این فرمت خواهد بود.
۲۰۲۳-۱۱-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk
همانطور که از نام آن پیداست، این بخش شامل لاگهایی از ۲۰ نوامبر ۲۰۲۳، از ساعت ۱ بامداد تا ۱:۱۵ بامداد است.
پس از ایجاد چانک، برای هر بخش یک ایندکس ایجاد میشود، این index دادههای مربوط به فایل بخش و ورودیهای لاگ را در فرمت key-value به صورت زیر ذخیره میکند
{ "2023-11-20T1:02:33.456Z": { "chunk": "2023-11-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk", "labels": { "method": "GET", "url": "/products", "status": 200 } }
همانطور که در فایل ایندکس مثال بالا نشان داده شده است، این فایل فقط نام فایل چانک، تایم استمپ و برچسب را ذخیره نموده و پیام لاگ را ذخیره نمیکند.
ویژگیهای گرافانا لوکی
ویژگیهای ارائه شده توسط گرافانا لوکی در زیر فهرست شدهاند.
مقیاسپذیری:
لوکی میتواند با توجه به حجم لاگها مقیاسبندی شود. با اضافه کردن ورودیها بر اساس حجم لاگ، به صورت افقی مقیاسبندی میشود، بنابراین لازم نیست نگران ترافیک سنگین لاگ برای کاهش سرعت فرآیند باشید.
این سیستم، لاگها را بین چندین ingester توزیع میکند تا از از دست رفتن دادهها در هنگام خرابی گره به دلیل ترافیک سنگین جلوگیری کند و همچنین لاگها را به گرههای ingester سالم هدایت میکند تا از خرابی و از دست رفتن دادهها جلوگیری شود.
کارایی:
از آنجا که Loki ورودیهای لاگ را به صورت چانکهایی فشرده و ذخیره میکند، فضای ذخیرهسازی را افزایش داده و زمان لازم برای بازیابی لاگها را حتی برای دادههای بزرگ کاهش میدهد.
با کمک ایندکسها، Loki میتواند به راحتی لاگهای مورد جستجو را بر اساس تایم استمپ و برچسبها پیدا کند.
چند مستاجری (Multi-Tenancy):
Loki میتواند لاگها را از منابع مختلف مانند podها، containerها، برنامهها و غیره به طور همزمان جمعآوری و تجزیه و تحلیل کند، بنابراین نیازی به پیکربندی عوامل ثبت لاگ جداگانه برای منابع مختلف نداریم.
اگرچه لاگها را از منابع مختلف جمعآوری میکند، اما لاگها را بر اساس منابع مانند فایلهای ذخیرهسازی جداگانه برای کانتینرها و برنامهها به طور جداگانه ذخیره میکند.
چرخش لاگ (Log Rotation):
Loki یک سیاست نگهداری به چانکها اختصاص داده است، وقتی آنها ذخیره میشوند، به طور خودکار لاگهای قدیمی را با توجه به دوره نگهداری حذف میکند، که به صرفهجویی در فضای ذخیرهسازی کمک میکند.
اگر نمیخواهید لاگهای قدیمی را حذف کنید، میتوانید لاگها را در ذخیرهسازی بلندمدت اشیا مانند AWS S3 و سایر ذخیرهسازیهای اشیا (object storage) نیز ذخیره کنید.
حالتهای استقرار Loki
Loki را میتوان در حالتهای مختلف برای مطابقت با الزامات مختلف مقیاسپذیری و قابلیت اطمینان مستقر کرد.
- حالت یکپارچه (Monolithic Mode): در این حالت، تمام اجزا (ingester، ruler و غیره) در یک فرآیند واحد اجرا میشوند که برای استقرارهای کوچک یا محیطهای آزمایشی مناسب است.
- حالت میکروسرویسها(Microservices Mode): در این حالت، هر جزء به عنوان یک سرویس مستقل اجرا میشود و حداکثر مقیاسپذیری و انعطافپذیری را برای استقرارهای بزرگ ارائه میدهد.
نتیجهگیری
به طور خلاصه، Grafana Loki ابزاری قدرتمند و متنباز برای جمعآوری، ذخیرهسازی، پرسوجو و تجسم لاگها است.
این نرمافزار دارای ویژگیهایی مانند مقیاسپذیری، فشردهسازی لاگ، پشتیبانی از چند مستاجری و چرخش خودکار لاگ برای نظارت و عیبیابی موثر است.