๐Ÿ“ˆ Prometheus ๋ฉ”ํŠธ๋ฆญ

๐Ÿ“ˆ Prometheus ๋ฉ”ํŠธ๋ฆญ

LiteLLM์€ Prometheus๊ฐ€ ํด๋งํ•  ์ˆ˜ ์žˆ๋Š” /metrics ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋…ธ์ถœํ•ด์š”. ์ง€์ถœ, ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰, ๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹, ์˜ˆ์‚ฐ, ๋ ˆ์ดํ„ด์‹œ, ๊ฐ€๋“œ๋ ˆ์ผ, MCP, ๊ด€๋ฆฌํ˜• ๋ฐฐ์น˜ ๋“ฑ ํ”„๋ก์‹œ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์ธก๋ฉด์„ ์‹œ๊ณ„์—ด ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

ํ”„๋ก์‹œ ์„ค์ •์˜ callbacks์— prometheus๋ฅผ ์ถ”๊ฐ€ํ•ด ์ผœ๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ /metrics๋Š” LiteLLM API ํ‚ค ์ธ์ฆ์„ ์š”๊ตฌํ•ด์š”(v1.85.0๋ถ€ํ„ฐ).

์ถœ์ฒ˜: ๋ฌธ์„œ

๋ณธ๋ฌธ

LiteLLM์€ Prometheus๊ฐ€ ํด๋งํ•  ์ˆ˜ ์žˆ๋Š” /metrics ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋…ธ์ถœํ•ด์š”.

๋น ๋ฅธ ์‹œ์ž‘ (Quick Start)

LiteLLM CLI๋ฅผ litellm --config proxy_config.yaml๋กœ ์“ด๋‹ค๋ฉด uv add prometheus_client==0.20.0๊ฐ€ ํ•„์š”ํ•ด์š”. ์ด๊ฒƒ์€ litellm ๋„์ปค ์ด๋ฏธ์ง€์— ๋ฏธ๋ฆฌ ์„ค์น˜๋ผ ์žˆ์–ด์š”.

ํ”„๋ก์‹œ config.yaml์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

    model_list:
      - model_name: gpt-5.6-terra
        litellm_params:
          model: gpt-5.6-terra
    litellm_settings:
      callbacks:
        - prometheus

ํ”„๋ก์‹œ ์‹œ์ž‘:

    litellm --config config.yaml --debug

ํ…Œ์ŠคํŠธ ์š”์ฒญ:

    curl --location 'http://0.0.0.0:4000/chat/completions' \
        --header 'Content-Type: application/json' \
        --data '{
        "model": "gpt-5.6-terra",
        "messages": [
            {
            "role": "user",
            "content": "what llm are you"
            }
        ]
    }'

/metrics์—์„œ ๋ฉ”ํŠธ๋ฆญ ๋ณด๊ธฐ:

    curl http://localhost:4000/metrics \
      -H "Authorization: Bearer ***"

์—ฌ๋Ÿฌ ์›Œ์ปค (Multiple Workers)

์—ฌ๋Ÿฌ ์›Œ์ปค๋กœ LiteLLM์„ ์“ฐ๋ฉด ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ง‘๊ณ„ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด PROMETHEUS_MULTIPROC_DIR ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ด์š”.

    export PROMETHEUS_MULTIPROC_DIR="/prometheus_multiproc"

์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” Prometheus ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ํ•  ๋ฉ”ํŠธ๋ฆญ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์จ์š”. ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๊ณ  LiteLLM ํ”„๋กœ์„ธ์Šค๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

Prometheus ์Šคํฌ๋ž˜ํ•‘์„ ์ถ”๋ก  ํŠธ๋ž˜ํ”ฝ์—์„œ ๋ถ„๋ฆฌํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ LiteLLM์€ ์ถ”๋ก  ์š”์ฒญ์„ ์„œ๋น™ํ•˜๋Š” ๊ฐ™์€ Uvicorn ์›Œ์ปค๋“ค์„ ์‚ฌ์šฉํ•ด ํ”„๋ก์‹œ ํฌํŠธ์— /metrics๋ฅผ ๋ Œ๋”๋งํ•ด์š”. ๋ฉ€ํ‹ฐ ์›Œ์ปค ๋ฐฐํฌ์—์„œ ๊ฐ ์Šคํฌ๋ž˜ํ•‘์€ ์ž‘์—…์ž ๊ฐ„ Prometheus ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•ด์š”. ํฌ๊ฑฐ๋‚˜ ๋†’์€ ์นด๋””๋„๋ฆฌํ‹ฐ์˜ ๋ฉ”ํŠธ๋ฆญ ์„ธํŠธ๋Š” ์š”์ฒญ ์„œ๋น™ ์›Œ์ปค์˜ CPU๋ฅผ ์†Œ๋ชจํ•˜๊ณ  ๊ผฌ๋ฆฌ ์ง€์—ฐ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”.

LiteLLM v1.101.0 ์ด์ƒ์€ ์ „์šฉ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ™์€ ๋ฉ”ํŠธ๋ฆญ ์„ธํŠธ๋ฅผ ์„œ๋น™ํ•  ์ˆ˜ ์žˆ์–ด์š”. --prometheus_metrics_port ๋˜๋Š” PROMETHEUS_METRICS_PORT๋ฅผ ๊ตฌ์„ฑํ•œ ๋’ค Prometheus๊ฐ€ ๊ทธ ํฌํŠธ๋ฅผ ์Šคํฌ๋ž˜ํ•‘ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”. ํ”„๋ก์‹œ ํฌํŠธ์˜ ๊ธฐ์กด /metrics ๋ผ์šฐํŠธ๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์œ ์ง€๋˜๋ฏ€๋กœ, ์ถ”๋ก  ํŠธ๋ž˜ํ”ฝ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ์Šคํฌ๋ž˜ํ•‘ ๋Œ€์ƒ์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์–ด์š”.

prometheus ์ฝœ๋ฐฑ์ด ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•ด์š”. ์ „์šฉ ํฌํŠธ๊ฐ€ ๊ตฌ์„ฑ๋˜๋ฉด LiteLLM์€ ํ•„์š” ์‹œ PROMETHEUS_MULTIPROC_DIR์„ ๋งŒ๋“ค๊ณ , ๋ฉ”ํŠธ๋ฆญ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ”„๋ก์‹œ --host์— ๋ฐ”์ธ๋”ฉํ•˜๋ฉฐ, ํ”„๋ก์‹œ์™€ ํ•จ๊ป˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•ด์š”.

    litellm --config config.yaml --num_workers 4 --prometheus_metrics_port 4001

prometheus.yml:

    scrape_configs:
      - job_name: litellm
        static_configs:
          - targets: ["litellm:4001"]

๋ฉ”ํŠธ๋ฆญ ๋ฆฌ์Šค๋„ˆ ๋ณด์•ˆ

์ „์šฉ ๋ฆฌ์Šค๋„ˆ๋Š” LiteLLM ๊ฐ€์ƒ ํ‚ค ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์š”. require_auth_for_metrics_endpoint๋Š” ํ”„๋ก์‹œ ํฌํŠธ์˜ /metrics์—๋งŒ ์ ์šฉ๋ผ์š”. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” Prometheus ๋˜๋Š” ์ˆ˜์ง‘๊ธฐ ๋„คํŠธ์›Œํฌ์—์„œ๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ณ , ์ „์šฉ ํฌํŠธ๋ฅผ ๊ณต๊ฐœ ์ธ๊ทธ๋ ˆ์Šค๋‚˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ ๊ฒŒ์‹œํ•˜์ง€ ๋งˆ์„ธ์š”.

๋ฐฐํฌ ๊ตฌ์„ฑ

  • Helm: litellm-helm
  • Helm: componentized
  • Terraform: AWS

values.yaml:

    metricsServer:
      enabled: true
      port: 4001

    serviceMonitor:
      enabled: true

์ฐจํŠธ๋Š” ์ „์šฉ <release>-litellm-metrics ClusterIP Service๋ฅผ ๋งŒ๋“ค๊ณ  ServiceMonitor๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ํ–ฅํ•˜๊ฒŒ ํ•ด์š”. ๊ธฐ๋ณธ Service๋Š” service.type์ด LoadBalancer์ผ ๋•Œ๋„ ๋ณ€ํ•˜์ง€ ์•Š์•„์š”. metricsServer.port๋Š” service.port์™€ ๋‹ฌ๋ผ์•ผ ํ•ด์š”.

values.yaml:

    gateway:
      metricsServer:
        enabled: true
        port: 4001

์ฐจํŠธ๋Š” ๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„๋ฅผ ๊ฒŒ์ดํŠธ์›จ์ด์™€ Prometheus ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์‚ฌ์ด๋“œ์นด๋กœ ์‹คํ–‰ํ•ด์š”. ์ „์šฉ <release>-litellm-gateway-metrics ClusterIP Service๋ฅผ ํ†ตํ•ด ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋…ธ์ถœํ•˜๋ฏ€๋กœ, Prometheus๊ฐ€ ๊ทธ ํ”„๋ผ์ด๋น— Service๋ฅผ ๋ฐœ๊ฒฌํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์„ธ์š”. ๊ฒŒ์ดํŠธ์›จ์ด Service๋Š” ๊ทธ๋Œ€๋กœ์˜ˆ์š”.

main.tf:

    module "litellm" {
      source  = "BerriAI/litellm/aws"
      version = "~> 1.101"

      gateway_metrics_port         = 4001
      gateway_metrics_scrape_cidrs = ["10.0.0.0/16"]
    }

๋ชจ๋“ˆ์€ ๊ฒŒ์ดํŠธ์›จ์ด ํƒœ์Šคํฌ์— ๋น„ํ•„์ˆ˜ ๋ฉ”ํŠธ๋ฆญ ์‚ฌ์ด๋“œ์นด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  gateway_metrics_scrape_cidrs์—์„œ๋งŒ ํ•ด๋‹น ํฌํŠธ ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•ด์š”. Application Load Balancer๋Š” ๋ฉ”ํŠธ๋ฆญ ํฌํŠธ๋กœ ๋ผ์šฐํŒ…ํ•˜์ง€ ์•Š์•„์š”. gateway_metrics_port๊ฐ€ null(๊ธฐ๋ณธ๊ฐ’)์ด๋ฉด ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜๊ณ , ํฌํŠธ 4000์€ ๊ฒŒ์ดํŠธ์›จ์ด ํŠธ๋ž˜ํ”ฝ์šฉ์œผ๋กœ ์˜ˆ์•ฝ๋ผ์š”.

๋กค์•„์›ƒ ๊ฒ€์ฆํ•˜๊ธฐ

Prometheus ๋Œ€์ƒ์„ ๋ฐ”๊พธ๊ธฐ ์ „์— ์ „์šฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

    curl -fsS http://litellm:4001/health
    # {"status":"healthy","multiproc_dir":"..."}

    curl -fsS http://litellm:4001/metrics/ | head

์ „์šฉ ์—”๋“œํฌ์ธํŠธ๋Š” ํ”„๋ก์‹œ ํฌํŠธ ์—”๋“œํฌ์ธํŠธ์™€ ๊ฐ™์€ ๋ฉ”ํŠธ๋ฆญ, ๋ผ๋ฒจ ๊ตฌ์„ฑ, ํ•„ํ„ฐ๋ง, ์••์ถ•์„ ์ง€์›ํ•ด์š”. ํ”„๋ก์‹œ readiness๋Š” ํฌํŠธ 4000์˜ /health/readiness์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ฐ€์ƒ ํ‚ค, ํŒ€, ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž

