mcpField
O
opentelemetry

opentelemetry

github.com/julianobarbosaクラウド・DevOps15134 回インストール4 日前に更新
リポジトリ

opentelemetry について

Kubernetes で OpenTelemetry による可観測性を実装するチーム向けのガイドです。テレメトリー信号、Collector のパイプライン、デプロイ方式、検証、よくある問題を扱います。

主な機能

  1. 01Helm による OpenTelemetry Collector のデプロイ
  2. 02OTLP 経由でのテストテレメトリー送信
  3. 03レシーバー、プロセッサー、エクスポーターの設定
  4. 04Kubernetes のデプロイ方式の比較
  5. 05Collector の Pod とログの検証
  6. 06計装とパイプラインの注意点の確認

活用シーン

  1. 01Kubernetes でのテレメトリー収集の設定
  2. 02OTLP エンドポイントのテスト
  3. 03Collector のデプロイ方式の選択
  4. 04データ欠落やトレース伝播の問題の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/julianobarbosa/claude-code-skills --skill opentelemetry

インストール後、Claude Code で/opentelemetryを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples/
values-daemonset.yaml
values-deployment.yaml
references/
COLLECTOR.md
INSTRUMENTATION.md
KUBERNETES.md
TROUBLESHOOTING.md
scripts/
validate-otel.sh

詳細

OpenTelemetry 実装ガイド

概要

OpenTelemetry(OTel)は、テレメトリデータ(トレース、メトリクス、ログ)の計装、生成、収集、エクスポートを行うためのベンダー中立な可観測性フレームワークです。このスキルでは、Kubernetes 環境で OTEL を実装するためのガイダンスを提供します。

クイックスタート

Kubernetes に OTEL Collector をデプロイする
# Add Helm repo
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update

# Install with basic config
helm install otel-collector open-telemetry/opentelemetry-collector \
  --namespace monitoring --create-namespace \
  --set mode=daemonset
OTLP 経由でテストデータを送信する
# gRPC endpoint: 4317, HTTP endpoint: 4318
curl -X POST http://otel-collector:4318/v1/traces \
  -H "Content-Type: application/json" \
  -d '{"resourceSpans":[]}'

基本概念

シグナル:テレメトリデータには次の 3 種類があります。

  • トレース:サービス間の分散リクエストフロー
  • メトリクス:数値測定値(カウンター、ゲージ、ヒストグラム)
  • ログ:構造化データまたは非構造化データを含むイベント記録

Collector のコンポーネント:

  • レシーバー:データを受け入れます(OTLP、Prometheus、Jaeger、Zipkin)
  • プロセッサー:データを変換します(batch、memory_limiter、k8sattributes)
  • エクスポーター:データを送信します(prometheusremotewrite、loki、otlp)
  • エクステンション:機能を追加します(health_check、pprof、zpages)

Collector の設定

基本的なパイプライン構造
config:
  receivers:
    otlp:
      protocols:
        grpc:
          endpoint: ${env:MY_POD_IP}:4317
        http:
          endpoint: ${env:MY_POD_IP}:4318

  processors:
    batch:
      timeout: 10s
      send_batch_size: 1024
    memory_limiter:
      check_interval: 5s
      limit_percentage: 80
      spike_limit_percentage: 25

  exporters:
    prometheusremotewrite:
      endpoint: "http://prometheus:9090/api/v1/write"
    loki:
      endpoint: "http://loki:3100/loki/api/v1/push"

  service:
    pipelines:
      metrics:
        receivers: [otlp]
        processors: [memory_limiter, batch]
        exporters: [prometheusremotewrite]
      logs:
        receivers: [otlp]
        processors: [memory_limiter, batch]
        exporters: [loki]
      traces:
        receivers: [otlp]
        processors: [memory_limiter, batch]
        exporters: [otlp/tempo]
Kubernetes 属性の付加
processors:
  k8sattributes:
    auth_type: "serviceAccount"
    passthrough: false
    filter:
      node_from_env_var: ${env:K8S_NODE_NAME}
    extract:
      metadata:
        - k8s.pod.name
        - k8s.namespace.name
        - k8s.deployment.name
        - k8s.node.name

デプロイモード

モードユースケースメリットデメリット
DaemonSetノードレベルの収集網羅的なカバレッジ、ホストメトリクスリソース使用量が多い
Deployment集中型ゲートウェイスケーラブルで、管理が容易単一障害点
SidecarPod ごとの収集分離され、きめ細かく制御可能Pod ごとにリソースオーバーヘッドが発生

一般的なパターン

開発環境
  • 可視性を高めるため、デバッグエクスポーターを有効にします
  • リソース制限を低く設定します(CPU 250m、メモリ 512Mi)
  • コスト削減のため、スポットインスタンスの許容設定を含めます
本番環境
  • サンプリングを実装します(トレースの 10~50%)
  • バッチサイズを大きくします(2048~4096)
  • オートスケーリングと PodDisruptionBudget を有効にします
  • すべてのエンドポイントで TLS を使用します

詳細なリファレンス

詳しいガイダンスについては、以下を参照してください。

検証コマンド

# Check collector pods
kubectl get pods -n monitoring -l app.kubernetes.io/name=otel-collector

# View collector logs
kubectl logs -n monitoring -l app.kubernetes.io/name=otel-collector --tail=100

# Test OTLP endpoint
kubectl run test-otlp --image=curlimages/curl:latest --rm -it -- \
  curl -v http://otel-collector.monitoring:4318/v1/traces

# Validate config syntax
otelcol validate --config=config.yaml

主要な Helm チャートの値

mode: "daemonset"  # or "deployment"
presets:
  logsCollection:
    enabled: true
  hostMetrics:
    enabled: true
  kubernetesAttributes:
    enabled: true
  kubeletMetrics:
    enabled: true
useGOMEMLIMIT: true
resources:
  limits:
    cpu: 500m
    memory: 1Gi
  requests:
    cpu: 100m
    memory: 256Mi

注意点

  • パイプラインの末尾にある Collector の tail_sampling は、処理中のバッファーを解放しません — 後段で行われた破棄の判断でもメモリを保持するため、負荷時に OOM が発生します。
  • 自動計装と手動計装を併用すると、トレースが二重にカウントされることがあります — サービスごとにどちらか一方の方式を選ぶか、サンプラーで明示的に重複を排除してください。
  • コンテキスト伝播:HTTP の B3 ヘッダーと W3C の traceparent ヘッダーは自動変換されません。混在環境では、気付かないうちにトレースの連続性が失われます。
  • OTel SDK と Collector のプロトコルバージョン:マイナーバージョンの不一致により、属性が気付かないうちに欠落することがあります(特にセマンティック規約の属性)。
  • リソース検出ではプラットフォーム属性(cloud.account.id、host.id)が追加され、トレースが肥大化します。ルーティングに使用しない場合は無効にしてください。
  • バッチプロセッサーとメモリーリミッターの順序:パイプラインではリミッターをバッチの前に置く必要があります。そうしないと、メモリーの逼迫時にバックプレッシャーがかからず、バッチが破棄されます。

コメント