「New Relic Advent Calendar 2025 」シリーズ4・25日目の記事になります。
はじめに
こんにちは。スタディング開発担当の山本です。最近のマイブームは「剣と魔法と学歴社会」(カクヨム)です。
今回は New Relic と LiteLLM Proxy を OpenTelemetry で統合する方法を共有したいと思います。
対象読者
- New Relic を利用している方
- LiteLLM Proxy を試してみたい方
背景と目的
KIYOラーニングではオブザーバビリティツールとして New Relic を活用しています。
また、今後プロダクトや社内で利用するLLMの運用効率化を目指して、LLMゲートウェイとして LiteLLM Proxy の採用を検討しています。
New Relic と LiteLLM Proxy は OpenTelemetry に対応していることと、OpenTelemetry を扱った経験が無かったため、勉強を兼ねて試しました。
LLMゲートウェイとは?
LLMゲートウェイ(またはAIゲートウェイ)とは、アプリケーションと複数の大規模言語モデル(LLM)プロバイダー(OpenAI, Anthropic, Azure AIなど)の間で、リクエストを仲介・管理する中継レイヤー(ミドルウェア)です。
主な役割は、複数の異なるLLMへのアクセスを一元化し、運用の効率化やセキュリティの強化を図ることにあります。
OpenTelemetryとは?
OpenTelemetry(OTel)は、クラウドネイティブなソフトウェアの動作を把握するために必要なデータ(テレメトリデータ)の収集・送信を標準化するためのオープンソース・プロジェクトです。
2025年現在、可観測性(オブザーバビリティ)の分野におけるデファクトスタンダードとして確立されており、多くのクラウドベンダーや監視ツールで採用されています。
試してみた
LiteLLM Proxy を準備してみる
- 私の利用経験が乏しい
- Admin UI で色々試してみたい
- Amazon Bedrock のモデルを使ってみる
という理由から、以下のファイルを用意しました。
docker-compose.yaml
services:
litellm:
image: litellm/litellm-database:v1.80.8-stable.1
platform: linux/amd64
depends_on:
postgres:
condition: service_healthy
environment:
# LiteLLM の設定
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} # PostgreSQL接続情報
- LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY} # LiteLLMの管理者パスワード
# New Relic(OTel)設定
- OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.nr-data.net # httpsのため443ポートの指定は省略可
- OTEL_EXPORTER_OTLP_HEADERS=api-key=${NEW_RELIC_API_KEY} # New Relic の INGEST - LICENSE キー
- OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf # New Relic では http/protobuf を推奨
- OTEL_SERVICE_NAME=litellm-proxy # APM上で表示されるサービス名
# OTel の詳細設定
- LITELLM_OTEL_INTEGRATION_ENABLE_EVENTS=true # 詳細なイベントを有効化
- LITELLM_OTEL_INTEGRATION_ENABLE_METRICS=true # 詳細なメトリクスを有効化
# AWS(Bedrock) の設定
- AWS_DEFAULT_REGION=ap-northeast-1
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
ports:
- '4000:4000'
volumes:
- ./config.yaml:/app/config.yaml
command: ['--config', '/app/config.yaml', '--detailed_debug']
postgres:
image: postgres:17
restart: always
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 1s
timeout: 5s
retries: 10
config.yaml
litellm_settings:
callbacks: ['otel']
model_list:
- model_name: Claude Opus 4.5
litellm_params:
model: bedrock/global.anthropic.claude-opus-4-5-20251101-v1:0
- model_name: Claude Sonnet 4.5
litellm_params:
model: bedrock/jp.anthropic.claude-sonnet-4-5-20250929-v1:0
.env
POSTGRES_USER={ユーザー名}
POSTGRES_PASSWORD={パスワード}
POSTGRES_DB=litellm
LITELLM_MASTER_KEY={パスワード}
NEW_RELIC_API_KEY={New Relic INGEST - LICENSE の APIキー}
AWS_ACCESS_KEY_ID={AWSのアクセスキー}
AWS_SECRET_ACCESS_KEY={AWSのシークレットアクセスキー}
LiteLLM Proxy を起動してみる
準備したファイルがある場所で、イメージのビルドとコンテナの起動を行います。
docker compose up -d --build
LiteLLM Proxy を試してみる
正常に起動していれば、http://localhost:4000/ でアクセスできます。
Admin UI に用意されている Playground で手っ取り早く試してみます。
LiteLLM Proxy にログインする
Admin UI へアクセスします。
初期状態では以下の情報でログイン可能です。
- Username:
admin - Password:
{.env - LITELLM_MASTER_KEY で設定した値}
Playground でAPIを呼び出してみる
Select Model からモデルを選択後に質問を投げてみます。
※余談ですが、v1.80.8では変換の確定も送信されてしまいました...
無事に呼び出せました。
New Relic を確認してみる
無事に統合できていれば、APM & Services の中に追加されています。
APM & Services 一覧を確認してみる
無事に統合できたようです。
中身を見てみる
Required metrics are missing
The OpenTelemetry APM experience depends matching data against a variety of standard semantic conventions. To learn more about which semantic conventions are leveraged and how OpenTelemetry data matching these are normalized, review the documentation linked below. Additionally, a legacy view of span data is available through the following link
指標が不足しているようなメッセージが表示されていますが、LiteLLM から送られるデータの仕様っぽいので一旦無視します。
Distributed tracing を見てみる
unknown (Received Proxy Server Request) を見てみる
それぞれの中身を確認してみると、APIの実行履歴は unknown (Received Proxy Server Request) に記録されているようです。
会話ログが記録されていることも確認できました。
会話ログを記録したくない場合は、config.yaml で turn_off_message_logging を True にすれば良いみたいです。
litellm_settings:
turn_off_message_logging: True
NRQL も確認してみる
OpenTelemetry ではコスト情報なども送られているようです。
Span に記録されているようなので、ざっくり見てみます。
FROM Span SELECT * WHERE service.name = 'litellm-proxy' SINCE 1 day ago
目視で確認したところ、name = Received Proxy Server Request のデータにコスト情報などが入っていましたので絞り込みます。
FROM Span SELECT * WHERE service.name = 'litellm-proxy' AND name ='Received Proxy Server Request' SINCE 1 day ago
以下に実際のSpanをJSON形式で一部抜粋してみました。
"gen_ai.completion.0.content": "# Qiitaでバズるためのポイント\n\nQiitaで注目を集める記事を書くコツをまとめます!\n\n## 📝 記事内容の選び方\n\n### バズりやすいテーマ\n- **新技術・最新情報**:リリース直後のフレームワークやツール\n- **ハマったエラー解決**:多くの人が遭遇する問題の解決法\n- **比較記事**:「AとBどっちがいい?」系\n- **チュートリアル**:初心者向けの丁寧な手順解説\n- **ベストプラクティス**:実務で使えるTips集\n\n### タイミングが重要\n- 新しいバージョンのリリース直後\n- アドベントカレンダー期間(12月)\n- 新年度・新学期の時期\n\n## ✍️ 書き方のコツ\n\n### タイトル\n- **具体的な数字**を入れる:「〇〇の方法10選」\n- **ターゲット明確化**:「初心者向け」「2024年版」\n- **問題解決型**:「〇〇できない時の対処法」\n\n### 記事構成\n- **結論を先に書く**\n- コードは実行可能な形で\n- スクリーンショットや図解を活用\n- 目次を作って読みやすく\n\n## 🚀 投稿戦略\n\n### ベストな投稿時間\n- **平日の朝(7-9時)** or **昼休み(12-13時)**\n- 金曜日の夕方も◎\n\n### タグ付け\n- 適切なタグを3-5個\n- 人気タグを1-2個混ぜる\n\n### SNS活用\n- Twitter(X)で投稿を告知\n- 関連コミュニティでシェア\n\n## 💡 継続のコツ\n\n- **質より量より更新頻度**(最初は)\n- LGTMをもらった記事のテーマを深堀り\n- コメントには丁寧に返信\n\n頑張ってください!🎉",
"gen_ai.completion.0.finish_reason": "stop",
"gen_ai.completion.0.role": "assistant",
"gen_ai.cost.discount_amount": 0,
"gen_ai.cost.discount_percent": 0,
"gen_ai.cost.input_cost": 0.0000726,
"gen_ai.cost.original_cost": 0.010236600000000002,
"gen_ai.cost.output_cost": 0.010164000000000001,
"gen_ai.cost.tool_usage_cost": 0,
"gen_ai.cost.total_cost": 0.010236600000000002,
"gen_ai.prompt.0.content": "Qiitaのバズり方を教えてー",
"gen_ai.prompt.0.role": "user",
"gen_ai.request.model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
"gen_ai.response.model": "jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
"gen_ai.system": "bedrock",
"gen_ai.usage.completion_tokens": 616,
"gen_ai.usage.prompt_tokens": 22,
トークン数も取得できており、いい感じですね。
LLMに関連する基本的な内容は gen_ai.* 属性へ設定されているようです。
おわりに
LiteLLM の OpenTelemetry から 会話ログ や コスト情報など を New Relic 上で確認できるようになりました。
今後は独自のダッシュボードを作成し、効率的な運用を目指して頑張ります。
参考文献
- OpenTelemetryとNew Relicの紹介 | New Relic Documentation
- ClineからLiteLLM Proxyを通してAmazon Bedrockを利用する | DevelopersIO
KIYOラーニング株式会社について
当社のビジョンは『世界一「学びやすく、分かりやすく、続けやすい」学習手段を提供する』ことです。革新的な教育サービスを作り成長させていく事で、オンライン教育分野でナンバーワンの存在となり、世界に展開していくことを目指しています。
プロダクト
- スタディング:「学びやすく・わかりやすく・続けやすい」オンライン資格対策講座
- スタディングキャリア:資格取得者の仕事探しやキャリア形成を支援する転職サービス
- AirCourse:受け放題の動画研修がついたeラーニングシステム(LMS)
KIYOラーニング株式会社では一緒に働く仲間を募集しています





