エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

Datadog導入によるSLOの設定

エムスリーエンジニアリンググループの秦野です。主にアンケートシステムを開発しているBIRというチームに所属しています。

今回、我々のチームにDatadogを導入したのでその経緯と過程についてご紹介したいと思います。

www.datadoghq.com

背景

 Datadogを導入しようとした背景として、BIRでは次のような問題意識を持っていました。 エラーの発生はSentryによって通知され、即時に対応できる体制が整っていましたが、エラーの発生頻度が妥当なのか、システムとして安定しているのか数値化できている訳ではありませんでした。そのため、システムの健全性に強い自信を持つことができていませんでした。 また、リクエストのレイテンシーも測定できていなかったため、アプリケーションのパフォーマンスに問題があるのかないのか分からない状況でした。

 また、AWSとGCP上でアプリケーションを運用しているため何か問題が起こった時にそれぞれのコンソールにログインしてアプリケーションの状態を確認する必要がありました。そのため、統一的な方法でアプリケーションの状態をチェックできず煩わしさを感じていました。

実現したかったこと

 そこで、エンドポイント毎のリクエストの成功率、レイテンシーをモニタリングしつつ、システムの健全性をSLOとして数値化し、監視、改善のサイクルを回せるような仕組みを構築することを目標としました。

実現に向けた取り組み

(1)測定項目のリストアップ

まず、どのようなSLOを設定するかを考えました。 SLOはユーザー体験を基準に設定することとし、可用性(正常なリクエストの割合)とレイテンシ(レスポンスの速さ)を測定することとしました。 SLOの設定に関してはこちらの記事が参考になりました。
cloud.google.com

(2)ツール選定

 モニタリングツールにはGCP オペレーションスイート、NewRelic、Datadogの3つを候補とし、それぞれの機能、UIなどを比較して最終的に利用するツールを選定しました。

GCP オペレーションツイートはApp Engine、Cloud Runが自動生成するCloudMonitoringのメトリクス、CloudTraceのスパンを無料で利用できるので価格面にメリットがあります。しかし、フロントエンド監視の機能はありません。 ユーザーがリクエストを投げてレスポンスを受け、それがブラウザで描画されるまでの合計時間を測定したかったのでこの点から選定対象から外しました。

NewRelic、Datadogはどちらもフロントエンド監視機能もAPM(アプリケーションパフォーマンス監視)の機能もあり、調べた限りではほぼ同等の機能を持っていそうでした。 DatadogはAPMの料金が1 ECSのタスクあたり月2$と安く、またUIも使いやすそうだったためモニタリングツールとしてDatadogを利用することとしました(NewRelicは以前利用したことがあり、新しい製品のDatadogを利用してみたいというのもありました。)

(3)テスト導入

 Datadogは14日間全ての機能が無料で使えるトライアル期間があるのでその期間を利用してテスト導入してみました。  テスト導入ではAWS Fargate上で稼働させているJavaアプリケーションとGCP Cloud Runで稼働しているGoアプリケーションにAPM・とRUMを導入してみました。

AWS Fargate上のJavaアプリケーションへのAPMの導入

導入方法は公式ドキュメントに詳細が記載されていますが Javaアプリを起動するときにjavaagentとしてdd-java-agentを一緒に起動することと

java -javaagent:/path/to/dd-java-agent.jar -Ddd.profiling.enabled=true -XX:FlightRecorderOptions=stackdepth=256 -Ddd.logs.injection=true -Ddd.service=my-app -Ddd.env=staging -jar path/to/your/app.jar -Ddd.version=1.0

Fargateでagent用のコンテナを一緒に立てるだけです。

Cloud Run上のGoアプリケーションへのAPMの導入

Goの場合はJavaアプリとは異なり、ソースコードを一部修正する必要がありますが導入は簡単です。次のようにddtraceをアプリ開始時にStartさせます。

package main

import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"

func main() {
    tracer.Start(
        tracer.WithEnv("prod"),
        tracer.WithService("test-go"),
        tracer.WithServiceVersion("abc123"),
    )
    defer tracer.Stop()

    // ...
}

HTTPサーバーにgo-chiを利用している場合、スパンを追加するためにchitrace Middlewareを追加する必要があります。

import (
    "github.com/go-chi/chi"
    chitrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-chi/chi"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)
func main() {
    // Start the tracer
    tracer.Start()
    defer tracer.Stop()

    // Create a chi Router
    router := chi.NewRouter()

    // Use the tracer middleware with the default service name "chi.router".
    router.Use(chitrace.Middleware())
    // ...
}

Goでトレースが提供されているパッケージの一覧はこちらから確認できます。

また、Fargateとは異なり、Cloud Runの場合Agentをどこかしらのサーバーにインストールして動かす必要があります。 今回はCompute EngineにAgentをインストールして動かしました。

APMを導入すると次のようなサマリやエンドポイント毎のリクエスト数、エラー率、レイテンシーを一覧で確認できるようになります。

APM Service Summary画面
また、トレースを確認することで各SQLでかかっている時間も測定できどのSQLがレイテンシに悪影響をあたえているかすぐにわかるようになります。

フロントへのRUM(リアルユーザーモニタリング)の導入も次のコードを追加するだけで簡単に設定できました。

import { Datacenter, datadogRum } from '@datadog/browser-rum';

datadogRum.init({
    applicationId: '<DATADOG_APPLICATION_ID>',
    clientToken: '<DATADOG_CLIENT_TOKEN>',
    datacenter: Datacenter.US,
    sampleRate: 100,
});

RUMを導入するとフロントエンドのサマリ情報が次の画像のように一覧画面で確認できるようになります。その他、User Analytics、Performance Monitoring、Errorsなどフロントエンドのアクセス、パフォーマンス、エラーなどをView単位で確認できるようになります。

RUM Service Summary画面

また、APMを導入することでAPMの値を元に次の画像のようなSLOを設定できるようになりました。

SLO一覧画面
*Track the status of all your SLOs in Datadogより画像を引用

テスト導入の結果、必要な機能をカバーできていること、UI、ドキュメントが充実しており導入しやすいことが分かったためチームで管理しているシステムにDatadogを導入し、アプリケーションパフォーマンス監視、SLO監視の体制を整えることができました。

SLOに関してはチームで目標となる値について合意を取り、そのSLOを下回らないようにバーンアラートを設定して監視しています。 改善の余地があるSLOについては期毎に現在のSLOより高い目標値を掲げ改善に取り組むことができるようになりました。 改善した分エンドポイントのレイテンシーやSLOの値が目に見えて改善されるのでエンジニアのモチベーション向上にも役立っていると感じています。

まとめ

・Datadogは導入が簡単
・APMはエンドポイント毎にリクエスト数、エラー率、レイテンシーなどを算出してくれるので改善すべき点がすぐに分かる
・SLOを設定することでシステムの健全性を測ることと改善のサイクルを回すことができるようになる
・監視しにくいアプリケーションのパフォーマンスに関しても監視することができ問題にすぐに対応できる

We are hiring!!

弊社ではデータ可視化ツールなどを整備してチームの生産性を向上させるエンジニアを募集しています! 以下のURLからカジュアル面談をお待ちしています!

jobs.m3.com