مقدمه
در معماریهای مدرن مبتنی بر Microservices، یک درخواست کاربر معمولاً از چندین سرویس مختلف عبور میکند. زمانی که مشکلی در عملکرد سیستم یا تأخیر در پاسخگویی به وجود میآید، پیدا کردن منبع اصلی مشکل میتواند بسیار دشوار باشد.
اینجاست که Distributed Tracing یا «ردیابی توزیعشده» وارد عمل میشود.
یکی از محبوبترین ابزارهای متنباز برای این کار Jaeger است. Jaeger به شما کمک میکند مسیر کامل یک درخواست را در بین سرویسهای مختلف مشاهده کرده و گلوگاههای عملکردی را شناسایی کنید.
در این مقاله با نحوه راهاندازی و استفاده از Jaeger در محیط Kubernetes آشنا میشویم.
Distributed Tracing چیست؟
Distributed Tracing روشی برای ردیابی یک درخواست در کل سیستم است.
فرض کنید کاربری سفارشی را در فروشگاه اینترنتی ثبت میکند:
User Request
│
▼
API Gateway
│
▼
User Service
│
▼
Order Service
│
▼
Payment Service
│
▼
Notification Service
اگر یکی از این سرویسها کند عمل کند، بدون ابزار ردیابی پیدا کردن علت مشکل زمانبر خواهد بود.
Distributed Tracing اطلاعات دقیقی از موارد زیر ارائه میدهد:
- مدت زمان اجرای هر سرویس
- مسیر کامل درخواست
- خطاهای احتمالی
- وابستگی بین سرویسها
- گلوگاههای عملکردی
Jaeger چیست؟
Jaeger یک پلتفرم متنباز برای Distributed Tracing است که توسط Uber توسعه داده شد و اکنون یکی از پروژههای رسمی CNCF محسوب میشود.
قابلیتهای اصلی Jaeger:
- مشاهده مسیر کامل درخواستها
- تحلیل زمان پاسخ سرویسها
- کشف Bottleneckها
- مانیتورینگ معماری Microservice
- پشتیبانی از OpenTelemetry
- ادغام با Kubernetes
پیشنیازها
قبل از شروع باید موارد زیر را داشته باشید:
- یک کلاستر Kubernetes
- kubectl
- Helm (اختیاری اما توصیهشده)
- دسترسی مدیریتی به کلاستر
نصب Jaeger روی Kubernetes
سادهترین روش استفاده از Helm است.
ابتدا ریپازیتوری Helm را اضافه کنید:
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update
سپس Jaeger را نصب کنید:
helm install jaeger jaegertracing/jaeger
پس از نصب میتوانید وضعیت Podها را بررسی کنید:
kubectl get pods
خروجی مشابه زیر خواهد بود:
NAME READY STATUS
jaeger-0 1/1 Running
نصب Jaeger Operator
در محیطهای Production معمولاً از Jaeger Operator استفاده میشود.
ابتدا Operator را نصب کنید:
kubectl create namespace observability
kubectl apply -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.57.0/jaeger-operator.yaml
سپس یک نمونه Jaeger ایجاد کنید:
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: jaeger
spec:
strategy: allInOne
اعمال تنظیمات:
kubectl apply -f jaeger.yaml
دسترسی به رابط کاربری Jaeger
برای مشاهده داشبورد:
kubectl port-forward svc/jaeger-query 16686:16686
اکنون مرورگر را باز کرده و وارد آدرس زیر شوید:
http://localhost:16686
در این داشبورد میتوانید تمام Traceها را مشاهده کنید.
Instrument کردن اپلیکیشن
نصب Jaeger به تنهایی کافی نیست.
برنامه شما باید Traceها را ارسال کند.
برای مثال در Node.js:
npm install jaeger-client
سپس:
const initTracer = require('jaeger-client').initTracer;
const config = {
serviceName: 'user-service',
sampler: {
type: 'const',
param: 1
}
};
const tracer = initTracer(config);
هر درخواست ثبتشده به Jaeger ارسال خواهد شد.
استفاده از OpenTelemetry
امروزه بیشتر پروژهها به جای کتابخانه اختصاصی Jaeger از OpenTelemetry استفاده میکنند.
مزایای OpenTelemetry:
- استاندارد صنعتی
- سازگاری با Jaeger
- سازگاری با Prometheus
- سازگاری با Grafana
- پشتیبانی از چندین Backend
نمونه نصب:
npm install @opentelemetry/sdk-node
مشاهده Traceها
پس از ارسال دادهها، در داشبورد Jaeger میتوانید:
جستجو بر اساس سرویس
user-service
مشاهده مدت زمان درخواست
Request Duration
مشاهده خطاها
Error Traces
بررسی وابستگی سرویسها
Service Dependencies
معماری Jaeger
Jaeger از چند بخش اصلی تشکیل شده است:
Application
│
▼
Agent
│
▼
Collector
│
▼
Storage
│
▼
Query UI
Agent
دریافت Trace از سرویسها
Collector
جمعآوری و پردازش دادهها
Storage
ذخیره اطلاعات در:
- Elasticsearch
- Cassandra
- OpenSearch
Query
نمایش اطلاعات در داشبورد
استقرار Production
برای محیط عملیاتی بهتر است:
از Elasticsearch استفاده کنید
storage:
type: elasticsearch
Replicaها را افزایش دهید
collector:
replicas: 3
مانیتورینگ را فعال کنید
ادغام با:
- Prometheus
- Grafana
Sampling را تنظیم کنید
نمونه:
sampler:
type: probabilistic
param: 0.1
در این حالت فقط ۱۰٪ از درخواستها ذخیره میشوند.
مزایای استفاده از Jaeger
- عیبیابی سریعتر
- شناسایی سرویسهای کند
- مشاهده وابستگی بین Microserviceها
- تحلیل عملکرد سیستم
- کاهش زمان رفع خطا
- سازگاری کامل با Kubernetes
جمعبندی
در معماریهای مبتنی بر Microservice، ردیابی مسیر درخواستها اهمیت بسیار زیادی دارد. Jaeger یکی از قدرتمندترین ابزارهای Distributed Tracing است که به راحتی روی Kubernetes اجرا میشود و امکان مشاهده مسیر کامل درخواستها، تحلیل عملکرد سرویسها و شناسایی مشکلات را فراهم میکند.
اگر از Kubernetes و Microservice استفاده میکنید، پیادهسازی Jaeger میتواند دید بسیار دقیقی نسبت به رفتار سیستم در اختیار شما قرار دهد و فرآیند مانیتورینگ و عیبیابی را به شکل چشمگیری بهبود دهد.
از همراهی شما با پارمین کلود متشکریم.
نظرات کاربران