Tác giả: Backend Engineer tại HolySheep AI — 3 năm kinh nghiệm xây dựng hệ thống monitoring cho LLM APIs tại doanh nghiệp startup Việt Nam

Vì sao bạn cần theo dõi chi phí API ngay lập tức

Khi tôi bắt đầu làm việc với các mô hình ngôn ngữ lớn (LLM) vào năm 2024, một câu chuyện kinh điển đã xảy ra: team chúng tôi không kiểm soát được chi phí API. Sau 2 tuần launch prototype, hóa đơn API từ $200/tháng nhảy vọt lên $4,800 — gấp 24 lần chỉ vì một bug nhỏ trong vòng lặp retry không giới hạn. Kể từ đó, tôi luôn bắt đầu mọi dự án LLM bằng hệ thống monitoring ngay từ ngày đầu tiên.

So sánh chi phí API LLM 2026 — Bảng giá đã xác minh

Trước khi đi vào kỹ thuật, hãy cùng xem bức tranh tổng quan về chi phí API các nhà cung cấp hàng đầu năm 2026:

Mô hìnhGiá Output (USD/MTok)Giá Input (USD/MTok)Chi phí 10M tokens/tháng
GPT-4.1$8.00$2.00$80,000 (nếu toàn output)
Claude Sonnet 4.5$15.00$3.00$150,000 (nếu toàn output)
Gemini 2.5 Flash$2.50$0.35$25,000 (nếu toàn output)
DeepSeek V3.2$0.42$0.14$4,200 (nếu toàn output)
HolySheep AITiết kiệm 85%+Hỗ trợ CNY/USDTùy gói — xem bảng giá

Với mức giá như trên, nếu doanh nghiệp của bạn xử lý 10 triệu tokens mỗi tháng với GPT-4.1 (toàn bộ là output), chi phí lên tới $80,000 — một con số có thể khiến startup phá sản. Đó là lý do monitoring không phải là "nice to have" mà là "must-have" trong kiến trúc LLM.

Kiến trúc hệ thống Monitoring HolySheep

Hệ thống monitoring mà tôi xây dựng cho HolySheep dựa trên 3 thành phần chính:

Cài đặt OpenTelemetry SDK cho HolySheep API

Dưới đây là code hoàn chỉnh để tích hợp OpenTelemetry vào ứng dụng gọi HolySheep API. Tôi đã test trên Python 3.10+ và Node.js 18+.

# Cài đặt dependencies
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp \
    opentelemetry-instrumentation-requests prometheus-client

Hoặc với npm cho Node.js

npm install @opentelemetry/api @opentelemetry/sdk-node \ @opentelemetry/exporter-trace-otlp-http @opentelemetry/instrumentation-http \ prom-client
# Python: monitoring_client.py
import os
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from prometheus_client import Counter, Histogram, Gauge
import time

Cấu hình Prometheus metrics

