Etizolam

For our good night sleep.

Datadogに任意のメトリックスを送信する (その1)

Datadogに任意のメトリックスを継続的に送信するには、DogStatsDを介してDatadogのサイトに送信するのが最も簡単な方法です。

DogStatsDは、NYC発祥の物販サイトEtsyがFOSS化しているStatsDのプロトコルを実装したメトリクス集積サーバ(a metrics aggregation server)です。DogStatsDは、DD-agentに同胞されているので、既にDD-agentが動作していればすぐに使うことができます。(但し、Intel Galileoのようにデーモンを手動で起動するケースは、dogstatsdを起動している必要があります。)

StatsD及びStatsDプロトコルは、DevOpsを実践している欧米企業で各種のメトリックスを収集するために広く使われているソフトウェアとプロトコルです。

DogStatsD

DogStatsDは、アプリケーションからUDPで受け取ったメトリックスを一旦ホスト内で蓄積します。その後一定時間ことに、DatadogのサイトにHTTPSで送信します。Datagogのサイトでは、DogStatsDから受けとったメトリックスも名前スペースとタグ付によって管理され、他のメトリックスと同様にグラフ化することができるようになっています。

DogStatsDとの通信がなぜUDPかというという事に関しては、「この間の通信の障害や遅延によってアプリケーションの動作をストールさせないため」と書いてありました。

DogStatsDのラッパーライブラリーについて

DogStatsDへのメトリックス送信手続きを簡素化するために、一般的な言語向けにラッパーライブラリーが提供されています。これらのラッパーライブラリーを活用すると数行のコード追加で任意メトリックスをDogStatsDに転送することができます。

以下に代表的なライブラリーを紹介しておきます。

Datadogによって提供されているライブラリー

Python: dogstatsd-python – Python DogStatsD client.

Ruby: dogstatsd-ruby – Ruby DogStatsD client.

PHP: php-datadogstatsd – PHP DogStatsD client.

C#: dogstatsd-csharp-client – C# DogStatsD client.

コミュニティーによって提供されいるライブラリー

Java: java-dogstatsd-client – DogStatsD Client for Java, Indeed提供.

Node.js: node-dogstatsd – Node.js DogStatsD client, Young Han Lee提供.

Perl: dogstatsd-perl – Perl DogStatsD client, Stefan Goethals提供.

Ruby: metricks-dogstatsd – backend for the popular Metriks gem, Mavenlink提供.

Go: go-dogstatsd – dogstatsd client written in Go, Ooyala提供.

Datadog agentをIntel Galileoで動かす(前編)

intel galileo

Datadog agent(以後DD-agent)が、Raspberry Piであっさり動いてしまったので、流行のIntel Galileo(以降Galileo)でもあっさり動くのではと思い挑戦してみました。 結果から言うと「問題なく出来ます」、しかし、Raspberry Pi(Rasbian)の時のように、Datadogが用意してくれている1行コマンド行を実行すれば完成ということには成りませんでした。

こういう時こそ情報の供給がだいじだと思うのでインストール方法を書き残しておくとにします。尚今回は、DD-agentとDogtatsDを起動させ、メトリックスをDatadogに送信しするところまでの手順を書きます。これらのスクリプトをGalileoの起動時に自動で起動する方法やGPIOからの情報を読み込み送信する方法は、後編で書こうと思います。

起動用のSDイメージについて

個人的に利用頻度が最も多いTokoro’s Tech-Noteで公開されているSDフルイメージを利用します。

このイメージの特徴は、arduino IDEは使えなくなるものの、linux系のlibでちょっとこれがあると便利かもというものがrepoから簡単に入手できることです。(Tokoro氏の善意に感謝します。)

先のSDフルイメージをPCにダウンロードし解凍後、fat32でフォーマットした4G SDカート(4G以上のSDの場合は、4Gのパーティションを作成してください)に書き込めば、起動用のSDカードの準備は完了です。

以下が解凍したSDフルイメージの中身です。 SD full soft list

準備ができたSDカードをGalileに差し込んで、LANケーブルと電源を指すとYocto linuxが起動してきます。LAN(eth0)は、IP addressを自動で取得する設定に成っているので、Galileoを接続したネットワークにDHCPサーバーが存在している必要があります。IP addressは、OSが起動したのを見計らってIPスキャナーLanScanなどでIntel GalileoのMACアドレスを探してIP addressを確認します。MACアドレスの情報は、LANコネクター口の上にシールで張られています。

OSが起動しIP addressが分かったら、sshでGalileoに接続していきます。

1
$ ssh root@X.X.X.X

rootにはpasswordは設定されてないので、sshの接続手順が完了すると、一気に管理者権限のコンソールが表示されます。

