ちょっと話題の記事

Datadog APMが正式リリースされました #datadog

2017.02.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

APMとは

APMはweb-Application Performance Monitoringの略称です。メモリやディスク使用量に着目するインフラ監視と異なり、リクエストを処理するために必要な、外部サービスや他の処理の呼び出しに着目する監視がAPMです。
どのようなWebアプリケーションでも、基準に差はありますが一定のスループットを求められます。「リクエストのn%がm秒以内にレスポンスを返し始めること」といったように、SLAの契約内容としてパフォーマンス要件が記載されている場合もあるでしょう。
遅いAPIは、エンドユーザから見れば動いていないのと一緒なのです。
また、昨今ではマイクロサービスのような設計が採り上げられています。ひとつのリクエストを処理するために沢山のサービスが連携して動作する場合、遅延や障害の原因をログのみから探るのは手間がかかります。

こういった理由から、APMを行いアプリケーションレベルのメトリクスに気を配ることが有効であると言えます。

Datadog APMとは

APMのサービスはオンプレ・SaaS問わず多数存在しますが、インフラ監視で人気のDatadogから、新たにAPMサービスがリリースされました。
Next-generation APM - datadoghq.com
公式ページからアピールポイントを要約すると、以下のようになります。

  • 複数スタックで構成されているシステムでも、アプリからインフラまで一貫して、SQLクエリ単位までドリルダウンできる
  • 分散システムでもリクエストをend-to-endでトレースできる
  • 多くの言語・フレームワークとの統合により、自動でリクエストトレーシングを開始できる
  • 既に使っているDatadogのダッシュボードやツールと統合して運用できる
  • アプリに入れるトレーシングエージェントはOSS

Datadog APMの用語説明

ログインすると見れる説明ページを意訳し、実際に使ったりしたあとで私なりの表現にしました。

エージェント

Datadog Agent

ホストサーバにインストールする、既存のエージェントです。
Datadogの機能を使うために必要なもので、このエージェントを起動することでDatadogのインフラ監視が可能となります。

Tracing Agent

Datadog APMを使うために必要なエージェントで、アプリケーションへライブラリとして組み込みます。
Tracing AgentがDatadog AgentにAPM用メトリクスを送信し、Datadog Agentがインフラ情報と共にDatadogへ送信します。
現在はRuby, Python, Golangが提供されています。

エンティティ

Trace

1回の処理に必要なアプリケーション処理の時間を追跡する単位です。End-to-EndでHTTPリクエストを受けてレスポンスを返すまでで1回のTraceとなります。1回のリクエスト(=1つのTrace)で複数のサービスやリソースを呼んでいる場合でも、各呼び出しは全て単一のTraceに内包されます。

Span

リクエストを処理する複数のロジック単位です。各Traceは1つ以上のSpanを持ちます。SpanはServiceおよびオプションでリソースに関連付けられます。各Spanは開始時間と経過時間、それとオプションとしてタグで構成されます。Spanはネストし、親子関係を持ちます。

Service

同じジョブを実行する処理セットの名前です。たとえば、単純なWebアプリケーションは、1つのWebアプリケーションサービスと1つのデータベースという2つのサービスで構成されます。

Resource

サービスへのクエリです。URLや、UsersController#indexのような関数がResourceになります。TracingバックエンドはServiceごとに沢山ののクエリを追跡できるので、可視性を維持するため、/user/home?id=100/user/home?id=200という独立したリソースは、/user/homeとしてグルーピングします。

使ってみた

今回はRailsアプリに導入してみます。 ドキュメントは、Datadogにログインして以下のURLにアクセスすれば閲覧できます。

Tracing Docs

1: datadog agentの確認

まず、APM対象のRailsアプリが動作するホストに、最新版(バージョン5.11.0以上)のエージェントがインストールされていることを確認します。
まだDatadogアカウントを作成していなかったり、最新でない場合は、公式ドキュメントや以下の記事を参考にして対応してください。

2: datadog agentのAPM有効化設定

ログイン後に見れるTracing Docsの設定ページを参考にして、datadog agentでAPMを有効化する設定を行います。
設定後はdatadog agentを再起動してください。

[Main]
# Enable the trace agent.
apm_enabled: true

例えばAnsibleを使っている場合は、断片的なコードになりますが以下のように修正します。

 ---
 - hosts: all
   vars:
     rails_env: "{{ lookup('env', 'RAILS_ENV') }}"
     application_name: "{{ application_name }}"
     datadog_config:
       collect_ec2_tags: yes
       collect_security_groups: yes
       apm_enabled: true       <=== 追加
   roles:
     - { role: Datadog.datadog, become: yes, datadog_api_key: "{{ lookup('env', 'DATADOG_KEY') }}" }

3: アプリにトレーシングライブラリと設定を追加する

RailsアプリのGemfileを編集し、APMに必要なddtrace gemへの依存を追加します。