REQUEST_COUNT = Counter( 'llm_api_requests_total', 'Total LLM API requests', ['model', 'status', 'provider'] ) REQUEST_LATENCY = Histogram( 'llm_api_latency_seconds', 'LLM API latency in seconds', ['model', 'provider'], buckets=[0.1, 0.25, 0.5, 1.0, 2.0, 5.0, 10.0] ) TOKEN_USAGE = Counter( 'llm_token_usage_total', 'Total tokens used', ['model', 'type', 'provider'] # type: input/output ) COST_TRACKER = Gauge( 'llm_cost_usd', 'Current cost in USD', ['model', 'provider'] )

Cấu hình OpenTelemetry

resource = Resource.create({ "service.name": "holysheep-api-monitor", "service.version": "1.0.0", "deployment.environment": os.getenv("ENV", "production") }) provider = TracerProvider(resource=resource) processor = BatchSpanProcessor(OTLPSpanExporter( endpoint=os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317") )) provider.add_span_processor(processor) trace.set_tracer_provider(provider) tracer = trace.get_tracer(__name__)

Bảng giá tham chiếu (USD per million tokens)

PRICING = { "gpt-4.1": {"input": 2.00, "output": 8.00}, "claude-sonnet-4.5": {"input": 3.00, "output": 15.00}, "gemini-2.5-flash": {"input": 0.35, "output": 2.50}, "deepseek-v3.2": {"input": 0.14, "output": 0.42}, # HolySheep: dynamic pricing với 85%+ savings "holysheep-gpt4": {"input": 0.30, "output": 1.20}, "holysheep-claude": {"input": 0.45, "output": 2.25}, "holysheep-gemini": {"input": 0.05, "output": 0.38}, "holysheep-deepseek": {"input": 0.02, "output": 0.06}, } def calculate_cost(model: str, input_tokens: int, output_tokens: int) -> float: """Tính chi phí USD cho một request""" model_key = model.lower() for key, pricing in PRICING.items(): if key in model_key: cost = (input_tokens / 1_000_000 * pricing["input"] + output_tokens / 1_000_000 * pricing["output"]) return round(cost, 6) return 0.0 async def call_holysheep_with_monitoring( prompt: str, model: str = "gpt-4", system_prompt: str = None ): """Gọi HolySheep API với full monitoring""" import requests start_time = time.time() status = "success" with tracer.start_as_current_span("llm_request") as span: span.set_attribute("llm.model", model) span.set_attribute("llm.provider", "holysheep") try: headers = { "Authorization": f"Bearer {os.getenv('HOLYSHEEP_API_KEY')}", "Content-Type": "application/json" } payload = { "model": model, "messages": [] } if system_prompt: payload["messages"].append({ "role": "system", "content": system_prompt }) payload["messages"].append({ "role": "user", "content": prompt }) # Gọi HolySheep API - base_url: https://api.holysheep.ai/v1 response = requests.post( "https://api.holysheep.ai/v1/chat/completions", headers=headers, json=payload, timeout=60 ) response.raise_for_status() data = response.json() # Trích xuất usage và tính chi phí usage = data.get("usage", {}) input_tokens = usage.get("prompt_tokens", 0) output_tokens = usage.get("completion_tokens", 0) cost = calculate_cost(model, input_tokens, output_tokens) # Cập nhật Prometheus metrics REQUEST_COUNT.labels(model=model, status="success", provider="holysheep").inc() TOKEN_USAGE.labels(model=model, type="input", provider="holysheep").inc(input_tokens) TOKEN_USAGE.labels(model=model, type="output", provider="holysheep").inc(output_tokens) COST_TRACKER.labels(model=model, provider="holysheep").set(cost) span.set_attribute("llm.input_tokens", input_tokens) span.set_attribute("llm.output_tokens", output_tokens) span.set_attribute("llm.cost_usd", cost) span.set_attribute("llm.latency_ms", (time.time() - start_time) * 1000) return { "response": data["choices"][0]["message"]["content"], "usage": usage, "cost_usd": cost, "latency_ms": round((time.time() - start_time) * 1000, 2) } except Exception as e: status = "error" REQUEST_COUNT.labels(model=model, status="error", provider="holysheep").inc() span.record_exception(e) raise finally: latency = time.time() - start_time REQUEST_LATENCY.labels(model=model, provider="holysheep").observe(latency) span.set_attribute("llm.total_latency_seconds", latency)
// Node.js: holysheep-monitor.js
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
const { trace, SpanStatusCode, context } = require('@opentelemetry/api');
const promClient = require('prom-client');

// Khởi tạo Prometheus registry
const register = new promClient.Registry();
promClient.collectDefaultMetrics({ register });

// Định nghĩa metrics
const requestCounter = new promClient.Counter({
    name: 'llm_api_requests_total',
    help: 'Total LLM API requests',
    labelNames: ['model', 'status', 'provider'],
    registers: [register]
});

const requestLatency = new promClient.Histogram({
    name: 'llm_api_latency_seconds',
    help: 'LLM API latency in seconds',
    labelNames: ['model', 'provider'],
    buckets: [0.1, 0.25, 0.5, 1.0, 2.0, 5.0, 10.0],
    registers: [register]
});

const tokenUsage = new promClient.Counter({
    name: 'llm_token_usage_total',
    help: 'Total tokens used',
    labelNames: ['model', 'type', 'provider'],
    registers: [register]
});

const costTracker = new promClient.Gauge({
    name: 'llm_cost_usd',
    help: 'Current cost in USD',
    labelNames: ['model', 'provider'],
    registers: [register]
});

// Bảng giá HolySheep 2026 (USD per million tokens)
const PRICING = {
    'holysheep-gpt4': { input: 0.30, output: 1.20 },
    'holysheep-claude': { input: 0.45, output: 2.25 },
    'holysheep-gemini': { input: 0.05, output: 0.38 },
    'holysheep-deepseek': { input: 0.02, output: 0.06 },
};

function calculateCost(model, inputTokens, outputTokens) {
    const pricing = PRICING[model.toLowerCase()];
    if (!pricing) return 0;
    
    return (inputTokens / 1_000_000 * pricing.input) +
           (outputTokens / 1_000_000 * pricing.output);
}

async function callHolySheep(prompt, model = 'gpt-4', systemPrompt = null) {
    const startTime = Date.now();
    let status = 'success';
    
    const tracer = trace.getTracer('holysheep-monitor', '1.0.0');
    
    return tracer.startActiveSpan('llm_request', async (span) => {
        span.setAttribute('llm.model', model);
        span.setAttribute('llm.provider', 'holysheep');
        
        try {
            const headers = {
                'Authorization': Bearer ${process.env.HOLYSHEEP_API_KEY},
                'Content-Type': 'application/json'
            };
            
            const messages = [];
            if (systemPrompt) {
                messages.push({ role: 'system', content: systemPrompt });
            }
            messages.push({ role: 'user', content: prompt });
            
            const response = await fetch('https://api.holysheep.ai/v1/chat/completions', {
                method: 'POST',
                headers,
                body: JSON.stringify({ model, messages }),
                signal: AbortSignal.timeout(60000)
            });
            
            if (!response.ok) {
                throw new Error(HTTP ${response.status}: ${await response.text()});
            }
            
            const data = await response.json();
            const { prompt_tokens = 0, completion_tokens = 0 } = data.usage || {};
            
            const cost = calculateCost(model, prompt_tokens, completion_tokens);
            const latencyMs = Date.now() - startTime;
            
            // Cập nhật metrics
            requestCounter.labels(model, 'success', 'holysheep').inc();
            tokenUsage.labels(model, 'input', 'holysheep').inc(prompt_tokens);
            tokenUsage.labels(model, 'output', 'holysheep').inc(completion_tokens);
            costTracker.labels(model, 'holysheep').set(cost);
            
            span.setAttribute('llm.input_tokens', prompt_tokens);
            span.setAttribute('llm.output_tokens', completion_tokens);
            span.setAttribute('llm.cost_usd', cost);
            span.setAttribute('llm.latency_ms', latencyMs);
            
            return {
                response: data.choices[0].message.content,
                usage: data.usage,
                costUsd: cost,
                latencyMs
            };
            
        } catch (error) {
            status = 'error';
            requestCounter.labels(model, 'error', 'holysheep').inc();
            span.recordException(error);
            span.setStatus({ code: SpanStatusCode.ERROR });
            throw error;
            
        } finally {
            const latencySeconds = (Date.now() - startTime) / 1000;
            requestLatency.labels(model, 'holysheep').observe(latencySeconds);
            span.setAttribute('llm.total_latency_seconds', latencySeconds);
            span.end();
        }
    });
}

module.exports = { callHolySheep, register };

Cấu hình Grafana Dashboard cho Cost & Latency Tracking

Sau khi đã thu thập metrics, bước tiếp theo là tạo dashboard Grafana để trực quan hóa dữ liệu. Dưới đây là JSON dashboard template mà tôi sử dụng cho các dự án HolySheep:

{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": null,
  "graphTooltip": 0,
  "id": null,
  "links": [],
  "panels": [
    {
      "datasource": "Prometheus",
      "fieldConfig": {
        "defaults": {
          "color": {"mode": "palette-classic"},
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {"color": "green", "value": null},
              {"color": "yellow", "value": 100},
              {"color": "red", "value": 1000}
            ]
          },
          "unit": "currencyUSD"
        }
      },
      "gridPos": {"h": 8, "w": 12, "x": 0, "y": 0},
      "id": 1,
      "options": {
        "colorMode": "value",
        "graphMode": "area",
        "justifyMode": "auto",
        "orientation": "auto",
        "reduceOptions": {
          "calcs": ["lastNotNull"],
          "fields": "",
          "values": false
        },
        "textMode": "auto"
      },
      "pluginVersion": "8.0.0",
      "targets": [
        {
          "expr": "sum(increase(llm_cost_usd[24h]))",
          "legendFormat": "Daily Cost",
          "refId": "A"
        }
      ],
      "title": "💰 Tổng chi phí API 24h",
      "type": "stat"
    },
    {
      "datasource": "Prometheus",
      "fieldConfig": {
        "defaults": {
          "color": {"mode": "palette-classic"},
          "custom": {
            "axisLabel": "",
            "axisPlacement": "auto",
            "barAlignment": 0,
            "drawStyle": "line",
            "fillOpacity": 10,
            "gradientMode": "none",
            "hideFrom": {"tooltip": false, "viz": false, "legend": false},
            "lineInterpolation": "smooth",
            "lineWidth": 2,
            "pointSize": 5,
            "scaleDistribution": {"type": "linear"},
            "showPoints": "never",
            "spanNulls": true
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {"color": "green", "value": null},
              {"color": "yellow", "value": 500},
              {"color": "red", "value": 2000}
            ]
          },
          "unit": "ms"
        }
      },
      "gridPos": {"h": 8, "w": 12, "x": 12, "y": 0},
      "id": 2,
      "options": {
        "legend": {"displayMode": "list", "placement": "bottom"},
        "tooltip": {"mode": "single"}
      },
      "targets": [
        {
          "expr": "histogram_quantile(0.50, sum(rate(llm_api_latency_seconds_bucket[5m])) by (le, model)) * 1000",
          "legendFormat": "P50 - {{model}}",
          "refId": "A"
        },
        {
          "expr": "histogram_quantile(0.95, sum(rate(llm_api_latency_seconds_bucket[5m])) by (le, model)) * 1000",
          "legendFormat": "P95 - {{model}}",
          "refId": "B"
        },
        {
          "expr": "histogram_quantile(0.99, sum(rate(llm_api_latency_seconds_bucket[5m])) by (le, model)) * 1000",
          "legendFormat": "P99 - {{model}}",
          "refId": "C"
        }
      ],
      "title": "📊 Độ trễ API theo Model (P50/P95/P99)",
      "type": "timeseries"
    },
    {
      "datasource": "Prometheus",
      "gridPos": {"h": 8, "w": 12, "x": 0, "y": 8},
      "id": 3,
      "options": {
        "displayLabels": ["name", "percent"],
        "legend": {"displayMode": "list", "placement": "right"},
        "pieType": "pie",
        "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false},
        "tooltip": {"mode": "single"}
      },
      "targets": [
        {
          "expr": "sum(increase(llm_token_usage_total[7d])) by (model)",
          "legendFormat": "{{model}}",
          "refId": "A"
        }
      ],
      "title": "🥧 Phân bổ Token theo Model (7 ngày)",
      "type": "piechart"
    },
    {
      "datasource": "Prometheus",
      "fieldConfig": {
        "defaults": {
          "color": {"mode": "thresholds"},
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {"color": "green", "value": null},
              {"color": "yellow", "value": 50},
              {"color": "red", "value": 100}
            ]
          },
          "unit": "percent"
        }
      },
      "gridPos": {"h": 8, "w": 12, "x": 12, "y": 8},
      "id": 4,
      "options": {
        "orientation": "auto",
        "reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": false},
        "showThresholdLabels": false,
        "showThresholdMarkers": true
      },
      "targets": [
        {
          "expr": "sum(rate(llm_api_requests_total{status='error'}[5m])) / sum(rate(llm_api_requests_total[5m])) * 100",
          "legendFormat": "Error Rate",
          "refId": "A"
        }
      ],
      "title": "⚠️ Tỷ lệ lỗi API (%)",
      "type": "gauge"
    }
  ],
  "schemaVersion": 27,
  "style": "dark",
  "tags": ["llm", "monitoring", "holysheep"],
  "templating": {"list": []},
  "time": {"from": "now-24h", "to": "now"},
  "timepicker": {},
  "timezone": "browser",
  "title": "HolySheep LLM Cost & Latency Dashboard",
  "uid": "holysheep-llm-monitor",
  "version": 1
}

