4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dify / LiteLLM Proxy で作成した生成AIアプリをOpenTelemetryで監視してみた

4
Last updated at Posted at 2026-10-27

はじめに

今回、New Relicが OpenTelemetry(OTel)標準の生成AIトレースを「AI Monitoring」に取り込む機能 にネイティブ対応しました!

image.png

DifyやLiteLLM環境では、LLM監視用にLangfuseやPhoenixなどを別途Dockerで立ち上げてセルフホストすることが多いですが、別途環境のセルフホストが不要で生成AIアプリで見るべき重要な指標を観測できるようになります。

本記事では、Dify / LiteLLM Proxy環境にこのアップデートを適用して、生成AIアプリからLLMへの呼び出しがどう可視化、分析できるのかを解説します。

試した環境について

Dify 上で記事執筆エージェントを構成しています。
マルチエージェント構成で組んでおり、各エージェントの役割は以下になります。

エージェント 役割
下調べエージェント リサーチ担当のエージェント。与えられたテーマについて、記事を書くために必要な事実・論点・背景・具体例を箇条書きで整理する。
執筆エージェント 執筆担当のエージェント。リサーチメモをもとに、読みやすい記事を日本語で執筆する。
校正エージェント 校正担当のエージェント。執筆された記事を推敲し、完成版を出力する。

3つのAIエージェント(下調べ→執筆→校正)を順番に通す Chatflow を動かし、その全LLM呼び出しを LiteLLM Proxy 経由にして、New Relic の AI Monitoring にOpenTelemetry で可視化する構成を今回試しています。

実行環境はDockerを利用しています。

ユーザー入力
   │
   ▼
┌─────────────────────────── Dify (Chatflow) ───────────────────────────┐
│  Agent1: 下調べ  →  Agent2: 執筆  →  Agent3: 校正                        │
└───────────────────────────────┬───────────────────────────────────────┘
                                 │  OpenAI 互換 API 呼び出し
                                 ▼
                        ┌──────────────────┐
                        │  LiteLLM Proxy   │  … 全LLM呼び出しの「関所」
                        │  (localhost:4000)│
                        └───────┬──────┬───┘
                                │      │ OpenTelemetry (gen_ai.* スパン / メトリクス)
                   LLM 呼び出し │      ▼
                                │   ┌──────────────────────────┐
                                ▼   │ New Relic AI Monitoring   │
                          ┌──────────┐ (otlp.nr-data.net)       │
                          │  LLM  │ └──────────────────────────┘
                          └──────────┘

LiteLLM Proxyの設定

Dify の各LLMノード → LiteLLM Proxy → Gemini という経路になり、Proxy が全LLM呼び出しを OpenTelemetry スパンとして New Relic に送信する設定になっています。

