tl;dr

Datadog で HTTP や TCP のコネクションチェックを行うことが出来るけど、Agent Check が HTTP エンドポイントや TCP ポートへの接続を試行する間隔を指定出来ないのかなって調べたら、以下のように言及されていたので実際に調べてみた。

help.datadoghq.com

上記の記事を抜粋。

For example, if you need to run an http check every 60 seconds rather than the default 15 seconds, add the following to the http_check.yaml config file:
min_collection_interval: 60
You can add this parameter at the init_config level or at the instance level.

  • http_check はデフォルトは 15 秒ごとにチェックされる
  • 変更したい場合には http_check.yaml に min_collection_interval で変更可能
  • init_config 又は instance に定義することが出来る

ということで動作確認

TCP Server を起動する

こちらの記事で作った Echo サーバーを起動する。

$ python test.py &
[1] 7179
$ ruby test.rb &
[2] 7184
$ echo "test" | nc 127.0.0.1 18181
test
$ echo "test" | nc 127.0.0.1 18282
test
$ tail log.txt
2015-11-17 00:29:11,414 INFO Python TCP Server Test Input:test
I, [2015-11-17T00:29:14.550477 #7184]  INFO -- : Ruby TCP Server Test Input: test

tcp_check を定義する

tcp_check の定義は /etc/dd-agent/conf.d/tcp_check.yaml に施す。今回は各アプリケーション毎に 60 秒ごとにチェックを行って欲しいので以下のように init_config に定義した。

init_config:
  min_collection_interval: 60

instances:
  - name: Python-App
    host: 127.0.0.1
    port: 18181

  - name: Ruby-App
    host: 127.0.0.1
    port: 18282

尚、各 instance 毎にインターバルの設定を変更したい場合には以下のように記載しても動作することを確認している。また、デフォルトの 15 秒以下を指定しても指定した時間 + 15 秒間隔となってしまうのであまり意味が無いと考える。更に、init_config で定義した値は instances で個々に定義した値で上書き可能である。

init_config:

instances:
  - name: Python-App
    host: 127.0.0.1
    port: 18181
    min_collection_interval: 180

  - name: Ruby-App
    host: 127.0.0.1
    port: 18282
    min_collection_interval: 300

Datadog Agent を再起動する。

$ sudo service datadog-agent restart

アプリケーションのログを確認する

暫くするとアプリケーションのログが記録される。

$ tail -n 2 *-log.txt
==> python-log.txt  ruby-log.txt 

ほぼ 60 秒 + 15 秒程度でアプリケーションへのアクセスが発生していることが判る。(厳密に 60 秒では無いのは謎...→も少ししらべやう)

Network Monitor を定義する

Monitor の定義には barkdog を使うと捗る。

github.com

以下のように API キーと APP キーを定義するところから始める。

$ export BARKDOG_API_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
$ export BARKDOG_APP_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# Monitor の定義を export する
$ barkdog --export --outfile Barkfile

以下のように定義。

$ cat Barkfile

(snip)

monitor "Python-App", :type=>"service check" do
  query ""tcp.can_connect".over("host:vagrant-ubuntu-trusty-64","instance:python_app").by("host","instance","port","target_host").last(6).count_by_status()"
  message "@slack-datadog-notification"
  options do
    no_data_timeframe 2
    notify_audit false
    notify_no_data false
    renotify_interval 0
    silenced({})
    thresholds "critical"=>5, "ok"=>3
    timeout_h 0
  end
end

monitor "Ruby-App", :type=>"service check" do
  query ""tcp.can_connect".over("host:vagrant-ubuntu-trusty-64","instance:ruby_app").by("host","instance","port","target_host").last(6).count_by_status()"
  message "@slack-datadog-notification"
  options do
    no_data_timeframe 2
    notify_audit false
    notify_no_data false
    renotify_interval 0
    silenced({})
    thresholds "critical"=>5, "ok"=>3
    timeout_h 0
  end
end

(snip)

Datadog の内部的には tcp.can_connect という監視項目になるようだ。ちなみに、HTTP Check の場合には http.can_connect となる。

以下のように適用。

$ barkdog --apply --dry-run
$ barkdog --apply

以下のように Manage Monitors にリストアップされる。

20151117090124

以上

厳密に指定した時間でインターバルされないのはちょっと謎だがデフォルトの 15 秒間隔だとちょっと短いかなと思ったら min_collection_interval の設定を検討したい。

以上。

元記事はこちら

(超メモ)Datadog の HTTP や TCP コネクションチェックのインターバル設定