STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

DatadogのCustom Instrumentationを活用した話

STORES 予約 でバックエンドエンジニアをしているaao4seyです。 先日、 STORES 予約 でスマートリスト1という機能をリリースしました。この機能の中で、一部パフォーマンス懸念があり、DatadogのCustom Instrumentationを活用し該当処理の実行時間を計測しました。

課題

冒頭に記述した通り、機能開発で追加したコードに一部パフォーマンス懸念がありました。 STORES 予約 ではDatadog APMのRails Integration2を設定しているためリクエストごとの粒度である程度の情報は取れていました。しかし、主に発行されるSQLの粒度でスパンが作成されており今回追加した処理に対する処理時間がどのくらいなのか?を把握し辛い状態でした。 (追加した処理で発行されるSQLを探して...といったことを行っておりました。)

そこでDatadog APMのCustom Instrumentationを活用し独自のスパンを作成すれば、コンソール上のトレース情報の見通しが良くなるかもしれないと考え試してみることにしました。

Custom Instrumentationとは

Datadog APMでは自動である程度アプリケーションのトレーシングを行ってくれます。3この自動で収集された情報に対して追加でトレース情報を追加できます。 Custom Instrumentationを用いることでDatadogへ送信するトレースを追加、変更、削除でき、Datadogコンソール上での可視性をカスタマイズできます。

Datadog ライブラリを使ったカスタムインスツルメンテーション

独自のトレースを追加してみる

STORES 予約 はRuby on Railsを採用しているので、以下のドキュメントを参考にしつつ計測に必要なカスタムスパンを追加していきます。

Ruby Custom Instrumentation using Datadog API

以下のコードのように計測したい処理をブロックで囲み、名前をつけておくことで簡単にカスタムスパンを追加することが出来ます。

      Datadog::Tracing.trace('smart_list.hogehoge') do |span|
        # 任意のタグを設定することができ、Datadogのコンソール上で設定した情報を確認できるようになります。
        # 今回はsmartlist の id があると調査時に活用できそうだったので追加しました。

        span.set_tag('smart_list.id', smart_list.id)

        # 計測対象の処理
      end

追加後のコンソール

以下のようにspanの一覧で、Datadog::Tracing.traceに指定した値を検索キーとして利用し表示することが出来ます。

コンソール

スパンの詳細を開いて見ると、以下のように span.set_tag で指定した情報を確認することが出来ました。

スパン詳細

これにより、以下の恩恵を得られるようになりました。

  • 当初の課題だったAPMの可視性の向上
    • 新規で追加したパフォーマンス懸念のあるコードの処理時間を把握しやすくなりました。
  • 調査に必要な情報の拡充
    • span.set_tagで任意の情報を付加することで、問題となっているトレースの情報から調査に必要な情報を引くことができるようになりました。

実際にスマートリスト機能のリリースの際にもこの情報を確認しつつリリース作業を行っており、想定外のパフォーマンス劣化がないことを確認でき、安心して作業を進めることができました。

まとめ

今回は STORES 予約 でのDatadog APMの活用についてご紹介しました。プロジェクトにDatadog Integrationの設定がされてたこともあり、簡単にCustom Instrumentationを活用して、該当処理の計測を行うことが出来ました。任意の情報をカスタムスパンに含めることができ、パフォーマンス劣化時の調査にも活用できるので、今後も積極的に利用していければと思っています。