user, key, team ๋“ฑ๋ณ„ ์ถ”์ ์— ์‚ฌ์šฉํ•ด์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_spend_metric ์ด ์ง€์ถœ. "end_user", "hashed_api_key", "api_key_alias", "model", "team", "team_alias", "user", "user_email", "client_ip", "user_agent", "requested_model", "model_id", "api_provider", "service_tier"๋ณ„
litellm_total_tokens_metric "end_user", "hashed_api_key", "api_key_alias", "model", "team", "team_alias", "user", "user_email", "requested_model", "model_id", "api_provider"๋ณ„ ์ž…๋ ฅ + ์ถœ๋ ฅ ํ† ํฐ
litellm_input_tokens_metric "end_user", "hashed_api_key", "api_key_alias", "model", "team", "team_alias", "user", "user_email", "requested_model", "model_id", "api_provider"๋ณ„ ์ž…๋ ฅ ํ† ํฐ
litellm_output_tokens_metric "end_user", "hashed_api_key", "api_key_alias", "model", "team", "team_alias", "user", "user_email", "requested_model", "model_id", "api_provider"๋ณ„ ์ถœ๋ ฅ ํ† ํฐ

ํ† ํฐ ์œ ํ˜• ์ƒ์„ธ ๋ฉ”ํŠธ๋ฆญ

๊ณต๊ธ‰์ž๊ฐ€ ๋ณด๊ณ ํ•˜๋Š” usage.prompt_tokens_details์™€ usage.completion_tokens_details ํ•„๋“œ(์˜ˆ: OpenAI ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ, Anthropic ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ, audio I/O, reasoning ํ† ํฐ)๋ฅผ ๋ถ„ํ•ดํ•˜๋Š” ํ† ํฐ ์œ ํ˜•๋ณ„ ์นด์šดํ„ฐ์˜ˆ์š”. ์ด๊ฒƒ๋“ค์€ ์œ„ ์ด๊ณ„์— **์ถ”๊ฐ€(additive)**๋˜๋ฉฐ, ๊ธฐ์กด litellm_input_tokens_metric / litellm_output_tokens_metric / litellm_total_tokens_metric ์นด์šดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ์˜ˆ์š”.

๊ฐ ์ƒ์„ธ ์นด์šดํ„ฐ๋Š” **ํฌ์†Œ(sparse)**ํ•ด์š”: ๊ณต๊ธ‰์ž๊ฐ€ ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•ด 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ณด๊ณ ํ•  ๋•Œ๋งŒ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, ํŠน์ • ์ƒ์„ธ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ณต๊ธ‰์ž๋Š” ๊ทธ์— ๋Œ€ํ•œ series๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„์š”. ๋ผ๋ฒจ ์ง‘ํ•ฉ์€ ๋ถ€๋ชจ ์ž…๋ ฅ/์ถœ๋ ฅ ํ† ํฐ ์นด์šดํ„ฐ์™€ ๋™์ผํ•ด PromQL์—์„œ ๊น”๋”ํ•˜๊ฒŒ ์กฐ์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ usage์˜ ์†Œ์Šค ํ•„๋“œ ์ผ๋ฐ˜ ๊ณต๊ธ‰์ž
litellm_input_cached_tokens_metric prompt_tokens_details.cached_tokens OpenAI ํ”„๋กฌํ”„ํŠธ ์บ์‹œ, Anthropic cache_read_input_tokens, DeepSeek prompt_cache_hit_tokens
litellm_input_cache_creation_tokens_metric prompt_tokens_details.cache_creation_tokens Anthropic cache_creation_input_tokens (ํ”„๋กฌํ”„ํŠธ ์บ์‹œ ์“ฐ๊ธฐ)
litellm_input_audio_tokens_metric prompt_tokens_details.audio_tokens OpenAI gpt-4o-audio-*, Gemini ์˜ค๋””์˜ค ์ž…๋ ฅ
litellm_output_reasoning_tokens_metric completion_tokens_details.reasoning_tokens OpenAI o1-* / o3-*, Anthropic extended thinking
litellm_output_audio_tokens_metric completion_tokens_details.audio_tokens OpenAI gpt-4o-audio-* ์˜ค๋””์˜ค ์ถœ๋ ฅ

๋ชจ๋ธ ๊ทธ๋ฃน์˜ ์บ์‹œ ์ ์ค‘ ๋น„์œจ PromQL ์˜ˆ์‹œ:

    sum by (requested_model) (rate(litellm_input_cached_tokens_metric_total[5m]))
    /
    sum by (requested_model) (rate(litellm_input_tokens_metric_total[5m]))

์ถœ๋ ฅ ์ค‘ reasoning ํ† ํฐ ๋น„์œจ PromQL ์˜ˆ์‹œ:

    sum by (requested_model) (rate(litellm_output_reasoning_tokens_metric_total[5m]))
    /
    sum by (requested_model) (rate(litellm_output_tokens_metric_total[5m]))

info

litellm_input_cached_tokens_metric์€ ๊ณต๊ธ‰์ž ์ธก ํ”„๋กฌํ”„ํŠธ ์บ์‹œ ์ฝ๊ธฐ(๊ณต๊ธ‰์ž๊ฐ€ ์ž…๋ ฅ์˜ ์บ์‹œ๋œ ์ผ๋ถ€๋ฅผ ๋ณด๊ณ )๋ฅผ ์ถ”์ ํ•ด์š”. ์ด๊ฒƒ์€ LiteLLM ์ž์ฒด ์‘๋‹ต ์บ์‹œ ์ ์ค‘(์ „์ฒด ์‘๋‹ต์ด LiteLLM ์บ์‹œ์—์„œ ์„œ๋น™๋˜๊ณ  ๊ณต๊ธ‰์ž ์š”์ฒญ์ด ์—†์Œ)์„ ์ถ”์ ํ•˜๋Š” litellm_cached_tokens_metric๊ณผ ๋‹ฌ๋ผ์š”.

์บ์‹œ ๋ฉ”ํŠธ๋ฆญ

LiteLLM ์ž์ฒด ์‘๋‹ต ์บ์‹œ๋ฅผ ์ถ”์ ํ•ด์š”. ์„ธ ๋ฉ”ํŠธ๋ฆญ ๋ชจ๋‘ "model", "hashed_api_key", "api_key_alias", "team", "team_alias", "end_user", "user", "model_id", "api_provider" ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_cache_hits_metric LiteLLM ์‘๋‹ต ์บ์‹œ์—์„œ ์™„์ „ํžˆ ์„œ๋น™๋œ ์š”์ฒญ (๊ณต๊ธ‰์ž ์š”์ฒญ ์—†์Œ)
litellm_cache_misses_metric LiteLLM ์‘๋‹ต ์บ์‹œ๋ฅผ ๋น—๋‚˜๊ฐ„ ์š”์ฒญ
litellm_cached_tokens_metric LiteLLM ์‘๋‹ต ์บ์‹œ์—์„œ ์„œ๋น™๋œ ํ† ํฐ

ํŒ€ - ์˜ˆ์‚ฐ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_team_max_budget_metric ํŒ€์˜ ์ตœ๋Œ€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "team", "team_alias"
litellm_remaining_team_budget_metric ํŒ€์˜ ๋‚จ์€ ์˜ˆ์‚ฐ (LiteLLM์—์„œ ๋งŒ๋“  ํŒ€) ๋ผ๋ฒจ: "team", "team_alias"
litellm_team_budget_remaining_hours_metric ํŒ€ ์˜ˆ์‚ฐ์ด ๋ฆฌ์…‹๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„ ๋ผ๋ฒจ: "team", "team_alias"

๊ฐ€์ƒ ํ‚ค - ์˜ˆ์‚ฐ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_api_key_max_budget_metric API ํ‚ค์˜ ์ตœ๋Œ€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "hashed_api_key", "api_key_alias"
litellm_remaining_api_key_budget_metric API ํ‚ค์˜ ๋‚จ์€ ์˜ˆ์‚ฐ (LiteLLM์—์„œ ๋งŒ๋“  ํ‚ค) ๋ผ๋ฒจ: "hashed_api_key", "api_key_alias"
litellm_api_key_budget_remaining_hours_metric API ํ‚ค ์˜ˆ์‚ฐ์ด ๋ฆฌ์…‹๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„ ๋ผ๋ฒจ: "hashed_api_key", "api_key_alias"

๋‚ด๋ถ€ ์‚ฌ์šฉ์ž - ์˜ˆ์‚ฐ

๋‚ด๋ถ€ ์‚ฌ์šฉ์ž์— ์—ฐ๊ฒฐ๋œ ์š”์ฒญ์—์„œ๋งŒ ๋ฐœํ–‰๋˜๋ฉฐ, ์ตœ๋Œ€ ์˜ˆ์‚ฐ๊ณผ ๋ฆฌ์…‹ ์‹œ๊ฐ„ ๊ฒŒ์ด์ง€๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ˆ์‚ฐ์ด ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ์š”๊ตฌ๋ผ์š”. ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์Šค์ผ€์ค„๋กœ ๋ฐœํ–‰ํ•˜๋ ค๋ฉด Starter์—์„œ Budget Metrics ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_remaining_user_budget_metric ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž์˜ ๋‚จ์€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "user"
litellm_user_max_budget_metric ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž์˜ ์ตœ๋Œ€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "user"
litellm_user_budget_remaining_hours_metric ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž ์˜ˆ์‚ฐ์ด ๋ฆฌ์…‹๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„ ๋ผ๋ฒจ: "user"

์กฐ์ง - ์˜ˆ์‚ฐ

์กฐ์ง์— ์—ฐ๊ฒฐ๋œ ์š”์ฒญ์—์„œ๋งŒ ๋ฐœํ–‰๋˜๋ฉฐ, ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž ๋ฉ”ํŠธ๋ฆญ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด ์ ์šฉ๋ผ์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_remaining_org_budget_metric ์กฐ์ง์˜ ๋‚จ์€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "org_id", "org_alias"
litellm_org_max_budget_metric ์กฐ์ง์˜ ์ตœ๋Œ€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "org_id", "org_alias"
litellm_org_budget_remaining_hours_metric ์กฐ์ง ์˜ˆ์‚ฐ์ด ๋ฆฌ์…‹๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„ ๋ผ๋ฒจ: "org_id", "org_alias"

๊ณ ๊ฐ (end_user) - ์˜ˆ์‚ฐ

