クラウドワークス エンジニアブログ

日本最大級のクラウドソーシング「クラウドワークス」の開発の裏側をお届けするエンジニアブログ

Dockerで始めるDatadog

初めまして。インターンasmsuechanです。以前はケーキ屋で働いていました。

これはDatadogにあまり馴染みのない人がDockerで立っているRailsアプリケーションにDatadogを導入するためのガイドです。

Datadogでわかること

Datadogはサーバーやアプリケーションの状態等パフォーマンスなどの数値を送信して、それを時系列ごとに集計し見やすいグラフを作成する事ができるSaaS型のモニタリングサービスです。そのため、もし取得したいデータの内容が重要な場合は、適宜別のログ収集サービスと組み合わせて利用しましょう。

Datadogを見てみる

アカウントがない方はまずdatadoghq.comの右上にあるGET STARTED FREEから登録します。

f:id:hyottokoaloha:20170228101517p:plain

これがダッシュボードの様子です。ここで収集したデータのグラフを見ることができます。 f:id:hyottokoaloha:20170228101528p:plain

準備

ここでは既にRailsが動くdocker(docker-compose)環境があり、そこにdatadogのコンテナdocker-dd-agentを立てて動かすことを想定しています。

最初に https://app.datadoghq.com/account/settings#api からdatadogのAPI_KEYを取得します。

次にdocker-compose.ymlにdogstatsdコンテナを追加し、railsコンテナのlinkにdatadogを追加します。なお、API_KEYはコミットに混ざらないよう.envなど別ファイルに分けて、Dockerのenv-fileオプションで読み込むなどした方が良さそうです。ここで.envを.gitignoreに追加するのを忘れないようにしましょう。dockerの設定はDataDog/docker-dd-agentのREADMEの記載を参考にしています。

version: '2'
services:
  rails:
    build: .
    links:
      - dd-agent:dd-agent
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    env_file: .env_rails
  dd-agent:
    image: datadog/docker-dd-agent
    environment:
      API_KEY: ${API_KEY}
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /proc/mounts:/host/proc/mounts:ro
     - /sys/fs/cgroup:/host/sys/fs/cgroup:ro

書けたら docker-compose build して docker-compose run rails すれば立つはずです。Dockerのセットアップはここまでで、あとは実際にDatadogを使ってみます。

次に、railsコンテナからdatadogにつなぐための準備をします。Gemfileに gem 'dogstatsd-ruby' を追加して bundle install するだけです。

注) Datadogはデータを送信するホスト数により課金されていくので、テストが終わったらdocker processを止めるようにしましょう。

http://docs.datadoghq.com/ja/guides/billing/

データを確認する

次で実際にDatadogにデータを送るのですが、データを確認しながら作業したいのでまずデータの確認方法を紹介します。

ダッシュボードを作成するには、メニューの Dashboards -> New DashboardDashboard Nameを書いてNew Timeboardをクリックします。 f:id:hyottokoaloha:20170228101619p:plain

正常に作成されると以下のようになります f:id:hyottokoaloha:20170228101628p:plain

ここにグラフを追加していくことによりダッシュボードを作ることができます。

Datadogにデータを送る

注) 画像に出てくるメトリクス名はfrontwatchとなっていますがこれはdatadog-testに読み替えてください。

メトリクス

Datadogはデータに datadog-test.this.is.metrics のような形式のメトリクスをつけてデータを送信します。このメトリクスでデータを判別します。

注) メトリクスが多いとDatadogに怒られるので機械的に無限に増える値( datadog-test.user_id.1 )のような値を指定することはできません。

ダッシュボードを作る時のここがメトリクスです。

f:id:hyottokoaloha:20170228113618p:plain

DogStatsD

この公式ドキュメントが分かりやすいと思います。 簡単に説明すると、DogStatsDはアプリケーションからDatadogにデータを送信するための受け口です。 このDogStatsDにRubyからデータを送るためのgemがdogstatsd-rubyになります。

dogstatsd-ruby

では実際にアプリケーション側からdatadogにデータを送信してみます。dogstatsd-rubyのREADMEにあるサンプルコードや公式ドキュメント参考にしてみてください。

なお、サンプル通りDatadogにデータを送ってもそのメトリクスはすぐには反映されないみたいです。20分くらい待ったら反映されました。

注) 間違ったデータを送信しようとするとそれ以降のデータ送信は無視されてしまいます

DogStatsdはデフォルトで10秒ごとにメトリクスをDatadogに送信しますが、設定で変えることもできます。

参考: http://docs.datadoghq.com/ja/guides/dogstatsd/#section-8

Datadog::Statsd.new

Datadog::Statsdのオブジェクトを作りDogStatsDにコネクションする準備をします。これからの操作は全てこのオブジェクトに対する操作です。

statsd = Datadog::Statsd.new('dogstatsd', 8125)

ここで指定しているdogstatsdはdocker-composeで作成したコンテナ名です。

increment

statsd.increment('datadog-test.counter') とした時 datadog-test.counterのタグの数値が増えます。しかし、直感的に値が1増えるわけではなく、

DogStatsDのデフォルト設定では10秒間隔でメトリクスをDatadogへ送信しています。カウンタは、この送信間隔の間の総カウント値を1秒間の数値に換算し、情報を送信しています。

参照: http://docs.datadoghq.com/ja/guides/metrics/

つまり10秒間に10回incrementが実行されると datadog-test.counterの値が1だけ増えるということです。

以下がincrementを使った時のグラフになります。

f:id:hyottokoaloha:20170228113642p:plain

