زیرساختهای ابری و میکروسرویسها به بخش جداییناپذیر توسعه نرمافزار تبدیل شدهاند. در شرایطی که نظارت بر لاگها (Logs) اهمیت بسیار زیادی پیدا کرده، ابزار Grafana Loki بهعنوان یک راهکار متنباز و مقیاسپذیر برای مانیتورینگ لاگها، توجه بسیاری از تیمهای DevOps و توسعهدهندگان را به خود جلب کرده است. اما واقعا Grafana Loki چیست و چرا باید بهجای ابزارهایی مانند ELK یا EFK به سراغ آن رفت؟ در این مقاله، ابتدا بررسی میکنیم که Grafana Loki چیست، چگونه کار میکند و چه قابلیتهایی دارد. سپس به سراغ موارد استفاده، مزایای آن و در نهایت، آموزش گامبهگام نصب Grafana (PLG Stack) میرویم.
Grafana Loki چیست؟
در پاسخ به این سؤال که Grafana Loki چیست، باید گفت که Loki یک سیستم جمعآوری لاگ (Log Aggregation) متنباز، مقیاسپذیر و چندمستاجری (Multi-Tenancy) است که توسط تیم نرم افزار Grafana توسعه داده شده. این ابزار برخلاف راهکارهای سنتی مانند ELK یا Graylog، محتوای لاگها را ایندکس نمیکند، بلکه تنها برچسبها (Labels) را ذخیره میکند. همین رویکرد باعث کاهش قابلتوجه در حجم ایندکس و در نتیجه، کاهش هزینههای ذخیرهسازی و پردازش میشود.
ایده اصلی پشت Loki، الهامگرفته از ابزاری شناختهشده در دنیای مانیتورینگ متریکهای زمانی به اسم Prometheus است. همانطور که Prometheus از برچسبها برای متریکها استفاده میکند، Loki نیز برای لاگها از همین روش بهره میبرد. این شباهت در معماری باعث میشود که توسعهدهندگان بتوانند از یک الگوی برچسبگذاری یکسان در هر دو سیستم استفاده کنند.
معماری Grafana Loki چیست؟
معماری Grafana Loki ماژولار و مقیاسپذیر است و به کاربران اجازه میدهد بسته به نیازشان، اجزای مختلف را بهصورت مستقل راهاندازی کرده و در مقیاس افقی گسترش دهند. این ساختار انعطافپذیر، آن را به گزینهای ایدهآل برای مانیتورینگ سرور در محیطهای مختلف تبدیل میکند. معماری نصب گرافانا لوکی از چهار جزء اصلی تشکیل شده:
- Distributor: مسئول دریافت دادههای لاگ از کلاینتهایی مثل Promtail یا Fluentd و بررسی اعتبار آنهاست. سپس این دادهها را به ماژولهای دیگر (Ingesterها) برای پردازش موازی ارسال میکند.
- Ingester: دادهها را در حافظه موقت و همچنین، فضای ذخیرهسازی دائمی (مانند AWS S3 یا فایلسیستم محلی) مینویسد. برخلاف سایر ابزارها، Ingester محتوا را ایندکس نمیکند، بلکه فقط متادیتا (اطلاعات برچسبی) را ذخیره میکند.
- Querier: وظیفه اجرای کوئریهای کاربران برای جستجوی لاگها را بر عهده دارد. ابتدا از دادههای لوکال استفاده میکند و سپس به سراغ فضای ذخیرهسازی بلندمدت میرود.
- Query Frontend: یک ماژول اختیاری که با تقسیم کوئریهای بزرگ به بخشهای کوچکتر، آنها را به صورت موازی اجرا میکند. این ویژگی بهویژه برای سازمانهایی که با حجم زیادی از لاگها کار میکنند، بسیار مفید است.
- Object Storage: برای نگهداری پایدار لاگها استفاده میشود. ابزارهایی مانند AWS S3، Google Cloud Storage یا حتی فایلسیستم لوکال میتوانند نقش فضای ذخیرهسازی را ایفا کنند. البته، برای زیرساختهای بزرگ و حساس، استفاده از Object Storageهای ابری یا فضای ذخیرهسازی یک سرور اختصاصی ایران توصیه میشود و فایلسیستم لوکال صرفا برای محیطهای آزمایشی مناسب است.
Grafana Loki چطور کار میکند؟
شاید بپرسید سازوکار عملکرد Grafana Loki چیست؟ برای پاسخ به این سوال، باید به سه مولفه اصلی در فرایند لاگگیری با Loki اشاره کنیم.
۱. جمعآوری لاگها با Promtail
Promtail یک ابزار جمعآوری لاگ سبکوزن است که بهطور خاص برای Loki طراحی شده. این ابزار لاگها را از منابع مختلف (مانند فایلهای سیستمی یا کانتینرهای Kubernetes) میخواند و قبل از ارسال آنها به Loki، عملیات برچسبگذاری، فیلتر کردن و فرمتبندی را انجام میدهد. یکی از مزیتهای Promtail، استفاده از مکانیزم کشف سرویس Prometheus است که باعث میشود بهراحتی در محیطهای ابری قابل استقرار باشد و فرآیندهای مرتبط را برای افرادی که با فرایندهای DevOps سر و کار دارند، سادهتر کند.
۲. ذخیرهسازی در Loki
بر خلاف سایر ابزارهای لاگگیری که هر خط از لاگ را بهصورت کامل ایندکس میکنند، در Loki فقط برچسبها (Labels) و زمان ثبت لاگها ذخیره میشوند. در پی این امر:
- هزینههای ذخیرهسازی کاهش مییابد،
- کوئریها سریعتر اجرا میشوند،
- و لاگها در کمتر از چند میلیثانیه بعد از دریافت، آماده جستجو میشوند.
۳. جستجو با LogQL
Loki دارای یک زبان کوئرینویسی قدرتمند بهنام LogQL است. با استفاده از آن، میتوان لاگها را براساس برچسبها، محتوای خاص یا الگوهای زمانی مورد نظر جستجو کرد. این زبان مشابه PromQL در Prometheus طراحی شده و کاربران میتوانند لاگها را در محیط داشبورد Grafana یا از طریق رابط خط فرمان (LogCLI) جستجو کنند.
همچنین با پیکربندی مناسب، میتوان هشدارها (Alerts) را نیز بر پایه لاگهای دریافتی تعریف کرد. بهعنوان مثال، در صورت مشاهده الگوی خاصی از خطا یا رخداد، هشدار برای تیم مربوطه از طریق Alertmanager ارسال میشود.
ویژگیهای کلیدی Grafana Loki چیست؟
یکی از نقاط قوت Grafana Loki در مقایسه با سایر ابزارهای لاگگیری، ترکیب سادهگرایی با مقیاسپذیری و قابلیت اتصال به اکوسیستم ابزارهای مانیتورینگ است. در این بخش، مهمترین ویژگیهای این سیستم را بررسی میکنیم:
- متنباز و قابل توسعه: Loki یک پروژه متنباز است که بهصورت فعال توسط جامعه کاربران و تیم گرافانا توسعه داده میشود. این مزیت باعث میشود کاربران بتوانند ویژگیهای دلخواه را اضافه کرده یا درک بهتری از عملکرد داخلی سیستم داشته باشند.
- مقیاسپذیری افقی: اگر نیاز دارید حجم بالایی از لاگها را ذخیره و پردازش کنید، میتوانید اجزای مختلف Loki مانند distributor، ingester و querier را بهصورت مستقل و روی چند سرور مجازی اجرا کنید و سامانه را بهصورت افقی گسترش دهید. این ساختار میکروسرویسمحور به تیمهای DevOps کمک میکند منابع را دقیقتر مدیریت کرده و عملکرد سامانه را مطابق نیاز مقیاس دهند.
- کوئریگیری سریع: با استفاده از زبان LogQL و برچسبهای بهینهشده، میتوان لاگها را با سرعت بالا جستجو کرد. طراحی Loki بهگونهای است که با بهرهگیری از پردازش موازی (Parallel Query Execution) حتی در محیطهایی با دادههای بسیار زیاد نیز پاسخهای سریعی ارائه میدهد.
- مصرف کم منابع: از آنجایی که گرافانا لوکی بر خلاف ELK یا Graylog محتوای لاگها را ایندکس نمیکند، حافظه و فضای ذخیرهسازی کمتری نیاز دارد. همین موضوع باعث میشود نصب Grafana Loki در محیطهای با منابع محدود نیز امکانپذیر باشد.
- یکپارچهسازی ساده با Prometheus و Grafana: اگر از Prometheus برای مانیتورینگ متریکها استفاده میکنید، Loki میتواند با همان ساختار برچسبگذاری به جمعآوری لاگها بپردازد. همچنین، با استفاده از داشبوردهای گرافیکی Grafana، میتوانید لاگها و متریکها را در کنار هم مشاهده کنید.
موارد استفاده رایج از Grafana Loki چیست؟
شاید بپرسید کاربرد Grafana Loki چیست؟ این ابزار بهدلیل انعطافپذیری بالا و هزینه پایین، در سناریوهای متنوعی قابل استفاده است. برخی از کاربردهای رایج آن عبارتاند از:
- دیباگ و عیبیابی سیستمها: DevOps و تیمهای پشتیبانی با استفاده از Loki میتوانند بررسی کنند که چه زمانی خطا رخ داده، علت آن چه بوده و چه رویدادهایی پیش از آن در سیستم ثبت شدهاند. این قابلیت برای کشف سریع خطاها حیاتی است.
- پایش امنیت: در دنیای امروز که حملات سایبری به سیستمها افزایش یافته، با بررسی لاگها در Loki، میتوان رفتارهای مشکوک، تلاشهای ناموفق برای لاگین، یا الگوهای مشکوک دیگر را شناسایی و پیگیری کرد.
- هوش تجاری: از لاگها میتوان برای استخراج دادههای رفتاری و آماری استفاده کرد. برای مثال، بررسی لاگها در یک فروشگاه آنلاین میتواند الگوهای خرید کاربران، نقاط پربازدید یا ساعات اوج مصرف را نمایان کند.
- نظارت بر سیستمهای ابری: در محیطهایی مانند Kubernetes، ابزارهایی نظیر Prometheus برای متریکها و Loki برای لاگها، ترکیب بسیار قدرتمندی را تشکیل میدهند. با نصب گرافانا لوکی در این محیطها، لاگگیری دقیق و کمهزینهای خواهید داشت.
مزایای Grafana Loki
استفاده از Grafana Loki در زیرساختهای لاگگیری مزایای متعددی دارد:
- هزینه پایین: از آنجایی که فقط متادیتا ایندکس میشود و لاگها بهصورت فشرده ذخیره میشوند، هزینههای مربوط به فضای ذخیرهسازی، رم و پردازش بهشدت کاهش مییابد که برای سازمانهایی که حجم بالایی از لاگ دارند، یک مزیت حیاتی است.
- Multi-Tenancy یا چندمستاجری: Loki با استفاده از tenantID، لاگهای کاربران یا تیمهای مختلف را بهصورت جداگانه ذخیره میکند. این ویژگی مخصوصا برای شرکتهای بزرگ یا ارائهدهندگان خدمات ابری که چند مشتری دارند، بسیار مهم است.
- افزونگی (Redundancy) پیشفرض: برای توقف از بین رفتن لاگها در اثر کرش سرورها، Loki بهصورت پیشفرض از سه نسخه پشتیبان برای هر لاگ استفاده میکند. این اقدام، امنیت اطلاعات و پایایی سیستم را افزایش میدهد.
- یکپارچگی با ابزارهای محبوب: Loki بهراحتی با Kubernetes، Prometheus و Grafana یکپارچه میشود. این امکان وجود دارد که از داشبوردهای آماده گرافانا برای نمایش لاگها در کنار متریکها بهره ببرید.
- قابلیت اجرا در محیطهای کوچک یا بزرگ: Loki میتواند هم بهصورت محلی برای تستها یا تیمهای کوچک اجرا شود، و هم در مقیاس بزرگ برای زیرساختهای عظیم با توزیع افقی اجزا. همین انعطافپذیری، آن را برای طیف گستردهای از پروژهها مناسب کرده است.
نحوه نصب PLG Stack (Promtail-Loki-Grafana)
برای نصب کامل استک PLG که شامل Promtail، Loki و Grafana است، از Helm chartهای مناسب استفاده میکنیم و مقادیر تنظیمات را متناسب با نیاز پروژه تغییر میدهیم. در این فرآیند ابتدا Prometheus-Operator نصب میشود (چون شامل Prometheus، Alertmanager و Grafana است)، سپس نوبت به نصب Loki Stack (که Promtail را نیز در خود دارد) و در نهایت Nginx میرسد.
نصب Grafana Loki
در اولین مرحله نصب Grafana Loki، ابتدا فایل پیکربندی loki-stack-values.yaml را میسازیم و مقادیر موردنیاز برای نصب Loki را در آن وارد میکنیم:
# Loki Stack Values promtail: serviceMonitor: enabled: true additionalLabels: app: prometheus-operator release: prometheus pipelineStages: - docker: {} - match: selector: '{app="nginx"}' stages: - regex: expression: '.*(?P<hits>GET /.*)' - metrics: nginx_hits: type: Counter description: "Total nginx requests" source: hits config: action: inc
در این فایل، سرویس Promtail برای مانیتورینگ فعال و برچسبهای مناسب روی لاگها اعمال میشود تا بتواند بهراحتی با Prometheus همگام شود. Loki از یک زنجیره پردازش (pipeline) استفاده میکند تا خطوط لاگ را دستکاری کرده، برچسبهای آنها را تغییر دهد و فرمت زمان را بهروزرسانی کند.
در مثالی که در کد آمده، مرحلهای با نام match وجود دارد که فقط در صورتی اجرا میشود که مقدار برچسب app برابر با nginx باشد. سپس با استفاده از عبارت منظم (regex)، لاگهایی که شامل عبارتهایی مثل hits و GET هستند فیلتر میشوند.
در مرحله بعد، یک متریک سفارشی با نام nginx_hits تعریف میشود که Promtail آن را از طریق endpoint /metrics در دسترس قرار میدهد. این متریک از نوع counter است و با هر لاگ مرتبط، مقدارش افزایش مییابد. برای اینکه این متریکها در Prometheus نیز دیده شوند، باید Promtail توسط Prometheus اسکن شود. با این روش میتوان از لاگهای کانتینر متریکهای اختصاصی تولید کرد. همچنین میتوان با استفاده از این متریکها، مقیاسپذیری مبتنی بر KPI را پیادهسازی کرد.
در نهایت، با اجرای دستورات زیر، نصب Loki انجام میشود:
helm3 repo add loki https://grafana.github.io/loki/charts helm3 repo update helm3 upgrade --install loki loki/loki-stack --values=loki-stack-values.yaml
نصب اپراتور پرومتئوس (Prometheus-Operator)
در این بخش، فایل prom-oper-values.yaml ساخته میشود و تنظیمات لازم در آن قرار میگیرد:
grafana: additionalDataSources: - name: loki access: proxy orgId: 1 type: loki url: http://loki:3100 version: 1 additionalPrometheusRules: - name: loki-alert groups: - name: test_nginx_logs rules: - alert: nginx_hits expr: sum(increase(promtail_custom_nginx_hits[1m])) > 2 for: 2m alertmanager: config: global: resolve_timeout: 1m route: group_by: ['alertname'] group_wait: 3s group_interval: 5s repeat_interval: 1m receiver: slack-notifications routes: - match: alertname: nginx_hits receiver: slack-notifications receivers: - name: 'slack-notifications' slack_configs: - api_url: 'https://hooks.slack.com/services/ABCD1234/ABCD567' channel: '#test'
در این پیکربندی، اتصال گرافانا به Loki بهعنوان منبع داده انجام شده است. همچنین، یک قانون هشدار با نام nginx hits تعریف شده که درصورت عبور تعداد درخواستها از حد مشخص، فعال میشود. این قوانین بهصورت گروهبندیشده و با زمانبندی منظم اجرا میشوند.
عبارت PromQL در بخش expr مشخص میکند چه زمانی هشدار باید فعال شود. این مقدار پیشکامپایل میشود تا سرعت اجرا افزایش یابد. عبارت استفادهشده، تغییرات شمارندهها را در یک بازه زمانی مشخص (مثلا یک دقیقه) محاسبه میکند. تابع sum نیز مجموع تمام nginx_hitsها را از تمام منابع جمع میکند. اگر این شرایط برای مدت معینی برقرار باشد، هشدار به حالت فعال (Firing) منتقل میشود.
Prometheus برای کنترل وضعیت هشدار، از عبارت for استفاده میکند تا مطمئن شود که شرط هشدار برای چند دوره متوالی برقرار است. هشدارها ابتدا در حالت Pending میمانند و بعد وارد وضعیت Firing میشوند.
در نهایت، Alertmanager بهگونهای تنظیم شده که هشدارها را از طریق Slack ارسال کند. Alertmanager از ساختار درختی برای مسیردهی هشدارها استفاده میکند و میتواند آنها را بر اساس نام هشدار، job یا cluster دستهبندی کند.
بهمحض یافتن هشدار مطابق شرایط، پیام به گیرندهای که از پیش تعریف شده (در اینجا Slack) ارسال میشود. آدرس کانال Slack و وب هوک مربوطه نیز در همین قسمت تنظیم شده است.
helm3 upgrade --install prometheus stable/prometheus-operator --values=prom-oper-values.yaml
گام بعدی، نصب Nginx است که فایل YAML مربوط به آن در این بخش قرار دارد. برای در دسترس قرار دادن Nginx از نوع سرویس NodePort استفاده میشود.
kubectl apply -f nginx.yaml
پس از راهاندازی کامل پادها، وضعیت آنها را بررسی خواهیم کرد.
└─ $ ▶ kubectl get pods alertmanager-prometheus-prometheus-oper-alertmanager-0 2/2 Running 0 3m14s loki-0 1/1 Running 0 82s loki-promtail-n494s 1/1 Running 0 82s nginx-deployment-55bcb6c8f7-f8mhg 1/1 Running 0 42s prometheus-grafana-c4bcbbd46-8npgt 2/2 Running 0 3m44s prometheus-kube-state-metrics-6d6fc7946-ts5z4 1/1 Running 0 3m44s prometheus-prometheus-node-exporter-jwz64 1/1 Running 0 3m44s prometheus-prometheus-oper-operator-f8df9fcf9-kc5wc 2/2 Running 0 3m44s prometheus-prometheus-prometheus-oper-prometheus-0 3/3 Running 1 3m2s
جمعبندی
در محیطهای عملیاتی حساس، حتی چند میکروثانیه قطعی میتواند تبعات جدی داشته باشد. به همین دلیل، داشتن زیرساختی قابلاعتماد برای لاگبرداری و مانیتورینگ، نقشی حیاتی در رفع سریع خطاها، بهینهسازی منابع و پیشگیری از بروز مشکلات دارد.
در پاسخ به این پرسش که Grafana Loki چیست، باید گفت Loki یک ابزار متنباز، مقیاسپذیر و نسبتا ساده برای جمعآوری و جستوجوی لاگهاست که بهخوبی با Prometheus و Grafana یکپارچه میشود. این ابزار با رویکردی سبک و بدون نیاز به ایندکسسازی سنگین، راهکاری مناسب برای سازمانهایی است که بهدنبال مانیتورینگ موثر لاگها هستند. فرآیند نصب گرافانا لوکی نیز با استفاده از ابزارهایی مانند Helm بسیار ساده شده است و به تیمها اجازه میدهد تا به سرعت از مزایای آن بهرهمند شوند.