config.yml
# LiteLLM Proxy をローカルで起動する Docker Compose。
#
services:
  litellm:
    # OTel 依存を同梱したカスタムイメージをビルドして使う (Dockerfile 参照)
    build:
      context: .
      dockerfile: Dockerfile
    image: litellm-proxy-otel:local
    container_name: litellm-proxy
    restart: unless-stopped
    ports:
      - "4000:4000"
    volumes:
      - ./config.yaml:/app/config.yaml:ro
    command: ["--config", "/app/config.yaml", "--port", "4000"]
    environment:
      # --- モデル呼び出し用 ---
      GEMINI_API_KEY: ${GEMINI_API_KEY}
      GROQ_API_KEY: ${GROQ_API_KEY}
      LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}

      # --- OpenTelemetry エクスポート (New Relic 宛) ---
      OTEL_EXPORTER: "otlp_http"
      # New Relic OTLP エンドポイント (US)。EU の場合は https://otlp.eu01.nr-data.net:4318
      OTEL_ENDPOINT: ${NEW_RELIC_OTLP_ENDPOINT:-https://otlp.nr-data.net:4318}
      # New Relic ライセンスキーを api-key ヘッダで送る
      OTEL_HEADERS: "api-key=${NEW_RELIC_LICENSE_KEY}"
      # New Relic 上でのエンティティ名 (サービス名)
      OTEL_SERVICE_NAME: ${OTEL_SERVICE_NAME:-litellm-proxy}
      OTEL_ENVIRONMENT_NAME: ${OTEL_ENVIRONMENT_NAME:-development}

      # 最新の GenAI セマンティック規約で出力 (New Relic AI Monitoring が解釈する gen_ai.* 準拠)
      OTEL_SEMCONV_STABILITY_OPT_IN: "gen_ai_latest_experimental"
      # LLM呼び出しごとに専用スパンを出す (トレースを見やすくする)
      USE_OTEL_LITELLM_REQUEST_SPAN: "true"
      # メトリクスも出力 (トークン使用量・コスト・レイテンシ)
      LITELLM_OTEL_INTEGRATION_ENABLE_METRICS: "true"
      # イベント(ログ)も出力。GenAI のプロンプト/補完を OTLP logs(events) として送る。
      # semconv モードでは gen_ai.client.inference.operation.details イベントになる。
      # ※ content capture が有効なときのみ中身が乗る (下の OTEL_CAPTURE_CONTENT 参照)。
      LITELLM_OTEL_INTEGRATION_ENABLE_EVENTS: "true"
      # OTLP logs のエクスポーター (events を New Relic に送るために必要)
      OTEL_LOGS_EXPORTER: "otlp_http"
      # OTel エクスポートの診断ログを出す (疎通確認用。安定したら外してよい)
      DEBUG_OTEL: "True"

      # --- プロンプト/応答の内容キャプチャ ---
      # 既定は内容を送らない (NO_CONTENT)。
      # プロンプトと応答を New Relic に送って中身まで見たい場合は SPAN_AND_EVENT に変更。
      # ※ PII・機密情報が送られる可能性があるため、組織のデータ方針を確認のうえで有効化すること。
      OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT: ${OTEL_CAPTURE_CONTENT:-NO_CONTENT}

# Proxy はホストの 4000 番ポートで公開される。
# Dify コンテナからは http://host.docker.internal:4000 でこの Proxy に到達できる
# (Docker Desktop では host.docker.internal がホストを指す)。
# こうすることで Dify の内部ネットワーク名に依存せず、構成が壊れにくい。

Dockerfile
# LiteLLM Proxy に OpenTelemetry のエクスポート依存を同梱したカスタムイメージ。
#
# 公式の litellm イメージには OTel SDK / OTLP エクスポーターが含まれていないため、
# callbacks: ["otel"] を指定しても送信されない。ここで必要パッケージを追加する。
FROM ghcr.io/berriai/litellm:main-latest

# OpenTelemetry の API / SDK / OTLP(HTTP) エクスポーター + instrumentation。
# (New Relic へ otlp_http で送るために必要)
#
# ※ opentelemetry-instrumentation が無いと「トレース(Span)は出るがメトリクスとログが
#    エクスポートされない」症状になる。公式 litellm イメージはこれを同梱していないため、
#    ここで明示的に追加する (BerriAI/litellm#22762 参照)。
USER root
RUN /app/.venv/bin/python -m ensurepip --upgrade \
 && /app/.venv/bin/python -m pip install --no-cache-dir \
    opentelemetry-api \
    opentelemetry-sdk \
    opentelemetry-exporter-otlp-proto-http \
    opentelemetry-instrumentation

.env
# LiteLLM Proxy の環境変数サンプル。

# === Gemini ===
# Google AI Studio で取得した API キー: https://aistudio.google.com/app/apikey
GEMINI_API_KEY=your-gemini-api-key-here

# === Groq ===
# https://console.groq.com で取得した API キー (無料枠が広い。config.yaml の実体で使用)
GROQ_API_KEY=your-groq-api-key-here

# === LiteLLM Proxy ===
# Proxy への接続キー。Dify 側の「API Key」にこの値を設定します。
# sk- で始まる任意の文字列にしてください。
LITELLM_MASTER_KEY=sk-litellm-local-master-key

# === New Relic (OpenTelemetry エクスポート先) ===
# New Relic のライセンスキー (ingest 用)。one.newrelic.com の API keys ページで取得。
NEW_RELIC_LICENSE_KEY=your-new-relic-license-key-here

# OTLP エンドポイント。アカウントのデータセンターに合わせて設定。
#   US: https://otlp.nr-data.net:4318
#   EU: https://otlp.eu01.nr-data.net:4318
#   JP: https://otlp.jp.nr-data.net:443   (JP はポート 443)
NEW_RELIC_OTLP_ENDPOINT=https://otlp.nr-data.net:4318

# New Relic 上でのサービス(エンティティ)名と環境名
OTEL_SERVICE_NAME=litellm-proxy
OTEL_ENVIRONMENT_NAME=development

# === プロンプト/応答の内容キャプチャ ===
# NO_CONTENT      : 内容を送らない (既定・安全)
# SPAN_AND_EVENT  : プロンプトと応答の中身も New Relic に送る
# ※ 有効化すると PII や機密情報が送られる可能性があります。組織のデータ方針を確認してください。
OTEL_CAPTURE_CONTENT=NO_CONTENT

Difyの設定

.env
# ===== OpenTelemetry (New Relic AI Monitoring) =====
# OpenTelemetryの設定箇所のみ記載
ENABLE_OTEL=true
OTLP_BASE_ENDPOINT=https://otlp.nr-data.net:4318
# New Relic ライセンスキー
OTLP_API_KEY=**
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_TYPE=otlp
OTEL_SAMPLING_RATE=1.0

データを確認

DifyのUIで作成したエージェントに対してテストのプロンプトを入力して、LLMからの出力結果を取得します。
image.png

AIトレース

Difyのアプリから呼び出されたLLMへの呼び出しがトレースとして確認できるようになります。LLMの呼び出し毎のトークンの消費傾向や、各AIエージェントのどこで時間がかかっているのか、エラーが発生しているかなどトレースから追うことが可能です。
image.png
image.png
image.png

Model Inventory

LiteLLM Proxyを通して呼び出している複数LLMのモデル毎のトークンの消費傾向やエラーなどの品質状況が専用のUIですぐに可視化されます。どのLLMのモデルが品質、コスト面で最適化なのかをサービスでの実際の利用状況をふまえて見極めることができます。
image.png
image.png
image.png

終わりに

Dify / LiteLLM Proxyのような生成AIアプリの実行環境において、「OTel標準で吐き出して、New Relic AI Monitoringで一元管理する」 パターンは、現在のLLMオブザーバビリティにおける最適解のひとつです。

ぜひお試しください!!


New Relicでは、新しい機能やその活用方法について、QiitaやXで発信しています!
無料でアカウント作成も可能なのでぜひお試しください!

New Relic株式会社のX(旧Twitter) や Qiita Organizationでは、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。

無料のアカウントで試してみよう!
New Relic フリープランで始めるオブザーバビリティ!

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?