nikkie-ftnextの日記

イベントレポートや読書メモを発信

OpenTelemetry で google-genai のテレメトリを、ローカル環境に docker run で立てた exporter に送る

はじめに

七尾百合子さん、お誕生日 157日目 おめでとうございます!1 nikkieです。

OpenTelemetryのexporterを素振りします2

目次

opentelemetry-instrumentation-google-genai の zero-code の例

opentelemetry-instrument python main.py3すると、トレース・ログ・メトリクスが記録される例です。
ただ私は4317ポートで何を動かすか分からなかったんですよね。

An OTLP compatible endpoint should be listening for traces, logs, and metrics on http://localhost:4317.

Dockerイメージ otel/opentelemetry-collector を動かす

https://hub.docker.com/r/otel/opentelemetry-collector

コレクターのセットアップ」にあるYAMLファイルを用意し、docker runします

docker run -p 4317:4317 -p 4318:4318 --rm -v $(pwd)/collector-config.yaml:/etc/otelcol/config.yaml otel/opentelemetry-collector

opentelemetry-instrument python main.pyするまで

main.pyを省力版で用意4

import google.genai
from dotenv import load_dotenv

load_dotenv()


def main():
    client = google.genai.Client()
    response = client.models.generate_content(
        model="gemini-2.0-flash",
        contents="Why is the sky blue?",
    )
    print(response.text)


if __name__ == "__main__":
    main()

.env5

OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
OTEL_EXPORTER_OTLP_PROTOCOL=grpc

OTEL_SERVICE_NAME=opentelemetry-python-google-genai

OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true

uvで仮想環境を作りました(uv venvPython 3.11.8 です)。

uv pip install -r requirements.txt6

google-genai
opentelemetry-api
opentelemetry-sdk
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation
opentelemetry-instrumentation-google-genai
opentelemetry-distro[otlp]
python-dotenv

uv pip freezeの出力(環境再現用)

annotated-types==0.7.0
anyio==4.10.0
cachetools==5.5.2
certifi==2025.8.3
charset-normalizer==3.4.3
google-auth==2.40.3
google-genai==1.31.0
googleapis-common-protos==1.70.0
grpcio==1.74.0
h11==0.16.0
httpcore==1.0.9
httpx==0.28.1
idna==3.10
importlib-metadata==8.7.0
opentelemetry-api==1.36.0
opentelemetry-distro==0.57b0
opentelemetry-exporter-otlp==1.36.0
opentelemetry-exporter-otlp-proto-common==1.36.0
opentelemetry-exporter-otlp-proto-grpc==1.36.0
opentelemetry-exporter-otlp-proto-http==1.36.0
opentelemetry-instrumentation==0.57b0
opentelemetry-instrumentation-google-genai==0.3b0
opentelemetry-proto==1.36.0
opentelemetry-sdk==1.36.0
opentelemetry-semantic-conventions==0.57b0
packaging==25.0
protobuf==6.32.0
pyasn1==0.6.1
pyasn1-modules==0.4.2
pydantic==2.11.7
pydantic-core==2.33.2
python-dotenv==1.1.1
requests==2.32.5
rsa==4.9.1
sniffio==1.3.1
tenacity==9.1.2
typing-extensions==4.14.1
typing-inspection==0.4.1
urllib3==2.5.0
websockets==15.0.1
wrapt==1.17.3
zipp==3.23.0

exporterに記録された!

仮想環境を有効にして opentelemetry-instrument python main.py すると、collectorのdockerコンテナをrunしているターミナルに出力が!
全文:https://gist.github.com/ftnext/a8bd74df23fcfa64ca2c82b7fad25cf5

リクエス「Why is the sky blue?」と

LogRecord #0
ObservedTimestamp: 2025-08-21 13:42:18.180994 +0000 UTC
Timestamp: 2025-08-21 13:42:18.180555 +0000 UTC
SeverityText: 
SeverityNumber: Info(9)
Body: Map({"content":"Why is the sky blue?"})
Attributes:
     -> gen_ai.system: Str(gemini)
     -> event.name: Str(gen_ai.user.message)
Trace ID: c2fea995f3cc0d4bdb53cd112e73e4ba
Span ID: 8c936c4e99089bd8
Flags: 1

対するレスポンスが記録されています

LogRecord #1
ObservedTimestamp: 2025-08-21 13:42:21.788134 +0000 UTC
Timestamp: 2025-08-21 13:42:21.788038 +0000 UTC
SeverityText: 
SeverityNumber: Info(9)
Body: Map({"content":{"parts":[{"code_execution_result":null,"executable_code":null,"file_data":null,"function_call":null,"function_response":null,"inline_data":null,"text":"The sky is blue due to a phenomenon called **Rayleigh scattering**. Here's the breakdown:\n\n<省略>","thought":null,"thought_signature":null,"video_metadata":null}],"role":"model"},"finish_reason":"STOP","index":0})
Attributes:
     -> gen_ai.system: Str(gemini)
     -> event.name: Str(gen_ai.choice)
Trace ID: c2fea995f3cc0d4bdb53cd112e73e4ba
Span ID: 8c936c4e99089bd8
Flags: 1

終わりに

OpenTelemetryのexporterの1つ、otel/opentelemetry-collectorイメージを動かせました。
google-genaiのテレメトリをコンソールやファイルではなく、ついにexporterに送ることができました!

otel/opentelemetry-collectorイメージですが、送られたテレメトリを後から見返せるのか気になります。


  1. 黄前久美子さん、お誕生日おめでとうございます!
  2. 「私はexporterについて大いに素振りの余地があります」 Agent Development Kit で AgentTool はどのように Gemini に見えているか知りたく、OpenTelemetry によるトレースを読む - nikkie-ftnextの日記
  3. 自動計装ですね
  4. 本家は環境変数でモデルやプロンプトを切り替えられるようにしています。 https://github.com/open-telemetry/opentelemetry-python-contrib/blob/v0.57b0/instrumentation-genai/opentelemetry-instrumentation-google-genai/examples/zero-code/main.py
  5. https://github.com/open-telemetry/opentelemetry-python-contrib/blob/v0.57b0/instrumentation-genai/opentelemetry-instrumentation-google-genai/examples/zero-code/.env
  6. そのままだと動かなかったので最新化しました。不要そうな依存は削除しています https://github.com/open-telemetry/opentelemetry-python-contrib/blob/v0.57b0/instrumentation-genai/opentelemetry-instrumentation-google-genai/examples/zero-code/requirements.txt