end_user ์ถ”์ ์ด ์ผœ์ ธ ์žˆ์„ ๋•Œ๋งŒ ๋ฐœํ–‰๋ผ์š”. ๊ฐ ์š”์ฒญ์—์„œ ์ธ์ฆ ์ค‘ ์บ์‹œ๋œ ๊ณ ๊ฐ ํ–‰์—์„œ ํ•ด๋‹น ์š”์ฒญ์˜ ๊ณ ๊ฐ์— ๋Œ€ํ•ด ๋‚จ์€ยท์ตœ๋Œ€ ์˜ˆ์‚ฐ ๊ฒŒ์ด์ง€๊ฐ€ ๊ฐฑ์‹ ๋ผ์š”(์ถ”๊ฐ€ DB ์ฟผ๋ฆฌ ์—†์Œ. ์บ์‹œ ๋ฏธ์Šค๋Š” ์ฃผ๊ธฐ์  ๊ฐฑ์‹ ์— ๋งก๊น€). ๋ฆฌ์…‹ ์‹œ๊ฐ„ ๊ฒŒ์ด์ง€์™€ ์ตœ๊ทผ ํŠธ๋ž˜ํ”ฝ์ด ์—†๋Š” ๊ณ ๊ฐ์€ ์˜ˆ์‚ฐ์ด ๋ถ™์€ ๋ชจ๋“  ๊ณ ๊ฐ์— ๋Œ€ํ•ด ์„ธ ๊ฒŒ์ด์ง€๋ฅผ ๋ชจ๋‘ ๋ฐœํ–‰ํ•˜๋Š” Startup์—์„œ Budget Metrics ์ดˆ๊ธฐํ™”๊ฐ€ ๋‹ค๋ค„์š”. max_end_user_budget_id๊ฐ€ ์„ค์ •๋˜๋ฉด ์ž์ฒด ์˜ˆ์‚ฐ์ด ์—†๋Š” ๊ณ ๊ฐ์€ ๊ทธ ๊ธฐ๋ณธ ์˜ˆ์‚ฐ์— ๋Œ€ํ•ด ๋ฐœํ–‰๋ผ์š”. ์ด ์‹œ๋ฆฌ์ฆˆ๋Š” Prometheus์—์„œ end_user ์ถ”์ ์— ์„ค๋ช…๋œ end_user ์นด๋””๋„๋ฆฌํ‹ฐ ์ƒํ•œ์˜ ์ ์šฉ์„ ๋ฐ›์•„์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_remaining_customer_budget_metric ๊ณ ๊ฐ์˜ ๋‚จ์€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "end_user"
litellm_customer_max_budget_metric ๊ณ ๊ฐ์˜ ์ตœ๋Œ€ ์˜ˆ์‚ฐ ๋ผ๋ฒจ: "end_user"
litellm_customer_budget_remaining_hours_metric ๊ณ ๊ฐ ์˜ˆ์‚ฐ์ด ๋ฆฌ์…‹๋˜๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„ ๋ผ๋ฒจ: "end_user"

๊ฐ€์ƒ ํ‚ค - ๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_remaining_api_key_requests_for_model LiteLLM ๊ฐ€์ƒ API ํ‚ค์˜ ๋‚จ์€ ์š”์ฒญ ์ˆ˜. ๊ฐ€์ƒ ํ‚ค์— ๋ชจ๋ธ๋ณ„ ๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹(rpm)์ด ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋งŒ. ๋ผ๋ฒจ: "hashed_api_key", "api_key_alias", "model", "model_id"
litellm_remaining_api_key_tokens_for_model LiteLLM ๊ฐ€์ƒ API ํ‚ค์˜ ๋‚จ์€ ํ† ํฐ ์ˆ˜. ๊ฐ€์ƒ ํ‚ค์— ๋ชจ๋ธ๋ณ„ ํ† ํฐ ์ œํ•œ(tpm)์ด ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋งŒ. ๋ผ๋ฒจ: "hashed_api_key", "api_key_alias", "model", "model_id"

Startup์—์„œ Budget Metrics ์ดˆ๊ธฐํ™”

์š”์ฒญ์„ ๋ฐ›๊ณ  ์žˆ๋“  ์•„๋‹ˆ๋“  ๋ชจ๋“  ํ‚คยทํŒ€์˜ ์˜ˆ์‚ฐ ๋ฉ”ํŠธ๋ฆญ์„ litellm์ด ๋ฐœํ–‰ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด config.yaml์—์„œ prometheus_initialize_budget_metrics๋ฅผ true๋กœ ์„ค์ •ํ•˜์„ธ์š”.

๋™์ž‘ ๋ฐฉ์‹:

  • prometheus_initialize_budget_metrics๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฉด
    • 5๋ถ„๋งˆ๋‹ค litellm์ด cron ์žก์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ชจ๋“  ํ‚ค, ํŒ€, ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž, ์กฐ์ง์„ ์ฝ์–ด์š”
    • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์˜ˆ์‚ฐ ๋ฉ”ํŠธ๋ฆญ์„ ๋ฐœํ–‰ํ•ด์š”
    • ์ด๋Š” /metrics ์—”๋“œํฌ์ธํŠธ์˜ ์˜ˆ์‚ฐ ๋ฉ”ํŠธ๋ฆญ์„ ์ฑ„์šฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ์š”
    litellm_settings:
      callbacks: ["prometheus"]
      prometheus_initialize_budget_metrics: true

ํŒŸ ํ—ฌ์Šค ๋ฉ”ํŠธ๋ฆญ (Pod Health Metrics)

ํŒŸ๋ณ„ ํ ๊นŠ์ด๋ฅผ ์ธก์ •ํ•˜๊ณ , LiteLLM์ด ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•˜๋Š” ๋ ˆ์ดํ„ด์‹œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ํƒ€์ž… ์„ค๋ช…
litellm_in_flight_requests Gauge ์ด uvicorn ์›Œ์ปค์—์„œ ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ HTTP ์š”์ฒญ ์ˆ˜. ํŒŸ์˜ ํ ๊นŠ์ด๋ฅผ ์‹ค์‹œ๊ฐ„ ์ถ”์ . ์›Œ์ปค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด ๋ชจ๋“  ํ™œ์„ฑ ์›Œ์ปค์— ๊ฑธ์ณ ํ•ฉ์‚ฐ(livesum)
litellm_admission_admitted_requests Gauge ํ˜„์žฌ ์›Œ์ปค๋ณ„ admission ์Šฌ๋กฏ์„ ๋ณด์œ ํ•œ ์š”์ฒญ ์ˆ˜. per-worker admission control์ด ์ผœ์ ธ ์žˆ์„ ๋•Œ๋งŒ ์ฑ„์›Œ์ง. ํ™œ์„ฑ ์›Œ์ปค์— ๊ฑธ์ณ ํ•ฉ์‚ฐ(livesum)
litellm_admission_queued_requests Gauge ์›Œ์ปค๋ณ„ admission ์Šฌ๋กฏ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์š”์ฒญ ์ˆ˜. ํ™œ์„ฑ ์›Œ์ปค์— ๊ฑธ์ณ ํ•ฉ์‚ฐ(livesum)
litellm_admission_rejected_requests_total Counter admission control์ด 503์œผ๋กœ ๊ฑฐ๋ถ€ํ•œ ์š”์ฒญ ์ˆ˜, reason ๋ผ๋ฒจ: queue_full(๋„์ฐฉ ์‹œ ํ๊ฐ€ ์ด๋ฏธ ์ตœ๋Œ€) ๋˜๋Š” queue_timeout(admission_queue_timeout_seconds๋ฅผ ๊ธฐ๋‹ค๋ ค๋„ ์Šฌ๋กฏ์„ ๋ชป ์–ป์Œ)

์–ธ์ œ ์ด๊ฒƒ์„ ์“ธ๊นŒ

LiteLLM์€ ์ž์ฒด ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ์‹œ์ ๋ถ€ํ„ฐ ๋ ˆ์ดํ„ด์‹œ๋ฅผ ์ธก์ •ํ•ด์š”. ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์š”์ฒญ์ด uvicorn์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ๊ธฐ๋‹ค๋ฆฐ๋‹ค๋ฉด, ๊ทธ ๋Œ€๊ธฐ๋Š” LiteLLM ์ž์ฒด ๋กœ๊ทธ์— ๋ณด์ด์ง€ ์•Š์•„์š”. litellm_in_flight_requests๋Š” ๊ทธ ์‹œ์ ์˜ ํŒŸ ๋ถ€ํ•˜๋ฅผ ๋ณด์—ฌ์ค˜์š”.

    high in_flight_requests + high ALB TargetResponseTime โ†’ pod overloaded, scale out
    low  in_flight_requests + high ALB TargetResponseTime โ†’ delay is pre-ASGI (event loop blocking)

Prometheus ์—†์ด๋„ ํ˜„์žฌ ๊ฐ’์„ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”:

    curl http://localhost:4000/health/backlog \
      -H "Authorization: Bearer ***"
    # {"in_flight_requests": 47}

ํ”„๋ก์‹œ ๋ ˆ๋ฒจ ์ถ”์  ๋ฉ”ํŠธ๋ฆญ

์ „์ฒด LiteLLM Proxy ์‚ฌ์šฉ๋Ÿ‰ ์ถ”์ ์— ์‚ฌ์šฉํ•ด์š”.

  • ํ”„๋ก์‹œ๋กœ์˜ ์‹ค์ œ ํŠธ๋ž˜ํ”ฝ ์†๋„ ์ถ”์ 
  • ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ์š”์ฒญ์˜ ํด๋ผ์ด์–ธํŠธ ์ธก ์š”์ฒญยท์‹คํŒจ ์ˆ˜
๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_proxy_failed_requests_metric ํ”„๋ก์‹œ์˜ ์‹คํŒจ ์‘๋‹ต ์ด ์ˆ˜ - ํด๋ผ์ด์–ธํŠธ๊ฐ€ litellm ํ”„๋ก์‹œ์—์„œ ์„ฑ๊ณต ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•จ. ๋ผ๋ฒจ: "end_user", "hashed_api_key", "api_key_alias", "requested_model", "team", "team_alias", "user", "user_email", "exception_status", "exception_class", "route", "client_ip", "user_agent", "model_id", "api_provider"
litellm_proxy_total_requests_metric ํ”„๋ก์‹œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ ์ด ์ˆ˜ - ํด๋ผ์ด์–ธํŠธ ์ธก ์š”์ฒญ ์ˆ˜ ์ถ”์ . ๋ผ๋ฒจ: "end_user", "hashed_api_key", "api_key_alias", "requested_model", "team", "team_alias", "user", "status_code", "user_email", "route", "client_ip", "user_agent", "model_id", "api_provider". ์„ ํƒ์ ์œผ๋กœ "stream" ํฌํ•จ - Emit Stream Label ์ฐธ๊ณ 

์ฝœ๋ฐฑ ๋กœ๊น… ๋ฉ”ํŠธ๋ฆญ

S3 ์ฝœ๋“œ ์Šคํ† ๋ฆฌ์ง€ ๊ฐ™์€ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ฝœ๋ฐฑ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ๋ณด๋‚ด๋Š” ์‹คํŒจ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_callback_logging_failures_metric ๊ตฌ์„ฑ๋œ ์ฝœ๋ฐฑ์œผ๋กœ ๋กœ๊ทธ ๋ฐœํ–‰ ์‹œ๋„ ์‹คํŒจ ์ด ์ˆ˜. ๋ผ๋ฒจ: "callback_name". S3, langfuse, langfuse_otel ๋ฐ ๊ธฐํƒ€ otel ๊ณต๊ธ‰์ž์— ์“ธ ๋•Œ ๋ฐ˜๋ณต ์‹คํŒจ ๊ฐ™์€ ์ฝœ๋ฐฑ ์ „๋‹ฌ ๋ฌธ์ œ์— ์•Œ๋ฆผ์„ ์”€

์ง€์› ์ฝœ๋ฐฑ:

  • S3Logger - S3 ์ฝœ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์‹คํŒจ
  • langfuse - Langfuse ๋กœ๊น… ์‹คํŒจ
  • otel - OpenTelemetry ๋กœ๊น… ์‹คํŒจ

๊ฐ€๋“œ๋ ˆ์ผ ๋ฉ”ํŠธ๋ฆญ

๊ฐ€๋“œ๋ ˆ์ผ์ด ์‹คํ–‰๋  ๋•Œ๋งŒ ๋ฐœํ–‰๋ผ์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_guardrail_requests_total ๊ฐ€๋“œ๋ ˆ์ผ ํ˜ธ์ถœ ์ด ์ˆ˜. ๋ผ๋ฒจ: "guardrail_name", "status", "hook_type"
litellm_guardrail_errors_total ๊ฐ€๋“œ๋ ˆ์ผ ์‹คํ–‰ ์ค‘ ๋งŒ๋‚œ ์˜ค๋ฅ˜ ์ด ์ˆ˜. ๋ผ๋ฒจ: "guardrail_name", "error_type", "hook_type"
litellm_guardrail_latency_seconds ๊ฐ€๋“œ๋ ˆ์ผ ์‹คํ–‰ ๋ ˆ์ดํ„ด์‹œ(์ดˆ) ํžˆ์Šคํ† ๊ทธ๋žจ. ๋ผ๋ฒจ: "guardrail_name", "status", "error_type", "hook_type"

