পাঠ ২৭ · ৩৩-এর মধ্যে · মডিউল ৪
Home / AI Courses / MLOps / Prometheus & Grafana

Prometheus ও Grafana

Prometheus + Grafana for ML monitoring
৭ মিনিট পড়া মধ্য · Intermediate Tooling

এই পাঠে যা শিখবেন

  • Prometheus pull model + service discovery
  • ৪ metric types — কোনটা কখন
  • FastAPI-এ ML metrics instrumentation
  • PromQL basics + Grafana dashboard

১ · Pull-based architecture

Prometheus standard pull model — service expose HTTP /metrics; Prometheus periodically scrape (15-60 sec interval).

  • Pros: no metric server-overload (scrape rate Prometheus-controlled).
  • Pros: service-discovery friendly (K8s, Consul).
  • Cons: short-lived job tricky (Pushgateway alternative).

২ · Metric types

  • Counter: monotonically increasing — request count, error count.
  • Gauge: goes up/down — queue depth, model accuracy.
  • Histogram: distribution — latency p50/p95/p99 observable.
  • Summary: pre-computed quantile — like histogram but server-side.

৩ · FastAPI-এ ML metrics

Python · prometheus-fastapi-instrumentator
from fastapi import FastAPI
from prometheus_fastapi_instrumentator import Instrumentator
from prometheus_client import Counter, Histogram, Gauge

app = FastAPI()

# ML-specific custom metrics
predictions_total = Counter(
    "ml_predictions_total",
    "Total predictions made",
    ["model_version", "label"],
)
prediction_confidence = Histogram(
    "ml_prediction_confidence",
    "Confidence distribution",
    ["model_version"],
    buckets=[0.1, 0.3, 0.5, 0.7, 0.9, 1.0],
)
inference_latency = Histogram(
    "ml_inference_latency_seconds",
    "Model inference time",
    ["model_version"],
    buckets=[0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0],
)
data_drift_psi = Gauge(
    "ml_data_drift_psi",
    "Population Stability Index per feature",
    ["feature"],
)

# Auto-instrument HTTP metrics
Instrumentator().instrument(app).expose(app)

@app.post("/predict")
def predict(req):
    import time
    start = time.perf_counter()
    proba = model.predict_proba([req.text])[0]
    label = str(proba.argmax())
    confidence = float(proba.max())

    elapsed = time.perf_counter() - start
    predictions_total.labels(
        model_version=MODEL_VERSION, label=label
    ).inc()
    prediction_confidence.labels(
        model_version=MODEL_VERSION
    ).observe(confidence)
    inference_latency.labels(
        model_version=MODEL_VERSION
    ).observe(elapsed)

    return {"label": label, "confidence": confidence}

# /metrics endpoint auto-exposed by Instrumentator

    
ML-specific metrics: prediction count by label (distribution skew), confidence histogram (drift signal), per-version latency. Drift PSI separate scrape job from data validation pipeline.

৪ · Prometheus config

YAML · prometheus.yml
global:
  scrape_interval: 30s

scrape_configs:
  - job_name: 'ml-services'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app]
        regex: '.*ml-.*'
        action: keep

  - job_name: 'sentiment-api'
    static_configs:
      - targets: ['sentiment-api:8000']

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

rule_files:
  - 'ml_alerts.yml'

    
K8s service discovery — pod label-based filter. Alertmanager-এ rules forward.

৫ · PromQL basics

  • rate(http_requests_total[5m]) — RPS over 5 min.
  • histogram_quantile(0.99, rate(ml_inference_latency_seconds_bucket[5m])) — p99 latency.
  • sum by (model_version) (rate(ml_predictions_total[5m])) — RPS per version.
  • avg_over_time(ml_data_drift_psi{feature="age"}[1h]) — recent drift trend.

৬ · Alert rules

YAML · ml_alerts.yml
groups:
  - name: ml-alerts
    rules:
      - alert: HighErrorRate
        expr: |
          sum(rate(http_requests_total{status=~"5.."}[5m]))
          / sum(rate(http_requests_total[5m])) > 0.01
        for: 5m
        labels: { severity: page }
        annotations:
          summary: "ML service error rate > 1%"

      - alert: HighLatency
        expr: |
          histogram_quantile(0.99,
            rate(ml_inference_latency_seconds_bucket[5m])
          ) > 0.2
        for: 10m
        labels: { severity: warn }

      - alert: DriftDetected
        expr: ml_data_drift_psi > 0.25
        for: 1h
        labels: { severity: warn }
        annotations:
          summary: "Feature {{ $labels.feature }} PSI = {{ $value }}"

      - alert: PredictionDistributionShift
        expr: |
          abs(
            sum(rate(ml_predictions_total{label="positive"}[1h]))
            / sum(rate(ml_predictions_total[1h]))
            - 0.3
          ) > 0.1
        for: 30m
        labels: { severity: page }

    
ML-specific alerts: error/latency standard, plus drift, plus prediction distribution shift. for: 5m — sustained, not flap.

৭ · Grafana dashboards

  • Service overview: RPS, error rate, p99 latency.
  • Model performance: accuracy time-series, confidence distribution.
  • Drift dashboard: per-feature PSI heatmap.
  • Business KPI: conversion rate (separate metric pipeline).

Grafana JSON-based dashboards — version-control git-এ। Reusable templates.

৮ · Cardinality care

Each unique label combination = separate metric. High-cardinality labels (user_id) = explosion.

  • OK: model_version (~5), label (~10).
  • Bad: user_id (millions), full URL paths.
  • Bound cardinality — bucket high-card values.
