Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【PHPerKaigi2026】OpenTelemetry SDKを使ってPHPでAPMを自作する

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

【PHPerKaigi2026】OpenTelemetry SDKを使ってPHPでAPMを自作する

PHPerKaigi2026で発表したスライドです

【概要文】
Observabilityにおけるアプリケーションのパフォーマンス監視において、APM(Application Performance Monitoring)は不可欠な存在です。しかし、これらのツールが「内部でどのように動作しているか?」を理解している開発者は多くありません。

本セッションでは、OpenTelemetry PHP SDKを使用して、シンプルなAPMツールをゼロから自作します。
トレース、メトリクス、ログの3つのシグナルを収集・可視化する過程を通じて、APMの仕組みとOpenTelemetryの設計思想を深く理解することを目指します。商用のAPMツールを「なんとなく使っている」状態から、「仕組みを理解して使いこなす」状態へステップアップしていきましょう!

【セッションの対象者】
・APMを使っているが仕組みを理解したいエンジニア
・Observabilityに興味があるエンジニア

【このセッションで得られること】
APMが内部で何をしているか?の理解
OpenTelemetry SDKの活用方法について

Avatar for Futoshi Endo

Futoshi Endo

March 21, 2026
Tweet

More Decks by Futoshi Endo

Other Decks in Technology

