Observability (اختیاری)
مقدمه
این فاز اختیاری است. برای ادامهٔ مسیر یادگیری لازم نیست آن را بخوانید یا انجام دهید. اگر زمان یا علاقه داشتید، میتوانید برای آشنایی با Observability و OpenTelemetry سراغش بیایید.
در دنیای توسعه نرمافزار مدرن، مخصوصاً در سیستمهای توزیعشده، نیاز به درک رفتار سیستم در زمان اجرا اهمیت بالایی دارد. مفهومی که این نیاز را پاسخ میدهد، Observability است.
در این مستند، پیادهسازی Observability روی پروژه ASP.NET Core با استفاده از OpenTelemetry توضیح داده شده است؛ شامل جمعآوری دادههای Logs، Metrics و Traces و مشاهده و تحلیل آنها در ابزارهای Jaeger، Prometheus و Grafana.
Observability چیست؟
Observability به توانایی سیستم برای ارائه اطلاعات درونی خود ا ز طریق خروجیهایی مانند log، metric و trace گفته میشود. سه ستون اصلی Observability:
- Logs: پیامهایی متنی برای ثبت رویدادها
- Metrics: اندازهگیریهای عددی برای تحلیل وضعیت سیستم
- Traces: بررسی مسیر اجرای درخواستها در بخشهای مختلف سیستم
معرفی OpenTelemetry
OpenTelemetry یک استاندارد و مجموعه ابزاری متنباز برای جمعآوری دادههای observability (logs, metrics, traces) از اپلیکیشنهاست.
اجزای اصلی:
- Instrumentation SDK: برای ثبت دادهها از داخل اپلیکیشن
- Collector: برای جمعآوری و انتقال دادهها به ابزارهای دیگر
- Exporter: برای ارسال داده به مقاصدی مثل Jaeger یا Prometheus
پیادهسازی در ASP.NET Core
برای پیادهسازی Observability در ASP.NET Core م یتوانید از OpenTelemetry استفاده کنید.
راهنمای رسمی OpenTelemetry برای ASP.NET Core شامل نصب پکیجها، پیکربندی Tracing، Metrics و Logs، و اتصال به ابزارهایی
مثل Jaeger و Prometheus است.
برای شروع میتوانید از این لینک استفاده کنید
OpenTelemetry .NET – Getting Started
در قدم بعدی برای استفاده از Instrumentation و ایجاد Log ,Trace و Metric از این لینک ها استفاده کنید
- OpenTelemetry .NET – Instrumentation
- OpenTelemetry .NET – Example: Use OpenTelemetry with Prometheus, Grafana, and Jaeger
راهاندازی ابزارهای Observability با Docker
فایل docker-compose.yml
version: '3.7'
services:
jaeger:
image: jaegertracing/all-in-one:1.39
ports:
- "16686:16686"
- "14268:14268"
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
فایل prometheus.yml
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'aspnetcore'
static_configs:
- targets: [ 'host.docker.internal:9184' ]
تحلیل دادهها
بررسی Traces در Jaeger:
- آدرس:
http://localhost:16686
بررسی Metrics در Prometheus:
- آدرس:
http://localhost:9090
ساخت داشبورد در Grafana:
- آدرس:
http://localhost:3000
تمرین عملی
Metrics
- فایل زیر رو با نام
simple-post-load.jsبسازید. - آدرس API، هدر و بدنه رو با مقادیر پروژه خودتون عوض کنید.
- دستور
k6 run simple-post-load.jsرو اجرا کنید. - حین اجرا، داشبورد پیشفرض ASP.NET Core رو در Grafana باز کنید و متریکهای مربوط به این API رو ببینید.
import http from 'k6/http';
import {check, sleep} from 'k6';
export const options = {
vus: 20,
duration: '1m',
};
const URL = 'http://localhost:5000/api/search';
const HEADERS = {'Content-Type': 'application/json'};
const BODY = JSON.stringify({
query: 'observability',
page: 1,
pageSize: 10,
});
export default function() {
const res = http.post(URL, BODY, {headers: HEADERS});
check(res, {
'status is OK/Created/NoContent': (r) => [200, 201, 204].includes(r.status),
});
sleep(0.3);
}
Traces
- در روند ساخت و اجرای query و استفاده از سرویس های مختلف Activity های مورد نیاز را بسازید
- یک درخواست به API بزنید و در Jaeger مراحل و زمان هر کدام از مراحل را بررسی کنید.
- در مرحلهٔ ساخت/اجرای query اطلاعات مفید (مثل نام جدول یا خلاصهٔ شرطها) را در Activity ها قرار دهید.
Logs
- لاگ برای زمان بالا آمدن، توقف و خاموش شدن سرویس ثبت کنید.
- برای هر درخواست query، در شروع و پایان لاگ بزنید:
- در شروع: خلاصهٔ درخواست یا query و TraceId.
- در پایان: تعداد نتایج و مدت زمان اجرا.
- برای خطاها لاگ با سطح Error ثبت کنید.
- مطمئن شوید TraceId در لاگها و Jaeger یکسان باشند.