さこ街浪漫

GO ON A HIGHWAY

Datadog で独自メトリックをグラフ化する

はじめに

Datadog の Agent Check を書いてみたので簡単に記録しておく。

公式ドキュメントを読めばわかることだが、「それがめんどくさいんじゃ」という人の参考になれば幸いである。

環境
概要

Datadog の Agent をインストールすると自動的にサーバー監視が始まり、ダッシュボードにグラフが追加されるのだが、初期状態では CPU、メモリ、ネットワークの使用状況など、標準的なグラフのみである。ここに独自の監視項目を追加したい、という場合には Agent Check という仕組みを利用する。簡単に言うと「Python スクリプトを置いておけば勝手に実行してくれる」という仕掛けになっている。 http://docs.datadoghq.com/guides/agent_checks/

手順

/etc/dd-agent/conf.d/mytest.yaml を用意する。このファイル内にタブ(=0x09)があると読んでもらえないので注意。

init_config:

instances:
    [{}]

/etc/dd-agent/checks.d/mytest.py を用意する。クラス名とファイル名は無関係。

from checks import AgentCheck
import random

class MyTest(AgentCheck):
    def check(self, instance):
        key = 'user.mygauge1'
        value = random.random() * 1000
        self.gauge(key, value)

パーミッションは下記のようにした。

-rw-r--r--. 1 dd-agent dd-agent 181 11月  4 16:56 2014 /etc/dd-agent/checks.d/mytest.py
-rw-r--r--. 1 dd-agent root      35 11月  4 16:31 2014 /etc/dd-agent/conf.d/mytest.yaml

テスト。

# service datadog-agent configtest

agent を起動。

# service datadog-agent start

Dashboard を見るとグラフが増えている。

f:id:masal3:20141104170155p:plain

グラフを開く。

f:id:masal3:20141104170856p:plain

完成。

さらに

同一のカテゴリーだがグラフとしては分けたい、という場合。tag を利用する。

f:id:masal3:20141104173721p:plain

Python の部分。'user.net.traffic' に特別な意味があるわけではなく、単純に好みで。

self.gauge('user.net.traffic', value, tags = ['direction:in', 'port:80', 'protocol:tcp'])
self.gauge('user.net.traffic', value, tags = ['direction:out', 'port:80', 'protocol:tcp'])
self.gauge('user.net.traffic', value, tags = ['direction:in', 'port:443', 'protocol:tcp'])
self.gauge('user.net.traffic', value, tags = ['direction:out', 'port:443', 'protocol:tcp'])
self.gauge('user.net.traffic', value, tags = ['direction:in', 'port:8080', 'protocol:tcp'])
self.gauge('user.net.traffic', value, tags = ['direction:out', 'port:8080', 'protocol:tcp'])

グラフ。

{
  "viz": "timeseries",
  "requests": [
    {
      "q": "diff(user.net.traffic{$host, protocol:tcp, direction:in, port:80})"
    },
    {
      "q": "diff(user.net.traffic{$host, protocol:tcp, direction:out, port:80})"
    },
    {
      "q": "diff(user.net.traffic{$host, protocol:tcp, direction:in, port:443})"
    },
    {
      "q": "diff(user.net.traffic{$host, protocol:tcp, direction:out, port:443})"
    },
    {
      "q": "diff(user.net.traffic{$host, protocol:tcp, direction:in, port:8080})"
    },
    {
      "q": "diff(user.net.traffic{$host, protocol:tcp, direction:out, port:8080})"
    }
  ]
}
補足
  • check を書き換えたら restart。
  • グラフにはいくつかの種類がある。
  • "host:コンピューター名" というタグは勝手に入る。
  • キーの名前の最初の「.」までが大分類になるようだが、詳細はわからない。
  • タグのあたりはグラフを実際に描いてみないと掴むのが難しい。とくかくやってみる。
  • たとえば「自分のアプリケーションなどからバッチ的に独自メトリックを送信してグラフ化したい」という場合には dogstatsd というものを利用する。こちらも驚くほど簡単なのでトライしてください。 http://docs.datadoghq.com/guides/metrics/