MCP ๊ฒŒ์ดํŠธ์›จ์ด ๋ฉ”ํŠธ๋ฆญ

MCP ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ํ†ตํ•ด ๋งŒ๋“  MCP ๋„๊ตฌ ํ˜ธ์ถœ์—์„œ๋งŒ ๋ฐœํ–‰๋ผ์š”. ๋‘ ๋ฉ”ํŠธ๋ฆญ ๋ชจ๋‘ "mcp_tool_name", "mcp_server_name", "hashed_api_key", "api_key_alias", "team", "team_alias", "user", "end_user" ๋ผ๋ฒจ์„ ๊ฐ€์ ธ์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_mcp_tool_calls_total ๋„๊ตฌยท์„œ๋ฒ„ ์ด๋ฆ„๋ณ„๋กœ ์„ธ๊ทธ๋จผํŠธ๋œ ์ด MCP ๋„๊ตฌ ํ˜ธ์ถœ ์ˆ˜
litellm_mcp_tool_call_spend_metric MCP ๋„๊ตฌ ํ˜ธ์ถœ์˜ ์ด ์ง€์ถœ. ํ˜ธ์ถœ์— 0์ด ์•„๋‹Œ ๋น„์šฉ์ด ์žˆ์„ ๋•Œ๋งŒ ์ฆ๊ฐ€

๊ด€๋ฆฌํ˜• ๋ฐฐ์น˜ ๋ฉ”ํŠธ๋ฆญ (Managed Batch Metrics)

Enterprise ์ „์šฉ. LiteLLM ๊ด€๋ฆฌํ˜• ๋ฐฐ์น˜์™€ ๊ทธ๊ฒƒ์„ ๋น„์šฉ ์ถ”์ ํ•˜๋Š” CheckBatchCost ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žก์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœํ–‰๋ผ์š”.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_managed_batch_created_total ์ƒ์„ฑ๋œ ๊ด€๋ฆฌํ˜• ๋ฐฐ์น˜ ์ด ์ˆ˜. ๋ผ๋ฒจ: "model", "api_provider", "user", "user_email", "api_key_alias"
litellm_managed_file_created_total ์ƒ์„ฑ๋œ ๊ด€๋ฆฌํ˜• ํŒŒ์ผ ์ด ์ˆ˜. ๋ผ๋ฒจ: "model", "api_provider", "user", "user_email", "api_key_alias"
litellm_managed_file_deleted_total ๊ด€๋ฆฌํ˜• ํŒŒ์ผ ์‚ญ์ œ ์ด ์ˆ˜, ์„ฑ๊ณต ๋˜๋Š” ์ฐจ๋‹จ. ๋ผ๋ฒจ: "result"
litellm_managed_file_size_bytes ๊ฐ€์žฅ ์ตœ๊ทผ ๊ด€๋ฆฌํ˜• ๋ฐฐ์น˜ ํŒŒ์ผ์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ), ๋ผ๋ฒจ ์กฐํ•ฉ๋ณ„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณธ ๊ฐ’. ๋ผ๋ฒจ: "purpose", "file_type", "model", "api_provider", "user"
litellm_managed_batch_duration_seconds ์™„๋ฃŒ๋œ ๋ฐฐ์น˜์˜ ์ง€์† ์‹œ๊ฐ„(์ดˆ) ํžˆ์Šคํ† ๊ทธ๋žจ (completed_at - created_at). ๋ผ๋ฒจ: "model", "api_provider"
litellm_check_batch_cost_jobs_polled ๋งˆ์ง€๋ง‰ CheckBatchCost ํด๋ง์ด ์ฐพ์€ ๋ฏธ์ฒ˜๋ฆฌ ๋ฐฐ์น˜ ์ˆ˜
litellm_check_batch_cost_jobs_processed_total CheckBatchCost๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋น„์šฉ ์ถ”์ ํ•œ ๋ฐฐ์น˜ ์ด ์ˆ˜. ๋ผ๋ฒจ: "model", "api_provider"
litellm_check_batch_cost_errors_total ์˜ค๋ฅ˜ ์œ ํ˜•๋ณ„ CheckBatchCost ์˜ค๋ฅ˜ ์ด ์ˆ˜. ๋ผ๋ฒจ: "error_type"
litellm_check_batch_cost_last_run_timestamp ๋งˆ์ง€๋ง‰ CheckBatchCost ์žก ์‹คํ–‰์˜ Unix ํƒ€์ž„์Šคํƒฌํ”„

LLM ๊ณต๊ธ‰์ž ๋ฉ”ํŠธ๋ฆญ

LLM API ์˜ค๋ฅ˜ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋‚จ์€ ๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹ยทํ† ํฐ ์ œํ•œ ์ถ”์ ์— ์‚ฌ์šฉํ•ด์š”.

์ถ”์ ๋˜๋Š” ๋ผ๋ฒจ

๋ผ๋ฒจ ์„ค๋ช…
litellm_model_name LiteLLM์ด ์‚ฌ์šฉํ•˜๋Š” LLM ๋ชจ๋ธ์˜ ์ด๋ฆ„
requested_model ์š”์ฒญ์— ๋ณด๋‚ธ ๋ชจ๋ธ
model_id ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ model_id. LiteLLM์ด ์ž๋™ ์ƒ์„ฑ, ๊ฐ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ๊ณ ์œ  model_id
api_base ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ API ๋ฒ ์ด์Šค
api_provider LLM API ๊ณต๊ธ‰์ž. ์˜ˆ: (azure, openai, vertex_ai)
hashed_api_key ์š”์ฒญ์˜ ํ•ด์‹œ๋œ api ํ‚ค
api_key_alias ์‚ฌ์šฉ๋œ api ํ‚ค์˜ ๋ณ„์นญ
team ์š”์ฒญ์˜ ํŒ€
team_alias ์‚ฌ์šฉ๋œ ํŒ€์˜ ๋ณ„์นญ
exception_status ์žˆ์œผ๋ฉด ์˜ˆ์™ธ ์ƒํƒœ
exception_class ์žˆ์œผ๋ฉด ์˜ˆ์™ธ ํด๋ž˜์Šค

์„ฑ๊ณต๊ณผ ์‹คํŒจ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_deployment_success_responses ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์„ฑ๊ณต์ ์ธ LLM API ํ˜ธ์ถœ ์ด ์ˆ˜. ๋ผ๋ฒจ: "requested_model", "litellm_model_name", "model_id", "api_base", "api_provider", "hashed_api_key", "api_key_alias", "team", "team_alias", "client_ip", "user_agent"
litellm_deployment_failure_responses ํŠน์ • LLM ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์‹คํŒจํ•œ LLM API ํ˜ธ์ถœ ์ด ์ˆ˜. ๋ผ๋ฒจ: "requested_model", "litellm_model_name", "model_id", "api_base", "api_provider", "exception_status", "exception_class", "hashed_api_key", "api_key_alias", "team", "team_alias", "client_ip", "user_agent"
litellm_deployment_total_requests ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ LLM API ํ˜ธ์ถœ ์ด ์ˆ˜ - ์„ฑ๊ณต + ์‹คํŒจ. ๋ผ๋ฒจ: "requested_model", "litellm_model_name", "model_id", "api_base", "api_provider", "hashed_api_key", "api_key_alias", "team", "team_alias", "client_ip", "user_agent"

๋‚จ์€ ์š”์ฒญ๊ณผ ํ† ํฐ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_remaining_requests_metric LLM API ๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ ๋ฐ˜ํ™˜๋œ x-ratelimit-remaining-requests ์ถ”์ . ๋ผ๋ฒจ: "model_group", "api_provider", "api_base", "litellm_model_name", "hashed_api_key", "api_key_alias", "model_id"
litellm_remaining_tokens_metric LLM API ๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ ๋ฐ˜ํ™˜๋œ x-ratelimit-remaining-tokens ์ถ”์ . ๋ผ๋ฒจ: "model_group", "api_provider", "api_base", "litellm_model_name", "hashed_api_key", "api_key_alias", "model_id"

๊ณต๊ธ‰์ž ์˜ˆ์‚ฐ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_provider_remaining_budget_metric LLM ๊ณต๊ธ‰์ž์˜ ๋‚จ์€ ์˜ˆ์‚ฐ. provider budget routing์ด ๊ตฌ์„ฑ๋  ๋•Œ๋งŒ ๋ฐœํ–‰. ๋ผ๋ฒจ: "api_provider"

๋””ํ”Œ๋กœ์ด๋จผํŠธ ์ƒํƒœ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_deployment_state ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์ƒํƒœ: 0 = ์ •์ƒ, 1 = ๋ถ€๋ถ„ ์žฅ์• , 2 = ์™„์ „ ์žฅ์• . ๋ผ๋ฒจ: "litellm_model_name", "model_id", "api_base", "api_provider"
litellm_deployment_latency_per_output_token ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์ถœ๋ ฅ ํ† ํฐ๋‹น ๋ ˆ์ดํ„ด์‹œ. ๋ผ๋ฒจ: "litellm_model_name", "model_id", "api_base", "api_provider", "hashed_api_key", "api_key_alias", "team", "team_alias"
litellm_deployment_tpm_limit ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๊ตฌ์„ฑ๋œ TPM ์ œํ•œ. config์— tpm ์ œํ•œ์ด ์žˆ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ๋งŒ ์„ค์ •. ๋ผ๋ฒจ: "litellm_model_name", "model_id", "api_base", "api_provider"
litellm_deployment_rpm_limit ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๊ตฌ์„ฑ๋œ RPM ์ œํ•œ. config์— rpm ์ œํ•œ์ด ์žˆ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ๋งŒ ์„ค์ •. ๋ผ๋ฒจ: "litellm_model_name", "model_id", "api_base", "api_provider"

ํด๋ฐฑ (Failover) ๋ฉ”ํŠธ๋ฆญ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_deployment_cooled_down LiteLLM ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋กœ์ง์ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ฟจ๋‹ค์šดํ•œ ํšŸ์ˆ˜. ๋ผ๋ฒจ: "litellm_model_name", "model_id", "api_base", "api_provider", "exception_status"
litellm_deployment_successful_fallbacks primary ๋ชจ๋ธ์—์„œ ํด๋ฐฑ ๋ชจ๋ธ๋กœ์˜ ์„ฑ๊ณต์ ์ธ ํด๋ฐฑ ์š”์ฒญ ์ˆ˜. ๋ผ๋ฒจ: "requested_model", "fallback_model", "hashed_api_key", "api_key_alias", "team", "team_alias", "exception_status", "exception_class", "model_id"
litellm_deployment_failed_fallbacks primary ๋ชจ๋ธ์—์„œ ํด๋ฐฑ ๋ชจ๋ธ๋กœ์˜ ์‹คํŒจํ•œ ํด๋ฐฑ ์š”์ฒญ ์ˆ˜. ๋ผ๋ฒจ: "requested_model", "fallback_model", "hashed_api_key", "api_key_alias", "team", "team_alias", "exception_status", "exception_class", "model_id"

