0%
در حال بارگذاری...

جستجو در سایت

درس ۶ سطح پیشرفته: DevOps پیشرفته — مانیتورینگ در پایتون: Observability، Logging، Alerting و Tracing

پایتون | Python پیشرفته

سلام مهندس DevOps و Site Reliability Engineer پایتون! به درس ششم سطح پیشرفته رسیدی — جایی که دیگه فقط کد نمی‌زنی، بلکه مسئول **زنده ماندن، سالم ماندن، سریع ماندن و قابل پیش‌بینی بودن** سیستم‌های میلیون کاربری هستی. تو این درس قراره یاد بگیری چطور با ابزارهای حرفه‌ای دنیا، هر ثانیه وضعیت برنامه‌ات رو مانیتور کنی، خطاها رو قبل از اینکه کاربر ببینه پیدا کنی، وقتی CPU یا RAM بالا رفت فوری هشدار بگیری، یه درخواست رو از لحظه ورود تا خروج کامل ردیابی کنی و در نهایت یه سیستم Observability کامل بسازی که حتی در مقیاس صدها سرویس و هزاران درخواست در ثانیه، همه چیز تحت کنترل باشه.

وقتی این درس تموم بشه، رزومه‌ات یه خط طلایی اضافه می‌کنه: «طراحی و پیاده‌سازی Observability، Monitoring و Alerting حرفه‌ای در مقیاس بزرگ» — خطی که هر شرکت بزرگ ایرانی و خارجی رو مجبور می‌کنه با تو مصاحبه کنه. آماده‌ای که از یه توسعه‌دهنده به یه **مهندس قابل اعتماد سیستم** تبدیل بشی؟ بزن بریم که یکی از مهم‌ترین مهارت‌های دنیای واقعی رو یاد بگیری!

سه ستون Observability چیست و چرا بدونشون نمی‌تونی سیستم بزرگ بسازی؟

Observability یعنی توانایی فهمیدن وضعیت داخلی سیستم فقط با نگاه به خروجی‌های خارجی. سه ستون اصلیش این‌هاست:

  • Metrics: اعداد و ارقام کمی مثل CPU، RAM، تعداد درخواست، latency، error rate
  • Logs: پیام‌های متنی برنامه، خطاها، رویدادها
  • Traces: ردیابی یک درخواست در تمام میکروسرویس‌ها

بدون این سه تا، وقتی سیستم کرش کرد، نمی‌دونی کجا مشکل داره. با این سه تا، حتی قبل از کرش می‌تونی مشکل رو پیدا کنی!

ستون ابزار معروف کاربرد اصلی مثال واقعی
Metrics Prometheus + Grafana مانیتورینگ عددی CPU بالای ۸۰٪، latency P99 بالای ۲ ثانیه
Logs Loki + Grafana یا ELK Stack جستجو در پیام‌ها خطای ۵۰۰ در سرویس پرداخت
Traces Jaeger یا Zipkin یا Tempo ردیابی توزیع‌شده درخواست کاربر از API تا دیتابیس ۳.۲ ثانیه طول کشیده

۱. Metrics با Prometheus — قلب تپنده مانیتورینگ

Prometheus یه سیستم pull-based هست — خودش می‌ره از برنامه‌ات metrics رو می‌کشه.

# نصب
pip install prometheus-client prometheus-fastapi-instrumentator
from fastapi import FastAPI
from prometheus_fastapi_instrumentator import Instrumentator
from prometheus_client import Counter, Histogram

app = FastAPI()

# متریک‌های سفارشی
REQUEST_COUNT = Counter("request_count", "تعداد درخواست‌ها", ["method", "endpoint", "status"])
REQUEST_LATENCY = Histogram("request_latency_seconds", "زمان پاسخ‌دهی", ["endpoint"])

Instrumentator().instrument(app).expose(app)

@app.get("/")
async def home():
    REQUEST_COUNT.labels(method="GET", endpoint="/", status="200").inc()
    with REQUEST_LATENCY.labels(endpoint="/").observe():
        await asyncio.sleep(0.1)  # شبیه‌سازی کار
    return {"message": "سلام از سیستم مانیتور شده!"}

# حالا برو به /metrics — خروجی Prometheus رو می‌بینی!

۲. Logging ساختاریافته — خداحافظ print، سلام structlog!

لاگ متنی دیگه کافیه نیست. لاگ ساختاریافته (JSON) جستجو رو آسون می‌کنه.

import structlog
import logging
import sys

structlog.configure(
    processors=[
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.JSONRenderer()
    ],
    logger_factory=structlog.stdlib.LoggerFactory(),
)

log = structlog.get_logger()

@app.post("/order/")
async def create_order(order_data: dict):
    log.info(
        "order.created",
        user_id=order_data.get("user_id"),
        amount=order_data.get("amount"),
        items=len(order_data.get("items", [])),
        ip=request.client.host
    )
    try:
        # پردازش سفارش
        pass
    except Exception as e:
        log.error("order.failed", error=str(e), order_id=order_data.get("id"))
        raise

