Slide 1

Slide 1 text

1 | © Commune Inc. All rights reserved OpenTelemetry を使ってフロントエ ンドのログとCore Web Vitalsを収集 した話

Slide 2

Slide 2 text

2 | © Commune Inc. All rights reserved Agenda ● ⾃⼰紹介 ● やったこと ● やっているときに気がついた落とし⽳ ● 今後

Slide 3

Slide 3 text

3 | © Commune Inc. All rights reserved ⾃⼰紹介 磯村洋 ● 所属 ○ コミューン株式会社 開発部 SREチーム ● 概略 ○ 2021年3⽉にコミューン株式会社に⼊社。 ○ 2022年6⽉よりSREチームに所属 ● 趣味 ○ 筋トレ ○ 散歩

Slide 4

Slide 4 text

4 | © Commune Inc. All rights reserved 背景 ● 今までRUM(Real User Monitoring)ツールを⼊れていなかった ○ クライアントからエラーが起きたと報告があってもフロントエンドで何が起きたか不明 ○ フロントエンドのパフォーマンスが劣化しても認識できない状態 ● アプリケーションのバックエンドの情報収集には既にOpenTelemetryを利⽤中 ● まだフロントエンド側実装はstableにはなってはいないがフロントエンド側もOpenTelemetryを利 ⽤すれば良いのではないかと思って今回導⼊

Slide 5

Slide 5 text

5 | © Commune Inc. All rights reserved やったこと ● opentelemetry のパッケージを使って Open Telemetry Collector にログを送信するロガーを⽤意 ● console.error を上書きしてフロントで記録されているエラーを Collector に送信 ● web-vitals を使って取得したデータをCollectorに送信 ブラウザ Collector Cloud Logging HTTPS

Slide 6

Slide 6 text

6 | © Commune Inc. All rights reserved loggerの準備 ● この程度のコードで動作可能 ● emit()を実⾏するとログが処理される ● ⼀定数のログがたまるか⼀定時間経過するとログが送信される Cloud Logging

Slide 7

Slide 7 text

7 | © Commune Inc. All rights reserved エラーログの収集 ● console.error を上書き ● キャッチされなかった場合にエラーをキャッチするイベントハンドラにコールバックを登録 Cloud Logging

Slide 8

Slide 8 text

8 | © Commune Inc. All rights reserved Web-vitals の取得 ● web-vitals パッケージで取得できた値をそのまま送信 Cloud Logging

Slide 9

Slide 9 text

9 | © Commune Inc. All rights reserved グラフの作成 バージョン毎のエラー数 ● Log Analyticsでグラフを作成 バージョン毎のLCPのレートがpoor だった件数

Slide 10

Slide 10 text

10 | © Commune Inc. All rights reserved SDKは開発中、ドキュメントも無い ● JavascriptのLogsはまだ開発中でドキュメントも無い ● ブラウザの実装に関しても開発中、仕様すら固まってない仕様もある 落とし⽳1

Slide 11

Slide 11 text

11 | © Commune Inc. All rights reserved headersを使うとnavigator.sendBeacon()が利⽤されない ● navigator.sendBeacon() ○ 分析や診断⽤のデータをサーバーに送信するためのAPI ○ XMLHttpRequest などと違いページ遷移が実⾏されてもリクエストを中断しない ● OTLPLogExporter ではデフォルトで navigator.sendBeacon()が利⽤される ○ ただし、クラスの初期化時にデフォルトのリクエストヘッダを指定すると navigator.sendBeacon() の代わりにXMLHttpRequestが利⽤される 落とし⽳2

Slide 12

Slide 12 text

12 | © Commune Inc. All rights reserved 構造化データはLogRecordのbodyに⼊れる 落とし⽳3 ● bodyがstring型になっていて、attributesが構造化データを⼊れられる型になっているので attributesに構造化データを⼊れたくなるが・・・

Slide 13

Slide 13 text

13 | © Commune Inc. All rights reserved 構造化データはbodyに⼊れる 落とし⽳3 ● Cloud Loggingの場合attributesに対応するlabelsが構造化データに対応していないため⽂字列にさ れてしまう

Slide 14

Slide 14 text

14 | © Commune Inc. All rights reserved 構造化データはbodyに⼊れる 落とし⽳3 ● 正解はbodyに直接構造化データを⼊れること ● string型のbodyにオブジェクトを⼊れるので、もちろん型エラーを無視する必要がある

Slide 15

Slide 15 text

15 | © Commune Inc. All rights reserved 構造化データはbodyに⼊れる 落とし⽳3 ● @opentelemetry/api-logs 0.49.1 -> 0.50.0 で直っていました・・・ ● 鋭意開発中ということがよく分かりました 😭 0.49.1 0.50.0

Slide 16

Slide 16 text

16 | © Commune Inc. All rights reserved 今後 ● ページ遷移、要素のクリックなどをとれるようにしたい ● Traces をとれるようにしたい ○ イベントの発⽕の起因が分からないのでとれるようにしたい ○ Logsを紐付けたい ● パフォーマンス指標はMetricsで取る or Metricsに変換したい

Slide 17

Slide 17 text

17 | © Commune Inc. All rights reserved コミューンはあなたのキャリアを実現するビークルです! 17 Xアカウント
 @CommuneDev
 フォローお願いします!
 エンジニア向け会社情報
 https://commmune.notion.site/ver-0 b895a0187ef4954a2d5182afd82082 d