์š”์ฒญ ์นด์šดํŒ… ๋ฉ”ํŠธ๋ฆญ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_requests_metric deprecated litellm_proxy_total_requests_metric ์‚ฌ์šฉ. API ํ‚ค, ํŒ€, ์‚ฌ์šฉ์ž๋ณ„๋กœ ์ถ”์ ๋˜๋Š” litellm์— ๋Œ€ํ•œ LLM ํ˜ธ์ถœ ์ด ์ˆ˜. ๋ผ๋ฒจ: "end_user", "hashed_api_key", "api_key_alias", "model", "team", "team_alias", "user", "user_email", "client_ip", "user_agent", "requested_model", "model_id", "api_provider"
litellm_zero_cost_requests_total usage๋ฅผ ๊ฐ€์กŒ์ง€๋งŒ ๊ฐ€๊ฒฉ ํ•ญ๋ชฉ์˜ ์š”์œจ์ด 0์ด ์•„๋‹Œ ๋ชจ๋ธ์—์„œ $0์œผ๋กœ ๊ธฐ๋ก๋œ ์š”์ฒญ. ๋ฌด๋ฃŒ ๋ชจ๋ธ๊ณผ usage ์—†๋Š” ์š”์ฒญ์€ ์นด์šดํŠธ๋˜์ง€ ์•Š์Œ. ๋ผ๋ฒจ: "requested_model", "model", "model_id", "api_provider", "reason"์—์„œ reason์€ missing_pricing_key, pricing_not_applied, cost_calculation_error. ์นด์šดํŠธ๋œ ๊ฐ ์š”์ฒญ์€ ๋ˆ„๋ฝ๋œ ๊ฐ€๊ฒฉ ํ‚ค๋ฅผ ์ด๋ฆ„์œผ๋กœ ์“ฐ๋Š” ๊ฒฝ๊ณ  ํ•˜๋‚˜๋„ ๊ธฐ๋กํ•จ. Requests that price to $0 ์ฐธ๊ณ 

์š”์ฒญ ๋ ˆ์ดํ„ด์‹œ ๋ฉ”ํŠธ๋ฆญ

๋ ˆ์ดํ„ด์‹œ SLO์™€ ์•Œ๋ฆผ์—๋Š” litellm_request_total_latency_metric์„ ์‚ฌ์šฉํ•ด์š”. ํ”„๋ก์‹œ ๋„์ฐฉ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ ์ข…๋ฃŒ๊นŒ์ง€ ์ „์ฒด ์š”์ฒญ์„ ์ธก์ •ํ•ด์š”. ์ด ๋ ˆ์ดํ„ด์‹œ๊ฐ€ ๋Š˜๋ฉด ๋‹ค๋ฅธ ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ ์ง€์—ฐ์ด ์ธ์ฆ, LLM ๊ณต๊ธ‰์ž, LiteLLM ์ฒ˜๋ฆฌ ์ค‘ ์–ด๋””์„œ ์˜ค๋Š”์ง€ ์‹๋ณ„ํ•˜์„ธ์š”.

๋ชจ๋“  ์š”์ฒญ ๋ ˆ์ดํ„ด์‹œ ๋ฉ”ํŠธ๋ฆญ์€ ์ดˆ ๋‹จ์œ„๋กœ ์ธก์ •๋˜๋Š” Prometheus ํžˆ์Šคํ† ๊ทธ๋žจ์ด์—์š”.

์ธก์ •ํ•˜๋ ค๋Š” ๊ฒƒ ๋ฉ”ํŠธ๋ฆญ ์ธก์ • ์ฐฝ
์—”๋“œ ํˆฌ ์—”๋“œ ๋ ˆ์ดํ„ด์‹œ litellm_request_total_latency_metric ์š”์ฒญ ๋„์ฐฉ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ ์ข…๋ฃŒ๊นŒ์ง€. ์ธ์ฆ, pre-call ํ›…, LLM API ํ˜ธ์ถœ, post-call ์ฒ˜๋ฆฌ ํฌํ•จ
์ธ์ฆ๊ณผ ์š”์ฒญ ๋Œ€๊ธฐ ์‹œ๊ฐ„ litellm_request_queue_time_seconds ์š”์ฒญ ๋„์ฐฉ๋ถ€ํ„ฐ pre-call ์ฒ˜๋ฆฌ ์‹œ์ž‘๊นŒ์ง€. ์ธ์ฆ๊ณผ ASGI ๋ ˆ๋ฒจ ํ์ž‰ ํฌํ•จ. ๋กœ๋“œ๋œ ํ”„๋ก์‹œ ํŒŸ ์ง„๋‹จ ์‹œ litellm_in_flight_requests์™€ ๋น„๊ต
LLM ๊ณต๊ธ‰์ž ๋ ˆ์ดํ„ด์‹œ litellm_llm_api_latency_metric LLM API ํ˜ธ์ถœ ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€
์ฒซ ํ† ํฐ๊นŒ์ง€ ์‹œ๊ฐ„ litellm_llm_api_time_to_first_token_metric LLM API ํ˜ธ์ถœ ์‹œ์ž‘๋ถ€ํ„ฐ ์ฒซ ํ† ํฐ๊นŒ์ง€. ์ŠคํŠธ๋ฆฌ๋ฐ ์š”์ฒญ์—์„œ๋งŒ ๋ฐœํ–‰
LiteLLM ์ฒ˜๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ litellm_overhead_latency_metric LLM API ํ˜ธ์ถœ๊ณผ ๊ฐ€๋“œ๋ ˆ์ผ์„ ์ œ์™ธํ•œ LiteLLM ์ฒ˜๋ฆฌ ์‹œ๊ฐ„
LiteLLM ์ฒ˜๋ฆฌยท๊ฐ€๋“œ๋ ˆ์ผ ์˜ค๋ฒ„ํ—ค๋“œ litellm_overhead_with_guardrails_latency_metric LiteLLM ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ + pre-callยทpost-call ๊ฐ€๋“œ๋ ˆ์ผ, LLM API ํ˜ธ์ถœ ์ œ์™ธ. ํ˜ธ์ถœ ์ค‘ ๊ฐ€๋“œ๋ ˆ์ผ์€ LLM API ํ˜ธ์ถœ๊ณผ ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉฐ ํฌํ•จ๋˜์ง€ ์•Š์Œ

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ์ง€๋‚œ 5๋ถ„๊ฐ„ ์—”๋“œ ํˆฌ ์—”๋“œ p95 ๋ ˆ์ดํ„ด์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์š”:

    histogram_quantile(0.95, sum by (le) (rate(litellm_request_total_latency_metric_bucket[5m])))

์š”์ฒญ ๋ ˆ์ดํ„ด์‹œ ๋ฉ”ํŠธ๋ฆญ์˜ ๋ผ๋ฒจ:

๋ฉ”ํŠธ๋ฆญ ๋ผ๋ฒจ
litellm_request_total_latency_metric litellm_llm_api_latency_metric litellm_llm_api_time_to_first_token_metric end_user, hashed_api_key, api_key_alias, requested_model, team, team_alias, user, model, model_id, api_provider, service_tier
litellm_request_queue_time_seconds end_user, hashed_api_key, api_key_alias, requested_model, team, team_alias, user, model, model_id, api_provider
litellm_overhead_latency_metric litellm_overhead_with_guardrails_latency_metric model_group, api_provider, api_base, litellm_model_name, hashed_api_key, api_key_alias, model_id

litellm_request_queue_time_seconds๋Š” ๊ณต๊ธ‰์ž๊ฐ€ ์ด ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋กํ•  ๋•Œ service tier๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ service_tier๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์š”.

๋””ํ”Œ๋กœ์ด๋จผํŠธยท๋ ˆ์ดํ„ด์‹œ ๋ฉ”ํŠธ๋ฆญ์˜ ํ˜ธ์ถœ์ž ์‹ ์› ๊ตฌ์„ฑ

๊ธฐ๋ณธ์ ์œผ๋กœ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์นด์šดํ„ฐ์™€ ํ˜ธ์ถœ์ž ๋ฒ”์œ„ ๋ ˆ์ดํ„ด์‹œ ํžˆ์Šคํ† ๊ทธ๋žจ์€ ํ˜ธ์ถœ์ž๋ฅผ api_key_alias๋กœ ์‹๋ณ„ํ•ด์š”. prometheus_deployment_and_latency_caller_identity๋ฅผ ์„ค์ •ํ•ด ๋Œ€์‹  user_email์„ ์“ฐ๊ฑฐ๋‚˜ ๋‘ ๋ผ๋ฒจ์„ ๋ชจ๋‘ ๋…ธ์ถœํ•˜์„ธ์š”:

config.yaml:

    litellm_settings:
      callbacks: ["prometheus"]
      prometheus_deployment_and_latency_caller_identity: user_email
๊ฐ’ ํ˜ธ์ถœ์ž ์‹ ์› ๋ผ๋ฒจ ๋™์ž‘
api_key_alias (๊ธฐ๋ณธ) api_key_alias ๊ธฐ์กด ๋ฉ”ํŠธ๋ฆญ ์Šคํ‚ค๋งˆ์™€ ๊ธฐ์กด ์ฟผ๋ฆฌ ์œ ์ง€
user_email user_email ๋ผ๋ฒจ ์Šคํ‚ค๋งˆ์—์„œ ๊ฐ™์€ ์œ„์น˜์˜ api_key_alias๋ฅผ ๋Œ€์ฒด
both api_key_alias, ๊ทธ๋‹ค์Œ user_email ๋‘ ์ฐจ์› ๋ชจ๋‘ ๋ฐœํ–‰. user_email์€ api_key_alias ๋ฐ”๋กœ ๋’ค์— ๋ฐฐ์น˜

์ด ์„ค์ •์€ ๋‹ค์Œ ๋ฉ”ํŠธ๋ฆญ ํŒจ๋ฐ€๋ฆฌ์—๋งŒ ์ ์šฉ๋ผ์š”:

  • litellm_deployment_total_requests
  • litellm_deployment_success_responses
  • litellm_deployment_failure_responses
  • litellm_request_total_latency_metric
  • litellm_llm_api_latency_metric
  • litellm_llm_api_time_to_first_token_metric
  • litellm_request_queue_time_seconds
  • litellm_overhead_latency_metric
  • litellm_deployment_latency_per_output_token

ํ˜ธ์ถœ์ž ๋ฒ”์œ„๊ฐ€ ์•„๋‹Œ ๊ด€๋ จ ๋ฉ”ํŠธ๋ฆญ์ด๋‚˜ ๊ฐ€๋“œ๋ ˆ์ผ ํฌํ•จ litellm_overhead_with_guardrails_latency_metric์€ ๋ฐ”๊พธ์ง€ ์•Š์•„์š”. ์นด์šดํ„ฐ ์ƒ˜ํ”Œ์€ Prometheus _total ์ ‘๋ฏธ์‚ฌ๋ฅผ, ํžˆ์Šคํ† ๊ทธ๋žจ _bucket, _sum, _count ์ƒ˜ํ”Œ์€ ์„ ํƒํ•œ ์‹ ์› ๋ผ๋ฒจ์„ ๋ฐ›์•„์š”.

์ด๋ฉ”์ผ์ด ํ•ด์„๋˜์ง€ ์•Š์€ ์š”์ฒญ์€ LiteLLM์˜ ๊ธฐ์กด "None" ๋ผ๋ฒจ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ํ•ด์„๋œ ์ด๋ฉ”์ผ๋ณ„๋กœ ๊ณต๊ธ‰์ž ์š”์ฒญ๊ณผ p95 ์—”๋“œ ํˆฌ ์—”๋“œ ๋ ˆ์ดํ„ด์‹œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด์„œ ์ด๋ฉ”์ผ์ด ์—†๋Š” ์š”์ฒญ์€ ์ œ์™ธํ•ด์š”:

    sum by (user_email) (
      rate(litellm_deployment_total_requests_total{user_email!="None"}[5m])
    )
    histogram_quantile(
      0.95,
      sum by (user_email, le) (
        rate(litellm_request_total_latency_metric_bucket{user_email!="None"}[5m])
      )
    )