source 'https://rubygems.org'

gem 'ddtrace'

RailsやSinatraのようなddtrace gemがサポートするフレームワークを使っている場合は、フレームワークの設定を追加するだけで簡単にAPMそ有効化できます。
gemドキュメントに設定一覧が書いてあります。

# config/initializers/datadog-tracer.rb

Rails.configuration.datadog_trace = {
  auto_instrument: true,
  auto_instrument_redis: true,
  default_service: 'my-rails-app'
}

編集後のGemファイルを含むRailsアプリをホストにデプロイした後、gem installコマンドや構成管理コードの実行など変更を反映する操作を忘れずに行いましょう。

ホスト上でRailsアプリを起動して少しリクエストを送り、DatadogのAPM画面を見るとリクエストが確認できます。

サービス一覧画面

サービス一覧

サービス詳細画面

サービス詳細

リソースステータス画面

リソースステータス一覧

トレース画面(概要)

リクエスト概要

トレース画面(SQL)

リクエストSQL

補足: サポート外フレームワークのモニタリング

もちろん、Rails/Sinatra以外のフレームワークや、サポート外の処理のAPMも可能です。以下はddtrace gemドキュメントからの抜粋です。

Net::HTTPの場合

Datadog::Monkey.patch_module(:http)というパッチを入れることで、Rails/Sinatora以外のライブラリもAPM対象にできます。
ドキュメントを読む限り、現在はRedis, Elastic Search, Net::HTTPに対応しているようです。

require 'net/http'
require 'ddtrace'

Datadog::Monkey.patch_module(:http) # you need to explicitly patch it

Net::HTTP.start('127.0.0.1', 8080) do |http|
  request = Net::HTTP::Get.new '/index'
  response = http.request request
end

content = Net::HTTP.get(URI('http://127.0.0.1/index.html'))

任意の処理の場合

Datadog.tracerインスタンスに渡すブロック内で、tracer.traceメソッドに渡した処理をAPM対象に追加できるようです。
まだ試していませんが、外部リクエストを伴わない重い処理もトレーシングできると思います。

require 'ddtrace'
require 'sinatra'
require 'activerecord'

# a generic tracer that you can use across your application
tracer = Datadog.tracer

get '/' do
  tracer.trace('web.request') do |span|
    # set some span metadata
    span.service = 'my-web-site'
    span.resource = '/'
    span.set_tag('http.method', request.request_method)

    # trace the activerecord call
    tracer.trace('posts.fetch') do
      @posts = Posts.order(created_at: :desc).limit(10)
    end

    # trace the template rendering
    tracer.trace('template.render') do
      erb :index
    end
  end
end

価格

https://www.datadoghq.com/pricing/

2週間のトライアル期間は無料で使うことができます。APMリリース後は、無料期間終了後の料金体系が変化します。
Datadogのホスト監視を普通に有料利用すると設定されるProプラン場合、APM利用なし(インフラ監視のみ)のホスト単価は$18月額/$15年額からで、"APM Upgrade Available"とあるため追加料金が発生するようです。具体的な金額を見つけられなかったため、現段階ではDatadog社への問い合わせが必要かもしれません。
100ホスト以上のインフラ監視利用で申し込めるEnterpriseプランでは、ホスト単価($27月額/$23年額から)にAPM利用料も含まれるため、追加の課金は発生しないようです。

なお、トライアル終了後の無料プランではAPMは提供されないようです。

感想

現在のプロジェクトでは、Datadogのインフラ監視をPagerDutyと共に運用しています。
Datdog APMリリース前は、社内ZabbixやNewRelic、Route53など複数のツールを組み合わせてAPMを実現していましたが、Datadog APMリリース後はツールを一本化できて助かっています。
APMを導入することで、外形監視ではわからない情報を得てOpsを効率化し、Devへのフィードバックを改善しやすくなります。
Datadog APMでアプリ監視とインフラ監視と統合し、少人数でDevOpsする必要があるプロジェクトでも安定した稼動状態を維持できています。

Datadog APMはDatadogインフラ監視とは別の料金が発生するため、予算によっては適用するホストを選ぶ必要があるかもしれません。
特にAPMが有効だと思うアプリケーションは、API GatewayやBFF(Backend For Frontend)のような、多数のサービスとやり取りしているサービスです。
外部サービス起因のアプリケーション遅延が発生しやすかったり、その影響が大きなサービスでは、パフォーマンスや特性を把握するために、Datadog APMは良い手段だと思います。

まとめ

Datadog APMのサービスについて、導入に必要な情報をまとめてみました。また、実際に使ったレポートをしました。
ベータ期間から試用していたこともあり、既に本番環境に投入していますが、安定して動作しています。
Datadog APMを導入することで、動作状況の可視化が一段と進んだと思います。
今後はインフラ監視との連携や適切な通知設定に挑戦したいです。