Cấu hình Alerting Rules cho Cost Control

Một trong những tính năng quan trọng nhất là alerting — tự động thông báo khi chi phí vượt ngưỡng. Dưới đây là Prometheus alerting rules:

# prometheus-alerts.yml
groups:
  - name: holysheep_cost_alerts
    rules:
      # Alert khi chi phí hàng ngày vượt $500
      - alert: HighDailyCost
        expr: sum(increase(llm_cost_usd[24h])) > 500
        for: 5m
        labels:
          severity: warning
          team: backend
        annotations:
          summary: "Chi phí API LLM cao bất thường"
          description: "Chi phí 24h đã đạt ${{ $value }}, vượt ngưỡng $500"
          runbook_url: "https://docs.holysheep.ai/runbooks/high-cost"

      # Alert khi chi phí hàng ngày vượt $2000 (CRITICAL)
      - alert: CriticalDailyCost
        expr: sum(increase(llm_cost_usd[24h])) > 2000
        for: 5m
        labels:
          severity: critical
          team: backend
        annotations:
          summary: "⚠️ CRITICAL: Chi phí API vượt kiểm soát!"
          description: "Chi phí 24h đạt ${{ $value }} — có thể có bug nghiêm trọng hoặc bị abuse!"
          runbook_url: "https://docs.holysheep.ai/runbooks/critical-cost"

      # Alert khi latency P95 vượt 5 giây
      - alert: HighLatency
        expr: histogram_quantile(0.95, sum(rate(llm_api_latency_seconds_bucket[5m])) by (le)) > 5
        for: 5m
        labels:
          severity: warning
          team: backend
        annotations:
          summary: "Độ trễ API cao"
          description: "P95 latency đạt {{ $value | humanizeDuration }}, vượt SLA 5s"

      # Alert khi tỷ lệ lỗi vượt 5%
      - alert: HighErrorRate
        expr: |
          sum(rate(llm_api_requests_total{status="error"}[5m])) 
          / 
          sum(rate(llm_api_requests_total[5m])) > 0.05
        for: 5m
        labels:
          severity: warning
          team: backend
        annotations:
          summary: "Tỷ lệ lỗi API cao"
          description: "Error rate đạt {{ $value | humanizePercentage }}"

      # Alert khi một model cụ thể có chi phí tăng đột biến 200%
      - alert: ModelCostSpike
        expr: |
          (sum(increase(llm_cost_usd[1h])) by (model) 
          / 
          avg(increase(llm_cost_usd[1h])) by (model) over (7d)) > 3
        for: 10m
        labels:
          severity: warning
          team: backend
        annotations:
          summary: "Chi phí model {{ $labels.model }} tăng đột biến"
          description: "Chi phí 1h gần đây cao hơn trung bình 7 ngày {{ $value | humanize }} lần"