これは11:16に statsd.increment('datadog-test.counter') を4回実行したことを示します。

gauge

ゲージは絶対値を送信するのに使用します。

例えば statsd.gauge('datadog-test.gauge', 1) とすると datadog-test.gauge に1が記録され、 statsd.gauge('dataedog-test.gauge', 10) とすると datadog-test.gauge に10が記録されます。

以下がgaugeを使った時のグラフになります。 f:id:hyottokoaloha:20170228113724p:plain

これは10:58に statsd.gauge('dataedog-test.gauge', 10) を実行し、10:59に statsd.gauge('datadog-test.gauge', 1) を実行したことを示します。

gaugeはレスポンスタイムを送信するなどの利用が考えられます。

histogram

以下のようなグラフを作ることができます。 f:id:hyottokoaloha:20170228113730p:plain

グラフを作る前にhistogramでメトリクスを作成します。まず以下を実行してください。

statsd.histogram('datadog-test.histogram', 1, { tags: ['value:value1', 'format:text'] })

tagsは ['value:valu1', 'format:text']のような形のarrayで渡します。 これを実行したらブラウザに移ります。

histogramを実行したら自動的に .avg, .max, .min, .95percentile のメトリクスが作成され、ここもhistogramを投げてからメトリクスの作成までに少し時間がかかります。

グラフを作成します。Add Graph -> Top List を選択し、datadog-test.histogram.avg のタグを探します。

f:id:hyottokoaloha:20170228113804p:plain

次に、ランキングを作りたいタググループを選びます。ここではvalue を指定します。 f:id:hyottokoaloha:20170228113812p:plain

こんなグラフができます。 f:id:hyottokoaloha:20170228113845p:plain

平均アクセス時間の集計などに使えそうです。

Get/from/avg byについて

グラフを作る際のメトリクス選択画面に以下のようなものがあったと思います。これについて説明しておきます。 f:id:hyottokoaloha:20170228113851p:plain

Get

メトリクスを指定します。グラフの作成をする際には必須の項目です。

from

タググループの要素(?)を指定します。ここでは value:value1value:value2 などが当てはまります。 f:id:hyottokoaloha:20170228113919p:plain

avg by

タググループを指定します。ここでは value が当てはまります。 f:id:hyottokoaloha:20170228113927p:plain

メトリクス/タググループに使える文字

上で述べたように、無限に増える文字列は使うことができません。

Datadogのバックエンドでは、ホスト、メトリクス, タグの組み合わせごとにシリーズ(時系列データ)を保存しています。 従って、無限にタグづけされたメトリクスをサポートすることができません。 ユーザIDやタイムスタンプなど、無限に増殖する[‘key’:‘value syntax’]の付与は止めてください。 それぞれのメトリクスにタグを付与する際には、1000種類を超えないように注意してください。

また、使用できない文字列もあるようです。

device, host, sourceの'key'文字列は、特別な文字列として取り扱われるために、標準的な方法では設定できないようになっています 参考: http://docs.datadoghq.com/ja/guides/metrics/#tags

なおメトリクスの文字数は無制限で、タグには200文字の制限があります。

メトリクス名には、文字数の制限はありません。
タグ名は、最大が200文字の制限があります。
参考: http://docs.datadoghq.com/ja/faq/

テンプレート変数の追加

テンプレート変数というものを追加します。これはタグの値を選んでグラフの値を絞り込むためのものです。

右上の歯車から Edit Template Variableを選択します。 f:id:hyottokoaloha:20170228114000p:plain

すると変数を作成できるようになるので適当な名前とタグを選択します。 f:id:hyottokoaloha:20170228114009p:plain

終わったらDoneを押します。これでグラフ全体の表示を環境ごとに切り替えることができるようになりました。

メトリクスが閾値を超えたときSlackに通知する

まず、Slack連携を追加します。メニューのIntegrations -> Integrationsに移動します。 f:id:hyottokoaloha:20170228114037p:plain

ここでは既にInstalledになっていますが、なっていなければSlackにマウスオーバーしてInstallします。完了したら Slack Service Hook にwebhookのURLを入力します。(参考)

スクリーンショット 2017-02-27 17.26.11.png

ここの new channel to post to に #random のように書いて Main_Account を選択したら Update Configuration を押します。これでDatadogのSlack連携は完了です。

次に、メニューの Monitors -> Metoric -> New Monitor から特定チャンネルと連携することができます。New MonitorのページからMetricを選択します。

f:id:hyottokoaloha:20170228114159p:plain

ここの 4. Notify your team で先ほど連携したSlackチャンネルを指定することによりそのタグが閾値を超えた際に通知されるようになります。

実際に閾値を設定して通知を飛ばすには 2. Set alert conditions の Alert threshold と Warning threshold を設定してください。

例えば、以下のようにすると frontwatch.development.avgvalue:value1 が5-10の時にWarningが通知され、10を超えるとAlertが飛ぶ、ということになります。

f:id:hyottokoaloha:20170228114206p:plain

value:value1にデータを飛ばすとちゃんと通知されました

f:id:hyottokoaloha:20170228114226p:plain

まとめ

Dockerのおかげでとても簡単にDatadogにデータを投げることができました。ただ、そのデータに基づいたダッシュボードを作るのが難しく、慣れが必要に感じました。

We’re Hiring!

クラウドソーシングのクラウドワークスではエンジニアを募集中です。

www.wantedly.com

興味のある方はお寿司ランチを無料で食べながらお話してみませんか?

crowdworks.co.jp

© 2016 CrowdWorks, Inc., All rights reserved.