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

OpenTelemetry PHPで始める!オブザーバビリティ入門

atsu.kg
February 10, 2024

OpenTelemetry PHPで始める!オブザーバビリティ入門

PHPでOpenTelemetryを使ってトレースを収集する:https://blog.wh-plus.co.jp/entry/2023/12/14/090000
PHPでOpenTelemetryを使ってメトリクスを収集する:https://blog.wh-plus.co.jp/entry/2024/01/05/191302
Observability Whitepaper:https://github.com/cncf/tag-observability/blob/whitepaper-v1.0.0/whitepaper.md

atsu.kg

February 10, 2024
Tweet

More Decks by atsu.kg

Other Decks in Programming

Transcript

  1. OpenTelemetry PHPで始める!
    オブザーバビリティ入門
    2024/2/11 PHPカンファレンス関西2024

    View full-size slide

  2. 2
    古賀 敦士
    株式会社ホワイトプラス所属
    大学・新社会人を六甲道で過ごす
    昨日食べたお好み焼きはふわとろで
    もんじゃみたいだった
    自己紹介

    View full-size slide

  3. 3
    PHPでOpenTelemetryを使ってトレースを収集する[1]
    PHPでOpenTelemetryを使ってメトリクスを収集する[2]
    TechBlogやってます
    ※本日紹介するソースコードの詳細説明はブログを参照ください
    [1] https://blog.wh-plus.co.jp/entry/2023/12/14/090000
    [2] https://blog.wh-plus.co.jp/entry/2024/01/05/191302

    View full-size slide

  4. 4
    アジェンダ
    オブザーバビリティとは何か
    OpenTelemetryが解決すること
    01
    02
    OpenTelemetry PHPによる計装・分析方法
    03

    View full-size slide

  5. 5
    オブザーバビリティとは何か

    View full-size slide

  6. 6
    オブザーバビリティという用語は、制御理論の中で次のように定義されている
    (参考:Observability Whitepaper)
    「外部出力の知識からシステムの内部状態をど
    れだけうまく推測できるかの尺度」
    これをソフトウェアの文脈に適用したもの

    View full-size slide

  7. 7
    オブザーバビリティという用語は、制御理論の中で次のように定義されている
    (参考:Observability Whitepaper)
    「外部出力の知識からシステムの内部状態をど
    れだけうまく推測できるかの尺度」
    これをソフトウェアの文脈に適用したもの
    テレメトリーデータ
    (Log, Metrics, Trace, etc)

    View full-size slide

  8. 8
    オブザーバビリティという用語は、制御理論の中で次のように定義されている
    (参考:Observability Whitepaper)
    「外部出力の知識からシステムの内部状態をど
    れだけうまく推測できるかの尺度」
    これをソフトウェアの文脈に適用したもの
    ・障害調査
    ・パフォーマンスチューニング
    ・正常動作チェック
    で活用

    View full-size slide

  9. システムの複雑化
    9
    オブザーバビリティの必要性

    View full-size slide

  10. 10
    10s
    /get-orders
    遅い...
    product
    応答速度改善:シンプルなシステム

    View full-size slide

  11. 11
    DB
    App
    10s
    /get-orders
    遅い...
    product
    1. コンポーネントを思い描く
    応答速度改善:シンプルなシステム

    View full-size slide

  12. 12
    DB
    App
    10s
    /get-orders
    遅い...
    product
    1. コンポーネントを思い描く
    2. ボトルネックを推測する
    重い処理? slow query?
    応答速度改善:シンプルなシステム

    View full-size slide

  13. 13
    DB
    App
    10s
    /get-orders
    遅い...
    product
    1. コンポーネントを思い描く
    2. ボトルネックを推測する
    3. 疑わしい箇所を深掘りする
    重い処理?
    → No
    応答速度改善:シンプルなシステム
    slow query?
    → Yes

    View full-size slide

  14. 14
    DB
    App
    10s
    /get-orders
    遅い...
    product
    1. コンポーネントを思い描く
    2. ボトルネックを推測する
    3. 疑わしい箇所を深掘りする
    重い処理?
    → No
    slow query?
    → Yes
    このやり方が通用する内は
    問題になりづらい
    応答速度改善:シンプルなシステム

    View full-size slide

  15. 15
    応答速度改善:複雑度が増したシステム
    10s
    /get-orders
    遅い...
    product

    View full-size slide

  16. 16
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    1. コンポーネントを思い描く(正確性が課題)
    DB2
    応答速度改善:複雑度が増したシステム

    View full-size slide

  17. 17
    10s
    /get-orders
    遅い...
    1. コンポーネントを思い描く(正確性が課題)
    2. ボトルネックを推測する(推測が困難)
    App
    product
    DB
    App3
    App2
    DB2
    重い処理?
    slow query?
    重い処理?
    重い処理?
    slow query?
    応答速度改善:複雑度が増したシステム

    View full-size slide

  18. 18
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    1. コンポーネントを思い描く(正確性が課題)
    2. ボトルネックを推測する(推測が困難)
    3. 疑わしい箇所を深掘りする(候補が多く時間がかかりそう)
    DB2
    重い処理?
    →No
    slow query?→No
    重い処理?
    →No
    重い処理?→No
    slow query?→Yes
    応答速度改善:複雑度が増したシステム

    View full-size slide

  19. 19
    別のやり方が必要
    →分散トレース
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    1. コンポーネントを思い描く(正確性が課題)
    2. ボトルネックを推測する(推測が困難)
    3. 疑わしい箇所を深掘りする(候補が多く時間がかかりそう)
    DB2
    重い処理?
    →No
    slow query?→No
    重い処理?→No
    応答速度改善:複雑度が増したシステム
    slow query?→Yes
    重い処理?
    →No

    View full-size slide

  20. 20
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    DB2
    App
    DB
    App2
    App3
    DB2
    time
    応答速度改善:複雑度が増したシステム

    View full-size slide

  21. 21
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    DB2
    1. トレースを確認する
    応答速度改善:複雑度が増したシステム
    App
    DB
    App2
    App3
    DB2
    time

    View full-size slide

  22. 22
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    DB2
    1. トレースを確認する
    2. ボトルネックを特定する(DB2)
    応答速度改善:複雑度が増したシステム
    App
    DB
    App2
    App3
    DB2
    time

    View full-size slide

  23. 23
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    DB2
    1. トレースを確認する
    2. ボトルネックを特定する(DB2)
    3. 処理を深掘りする(DB2のクエリ)
    応答速度改善:複雑度が増したシステム
    App
    DB
    App2
    App3
    DB2
    time

    View full-size slide

  24. 24
    App
    10s
    /get-orders
    遅い...
    product
    DB
    App3
    App2
    DB2
    Traceを活用することで
    パフォーマンスチューニングの敷居を下げる
    応答速度改善:複雑度が増したシステム
    App
    DB
    App2
    App3
    DB2
    time
    1. トレースを確認する
    2. ボトルネックを特定する(DB2)
    3. 処理を深掘りする(DB2のクエリ)

    View full-size slide

  25. 25
    オブザーバビリティを高めたい!
    でもどうやって?

    View full-size slide

  26. 26
    トレース基盤A
    ログ基盤C
    メトリクス基盤B
    メトリクス基盤B
    の計装
    ログ基盤C
    の計装
    トレース基盤A
    の計装
    主要テレメトリーの計装
    App

    View full-size slide

  27. 27
    トレース基盤A
    (廃止)
    トレース基盤D
    (新規)
    ログ基盤C
    メトリクス基盤B
    メトリクス基盤B
    の計装
    ログ基盤C
    の計装
    トレース基盤A
    の計装(廃止)
    App
    トレース基盤D
    の計装(新規)
    バックエンドが変わると計装を丸々作り替えなければならない
    主要テレメトリーの計装
    互換性が無い

    View full-size slide

  28. 28
    OpenTelemetryとは何か
    ・テレメトリーデータを計装するための標準仕様と実装を提供
    するオープンソースプロジェクト
    ・ベンダー非依存な処理方式とデータモデル
    ・各言語向けライブラリがあり、出力データの互換性がある
    参考:https://opentelemetry.io/

    View full-size slide

  29. 29
    ログ基盤C
    メトリクス基盤B
    メトリクス基盤B
    の計装
    ログ基盤C
    の計装
    トレースの計装 トレース基盤A
    App
    主要テレメトリーの計装

    View full-size slide

  30. 30
    トレース基盤A
    (廃止)
    既存の計装ロジックを維持できる
    ログ基盤C
    メトリクス基盤B
    メトリクス基盤B
    の計装
    ログ基盤C
    の計装
    トレースの計装
    送信先の設定を変更
    トレース基盤D
    (新規)
    App
    主要テレメトリーの計装

    View full-size slide

  31. 31
    OpenTelemetry PHPによる計装

    View full-size slide

  32. 32
    テレメトリーデータの送信方法
    バックエンドA
    アプリケーション
    ①直接送信

    View full-size slide

  33. 33
    テレメトリーデータの送信方法
    バックエンドA
    アプリケーション
    アプリケーション バックエンドB
    OpenTelemetry
    Collector
    ①直接送信
    ②OpenTelemetry Collectorが仲介して送信

    View full-size slide

  34. 34
    今回の構成
    OpenTelemetry
    Collector
    Google Cloud
    Metrics
    Trace
    Log

    View full-size slide

  35. 35
    OpenTelemetry
    Collector
    Google Cloud
    計装方法を説明
    説明は割愛
    Metrics
    Trace
    Log
    今回の構成

    View full-size slide

  36. 36
    Metrics
    OpenTelemetry PHPによる計装

    View full-size slide

  37. 37
    データの数値表現。
    監視やアラート、傾向分析に利用する。
    例:CPU使用率、リクエストレイテンシ
    メトリクスとは

    View full-size slide

  38. 38
    メトリクスのデータモデルの一つ。
    測定範囲を一連の間隔 (バケット) に分割し、
    各バケットに含まれる測定値の数をカウントすることで集計する。
    ヒストグラムとは

    View full-size slide

  39. 39
    メトリクスのデータモデルの一つ。
    測定範囲を一連の間隔 (バケット) に分割し、
    各バケットに含まれる測定値の数をカウントすることで集計する。
    ヒストグラムとは

    View full-size slide

  40. メトリクスのデータモデルの一つ。
    測定範囲を一連の間隔 (バケット) に分割し、
    各バケットに含まれる測定値の数をカウントすることで集計する。
    40
    ヒストグラムとは

    View full-size slide

  41. 41
    メトリクスのデータモデルの一つ。
    測定範囲を一連の間隔 (バケット) に分割し、
    各バケットに含まれる測定値の数をカウントすることで集計する。
    Request Latencyをヒストグラム形式で取得しヒートマップで可視化する
    ヒストグラムとは

    View full-size slide

  42. 42
    Metricsの計装コード

    View full-size slide

  43. 43
    Metricsを記録するまでの流れ
    1. MeterProviderの生成
    2. MeterProviderの登録
    3. Meterの生成
    4. Histogramの生成
    5. Histogramで値を記録
    1
    1. MeterProviderの生成
    2. MeterProviderの登録
    3. Meterの生成
    4. Histogramの生成
    5. Histogramで値を記録

    View full-size slide

  44. 44
    1. MeterProviderの生成
    ・Exporter
    ・ResourceInfo
    ・CriteriaViewRegistry

    View full-size slide

  45. 45
    1. MeterProviderの生成:Exporter
    データの送信設定を行う

    View full-size slide

  46. 46
    1. MeterProviderの生成:ResourceInfo
    アプリケーションに関する情報を表現する

    View full-size slide

  47. 47
    1. MeterProviderの生成:CriteriaViewRegistry
    条件に合致するメトリクスの出力方法をカスタマイズする

    View full-size slide

  48. 条件に合致するメトリクスの出力方法をカスタマイズする
    48
    1. MeterProviderの生成:CriteriaViewRegistry
    バケット定義を設定

    View full-size slide

  49. 49
    2. MeterProviderの登録

    View full-size slide

  50. 50
    3. Meterの生成

    View full-size slide

  51. 51
    4. Histogramの生成

    View full-size slide

  52. 52
    5. Histogramで値を記録

    View full-size slide

  53. ※Cloud Monitoringでの表示
    53
    メトリクスの出力結果

    View full-size slide

  54. 54
    4
    3
    2
    1
    0
    高レイテンシなリクエストが多い時間帯
    (s)
    メトリクスの出力結果

    View full-size slide

  55. 55
    4
    3
    2
    1
    0
    高レイテンシなリクエストが多い時間帯
    → ボトルネックを探るにはトレースを取る
    (s)
    メトリクスの出力結果

    View full-size slide

  56. 56
    Trace
    OpenTelemetry PHPによる計装

    View full-size slide

  57. 57
    1つのリクエストがアプリケーションを構成する様々なサービスによって処理さ
    れる過程を追跡する方法。
    障害発生箇所、パフォーマンスのボトルネックを特定するのに有効。
    トレースとは

    View full-size slide

  58. 58
    トレースの構成
    get-order(例:ミドルウェア)
    get-order-controller(例:コントローラ)
    query-order(例:SQLクエリ)
    time

    View full-size slide

  59. 59
    トレースの構成
    span
    root span get-order
    get-order-controller
    query-order
    time

    View full-size slide

  60. 60
    トレースの構成
    trace_id: 123
    span_id: abc
    trace_id: 123
    span_id: hij
    parent_id: def
    trace_id: 123
    span_id: def
    parent_id: abc
    get-order
    get-order-controller
    query-order
    time

    View full-size slide

  61. 61
    Traceの計装コード

    View full-size slide

  62. 62
    1. TracerProviderの生成
    2. TracerProviderの登録
    3. Tracerの生成
    4. Spanの開始・終了
    1
    Traceを記録するまでの流れ

    View full-size slide

  63. 63
    1. TracerProviderの生成

    View full-size slide

  64. 64
    1. TracerProviderの生成 OpenTelemetry Collectorにデータを送信

    View full-size slide

  65. 65
    1. TracerProviderの生成
    常時サンプリング

    View full-size slide

  66. 66
    1. TracerProviderの生成
    メトリクスと同じものを使用

    View full-size slide

  67. 67
    2. TracerProviderの登録

    View full-size slide

  68. 68
    3. Tracerの生成

    View full-size slide

  69. 69
    4. Spanの開始・終了

    View full-size slide

  70. 70
    ネストしたSpan

    View full-size slide

  71. 71
    トレースの出力結果

    View full-size slide

  72. 72
    4
    3
    2
    1
    0
    (再掲)メトリクスの出力結果
    この時間帯のトレースを見たい

    View full-size slide

  73. 73
    4
    3
    2
    1
    0
    この時間帯のトレースを見たい
    → 該当するトレースを探すのはひと手間かかる
    (再掲)メトリクスの出力結果

    View full-size slide

  74. 74
    4
    3
    2
    1
    0
    この時間帯のトレースを見たい
    → ExemplarでMetricsとトレースを紐付ける
    (再掲)メトリクスの出力結果

    View full-size slide

  75. 75
    メトリクスにコンテキストを提供するもの。
    コンテキスト中にtraceIdやspanIdを含めることで、メトリクスからトレースへ
    の遷移が可能になる。
    Exemplarとは

    View full-size slide

  76. 76
    Exemplarを有効化する

    View full-size slide

  77. 77
    Exemplarを有効化する
    出力

    View full-size slide

  78. 78
    メトリクスの出力結果 with Exemplar

    View full-size slide

  79. 79
    メトリクスの出力結果 with Exemplar

    View full-size slide

  80. 80
    内訳を把握したい
    メトリクスの出力結果 with Exemplar

    View full-size slide

  81. 81
    内訳を把握したい
    → トレースとログを紐付ける
    メトリクスの出力結果 with Exemplar

    View full-size slide

  82. 82
    Log
    OpenTelemetry PHPによる計装
    参考:https://github.com/open-telemetry/opentelemetry-php/blob/main/examples/logs/getting_started.php

    View full-size slide

  83. 83
    1. LoggerProviderの生成
    2. LoggerProviderの登録
    3. Loggerの生成
    4. EventLoggerの生成
    5. EventLoggerでログ出力
    1
    Logを記録するまでの流れ

    View full-size slide

  84. 84
    1. LoggerProviderの生成

    View full-size slide

  85. 85
    1. LoggerProviderの生成
    OpenTelemetry Collectorにデータを送信

    View full-size slide

  86. 86
    1. LoggerProviderの生成
    メトリクス、トレースと同じものを使用

    View full-size slide

  87. 87
    2. LoggerProviderの登録

    View full-size slide

  88. 88
    3. Loggerの生成

    View full-size slide

  89. 89
    3. EventLoggerの生成

    View full-size slide

  90. 90
    4. EventLoggerでログ出力
    spanをactivateするとtraceIdやspanIdをログに含められる

    View full-size slide

  91. 91
    4. EventLoggerでログ出力

    View full-size slide

  92. 92
    4. EventLoggerでログ出力

    View full-size slide

  93. 93
    Logの出力結果

    View full-size slide

  94. 94
    Logの出力結果

    View full-size slide

  95. 95
    Metrics,Trace,Logの紐付け

    View full-size slide

  96. 96
    Metrics,Trace,Logの紐付け
    時間がかかっている原因を知りたい

    View full-size slide

  97. 97
    Metrics,Trace,Logの紐付け

    View full-size slide

  98. 98
    Metrics,Trace,Logの紐付け

    View full-size slide

  99. 99
    Metrics,Trace,Logの紐付け

    View full-size slide

  100. 100
    Metrics,Trace,Logの紐付け
    ボトルネックを調べるフローを構築できた!

    View full-size slide

  101. 101
    まとめ

    View full-size slide

  102. 102
    ・オブザーバビリティとは、外部出力の知識からシステムの内部状態をどれだけ
    うまく推測できるかの尺度
    まとめ

    View full-size slide

  103. 103
    ・オブザーバビリティとは、外部出力の知識からシステムの内部状態をどれだけ
    うまく推測できるかの尺度
    ・システムが複雑化するにつれてオブザーバビリティの必要性が高まる
    まとめ

    View full-size slide

  104. 104
    ・オブザーバビリティとは、外部出力の知識からシステムの内部状態をどれだけ
    うまく推測できるかの尺度
    ・システムが複雑化するにつれてオブザーバビリティの必要性が高まる
    ・OpenTelemetryにより、ベンダーロックインを避けつつテレメトリーデータ
    を計装できる
    まとめ

    View full-size slide

  105. 105
    ・オブザーバビリティとは、外部出力の知識からシステムの内部状態をどれだけ
    うまく推測できるかの尺度
    ・システムが複雑化するにつれてオブザーバビリティの必要性が高まる
    ・OpenTelemetryにより、ベンダーロックインを避けつつテレメトリーデータ
    を計装できる
    ・OpenTelemetry PHPでMetrics,Trace,Logを取得でき、また関連付けることで
    オブザーバビリティを高められる
    まとめ

    View full-size slide

  106. 106
    ご清聴ありがとうございました!

    View full-size slide