Slide 1

Slide 1 text

Datadog APMで測定するアプリケー ションパフォーマンス 株式会社メタップスペイメント 茂田 裕行

Slide 2

Slide 2 text

自己紹介 名前 茂田 裕行 経歴 ● 2018年に株式会社メタップスペイメント入社 ● それ以前はSIerやスタートアップでサービスやアプリの開発、保守 普段使っている言語 Go, Python

Slide 3

Slide 3 text

『給与即時払いサービスCRIA』のサービス構成 ● バックエンドAPI ○ Go ○ AWS(ECS Fargate, Aurora, SQS, S3, SNS, Lambda) ● アプリ ○ React Native ● ブラウザ版、管理画面 ○ React ● マイクロサービス ○ 送金 ○ データの一括登録

Slide 4

Slide 4 text

運用で困っていること ● インフラで発生するインシデント(メールが送られない、画面表示が遅いなど)が発生しても、即座の原因 特定が困難 ● イベント(データ登録や更新)ごとの頻度や利用時間帯がつかめない ● 時系列的に記録されたログでは、他に来るリクエストの情報が混じったりして、特定の関心のあるリクエス トを追うのが難しい ● 処理が複数のサービスに分散されていると、関心のあるの処理を追いづらい

Slide 5

Slide 5 text

Datadog APMとは Datadog社が提供する、アプリケーションのパフォーマンスをリアルタイムで監視し、分析するためのツール (SaaS) ● ユーザーのリクエストがシステムを通過するパスを追跡し、各モジュールでの処理時間を把握できる ● アプリケーションのパフォーマンスを監視し、異常が発生した場合に検知 ● 詳細なレポーティング ● 分散システムのサポート

Slide 6

Slide 6 text

実際に組み込んでみた // アプリケーション開始時 tracer.Start(tracer.WithServiceName(serviceName)) defer tracer.Stop() // データベース接続時 sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName(serviceName)) db, err := sqltrace.Open("mysql", "datadog_sample:password@tcp(db:3306)/db_test", sqltrace.WithServiceName(serviceName)) if err != nil { logger.Error("failed to connect mysql", slog.Any("error", err)) return } defer db.Close() それ以外にも、datadog-agentの設定でAPM有効化を行う必要がある ソースコードでライブラリを組み込む必要がある( Goの場合)

Slide 7

Slide 7 text

適用後に見られる画面 リクエスト数、エラー数、レイテンシ、処理内訳が確認できた サマリ

Slide 8

Slide 8 text

適用後に見られる画面 トレース 適切に設定すれば、アプリケーションでかかった時間だけでなく、外部システム( DBやマイクロサービス) の呼び出し時間や処理内容もわかる。 メソッドごとの処理時間も、スパン(処理単位)を設定すればわかる。

Slide 9

Slide 9 text

適用後に見られる画面 ログ 適切に設定(span_idとtrace_idをログに出力しdatadogへ送信)すれば、リクエストごとに、紐づいたログ を参照できる

Slide 10

Slide 10 text

今後の課題 ● 本番環境への全体的な適用(ソースコード修正が必要) ○ Goだとcontext.Contextというパラメータに、 APM設定用の情報を設定し、リクエストを受け付ける処理から DB やAWS操作処理まで引き回す必要がある ○ 各サービスで修正する必要がある ● 各イベントの時間帯ごとの発生頻度を出す方法は調査中