Hướng dẫn cài đặt Prometheus + Grafana với Docker Compose

Để tiết kiệm thời gian, tôi đã tạo docker-compose.yml hoàn chỉnh cho toàn bộ stack:

version: '3.8'

services:
  # OpenTelemetry Collector
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.91.0
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "4317:4317"   # OTLP gRPC
      - "4318:4318"   # OTLP HTTP
      - "8888:8888"   # Prometheus metrics exposed by collector
    networks:
      - monitoring

  # Prometheus - Thu thập metrics từ ứng dụng
  prometheus:
    image: prom/prometheus:v2.48.0
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-lifecycle'
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus-alerts.yml:/etc/prometheus/alerts.yml
      - prometheus-data:/prometheus
    ports:
      - "9090:9090"
    networks:
      - monitoring
    depends_on:
      - otel-collector

  # Grafana - Dashboard visualization
  grafana:
    image: grafana/grafana:10.2.2
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=changeme
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_INSTALL_PLUGINS=grafana-piechart-panel
    volumes:
      - grafana-data:/var/lib/grafana
      - ./dashboards:/etc/grafana/provisioning/dashboards
      - ./datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml
    ports:
      - "3000:3000"
    networks:
      - monitoring
    depends_on:
      - prometheus

  # Alertmanager - Xử lý alerts
  alertmanager:
    image: prom/alertmanager:v0.26.0
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager-data:/alertmanager
    ports:
      - "9093:9093"
    networks:
      - monitoring

  # Prometheus Push Gateway (cho batch jobs)
  pushgateway:
    image: prom/pushgateway:v1.6.2
    ports:
      - "9091:9091"
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