prometheus_metrics_config.include_labels๋Š” ์„ ํƒ๋œ ๋ชจ๋“œ์— ๋Œ€ํ•ด ๊ฒ€์ฆ๋ผ์š”. api_key_alias ๋ชจ๋“œ์—์„œ๋Š” api_key_alias๋ฅผ, user_email ๋ชจ๋“œ์—์„œ๋Š” user_email์„, both ๋ชจ๋“œ์—์„œ๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋‘˜ ๋‹ค ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด์š”. ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ชจ๋“œ ๊ฐ’์€ ์ˆ˜๋ฝ๋˜๋Š” ๊ฐ’์„ ๋ช…๋ช…ํ•œ ValueError๋กœ ํ”„๋ก์‹œ ์‹œ์ž‘์„ ์‹คํŒจ์‹œํ‚ค๊ณ , user_email ๋ชจ๋“œ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํŒจ๋ฐ€๋ฆฌ์—์„œ include_labels: [api_key_alias]์™€ ๊ฒฐํ•ฉ๋˜๋ฉด ๋‘ ์„ค์ •์„ ๋ช…๋ช…ํ•˜๋ฉฐ ์‹œ์ž‘๋„ ์‹คํŒจํ•ด์š”. prometheus_exclude_labels๋Š” ๋‚˜์ค‘์— ์ ์šฉ๋˜๋ฉฐ ๋‘ ์‹ ์› ๋ผ๋ฒจ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด์ ์œผ๋กœ both๋ฅผ ์„ ํƒํ•˜๊ณ  api_key_alias๋ฅผ ์ œ์™ธํ•˜๋ฉด ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํŒจ๋ฐ€๋ฆฌ์—๋Š” user_email๋งŒ ๋‚จ์•„์š”.

warning

์ด ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด ๊ณ ์ • Prometheus ์ˆ˜์ง‘๊ธฐ ๋ผ๋ฒจ ์Šคํ‚ค๋งˆ๊ฐ€ ๋ฐ”๋€Œ์–ด์š”. ๋ณ€๊ฒฝ ํ›„ ๋ชจ๋“  LiteLLM Proxy/logger ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”. ๋ผ์ด๋ธŒ ๊ตฌ์„ฑ ๋ฆฌ๋กœ๋“œ๋กœ ๊ธฐ์กด ์ˆ˜์ง‘๊ธฐ๋ฅผ ์žฌ๊ตฌ์ถ•ํ•  ์ˆ˜ ์—†์–ด์š”.

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์˜ˆ์š”. ์ด๋ฉ”์ผ ๋ ˆ๋ฒจ ๊ท€์†์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ”๊พธ๊ณ , /metrics ์ธ์ฆ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” Prometheus ์Šคํฌ๋ž˜ํผ๋กœ๋งŒ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ์„ ์ œํ•œํ•˜์„ธ์š”.

both๋Š” ๊ด€์ฐฐ๋œ ์™„์ „ํ•œ ๋ผ๋ฒจ ํŠœํ”Œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ series๋ฅผ ๊ธฐ๋กํ•ด์š”. ๊ฐ™์€ ์š”์ฒญ์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ series๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„์š”. ๋ณ„์นญ๊ณผ ์ด๋ฉ”์ผ์ด ์•ˆ์ •์ ์ธ ์ผ๋Œ€์ผ ๋งคํ•‘์ด๋ฉด ์ด๋ฉ”์ผ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ด๋„ ๊ณ ์œ  series ์ˆ˜๋Š” ๋Š˜์ง€ ์•Š์•„์š”. ๋ณ„์นญ์ด ์‚ฌ์šฉ์ž ๊ฐ„ ์žฌ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๋งคํ•‘์ด ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ณ„์นญ์ด ํ•ด์„๋œ ์ด๋ฉ”์ผ๊ณผ ๋ถ€์žฌ ์ด๋ฉ”์ผ๋กœ ๋ชจ๋‘ ๊ด€์ฐฐ๋˜๋ฉด ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋Š˜ ์ˆ˜ ์žˆ์–ด์š”.

service tier๋ณ„ ๋ ˆ์ดํ„ด์‹œยท์ง€์ถœ ์„ธ๊ทธ๋จผํŠธ

์š”์ฒญ ๋ ˆ์ดํ„ด์‹œ ๋ฉ”ํŠธ๋ฆญ๊ณผ litellm_spend_metric์˜ service_tier ๋ผ๋ฒจ์€ ์š”์ฒญ์ด ์‹ค์ œ๋กœ ์‹คํ–‰๋œ ํ‹ฐ์–ด๋ฅผ ๋‹ด์•„์š”. ๊ทธ๋ž˜์„œ ํŠธ๋ž˜ํ”ฝ์„ ๋” ์‹ธ๊ฑฐ๋‚˜ ๋” ๋น ๋ฅธ ํ‹ฐ์–ด๋กœ ์˜ฎ๊ธฐ๊ธฐ ์ „ํ›„์˜ ๋ ˆ์ดํ„ด์‹œ์™€ ๋น„์šฉ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์š”:

    histogram_quantile(0.95, sum by (service_tier, le) (rate(litellm_request_total_latency_metric_bucket[5m])))

๊ฐ’์€ ๊ณต๊ธ‰์ž๊ฐ€ ์„œ๋น™ํ–ˆ๋‹ค๊ณ  ๋ณด๊ณ ํ•œ ํ‹ฐ์–ด์˜ˆ์š”. ๊ทธ๋ž˜์„œ "service_tier": "auto"๋กœ ๋ณด๋‚ธ ์š”์ฒญ์ด auto๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณต๊ธ‰์ž๊ฐ€ ๊ณ ๋ฅธ ๊ตฌ์ฒด์ ์ธ ํ‹ฐ์–ด(์˜ˆ: default) ์•„๋ž˜์— ๋‚˜ํƒ€๋‚˜์š”. ๊ณต๊ธ‰์ž๊ฐ€ ํ‹ฐ์–ด๋ฅผ ๋ณด๊ณ ํ•˜์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์—์„œ ๋ช…๋ช…๋œ ํ‹ฐ์–ด๋ฅผ ์“ฐ๊ณ , ํ‹ฐ์–ด๋ฅผ ์š”์ฒญํ•˜์ง€๋„ ๋ฐ›์ง€๋„ ์•Š์€ ์š”์ฒญ์€ ๋นˆ ๊ฐ’์œผ๋กœ ๋ผ๋ฒจ๋ง๋ผ์š”.

Prometheus์—์„œ end_user ์ถ”์ 

๊ธฐ๋ณธ์ ์œผ๋กœ LiteLLM์€ Prometheus์—์„œ end_user๋ฅผ ์ถ”์ ํ•˜์ง€ ์•Š์•„์š”. ์ด๋Š” LiteLLM Proxy ๋ฉ”ํŠธ๋ฆญ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ์˜ˆ์š”.

Prometheus์—์„œ end_user๋ฅผ ์ถ”์ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”:

config.yaml:

    litellm_settings:
      callbacks: ["prometheus"]
      enable_end_user_cost_tracking_prometheus_only: true

end_user ๋ผ๋ฒจ์„ ์ง€๋‹ˆ๋Š” ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ(๊ณ ๊ฐ ์˜ˆ์‚ฐ ๊ฒŒ์ด์ง€ ํฌํ•จ)์€ prometheus_end_user_metrics_max_series_per_metric(๊ธฐ๋ณธ 10000, ์˜ค๋ž˜๋œ series๊ฐ€ ๋จผ์ € ๋ฒ„๋ ค์ง)์œผ๋กœ ๋ฉ”ํŠธ๋ฆญ๋‹น ์ƒํ•œ๋˜๊ณ , prometheus_end_user_metrics_ttl_seconds(๊ธฐ๋ณธ 3600)๋ณด๋‹ค ์˜ค๋ž˜ ์œ ํœดํ•œ series๋Š” ์ œ๊ฑฐ๋ผ์š”. ๊ทธ ์ œํ•œ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ null๋กœ ์„ค์ •ํ•˜์„ธ์š”.

config.yaml:

    litellm_settings:
      callbacks: ["prometheus"]
      enable_end_user_cost_tracking_prometheus_only: true
      prometheus_end_user_metrics_max_series_per_metric: 500
      prometheus_end_user_metrics_ttl_seconds: 1800

Emit Stream ๋ผ๋ฒจ

์š”์ฒญ์„ ์ŠคํŠธ๋ฆฌ๋ฐ vs ๋น„-์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ๋‚˜๋ˆ„๋ ค๋ฉด litellm_proxy_total_requests_metric์— stream ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•ด์š”. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋ผ์š”.

config.yaml:

    litellm_settings:
      callbacks: ["prometheus"]
      prometheus_emit_stream_label: true

์ผœ๋ฉด litellm_proxy_total_requests_metric์— ๊ฐ’ "True", "False", "None"์„ ๊ฐ€์ง„ stream ๋ผ๋ฒจ์ด ์ถ”๊ฐ€๋ผ์š”.

    litellm_proxy_total_requests_metric{..., stream="True"} 42
    litellm_proxy_total_requests_metric{..., stream="False"} 100

note

์ด ๋ผ๋ฒจ์€ ์˜ตํŠธ์ธ์ด์—์š”. ๊ธฐ์กด ๋ฉ”ํŠธ๋ฆญ์— ์ƒˆ ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋ฐ”๋€Œ๊ณ  ์ด ๋ฉ”ํŠธ๋ฆญ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ธฐ์กด Prometheus ์ฟผ๋ฆฌ/Grafana ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๊นจ์ง€๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ์ƒˆ ๋ฐฐํฌ์—์„œ๋งŒ ์ผœ๊ฑฐ๋‚˜ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ค€๋น„๊ฐ€ ๋์„ ๋•Œ๋งŒ ์ผœ์„ธ์š”.

[BETA] ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ

์œ„์— ์–ธ๊ธ‰๋œ ๋ชจ๋“  ์ด๋ฒคํŠธ์—์„œ ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ์„ Prometheus๋กœ ์ถ”์ ํ•ด์š”.

์ปค์Šคํ…€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ผ๋ฒจ

  1. config.yaml์—์„œ ์ปค์Šคํ…€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ผ๋ฒจ์„ ์ •์˜ํ•ด์š”
    model_list:
      - model_name: openai/gpt-5.6-terra
        litellm_params:
          model: openai/gpt-5.6-terra
          api_key: os.environ/OPENAI_API_KEY

    litellm_settings:
      callbacks: ["prometheus"]
      custom_prometheus_metadata_labels: ["metadata.foo", "metadata.bar"]
  1. ์ปค์Šคํ…€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ผ๋ฒจ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์š”
  • Curl ์š”์ฒญ
  • ํ‚ค์—์„œ
  • ํŒ€์—์„œ
    curl -L -X POST 'http://0.0.0.0:4000/v1/chat/completions' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer ***' \
    -d '{
        "model": "openai/gpt-5.6-terra",
        "messages": [
          {
            "role": "user",
            "content": [
              {
                "type": "text",
                "text": "What's in this image?"
              }
            ]
          }
        ],
        "max_tokens": 300,
        "metadata": {
            "foo": "hello world"
        }
    }'
    curl -L -X POST 'http://0.0.0.0:4000/key/generate' \
    -H "Authorization: Bearer ***" \
    -H 'Content-Type: application/json' \
    -d '{
        "metadata": {
            "foo": "hello world"
        }
    }'
    curl -L -X POST 'http://0.0.0.0:4000/team/new' \
    -H "Authorization: Bearer ***" \
    -H 'Content-Type: application/json' \
    -d '{
        "metadata": {
            "foo": "hello world"
        }
    }'
  1. ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ์„ ์œ„ํ•ด /metrics ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™•์ธํ•ด์š”
    ... "metadata_foo": "hello world" ...