۳. Distributed Tracing — ردیابی درخواست در میکروسرویس‌ها

وقتی یه درخواست از ۱۰ سرویس رد می‌شه، چطور بفهمی کجا کند شده؟ با Tracing!

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource

trace.set_tracer_provider(
    TracerProvider(resource=Resource.create({SERVICE_NAME: "order-service"}))
)

jaeger_exporter = JaegerExporter(agent_host_name="localhost", agent_port=6831)
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(jaeger_exporter))

tracer = trace.get_tracer(__name__)

@app.post("/order/")
async def create_order():
    with tracer.start_as_current_span("create-order") as span:
        span.set_attribute("user_id", 123)
        # فراخوانی سرویس پرداخت
        with tracer.start_as_current_span("call-payment-service"):
            await call_payment()
        # فراخوانی سرویس نوتیفیکیشن
        with tracer.start_as_current_span("send-notification"):
            await send_email()

۴. Alerting — هشدار قبل از فاجعه

# alert.rules.yml
groups:
  - name: fastapi-alerts
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "خطای بالا در API"
          description: "بیش از ۵٪ درخواست‌ها خطای ۵xx دارن — سریع چک کن!"

      - alert: HighLatency
        expr: histogram_quantile(0.95, rate(request_latency_seconds_bucket[5m])) > 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "latency بالا"
          description: "P95 latency بالای ۲ ثانیه — بهینه‌سازی لازم است"

۵. Grafana — داشبوردهای زیبا و حرفه‌ای

در Grafana داشبورد بساز با این پنل‌ها:

  • RED Method: Request Rate, Error Rate, Duration
  • CPU/Memory/Disk per pod
  • Latency P50, P95, P99
  • Active WebSocket connections
  • Top 10 کندترین endpointها
  • Business metrics: تعداد سفارش، فروش روزانه

۶. Health Check، Liveness و Readiness Probe

@app.get("/health")
async def health_check():
    # چک دیتابیس، Redis، سرویس خارجی
    return {"status": "healthy", "timestamp": datetime.utcnow().isoformat()}

@app.get("/ready")
async def readiness_check():
    # چک اینکه آیا آماده دریافت ترافیک هستیم؟
    if not db_connected or not redis_connected:
        raise HTTPException(status_code=503, detail="Not ready")
    return {"status": "ready"}

۱۲ تمرین آتشین برای تبدیل شدن به SRE واقعی

  1. Prometheus + Grafana کامل برای پروژه FastAPI خودت
  2. لاگ ساختاریافته با structlog + Loki + Grafana
  3. Tracing کامل با Jaeger برای تمام میکروسرویس‌ها
  4. Alertmanager با هشدار تلگرام و ایمیل
  5. Dashboard حرفه‌ای با RED + USE Method
  6. SLO تعریف کن (مثلاً ۹۹.۹٪ آپ‌تایم، latency زیر ۱ ثانیه)
  7. Chaos Engineering ساده (kill random pod و ببین سیستم زنده می‌مونه؟)
  8. Auto-scaling بر اساس CPU و custom metric
  9. Canary Deployment با Istio یا Argo Rollouts
  10. Centralized Logging با ELK Stack
  11. Security Monitoring (تشخیص حمله Brute Force از لاگ)
  12. کلاس کامل ObservabilityManager با همه ابزارها بساز

پروژه نهایی درس: Observability کامل برای فروشگاه آنلاین میکروسرویس

  • Prometheus + Grafana + Alertmanager با ۵ rule هشدار
  • Loki برای لاگ‌های ساختاریافته
  • Jaeger برای tracing توزیع‌شده
  • Dashboard با RED metrics + Business metrics (فروش روزانه، تعداد کاربر)
  • Health check + Readiness + Liveness probe
  • همه چیز در Docker Compose + Kubernetes manifests
  • هشدار تلگرام وقتی error rate بالای ۳٪ شد

جمع‌بندی و قدم بعدی

تبریک عظیم می‌گم مهندس SRE! تو الان می‌تونی یه سیستم مقیاس‌پذیر رو نه تنها بسازی، بلکه ۲۴/۷ سالم، سریع و قابل نظارت نگه داری. این دانش دقیقاً همون چیزیه که شرکت‌های بزرگ از یه Senior Backend، DevOps یا SRE انتظار دارن. درس بعدی (درس ۷) قراره درباره **سیستم‌های توزیع‌شده، Message Queue پیشرفته، Event Sourcing، CQRS و Saga Pattern** باشه — جایی که سیستم‌های بانکی، صرافی و پلتفرم‌های بزرگ با اون کار می‌کنن. پروژه Observability رو توی GitHub آپلود کن، لینک بده و با افتخار به همه بگو: «من Observability و Monitoring حرفه‌ای بلدم!» مسیرت پر از موفقیت باشه!

ارسال نظر جدید

گزارش دیدگاه