volumes:
  prometheus-data:
  grafana-data:
  alertmanager-data:
# otel-collector-config.yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

  prometheus:
    config:
      scrape_configs:
        - job_name: 'holysheep-api'
          static_configs:
            - targets: ['host.docker.internal:8000']
          metrics_path: /metrics

processors:
  batch:
    timeout: 10s
    send_batch_size: 1024

  memory_limiter:
    check_interval: 1s
    limit_percentage: 75

  # Transform để thêm metadata cho cost tracking
  transform:
    error_mode: ignore
    metric_statements:
      - context: metric
        statements:
          - set(description, "LLM API Cost in USD") where name == "llm_cost_usd"

exporters:
  prometheus:
    endpoint: "0.0.0.0:8888"
    namespace: "holysheep"
    const_labels:
      environment: production

  prometheusremotewrite:
    endpoint: "http://prometheus:9090/api/v1/write"
    tls:
      insecure: true

  logging:
    verbosity: basic

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [logging]
    metrics:
      receivers: [otlp, prometheus]
      processors: [memory_limiter, batch, transform]
      exporters: [prometheus, prometheusremotewrite, logging]
    logs:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [logging]

Lỗi thường gặp và cách khắc phục

1. Lỗi "Connection refused" khi gửi metrics đến Prometheus

Mô tả: Ứng dụng không thể kết nối đến Prometheus endpoint, thường xảy ra khi chạy Docker trên Mac/Windows với host networking khác.

# Vấn đề: Container không thể truy cập localhost:9090

Error: ConnectionRefusedError: [Errno 111] Connection refused

GIẢI PHÁP:

1. Trên Docker Desktop, sử dụng host.docker.internal thay vì localhost

2. Hoặc thêm vào prometheus.yml:

scrape_configs: - job_name: 'holysheep-api' static_configs: - targets: ['host.docker.internal:8000'] # Thay vì localhost:8000 scrape_interval: 15s

3. Nếu dùng Linux, thêm --network=host vào docker-compose service

4. Kiểm tra firewall không chặn port 9090

Xác minh kết nối:

docker exec prometheus wget -qO- http://host.docker.internal:8000/metrics || \ echo "Kiểm tra lại network configuration"

2. Lỗi "403 Forbidden" khi gọi HolySheep API