์ปค์Šคํ…€ ํƒœ๊ทธ

๋” ๋‚˜์€ ํ•„ํ„ฐ๋งยท๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ํŠน์ • ํƒœ๊ทธ๋ฅผ prometheus ๋ผ๋ฒจ๋กœ ์ถ”์ ํ•ด์š”.

  1. config.yaml์—์„œ ์ปค์Šคํ…€ ํƒœ๊ทธ๋ฅผ ์ •์˜ํ•ด์š”
    model_list:
      - model_name: openai/gpt-5.6-terra
        litellm_params:
          model: openai/gpt-5.6-terra
          api_key: os.environ/OPENAI_API_KEY

    litellm_settings:
      callbacks: ["prometheus"]
      custom_prometheus_metadata_labels: ["metadata.foo", "metadata.bar"]
      custom_prometheus_tags:
        - "prod"
        - "staging"
        - "batch-job"
        - "User-Agent: RooCode/*"
        - "User-Agent: claude-cli/*"
  1. ํƒœ๊ทธ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์š”
    curl -L -X POST 'http://0.0.0.0:4000/v1/chat/completions' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer ***' \
    -d '{
        "model": "openai/gpt-5.6-terra",
        "messages": [
          {
            "role": "user",
            "content": [
              {
                "type": "text",
                "text": "What's in this image?"
              }
            ]
          }
        ],
        "max_tokens": 300,
        "metadata": {
            "tags": ["prod", "user-facing"]
        }
    }'
  1. ์ปค์Šคํ…€ ํƒœ๊ทธ ๋ฉ”ํŠธ๋ฆญ์„ ์œ„ํ•ด /metrics ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™•์ธํ•ด์š”
    ... "tag_prod": "true", "tag_staging": "false", "tag_batch_job": "false" ...

์ปค์Šคํ…€ ํƒœ๊ทธ ๋™์ž‘ ๋ฐฉ์‹:

  • ๊ตฌ์„ฑ๋œ ๊ฐ ํƒœ๊ทธ๋Š” prometheus ๋ฉ”ํŠธ๋ฆญ์˜ boolean ๋ผ๋ฒจ์ด ๋ผ์š”
  • ํƒœ๊ทธ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด(์ •ํ™• ๋˜๋Š” ์™€์ผ๋“œ์นด๋“œ) ๋ผ๋ฒจ ๊ฐ’์€ "true", ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด "false"์˜ˆ์š”
  • ํƒœ๊ทธ ์ด๋ฆ„์€ prometheus ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ •๋ฆฌ๋ผ์š” (์˜ˆ: "batch-job" โ†’ "tag_batch_job")
  • *๋ฅผ ์‚ฌ์šฉํ•œ ์™€์ผ๋“œ์นด๋“œ ํŒจํ„ด ์ง€์› (์˜ˆ: "User-Agent: RooCode/*"๋Š” "User-Agent: RooCode/1.0.0"์™€ ์ผ์น˜)

์™€์ผ๋“œ์นด๋“œ ์˜ˆ์‹œ:

    litellm_settings:
      callbacks: ["prometheus"]
      custom_prometheus_tags:
        - "User-Agent: RooCode/*"
        - "User-Agent: claude-cli/*"