1
2
3
4
5
The authenticity of host '192.168.8.171 (192.168.8.171)' can't be established.
RSA key fingerprint is 4d:5e:57:43:b0:02:6e:f3:ae:3c:1e:2c:7a:55:f5:4b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'X.X.X.X' (RSA) to the list of known hosts.
root@clanton:~#

DD-agent起動に足りないPackageのインストール

sshで接続ができたところで、まず最初にする作業は、Tokoroさんが提供してくれているPackageをopkgコマンドでインストールするためのrepo情報の追記です。

既にrepo情報が追記された設定ファイルも公開されているので、下記のコマンドを実行して既存のrepo設定ファイルをTokoroさんのrepoの設定情報が記載された設定ファイルに置き換えます。

1
wget http://storage.tokor.org/pub/galileo/packages/opkg.conf -O /etc/opkg/opkg.conf

詳細に関しては、「IntelのGalileoでパッケージマネージャopkgを使う」を参照してください。

次に、Package情報を更新し、新しいバージョンのパッケージがあるものは最新に入れ替えておくことにします。

1
2
opkg update
opkg upgrade

起動時にDateコマンドで毎回時間を設定するのは非常に手間なので、簡単に時間が設定されるようにします。自動で時間を設定してくれるntpdateをPackageインストールします。

1
2
opkg install ntpdate
ntpdate ntpdate ntp.nict.jp

次に、ntpdもインストールして設定しておきます。

1
opkg install ntp

ntpの設定ファイルを編集します。

1
vi /etc/ntp.conf

# server time.server.example.comと書かれている行をコメントアウトし、次のように公開されているntpサーバー名を記載します。

1
2
3
# server time.server.example.com
server ntp.nict.jp
server 0.asia.pool.ntp.org

次に、システムの状態を定期的に監視するためのsysstatをPackageインストールします。

1
opkg install sysstat

DD-agentを起動するためのPackageの追加インストールは、これで終了です。

DD-agentのダウンロード

OSの準備ができたので、DD-agentをGithubから取得し、Galileoに設置します。 Githubのサイトで、DD-agentを検索すると、次のような検索結果が表示されます。

github dd-agent

赤枠で囲った項目をダブルクリックして、Datadogが管理しているdd-agentのページに移動します。

github dd-agent

Download ZIP ボタンを見つけ、右クリックを使ってリンク先URLをクリップボードに保存ます。

Galileoのwgetコマンドでは、githubのCAの情報がうまく処理でないようなので—no-check-certificateをコマンドオプションに追記し実行します。

1
wget --no-check-certificate https://github.com/DataDog/dd-agent/archive/master.zip

ダウンロードが終わったらファイルを解凍し、起動の準備に入ります。

1
unzip master.zip

master.zipは、dd-agent-masterというディレクトリ以下に展開されます。

1
cd dd-agent-master

ディレクトリをlsで表示してみると次の様になっているはずです。

1
2
3
4
5
6
7
8
9
10
11
12
root@clanton:~/dd-agent-master# ls
CHANGELOG.md    aggregator.py   dogstream  requirements.txt
LICENSE     checks    emitter.py   resources
LICENSE-boto    checks.d    ez_setup.py  setup.py
LICENSE-httplib2  compat    graphite.py  supervisord.dev.conf
LICENSE-minjson   conf.d    httplibproxy.py  tests
LICENSE-ntplib    config.py   jmxfetch.py  transaction.py
MANIFEST.in   daemon.py   migration.py   urllib2proxy.py
README.markdown   datadog-cert.pem  minjson.py   util.py
Rakefile    datadog.conf.example  modules.py   win32
Vagrantfile   ddagent.py    packaging  yaml
agent.py    dogstatsd.py    pup

API keyの取得

DatadogのAPIアクセスは、API keyを使って認証しています。このkey(文字列)情報は、DD-agentの起動時に設定ファイルから読み込む仕様になっているので、設置ファイルに事前に記述しておく必要があります。

設定ファイルのサンプルが、dd-agent-masterディレクトリにあるので、このサンプルファイルをコピーして作業を始めます。

1
cp datadog.conf.example datadog.conf

次に、設定ファイルに書き込むためのAPI keyをDatadog APIsページから取得します。

datadog apikey

API keyの文字列が分かったところで、設定ファイルの編集をします

1
vi datadog.conf

設定ファイルの18行目にある、api_key:の後ろに先のページで取得したAPI keyをペーストします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Main]

# The host of the Datadog intake server to send Agent data to
dd_url: https://app.datadoghq.com

# If you need a proxy to connect to the Internet, provide the settings here
# proxy_host: my-proxy.com
# proxy_port: 3128
# proxy_user: user
# proxy_password: password

# If you run the agent behind haproxy, you might want to set this to yes
# skip_ssl_validation: no

# The Datadog api key to associate your Agent's data with your organization.
# Can be found here:
# https://app.datadoghq.com/account/settings
api_key:

これで設定ファイルの追記も完了です。

Agentの動作確認

Agentを起動する前にdatadog関連のデーモンがlogを出力する先のディレクトリーを準備しておきます。

1
mkdir /var/log/datadog

それでは、Agentを起動してみます。

1
2
cd ~/dd-agent-master
python agent.py start

しばらくすると、DatadogのInfrastrucureページ上にclanton(Galileoに設定したホスト名)というホスト名が追加されます。

datadog clanton

ホスト名をダブルクリックすると、sysstatが収集しているGalileoの基本メトリックスがグラフ化されて表示されるはずです。

datadog clanton

DogtatsDの動作確認

次に、任意のメトリックスを手軽に転送するためにDogStatsを起動することにします。

DogStatsDは、NYC発祥の物販サイトEtsyがFOSS化しているStatsDのプロトコルを利用した派生バージョンです。StatsDは、DevOpsを実践している欧米企業で各種のメトリックスを収集するために広く使われているソフトウェアです。

同様の目的でDogStatsDを使うことで、プログラムの中からDatadogのサービスに任意のメトリックスを簡単に転送することができます。メトリックスさえ転送できてしまえば、後はDatadogのダッシュボード機能を使って、集めたメトリックスをリアルタイムに処理&可視化できるという文脈になります。

既に設定ファイルへのAPI keyの追記は済んでいるので、次のように起動します。

1
2
cd ~/dd-agent-master
python dogstatsd.py start

任意のメトリックスをプログラムの中からDogStatsDを介してDatadogに送信ができたかを確認するためには、次のような簡単なプログムを書きます。

pythonの場合は、Datadogが提供しているDogStatsDのラッパーライブラリーがPIPにあるので次のようにインストールすることにします。

1
2
3
4
cd ~/dd-agent-master
python ez_setup.py
easy_isntall pip
pip install dogstatsd-python

dogstatsd-pythonのインストールが無事インストールが成功したら、dogstatsd-test.pyなどのファイル名で次のファイルのようなpythonスクリプトを書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /usr/bin/env python

from statsd import statsd
import time
import random

def mysleep():
    statsd.increment('myapp.testsleep')
    sleep_time = random.uniform(0.0, 0.9)
    print "sleep: %f" % sleep_time
    time.sleep(sleep_time)

if __name__ == "__main__":
    while(1):
        mysleep();

pythonスクリプトが書き上がったところで実行してみます。

1
python dogstatsd-test.py

コンソールに大量のsleep文字列が出力されます。バックグラウンドではsleepが表示された回数をカウントして、一定時間ごとにそのカウント値をDatadogに転送しています。

先に見たDatadogのInfrastrucureページのclantonの行の右端にmyappという青いラベルが増えていることが確認できたら、ダブルクリックしmyappの名前スペースのメトリックスを表示するページに移動します。

今は、myappの名前スペースに1種類のメトリックスしかないので、次のようなグラフが表示されれば、動作確認は完了です。

datadog myapp testsleep

まとめ

ここまでで前編は終わりです。内容が理解できれば30分以内でできてしまうインストール作業ではないかと思います。こんな簡単な作業で、GPIOで集めた情報も可視化できるなんて素晴しいと思いませんか。後半では、GalileoのGPIO関連ライブラリーと任意のメトリックスの取り扱いに関して書いていこうと思います。

  • 2014/04/18 ntpdate、及びntpの設定に関連する記述を変更しました。

Datadog Integrationsを追加する

DD−agentが収集している基本的なメトリックスのグラフを見ているだけでも多くのことが分るようになりますが、それ以外にもDatadog社が事前に準備してくれているメトリックス収集プラグインが存在しています。これらのプラグインをDatadogでは、Integrationsと読んでいるようです。

Datadogにloginし、ダッシュボードからIntegrations タブにカーソルを移動し、ドロップダウンからIntegrationsを選択すると次のページに移動することができます。

datadog integrations

各Instarationのタイルにカーソルを合わせると、その解説が表示され、Avalableボタンが、Installに変わります。Installをダブルクリックする、次のようなインストール確認の画面が表示されます。

datadog integrations

Configurationタブを選択して、設定項目を入力しInstall Integrationをクリックします。

Integrationの種類によっては、サーバー側の設定が必要なものもあります。その情報は、Configurationページで詳細に記載されています。その手順に従って設定作業を完了しておいてください。

Datadog側でIntagrationのインストールが完了すると、ページ上段のInstalled項目にタイルが表示されます。後に設定の変更などが発生した場合は、緑のInstalledボタンをクリックし、再度Configurationタブ選択し再設定することで、新しい設定を反映させるとことができます。

datadog integrations

Configurationが正しくできてメトリックスがDatadog側で受信できていれば、しばらくするとInfrastractureページにメトリックスを表示するための青いラベルが追加されます。