Prometheus + Grafana — ML observability stack ML service /metrics endpoint Prometheus scrape + store Grafana dashboards User browser Alertmanager Slack, PagerDuty Slack / PD notification scrape PromQL alert rule fires Standard observability stack — adopted widely in Bangladesh tech.
Prometheus + Grafana standard ML monitoring stack — পাঠ ২৪-২৬-এর concept-গুলো এখানে operationalized.
Bangladesh tech-এ Prometheus + Grafana de facto. Datadog/New Relic enterprise option, কিন্তু cost বেশি।

ভাবনার প্রশ্ন

প্র ০১"Prometheus vs Datadog/CloudWatch — Bangladesh team-এর জন্য?"

Cost vs convenience tradeoff.

Prometheus + Grafana (OSS):

  • Free; self-host.
  • Powerful PromQL.
  • Wide K8s integration.
  • Cons: ops overhead, retention storage.

Datadog (SaaS):

  • Easy setup, polished UI.
  • APM + log + metric one platform.
  • Cost: $15-30/host/month rapidly accumulates.
  • BD: large fintech use; smaller skip.

CloudWatch (AWS):

  • AWS-native, integrated.
  • Cost: per-metric per-dashboard charge.
  • Custom metric expensive at scale.

BD adoption:

  • ~80% Prometheus + Grafana.
  • ~10% Datadog (enterprise).
  • ~5% CloudWatch (AWS-locked).

মূল উপলব্ধি: Prometheus + Grafana cost-effective default. Managed alternatives convenience cost-justified at large scale.

প্র ০২"Cardinality bombs — কীভাবে avoid?"

Cardinality issue Prometheus practical disaster.

Common bombs:

  • user_id label — millions.
  • request_path full URL — combinatorial.
  • request_id, session_id — unique each.
  • high-precision timestamps as labels.

Symptoms:

  • Prometheus memory explosion.
  • Slow queries.
  • Disk fill.

Prevention:

  • Bucket high-card values: user_id_bucket = id % 100.
  • Path normalize: /api/users/{id} → /api/users/_।
  • Allow-list labels in CI lint.
  • Cardinality monitor: count by (__name__) ({__name__=~".*"})।

Detection:

  • Prometheus's tsdb-status page — top metrics by series.
  • Alert: series count growing fast.

Bangladesh real:

  • One BD startup — request_path label exploded ৫০০K series, Prometheus crash.
  • Fix: relabel + drop high-cardinality.

মূল উপলব্ধি: Cardinality awareness essential. Label design critical. Quarterly review series count.

প্র ০৩"Retention strategy — কত দিন keep?"

Storage cost vs historical value.

Default Prometheus:

  • 15 days local storage.
  • Sufficient most operational debugging.

Long-term storage:

  • Thanos, Cortex, VictoriaMetrics — Prometheus + S3 backing.
  • Year-long retention possible.
  • Cost: tiered storage (hot/cold).

What needs long retention:

  • Compliance audit (Bangladesh Bank ICT 5 years).
  • Long-term trend (year-over-year).
  • Capacity planning.

Tiered:

  • 15 days full granularity.
  • 3 months downsampled (5-min average).
  • 1 year downsampled (1-hour average).
  • Storage 100× less.

BD context:

  • Most teams 30-90 days local.
  • Critical metrics export to BigQuery/Snowflake.
  • Compliance separate audit trail.

মূল উপলব্ধি: Tiered retention smart cost. Downsample aggressively. Compliance separate from operational.

প্র ০৪"SLO/SLI design ML service-এ?"

SLI = Service Level Indicator (metric). SLO = target. SLA = contract.

SLI examples ML:

  • Availability: % requests successful (200 status).
  • Latency: % requests p99 < threshold.
  • Quality: % predictions confidence > threshold.
  • Freshness: % requests using model less than X days old.

SLO target:

  • 99.9% availability — 43 min downtime/month.
  • 99% latency < 100ms.
  • Error budget: 100% - SLO = max budget acceptable.

Error budget concept:

  • SLO 99.9% → 0.1% budget = 43 min/month.
  • If month consumed, freeze deployments.
  • Below budget: ship freely.
  • Self-regulating tension between feature + reliability.

BD context — bKash payment:

  • SLO 99.95% extreme reliability.
  • 4 min/month budget tight.
  • ML model service must align.

SLA careful:

  • SLO internal target. SLA contract with customer (stricter or looser).
  • Penalty risk; underpromise overdeliver.

মূল উপলব্ধি: SLO/SLI/SLA discipline ML team graduate stage. Error budget reliability + speed balance.

অনুশীলন

  1. Instrument: উপরের code নিজের FastAPI ML service-এ apply. /metrics দেখুন।

    pip install prometheus-fastapi-instrumentator; instrument; localhost:8000/metrics check.

  2. Local Prometheus: Docker-এ Prometheus run; service scrape; Grafana add data source.

    Compose with Prometheus + Grafana; prometheus.yml-এ static_configs target add; Grafana DS Prometheus add.

  3. চিন্তা: Pathao ride matching — ৫টি SLI define করুন।
    • Availability: % match request 200.
    • Latency: % p99 < 200ms.
    • Match quality: % rides with confidence > 0.7.
    • Freshness: % decisions using model < 24h old.
    • Fairness: subgroup acceptance gap < 5%.

আরও পড়ুন

পূর্ববর্তী পাঠ
পাঠ ২৬ · Concept drift