初めまして。インターンのasmsuechanです。以前はケーキ屋で働いていました。
これはDatadogにあまり馴染みのない人がDockerで立っているRailsアプリケーションにDatadogを導入するためのガイドです。
Datadogでわかること
Datadogはサーバーやアプリケーションの状態等パフォーマンスなどの数値を送信して、それを時系列ごとに集計し見やすいグラフを作成する事ができるSaaS型のモニタリングサービスです。そのため、もし取得したいデータの内容が重要な場合は、適宜別のログ収集サービスと組み合わせて利用しましょう。
Datadogを見てみる
アカウントがない方はまずdatadoghq.comの右上にあるGET STARTED FREEから登録します。
これがダッシュボードの様子です。ここで収集したデータのグラフを見ることができます。
準備
ここでは既に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 Dashboard でDashboard Nameを書いてNew Timeboardをクリックします。
正常に作成されると以下のようになります
ここにグラフを追加していくことによりダッシュボードを作ることができます。
Datadogにデータを送る
注) 画像に出てくるメトリクス名はfrontwatchとなっていますがこれはdatadog-testに読み替えてください。
メトリクス
Datadogはデータに datadog-test.this.is.metrics
のような形式のメトリクスをつけてデータを送信します。このメトリクスでデータを判別します。
注) メトリクスが多いとDatadogに怒られるので機械的に無限に増える値(
datadog-test.user_id.1
)のような値を指定することはできません。
ダッシュボードを作る時のここがメトリクスです。
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を使った時のグラフになります。
これは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を使った時のグラフになります。
これは10:58に statsd.gauge('dataedog-test.gauge', 10)
を実行し、10:59に statsd.gauge('datadog-test.gauge', 1)
を実行したことを示します。
gaugeはレスポンスタイムを送信するなどの利用が考えられます。
histogram
以下のようなグラフを作ることができます。
グラフを作る前に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
のタグを探します。
次に、ランキングを作りたいタググループを選びます。ここではvalue を指定します。
こんなグラフができます。
平均アクセス時間の集計などに使えそうです。
Get/from/avg byについて
グラフを作る際のメトリクス選択画面に以下のようなものがあったと思います。これについて説明しておきます。
Get
メトリクスを指定します。グラフの作成をする際には必須の項目です。
from
タググループの要素(?)を指定します。ここでは value:value1
、 value:value2
などが当てはまります。
avg by
タググループを指定します。ここでは value
が当てはまります。
メトリクス/タググループに使える文字
上で述べたように、無限に増える文字列は使うことができません。
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を選択します。
すると変数を作成できるようになるので適当な名前とタグを選択します。
終わったらDoneを押します。これでグラフ全体の表示を環境ごとに切り替えることができるようになりました。
メトリクスが閾値を超えたときSlackに通知する
まず、Slack連携を追加します。メニューのIntegrations -> Integrationsに移動します。
ここでは既にInstalledになっていますが、なっていなければSlackにマウスオーバーしてInstallします。完了したら Slack Service Hook にwebhookのURLを入力します。(参考)
ここの new channel to post to に #random のように書いて Main_Account を選択したら Update Configuration を押します。これでDatadogのSlack連携は完了です。
次に、メニューの Monitors -> Metoric -> New Monitor から特定チャンネルと連携することができます。New MonitorのページからMetricを選択します。
ここの 4. Notify your team で先ほど連携したSlackチャンネルを指定することによりそのタグが閾値を超えた際に通知されるようになります。
実際に閾値を設定して通知を飛ばすには 2. Set alert conditions の Alert threshold と Warning threshold を設定してください。
例えば、以下のようにすると frontwatch.development.avg
の value:value1
が5-10の時にWarningが通知され、10を超えるとAlertが飛ぶ、ということになります。
value:value1
にデータを飛ばすとちゃんと通知されました
まとめ
Dockerのおかげでとても簡単にDatadogにデータを投げることができました。ただ、そのデータに基づいたダッシュボードを作るのが難しく、慣れが必要に感じました。
We’re Hiring!
クラウドソーシングのクラウドワークスではエンジニアを募集中です。
興味のある方はお寿司ランチを無料で食べながらお話してみませんか?