Slide 1

Slide 1 text

© PLAID, Inc. | Confidential 2024.07.17  |  Datadog セミナー プレイドにおける Datadog APM の活⽤⽅法 APM‧Profiler を利⽤した⼤規模 SaaS のパフォーマンス改善事例 © PLAID, Inc. | Confidential

Slide 2

Slide 2 text

© PLAID, Inc. | Confidential ⾃⼰紹介 ⼤⽮ 康介 株式会社プレイド エンジニア 2020年新卒⼊社 GKEの運⽤、KARTE Talkの開発、KARTEの管理画⾯のパフォーマンス改善など DX & Performance © PLAID, Inc. | Confidential 2

Slide 3

Slide 3 text

© PLAID, Inc. | Confidential KARTEについて © PLAID, Inc. | Confidential 3 CX(顧客体験)プラットフォーム

Slide 4

Slide 4 text

© PLAID, Inc. | Confidential KARTEについて © PLAID, Inc. | Confidential 4 CX(顧客体験)プラットフォーム ⼀⼈ひとりに合わせた 顧客体験を提供 WebやAppの訪問者の⾏動を 顧客ごとにリアルタイムに解析

Slide 5

Slide 5 text

© PLAID, Inc. | Confidential プレイドの全体戦略 “マルチチャネル × 1st Party Customer Data × リアルタイ ム” をワンストップで 提供するプラット フォーム © PLAID, Inc. | Confidential 5 1st Party Customer Data 戦略策定/ 事業‧組織開発 広告 市場調査/ 顧客調査 カスタマーサポート マーケティングオートメーション オフライン/OMO オンサイト マーケティング EmotionTech CX/EX KARTE Signals Databeat KARTE RightSupport STUDIO ZERO KARTE Message KARTE TALK KARTE Web/App KARTE Blocks

Slide 6

Slide 6 text

© PLAID, Inc. | Confidential KARTE 全体のアーキテクチャ図

Slide 7

Slide 7 text

© PLAID, Inc. | Confidential マルチプロダクトを開発するチーム体制とアーキテクチャ - 元々モノリスだったアプリ ケーションをマイクロサービ スに分割 - それぞれのサービスを担当の チームが開発‧運⽤‧保守

Slide 8

Slide 8 text

© PLAID, Inc. | Confidential KARTE 管理画⾯の特徴と課題 - 依存関係が⾮常に複雑 - プロダクトの性質上扱うデータ 量が⼤きい パフォーマンスが劣化しやすく 原因の特定が困難

Slide 9

Slide 9 text

© PLAID, Inc. | Confidential APM を導⼊するまで どうやってシステムの状態を把握していたか

Slide 10

Slide 10 text

© PLAID, Inc. | Confidential APM 導⼊前 監視⽅法 - ログ - メトリクス(インフラ、アプリケーション) - CPU, Memory などの使⽤率 - LB のエラー率、レイテンシ - アプリケーションにカスタムメトリクスを仕込む 課題 - リクエストがどのような経路になっているかわからない - システムの内部状態を把握するためにはコードを変更してリリースする必要がある const dd = require('libs-dogstatsd'); const stats = dd.start(); // measure hoge hoge(); stats.tick('hoge', 1, 1, ['user_id:1234']); カスタムメトリクスの実装例

Slide 11

Slide 11 text

© PLAID, Inc. | Confidential Datadog APM を導⼊

Slide 12

Slide 12 text

© PLAID, Inc. | Confidential Datadog APM Datadog APM - リクエストの経路を特定できる - パフォーマンスのボトルネックを特定できる

Slide 13

Slide 13 text

© PLAID, Inc. | Confidential Datadog APM の導⼊ 導⼊⽅法 JavaScript の場合はこれだけ プラグインも豊富(JavaScript の場合は特別な設定なく全て有効になる) - mongo - redis - express - google-cloud などなど import 'dd-trace/init';

Slide 14

Slide 14 text

© PLAID, Inc. | Confidential APM の活⽤⽅法

Slide 15

Slide 15 text

© PLAID, Inc. | Confidential Datadog APM の活⽤⽅法 - 異常検知 - Monitor - パフォーマンスチェック - Service Catalog - Dashboard - 障害の分析 - Dashboard - Trace Explorer - Continuous Profiler

Slide 16

Slide 16 text

© PLAID, Inc. | Confidential 異常検知 Monitor - トレースメトリクスや、span から⽣成したメトリクスを使⽤ - Multi Alert を使ってサービス横断でエラー率を監視 - 開発中のシステムなどは Mute している

Slide 17

Slide 17 text

© PLAID, Inc. | Confidential パフォーマンスチェック Service Catalog - ⼤規模なリファクタ時やライブラリのバー ジョンアップなどをするときに眺めておく - 何かあれば⼤体気づける - エラー率の増加 - レイテンシの悪化 - 何も準備しなくても誰でもできる

Slide 18

Slide 18 text

© PLAID, Inc. | Confidential Datadog APM のベストプラクティス Scorecards - ログやデプロイの関連付け - Ownership 情報の付与 - これはあまりやってない - SLO や Monitor の作成 100%を⽬指す必要はないが、参考になる

Slide 19

Slide 19 text

© PLAID, Inc. | Confidential 今までの監視⽅法と何が変わったか APM を導⼊した効果

Slide 20

Slide 20 text

© PLAID, Inc. | Confidential APM を導⼊した効果 - 未知の問題が起きたときに、何が起きたか後から解像度⾼く把握できる - ログやメトリクスを仕込んで再度リリースする必要がない - 各サービスがどのように監視されているかが、実装者に依存しない - デバッグできる⼈が増える - アラートを統⼀的に管理できる