Transcript

  1. 2 自己紹介 氏名: 遠藤太徳 (Endo Futoshi) 所属: NewRelic株式会社(New Relic, K.K.)

    役職: Technical Account Manager Webアプリケーションエンジニアとして API開発、既存サービスのリファクタリ ング、CREとしてユーザー体験改善、チームビルディングを経験。現職では New Relic のTechnical Account Manager として活用支援や、勉強会 を行っています。 PHP歴は9年程🐘 趣味: 音楽、料理、ゲーム、個人開発、どんちゃん (豆柴)と散歩
  2. 6 ✅ 今日お話すること ✓ APMが内部で何をしているかの仕組み ✓ Trace・Metrics・Logsの3シグナルの役割 ✓ OTel PHP

    SDKを使った計装コードの書き方 ✓ 「計装を手で書く」ことで商用 APMの 動作原理を理解すること ✓ DockerでJaeger・Prometheusに データを送って可視化すること ❌ 今日お話しないこと ✕ New RelicやDatadogのような APMツールをゼロから作ること ✕ JaegerやPrometheusの 内部実装の詳細 ✕ 本番運用レベルの パフォーマンスチューニング ✕ OpenTelemetry Collectorの 高度な設定・運用 ✕ PHP以外の言語での OTel実装
  3. 19

  4. 21 APMでモニタリングするために必要な 3つのテレメトリデータ Traces 「リクエストの足跡」 リクエストの処理過程をSpan単位 (処理の単位)で記録。どの処理で時 間がかかったかを可視化。 Metrics 「アプリのバイタル」

    リクエスト数・レイテンシ・エラー率な ど時系列で集計する定量データ。 orders.total{status="success"} = 1,024 orders.total{status="failed"} = 12 order.duration_p50 = 95ms order.duration_p99 = 430ms order.duration_max = 812ms Logs 「何が起きたか」の記録 タイムスタンプ付きの構造化テキス ト。 Trace IDと紐付けてコンテキストを持 たせる。 { "level": "INFO", "message": "Order started", "trace_id": "a1b2c3d4e5f6", "user_id": 1001, "product_id": 88, "amount": 5800, "timestamp": "2025-03-20T12:34:56Z" } TraceID: a1b2c3d4e5f6 POST /orders ─────────────────────── 150 ms ├─ stock.check ──── 12ms ├─ db.insert ─────────────── 40ms └─ http.payment-api ──────────────120ms ⚠ APMとはなにか
  5. 22 🤖自動計装 🔧手動計装 仕組み 自動計装用のAPMエージェントをアプ リケーションにインストール。 コード変更なしに計装する。 ライブラリをimportし、計装ポイントを 明示的に記述する。 メリット:

    コード変更不要。すぐにテレメトリデー タを収集して、計測が開始できる。 細かい制御が可能。業務データを Spanに含められる。 デメリット 言語・フレームワーク依存。細かい制 御が難しい。 コード変更が必要。初期実装コストが かかる。 代表例: New Relic Agent , Datadog APM Open Telemetry ゼロコード計装 Open Telemetry SDK、カスタム計 装コード 計装方法の比較
  6. 24 🤖自動計装 🔧手動計装 仕組み 自動計装用のAPMエージェントをアプ リケーションにインストール。 コード変更なしに計装する。 ライブラリをimportし、計装ポイントを 明示的に記述する。 メリット:

    コード変更不要。すぐにテレメトリデー タを収集して、計測が開始できる。 細かい制御が可能。業務データを Spanに含められる。 デメリット 言語・フレームワーク依存。細かい制 御が難しい。 コード変更が必要。初期実装コストが かかる。 代表例: New Relic Agent , Datadog APM Open Telemetry ゼロコード計装 Open Telemetry SDK、カスタム計 装コード 計装方法の比較 今回は手動計装で挑戦!
  7. 26 🏗 CNCF プロジェクト Cloud Native Computing Foundation 傘下。KubernetesやPrometheusと同じコミュニティが管理 する本格的なOSS。

    🌐 ベンダー非依存 一度計装すれば、New Relic・Datadog・Jaegerなど任意のObservability Backendへデータ を送信できる。 🔌 多言語対応 Java・Go・Python・JavaScript・PHPなど20以上の言語向けSDKが提供されている。 📡 業界標準化 Google・Microsoft・AWS・Splunkなど主要クラウドベンダーが積極的にコントリビュートしている。 OpenTelemetryの概要 オブザーバビリティフレームワークでありツールキット。 Traces・Metrics・Logsのようなテレメトリーデータ を生成、エクスポート、収集などを容易 にするために設計されてる
  8. 29 OpenTelemetryの概要 PHP App+SDKから受け取ったデータを Otel Collectorで受け取り編集する ◦ Receiver(受信) ▪ OTLP形式でSDKから

    Traces・Metrics・Logsを 受け取る ◦ Processor(加工) ▪ 不要な属性を削除したり、タ グを追加したりしてデータを 整形 ▪ 追加のSamplingフィルタ リング ◦ Exporter(転送) ▪ 送り先の形式に変換して送 信
  9. 32 Todo アプリ (PHP) OTelで手動計装 Observability Backend Open Telemetry Collector

    Obeservabiltiy Backendまでの処理を実装して APMの裏側を理解 • OTel SDK で Traces・Metrics・Logs を取得する為の処理を手動計装 • OTel Collector でデータを受け取り、Observability Backendへ転送する • Jaeger・Grafana でトレースとメトリクスを可視化する PHP+OTel SDK でAPMの裏側を理解する OTELP OTELP
  10. 34 PHPでAPMを自作する ref: https://github.com/open-telemetry/opentelemetry-php • open-telemetry/api ◦ 計装する為のインターフェース定 義 •

    open-telemetry/sdk ◦ 実際に処理を動かす為のパッ ケージ(エンジン) • open-telemetry/exporter-otlp ◦ SDKで収集したデータをOTLP 形式でCollectorに送る
  11. 36

  12. 37

  13. 38

  14. 41 • 初期化しない場合テレメトリデータを受け 取る為の土台がない為、なにも記録され ない ◦ https://opentelemetry.io/docs/la nguages/php/instrumentation/ • したがって、手動計装の場合はOTelの

    TracerProvider・MeterProvider・Logg erProviderも毎回初期化が必要です ◦ 自動計装であればPHPプロセス起 動時に自動で初期化されるため開 発者が意識しなくて良い
  15. 43 • TelemetryMiddleware.php ◦ HTTPリクエスト全体を1つの「HTTP SERVER Span」でラップするクラス。リク エスト受信時にSpanを開始し、処理完了 後はレスポンスのステータスコードやメ ソッドをSpanに記録し計測します。

    • TodoHandler.php ◦ Todo APIのビジネスロジックを担うクラ ス、GET/POST/PUT/DELETEの各操作 を実装し、処理の開始・完了・エラーを構 造化ログとして出力します。
  16. 44

  17. 47

  18. 48

  19. 49

  20. 50

  21. 51

  22. 52

  23. 54 • OpenTelemetry SDKを使った「手動計装」をやってみてAPMの 裏側でどんな事が行われているか理解ができた! • 正直、最初に覚える事は沢山あります! • 今日の発表で OpenTelemetryに興味が出た方は公式のドキュ

    メントだったり、僕が作成したリポジトリや、書籍「入門 OpenTelemetry」わかりやすいので、ぜひ手にとってみて、手を 動かしてみてください!
  24. 57 • 入門 Open Telemetry • 実践 OpenTelemetry • https://speakerdeck.com/ymotongpoo/intro-of-opentelemetry-book

    • https://dev.classmethod.jp/articles/otel-sdk-php-export-performance-degra dation/ • PHP アプリケーションのトレース計装ではじめる OpenTelemetry 入門 • https://speakerdeck.com/oracle4engineer/zero-code-observability-with-ope ntelemetry-and-oci-apm •