์‚ฌ์šฉ ์‚ฌ๋ก€:

  • ํ™˜๊ฒฝ ์ถ”์  (prod, staging, dev)
  • ์š”์ฒญ ์œ ํ˜• ๋ถ„๋ฅ˜ (batch-job, user-facing, background)
  • ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ (new-feature, beta-users)
  • ํŒ€ยท์„œ๋น„์Šค ์‹๋ณ„ (team-a, service-xyz)
  • User-Agent ์ถ”์  - Roo Code, Claude Code, Gemini CLI๊ฐ€ ์–ผ๋งˆ๋‚˜ ์“ฐ์ด๋Š”์ง€ ์ถ”์  (User-Agent: RooCode/*, User-Agent: claude-cli/*, User-Agent: gemini-cli/*)

๋ฉ”ํŠธ๋ฆญ๊ณผ ๋ผ๋ฒจ ๊ตฌ์„ฑ (Configuring Metrics and Labels)

์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํŠน์ • ๋ฉ”ํŠธ๋ฆญ์„ ์„ ํƒ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๊ณ  ํฌํ•จํ•  ๋ผ๋ฒจ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.

ํŠน์ • ๋ฉ”ํŠธ๋ฆญยท๋ผ๋ฒจ ํ™œ์„ฑํ™”

prometheus_metrics_config์—์„œ ์ง€์ •ํ•ด ๋ฐœํ–‰ํ•  ๋ฉ”ํŠธ๋ฆญ์„ ๊ตฌ์„ฑํ•ด์š”. ๊ฐ ๊ตฌ์„ฑ ๊ทธ๋ฃน์€ (์กฐ์ง์šฉ) group ์ด๋ฆ„๊ณผ ํ™œ์„ฑํ™”ํ•  metrics ๋ชฉ๋ก์ด ํ•„์š”ํ•ด์š”. ์„ ํƒ์ ์œผ๋กœ ๋ฉ”ํŠธ๋ฆญ์˜ ๋ผ๋ฒจ์„ ํ•„ํ„ฐ๋งํ•  include_labels ๋ชฉ๋ก์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด์š”.

    model_list:
      - model_name: gpt-5.6-terra
        litellm_params:
          model: gpt-5.6-terra

    litellm_settings:
      callbacks: ["prometheus"]
      prometheus_metrics_config:
        # High-cardinality metrics with minimal labels
        - group: "proxy_metrics"
          metrics:
            - "litellm_proxy_total_requests_metric"
            - "litellm_proxy_failed_requests_metric"
          include_labels:
            - "hashed_api_key"
            - "requested_model"
            - "model_group"

LiteLLM ์‹œ์ž‘ ์‹œ ๋ฉ”ํŠธ๋ฆญ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋๋‹ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ์—์„œ ๋‹ค์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

๋ฉ”ํŠธ๋ฆญ๋ณ„ ๋ผ๋ฒจ ํ•„ํ„ฐ๋ง

๊ฐ ๋ฉ”ํŠธ๋ฆญ์— ํฌํ•จํ•  ๋ผ๋ฒจ์„ ์ œ์–ดํ•ด ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ์ค„์—ฌ์š”:

    litellm_settings:
      callbacks: ["prometheus"]
      prometheus_metrics_config:
        - group: "token_consumption"
          metrics:
            - "litellm_input_tokens_metric"
            - "litellm_output_tokens_metric"
            - "litellm_total_tokens_metric"
          include_labels:
            - "model"
            - "team"
            - "hashed_api_key"
        - group: "request_tracking"
          metrics:
            - "litellm_proxy_total_requests_metric"
          include_labels:
            - "status_code"
            - "requested_model"

๊ณ ๊ธ‰ ๊ตฌ์„ฑ

๋‹ค๋ฅธ ๋ผ๋ฒจ ์ง‘ํ•ฉ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ๊ทธ๋ฃน์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”:

    litellm_settings:
      callbacks: ["prometheus"]
      prometheus_metrics_config:
        # High-cardinality metrics with minimal labels
        - group: "deployment_health"
          metrics:
            - "litellm_deployment_success_responses"
            - "litellm_deployment_failure_responses"
          include_labels:
            - "api_provider"
            - "requested_model"

        # Budget metrics with full label set
        - group: "budget_tracking"
          metrics:
            - "litellm_remaining_team_budget_metric"
          include_labels:
            - "team"
            - "team_alias"
            - "hashed_api_key"
            - "api_key_alias"
            - "model"
            - "end_user"

        # Latency metrics with performance-focused labels
        - group: "performance"
          metrics:
            - "litellm_request_total_latency_metric"
            - "litellm_llm_api_latency_metric"
          include_labels:
            - "model"
            - "api_provider"
            - "requested_model"

๊ตฌ์„ฑ ๊ตฌ์กฐ:

  • group: ๊ด€๋ จ ๋ฉ”ํŠธ๋ฆญ์„ ์กฐ์งํ•˜๊ธฐ ์œ„ํ•œ ์„ค๋ช… ์ด๋ฆ„
  • metrics: ์ด ๊ทธ๋ฃน์— ํฌํ•จํ•  ๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ๋ชฉ๋ก
  • include_labels: (์„ ํƒ) ์ด ๋ฉ”ํŠธ๋ฆญ์— ํฌํ•จํ•  ๋ผ๋ฒจ ๋ชฉ๋ก

๊ธฐ๋ณธ ๋™์ž‘: prometheus_metrics_config๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ์ด ๊ธฐ๋ณธ ๋ผ๋ฒจ๋กœ ํ™œ์„ฑํ™”๋ผ์š” (ํ•˜์œ„ ํ˜ธํ™˜).

๋ฉ”ํŠธ๋ฆญยท๋ผ๋ฒจ ์ „์—ญ ์ œ์™ธ

prometheus_metrics_config๋Š” include ๊ธฐ๋ฐ˜์ด๋ผ ์œ ์ง€ํ•˜๋ ค๋Š” ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ์„ ๋‚˜์—ดํ•ด์•ผ ํ•ด์š”. ๋ฉ”ํŠธ๋ฆญ์ด๋‚˜ ๋ผ๋ฒจ์˜ ์ž‘์€ ์ง‘ํ•ฉ๋งŒ ๋ฒ„๋ฆฌ๋ ค๋ฉด ์ „์—ญ prometheus_exclude_metrics์™€ prometheus_exclude_labels ์˜ต์…˜์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์„ธ์š”. ๋‚˜์—ด๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋ชจ๋‘ ๊ธฐ๋ณธ ๋ผ๋ฒจ๋กœ ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋‚จ๊ณ , ํ–ฅํ›„ LiteLLM ๋ฆด๋ฆฌ์Šค์—์„œ ์ถ”๊ฐ€๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ์€ ์ถ”๊ฐ€ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์—†์ด ์ž๋™์œผ๋กœ ๋ฐœํ–‰๋ผ์š”.

    litellm_settings:
      callbacks: ["prometheus"]
      # Drop these metrics entirely
      prometheus_exclude_metrics:
        - "litellm_input_tokens_metric"
        - "litellm_output_tokens_metric"
      # Drop these labels from every metric that would otherwise emit them
      prometheus_exclude_labels:
        - "hashed_api_key"
        - "api_key_alias"

๋‘ ๋ชฉ๋ก ๋ชจ๋‘ ์‹œ์ž‘ ์‹œ ๊ฒ€์ฆ๋ผ์š”. ์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”ํŠธ๋ฆญยท๋ผ๋ฒจ ์ด๋ฆ„์€ ๊ตฌ์„ฑ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผ์ผœ ์˜คํƒ€๊ฐ€ ์ฆ‰์‹œ ๋“œ๋Ÿฌ๋‚˜์š”. ์ œ์™ธ๊ฐ€ ํ•ญ์ƒ ์šฐ์„ ํ•˜๋ฏ€๋กœ prometheus_exclude_metrics์— ๋ช…๋ช…๋œ ๋ฉ”ํŠธ๋ฆญ์€ prometheus_metrics_config ๊ทธ๋ฃน์ด ํ™œ์„ฑํ™”ํ•ด๋„ ๋ฒ„๋ ค์ง€๊ณ , prometheus_exclude_labels์˜ ๋ผ๋ฒจ์€ ๊ทธ๋ฃน์˜ include_labels๊ฐ€ ๋‚˜์—ดํ•ด๋„ ์ œ๊ฑฐ๋ผ์š”.

์‹œ์Šคํ…œ ํ—ฌ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง (Monitor System Health)

litellm ์ธ์ ‘ ์„œ๋น„์Šค(redis / postgres)์˜ ํ—ฌ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋ฉด:

    model_list:
      - model_name: gpt-5.6-terra
        litellm_params:
          model: gpt-5.6-terra
    litellm_settings:
      service_callback: ["prometheus_system"]

๋ชจ๋‹ˆํ„ฐ๋ง๋˜๋Š” ๊ฐ ์„œ๋น„์Šค๋Š” litellm_<service>_<type> ์ด๋ฆ„์˜ ์„ธ ๋ฉ”ํŠธ๋ฆญ์„ ๋ฐœํ–‰ํ•ด์š”:

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ํƒ€์ž… ์„ค๋ช…
litellm_<service>_latency Histogram ์„œ๋น„์Šค ํ˜ธ์ถœ์˜ ๋ ˆ์ดํ„ด์‹œ(์ดˆ)
litellm_<service>_failed_requests_total Counter ์„œ๋น„์Šค ํ˜ธ์ถœ ์‹คํŒจ ์ˆ˜. ๋ผ๋ฒจ: "error_class", "function_name" (๋ฌด์—‡์ด ์‹คํŒจํ•˜๋Š”์ง€ ๋””๋ฒ„๊น…์šฉ)
litellm_<service>_total_requests_total Counter ์„œ๋น„์Šค ํ˜ธ์ถœ ์ด ์ˆ˜. ์‹คํŒจ ์นด์šดํ„ฐ์™€ ํ•จ๊ป˜ ์˜ค๋ฅ˜์œจ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ

๋ชจ๋‹ˆํ„ฐ๋ง๋˜๋Š” ์„œ๋น„์Šค:

์„œ๋น„์Šค ์„ค๋ช…
redis Redis ํ˜ธ์ถœ (์บ์‹ฑ, ๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹ ์ƒํƒœ)
postgres Postgres DB ํ˜ธ์ถœ (ํ‚ค, ํŒ€, ์ง€์ถœ ๋กœ๊ทธ). ์˜ˆ: litellm_postgres_latency, litellm_postgres_failed_requests_total, litellm_postgres_total_requests_total
auth ์š”์ฒญ ์ธ์ฆ ๊ฒ€์‚ฌ. ๊ณผ๋ถ€ํ•˜๋œ DB๋กœ ์ธํ•œ ์ธ์ฆ ๋А๋ ค์ง์— ์œ ์šฉ
batch_write_to_db DB๋กœ์˜ ๋ฐฐ์น˜ ์ง€์ถœ/์‚ฌ์šฉ๋Ÿ‰ ์“ฐ๊ธฐ
reset_budget_job ์ฃผ๊ธฐ์  ์˜ˆ์‚ฐ ๋ฆฌ์…‹ ์žก
router LiteLLM ๋ผ์šฐํ„ฐ ์—ฐ์‚ฐ
proxy_pre_call LLM API๋ฅผ ์น˜๊ธฐ ์ „์— ํ”„๋ก์‹œ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” pre-call ํ›…
self LiteLLM ์ž์ฒด API ํ˜ธ์ถœ ์ฒ˜๋ฆฌ

DB ์‹คํŒจ ๋˜๋Š” ๋А๋ฆผ ์•Œ๋ฆผ ์˜ˆ์‹œ:

    rate(litellm_postgres_failed_requests_total[5m]) > 0
    histogram_quantile(0.95, sum by (le) (rate(litellm_postgres_latency_bucket[5m]))) > 1

DB ํŠธ๋žœ์žญ์…˜ ํ ํ—ฌ์Šค ๋ฉ”ํŠธ๋ฆญ

DB ํŠธ๋žœ์žญ์…˜ ํ์˜ ํ—ฌ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”. ์˜ˆ: ์ธ๋ฉ”๋ชจ๋ฆฌ์™€ redis ๋ฒ„ํผ์˜ ํฌ๊ธฐ ๋ชจ๋‹ˆํ„ฐ๋ง.

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช… ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…
litellm_pod_lock_manager_size ์–ด๋–ค ํŒŸ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—…๋ฐ์ดํŠธ๋ฅผ ์“ธ ๋ฝ์„ ๊ฐ€์กŒ๋Š”์ง€ ํ‘œ์‹œ Redis
litellm_in_memory_daily_spend_update_queue_size ์ธ๋ฉ”๋ชจ๋ฆฌ ์ผ๋ณ„ ์ง€์ถœ ์—…๋ฐ์ดํŠธ ํ์˜ ํ•ญ๋ชฉ ์ˆ˜. ๊ฐ ์‚ฌ์šฉ์ž์˜ ์ง‘๊ณ„ ์ง€์ถœ ๋กœ๊ทธ In-Memory
litellm_redis_daily_spend_update_queue_size Redis ์ผ๋ณ„ ์ง€์ถœ ์—…๋ฐ์ดํŠธ ํ์˜ ํ•ญ๋ชฉ ์ˆ˜. ๊ฐ ์‚ฌ์šฉ์ž์˜ ์ง‘๊ณ„ ์ง€์ถœ ๋กœ๊ทธ Redis
litellm_redis_daily_end_user_spend_update_queue_size Redis ์ผ๋ณ„ end user ์ง€์ถœ ์—…๋ฐ์ดํŠธ ํ์˜ ํ•ญ๋ชฉ ์ˆ˜ Redis
litellm_redis_daily_agent_spend_update_queue_size Redis ์ผ๋ณ„ agent ์ง€์ถœ ์—…๋ฐ์ดํŠธ ํ์˜ ํ•ญ๋ชฉ ์ˆ˜ Redis
litellm_in_memory_spend_update_queue_size ํ‚ค, ์‚ฌ์šฉ์ž, ํŒ€, ํŒ€ ๋ฉค๋ฒ„ ๋“ฑ์˜ ์ธ๋ฉ”๋ชจ๋ฆฌ ์ง‘๊ณ„ ์ง€์ถœ ๊ฐ’ In-Memory
litellm_redis_spend_update_queue_size ํ‚ค, ์‚ฌ์šฉ์ž, ํŒ€ ๋“ฑ์˜ Redis ์ง‘๊ณ„ ์ง€์ถœ ๊ฐ’ Redis

๐Ÿ”ฅ LiteLLM ์œ ์ง€ Grafana ๋Œ€์‹œ๋ณด๋“œ

LiteLLM์€ ์ด ํŽ˜์ด์ง€์˜ litellm_* ๋ฉ”ํŠธ๋ฆญ์šฉ Grafana ๋Œ€์‹œ๋ณด๋“œ ๋‘ ๊ฐœ๋ฅผ cookbook/litellm_proxy_server/grafana_dashboard ํด๋”์— ์œ ์ง€ํ•ด์š”. Dashboards > New > Import์—์„œ JSON์„ ๊ฐ€์ ธ์˜ค๊ณ  ์•ˆ๋‚ด๊ฐ€ ๋‚˜์˜ค๋ฉด Prometheus ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๊ณ ๋ฅด์„ธ์š”.

All Prometheus Metrics ๋Œ€์‹œ๋ณด๋“œ๋Š” ์œ„ ํ‘œ์˜ ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•œ ํŒจ๋„์„ ์ฃผ์ œ๋ณ„๋กœ ๊ทธ๋ฃน์ง€์–ด ๊ฐ€์ ธ์š”: ํŠธ๋ž˜ํ”ฝ, ๋ ˆ์ดํ„ด์‹œ, ์ง€์ถœยทํ† ํฐ, ์บ์‹œ, ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆ์ดํŠธ ๋ฆฌ๋ฐ‹, ์˜ˆ์‚ฐ, ๊ฐ€๋“œ๋ ˆ์ผ, MCP, ๊ด€๋ฆฌํ˜• ํŒŒ์ผยท๋ฐฐ์น˜, ์‚ฌ์šฉ์žยทํŒ€, ๊ทธ๋ฆฌ๊ณ  prometheus_system ์„œ๋น„์Šค ๋ฉ”ํŠธ๋ฆญ๊ณผ DB ํŠธ๋žœ์žญ์…˜ ํ ํฌ๊ธฐ๊นŒ์ง€. ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์˜ ํŒจ๋„์€ ๋น„์›Œ ์žˆ๊ณ , ๊ทธ readme๋Š” ๊ฐ ํ–‰์— ์–ด๋–ค ์„ค์ •์ด ํ•„์š”ํ•œ์ง€ ๋‚˜์—ดํ•ด์š”.

v2 ๋Œ€์‹œ๋ณด๋“œ๋Š” ๋ชจ๋ธ ๊ทธ๋ฃน๋ณ„ ์š”์ฒญ ์†๋„, ์‹คํŒจ, ๋ ˆ์ดํ„ด์‹œ, ๋‚จ์€-์š”์ฒญยท๋‚จ์€-ํ† ํฐ ๊ฒŒ์ด์ง€์˜ ๊ฐ„๊ฒฐํ•œ ๋ณด๊ธฐ๋กœ, ์•„๋ž˜์— ๋ณด์—ฌ์š”.

Deprecated ๋ฉ”ํŠธ๋ฆญ

๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„ ์„ค๋ช…
litellm_llm_api_failed_requests_metric deprecated litellm_proxy_failed_requests_metric ์‚ฌ์šฉ

/metrics ์—”๋“œํฌ์ธํŠธ ์ธ์ฆ

๊ธฐ๋ณธ์ ์œผ๋กœ /metrics๋Š” LiteLLM API ํ‚ค ์ธ์ฆ์„ ์š”๊ตฌํ•ด์š” (v1.85.0๋ถ€ํ„ฐ).

Prometheus์˜ ๊ฒฝ์šฐ ์Šคํฌ๋ ˆ์ดํ”„ ๊ตฌ์„ฑ์— authorization์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

    scrape_configs:
      - job_name: 'litellm'
        authorization:
          type: Bearer
          credentials: <LITELLM_API_KEY>
        static_configs:
          - targets: ['localhost:4000']

์ธ์ฆ ์—†๋Š” ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด:

    litellm_settings:
      require_auth_for_metrics_endpoint: false

FAQ

_created vs. _total ๋ฉ”ํŠธ๋ฆญ์ด ๋ญ”๊ฐ€์š”?

Python Prometheus ํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋“  ์นด์šดํ„ฐยทํžˆ์Šคํ† ๊ทธ๋žจ ์˜†์— _created ์ƒ˜ํ”Œ์„ ๋ฐœํ–‰ํ•ด์š”. ๊ทธ๊ฒƒ์€ ํ•ด๋‹น series๊ฐ€ ์ƒ์„ฑ๋œ Unix ํƒ€์ž„์Šคํƒฌํ”„(๋ณดํ†ต ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘ ๋˜๋Š” ์ฒ˜์Œ ๋ณด๋Š” ๋ผ๋ฒจ ์กฐํ•ฉ)๋ฅผ ๋‹ด๊ณ , ์–ด๋–ค ๊ฒƒ๋„ ์„ธ์ง€ ์•Š์•„์š”.

์นด์šดํŒ… ๋ชฉ์ ์—๋Š” _total ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.

๋” ์•Œ์•„๋ณด๊ธฐ (Learn more)