Slide 21

Slide 21 text

© PLAID, Inc. | Confidential Continuous Profiler

Slide 22

Slide 22 text

© PLAID, Inc. | Confidential Continuous Profiler - CPU、Memory などのプロファイルを取得して、パフォーマンスのボトルネックを特定するための機能 - Flame Graph による可視化ができる

Slide 23

Slide 23 text

© PLAID, Inc. | Confidential ボトルネック特定の事例 mongoose (mongodb のクライアントライブラリ)のバージョンアップによるパフォーマンス劣化

Slide 24

Slide 24 text

© PLAID, Inc. | Confidential mongoose アップデートによるパフォーマンス劣化 - mongo 4 系の EOL に伴って、クライアントライブラリ(mongoose)をアップデート - リリース後にパフォーマンスが劇的に悪化

Slide 25

Slide 25 text

© PLAID, Inc. | Confidential mongoose アップデートによるパフォーマンス劣化 CPU 使⽤率が上がっていたのが原因 では、リクエストが増えてないのに CPU 使⽤率が上がった原因は? Continuous Profiler を使って特定する

Slide 26

Slide 26 text

© PLAID, Inc. | Confidential Continuous Profiler の活⽤⽅法 Continuous Profiler を使ったボトルネック特定の⼿順 1. Continuous Profiler を有効にする 2. トレースメトリクス(trace. から始まるや つ)を可視化する 3. レイテンシが跳ねた時間帯の trace を View related traces でみに⾏く 4. 外部呼び出しで詰まっているか、CPU で詰まっている かを確認する 5. Compare Profiling を使って CPU を使っている関数 を特定する 環境変数を設定するだけ export DD_PROFILING_ENABLED=true export DD_PROFILING_TIMELINE_ENABLED=1

Slide 27

Slide 27 text

© PLAID, Inc. | Confidential Continuous Profiler の活⽤⽅法 Continuous Profiler を使ったボトルネック特定の⼿順 1. Continuous Profiler を有効にする 2. トレースメトリクス(trace. から始まるや つ)を可視化する 3. レイテンシが跳ねた時間帯の trace を View related traces でみに⾏く 4. 外部呼び出しで詰まっているか、CPU で詰まっている かを確認する 5. Compare Profiling を使って CPU を使っている関数 を特定する

Slide 28

Slide 28 text

© PLAID, Inc. | Confidential Continuous Profiler の活⽤⽅法 Continuous Profiler を使ったボトルネック特定の⼿順 1. Continuous Profiler を有効にする 2. トレースメトリクス(trace. から始まるや つ)を可視化する 3. レイテンシが跳ねた時間帯の trace を View related traces でみに⾏く 4. 外部呼び出しで詰まっているか、CPU で詰まっている かを確認する 5. Compare Profiling を使って CPU を使っている関数 を特定する

Slide 29

Slide 29 text

© PLAID, Inc. | Confidential Continuous Profiler の活⽤⽅法 Continuous Profiler を使ったボトルネック特定の⼿順 1. Continuous Profiler を有効にする 2. トレースメトリクス(trace. から始まるや つ)を可視化する 3. レイテンシが跳ねた時間帯の trace を View related traces でみに⾏く 4. 外部呼び出しで詰まっているか、CPU で詰まっている かを確認する 5. Compare Profiling や Endpoint Profiling を使って CPU を使っている関数を特定する

Slide 30

Slide 30 text

© PLAID, Inc. | Confidential 使ってみた結果 - イベントループのブロッキングが問題の場合、遅い API があったとしても原因なのか結果なのかを特定するのが難しい - Endpoint Profiling により API ごとに Frame Graph を可視化することで調査がしやすかった - いくつかの潜在的なパフォーマンスの問題を特定し、パフォーマンスを向上させつつライブラリを vup することができ た🎉

Slide 31

Slide 31 text

© PLAID, Inc. | Confidential オーバーヘッドは?コストは?

Slide 32

Slide 32 text

© PLAID, Inc. | Confidential Continuous Profiler のパフォーマンスオーバーヘッド - いくつかのサービスで試したが、Profiler を有効にするだけでパフォーマンスが少し悪くなるケースもあった - Profiler を有効にした Pod と有効にしてない Pod を⽤意して⽐較した - ⾔語ごとに注意事項があるので、公式ドキュメントをしっかり読むべき - Node.js の場合は Node.js 16 よりも前のバージョンを使う場合にオーバーヘッドが⼤きい

Slide 33

Slide 33 text

© PLAID, Inc. | Confidential Continuous Profiler のコスト - APM と同じく Host 単位 - 全てのサービスに Profiling を⼊れる必要はない - 複数 Pod がある場合は1台だけ⼊れて利⽤した

Slide 34

Slide 34 text

© PLAID, Inc. | Confidential まとめ

Slide 35

Slide 35 text

© PLAID, Inc. | Confidential まとめと今後 - APM 導⼊による効果 - 複雑なシステムにおいて未知の問題が起きたとしても、新たにコードを修正してリリースするこ となくシステムの状態を把握できる - 各マイクロサービスが同じやり⽅で監視‧探索できる - Continuous Profiler の活⽤ - Compare Profiling や Endpoint Profiling などの機能で効率的にボトルネックの特定ができる - パフォーマンス‧コストなどの懸念がある場合はまずは Pod 1台から⼊れてみると良い - 今後やっていきたいこと - Dynamic Instrumentation を導⼊したい - コードを変更したり再デプロイすることなく、ログ‧メトリクス‧スパンを追加できる - Node.js, Typescript は未対応(Java, Python, .NET に対応)