1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

図解で、はじめての Datadog カスタムメトリクス

1
Posted at

はじめに

Datadog はサーバー、アプリケーション、セキュリティ、システム構成などさまざまな状態を可視化できる監視モニタリング基盤(プラットフォーム)です。
その中でも「カスタムメトリクス」は、Datadog標準メトリクスでは収集できない独自の数値, 時系列データ, をダッシュボードで可視化できる仕組みです。
この記事では、Datadogユーザー会 JDDUG のオンライン勉強会 で学習した「Datadogでカスタムメトリクスを取得する代表的な3つの方式」を図解で解説します。

  1. DogStatsD
  2. Agent Check
  3. HTTP API

なお、単数の場合[メトリック]、複数の場合[メトリクス]と書きます。

1. カスタムメトリクスとは?

Datadog が標準で収集するメトリクス「CPU, メモリ, ネットワークなど」に加えて、独自の数値をDatadogダッシュボードに送信して、ダッシュボードにグラフなどで分かりやすく可視化できる仕組みです。

例:

  • アプリケーション内部の実行回数
  • バッチ処理の成功数
  • 独自のビジネス指標(注文数など)

😅 こんな使い方する人はいないだろうけれど、過去に「図解で、うちのワンコ🐶を真夏の暑さから守る(Datadogで)」という記事を書きました。酷暑の日に万が一、エアコンが故障したら室内でも熱中症になるくらい暑くなります。そんなときにアラート通知が届くソリューション: ラズパイに接続した温度センサーによる室温監視 なんてこともできちゃいます。

2. Datadog カスタムメトリクス

用途によって6つのいずれかの方式を選定します。この記事では #1 ~ #3 まで計装します。

# 用途 推奨方法 理由
1 アプリから送信 DogStatsD コードに計装
2 サーバーの状態監視 Agent Check Agentが直接収集
3 サーバレス環境 HTTP API Agent不要
4 ログを分析 Logs pipeline コーディング不要
5 アプリの性能 APM 自動抽出
6 WEBのKPI RUM ユーザー行動を可視化したいとき

3. 今回のインフラ構成

パブリックIPアドレスを持つ仮想サーバー1台に Datadog Agent をインストールします。KAGOYAのVPS(仮想サーバー)は月額770円ととてもリーズナブル。

image.png

4. Datadog Agent インストール

カスタムメトリクスを収集するには Agentあり/なし を選べますが、方式1 DogStatsD では Agent が必要なので、ここでインストールしておきます。

インストール先のOSを選び、インストールコマンドを取得します。インストール手順はこちら

ドキュメント Agent がサーバーに与える影響は、よく質問を受けるので目を通しておいた方がよいです。

Agent 操作コマンド

LinuxでAgentの再起動や動作状態を確認するには下記のコマンドを使います。ドキュメントはこちら

Ubuntuの場合

操作 コマンド
Agent 起動 sudo systemctl start datadog-agent
Agent 停止 sudo systemctl stop datadog-agent
Agent 再起動 sudo systemctl restart datadog-agent
Agent サービスの状態確認 sudo systemctl status datadog-agent
Agent の有効なcheck確認 sudo datadog-agent status
サポート用フレアを送信する sudo datadog-agent flare
ヘルプ sudo datadog-agent --help
check毎に確認する sudo datadog-agent check

5. 標準メトリクス

Agent をインストールするだけで観測できるメトリック

  • CPU
  • メモリ
  • ディスク
  • NIC送受信
  • ロードアベレージ

コンフィグに追加するだけで観測できるメトリック

  • ログ収集
  • プロセスのリソース(CPU / メモリ など)
  • ポートの有効性

image.png

6. カスタムメトリクスの設定

方式1:DogStatsD(アプリのメトリクス収集)

図解(しくみ)

アプリケーション → Agent → ダッシュボード

  • アプリケーションが UDP/TCP 8125 ポートへメトリクス送信
  • Agent 8125 ポートで受信・集約して Datadog インテークサーバーへ送信

image.png

計装手順(Python例)

1. Datadogライブラリをインストール

pip install datadog

2. アプリに組み込む DogStatsD へ送信するコード

  • options にはAgentのホストとポート番号を指定
  • statsd.gauge(name, value, tags=[]) 内に、自由に命名したメトリクス名、現在値、タグを渡す
アプリ名.py
from datadog import initialize, statsd
import random
import time

options = { 'statsd_host':'127.0.0.1', 'statsd_port':8125 }
initialize(**options)

while True:
    value = random.randint(1, 100)
    statsd.gauge('jddug.metric-dogstatsd.value', value, tags=["env:dev"])
    time.sleep(5)
その他 statsd の関数
関数 機能
statsd.gauge(name, value, tags=[]) 自由に命名したメトリクス名、現在値、タグを渡す
statsd.count(name, value, tags=[]) エラー回数, リクエスト数などカウントを送る
statsd.histogram(name, value, tags=[]) レスポンスタイムやサイズなど分布統計
statsd.distribution(name, value, tags=[]) 複数ホストにまたがるレイテンシーなど分布メトリクス
statsd.set(name, value, tags=[]) ユーザ数、IP数などユニーク値を送る
statsd.service_check(name, value, tags=[]) 外形監視などサービス状態[OK
statsd.event(EventObject) 障害通知などカスタムイベントを送る

3. Agent の設定

Datadog Agent のコンフィグで、dogstatsd を有効化します

/etc/datadog-agent/datadog.yaml
dogstatsd_metrics_stats_enable: true

ダッシュボード例

Metrics > Explorer

メトリクス欄に、カスタムメトリクス名を入れて値が表示されることを検査します。表示できるようになるまで60秒以上かかります。

image.png

DogStatsD できること / できないこと

できること
  • 高頻度メトリクスの送信
  • タグを柔軟に付与
  • アプリケーション内部の状態を可視化
できないこと
  • Agent がない環境では使えない
  • UDP ロスの可能性

方式2: Agent Check(Agent によるメトリクス収集)

図解(しくみ)

Agent → ダッシュボード

  • Agent が Python スクリプトを定期実行
  • サーバー内部の状態を直接収集

image.png

計装手順

Linux の場合は下記フォルダのコンフィグとチェックの2つのファイルを用意します。
コンフィグはディレクトリ内にテンプレートがあるので複製して拡張子を.yamlに変更しておき、Agentを再起動すると.yamlファイルが読み込まれて、チェックが有効になります。
チェックはpythonで記述された検査プログラムであり、コンフィグと同名の.pyファイルが起動されます。標準チェックの場合は、チェックファイルが不要ですが、カスタムチェックの場合は検査プログラムを記述します。

image.png

下記に、カスタム Agent Check のサンプルを紹介します。ファイル名は重複しない自由なファイル名を記述できます。ここでは<kano.yaml>と<kano.py>を設置してみます。

1. コンフィグ配置

最小限のコンフィグは、Check検査プログラムを実行する間隔 interval を指定します。下記は15秒置きに実行するものです。

/etc/datadog-agent/conf.d/kano.yaml
init_config:

instances:
  - min_collection_interval: 15

2. Python スクリプト配置

Check 検査プログラムを記述します。カスタムメトリクス名 kano.metric-check に1から100までの乱数をゲージ値として送信するコードです。

/etc/datadog-agent/checks.d/kano.py
from datadog_checks.base import AgentCheck
import random

class KanoCheck(AgentCheck):
    def check(self, instance):
        value = random.randint(1, 100)
        self.gauge("kano.metric-check", value)

3. Agent 再起動

Agentを再起動して、コンフィグを読み込ませます。成功したら15秒置きに kano.py が実行されます。

sudo systemctl restart datadog-agent

ダッシュボード例

Metrics > Explorer

メトリクス欄に、カスタムメトリクス名を入れて値が表示されることを検査します。

image.png

Datadog Agent Check できること / できないこと

できること
  • サーバー内部(OSやミドルウェア)の独自メトリクスを収集
  • Python コードで自由にロジックを記述できる。値さえあればメトリクス化が可能
  • 独自メトリクスでも Agent の標準メトリクスと同じ手法で実行するため安定
できないこと
  • Free プランではカスタムメトリクスは使えない
  • やらないほうがいいこと:毎回異なる値のタグ付け(ユーザーIDやIPアドレスなど)は課金が増加する

方式3:Datadog HTTP API(Agent レスによるメトリクス収集)

図解(しくみ)

  • HTTPメソッド(POST)でメトリクス送信
  • AWS Lambda など外部サービスから使いやすい

image.png

計装手順

Bash コマンドライン例

下記は curl での送信サンプル。Datadog API に POST メソッドで直接、メトリクスを送信できます。
この例では、カスタムメトリクス kano.metric-api.value に値 44 を送信します。
Agent不要なので、HTTPメソッドをアプリのコードに組み込むだけで使えます。

curl -X POST \
  -H "Content-Type: application/json" \
  -H "DD-API-KEY: <YOUR_API_KEY>" \
  -d '{
        "series": [{
          "metric": "kano.metric-api.value",
          "points": [[ '"$(date +%s)"', 44 ]]
        }]
      }' \
  "https://api.datadoghq.com/api/v1/series"

APIキー

APIキーはDatadogダッシュボードで作成・取得します。

image.png

ダッシュボード例

下図ではカスタムメトリクス jddug.metric_api.value を作って、時系列で値 44 を取得しています。

image.png

Datadog HTTP API できること / できないこと
できること
  • サーバレス(Agent がない環境)でメトリクス送信
  • AWS Lambda / Azure Functions / など、外部サービスから直接送信
  • API Key があれば、どこからでも送信可能
できないこと
  • Agent や DogStatsD は、時間毎の集計, Rate / Count などできるが HTTP API ではやらない
  • タグ(host, env など)は自動付与されない。必要なら自分で tags に host:<ホスト名> などを追加する
  • Free プランでは保存されない

7. カスタムメトリクスの課金体系

基本料金

Datadog Infrastructure の pro プランでは、100 個のカスタムメトリクスが料金に含まれています。

超過分が従量課金

101 個目から 100メトリクス毎に追加料金 月額$1 が発生します。

カスタムメトリクスが高額になる使い方

タグが固定になる dogstatsd.gauge('kano.metric-js-dogstatsd.value', randint(20, 45), [ 'env:prod', 'service:jddug_online']); の場合は、何回送信しても、異なる値を送信しても、月額は変わりません。

しかし、タグが変動する dogstatsd.gauge('kano.metric-js-dogstatsd.value', randint(20, 45), [ 'id:' + userid ]); 場合は、Datadog内部では新しい"時系列(time series)"が生成されるため、送信する都度、カスタムメトリクス数が増加し、月額が増加します。

8. まとめ

方式 特徴 おすすめ用途
DogStatsD アプリから高速送信 Webアプリの内部状態
Agent Check Agent が Python で収集 サーバー内部の独自メトリクス
HTTP API Agent 不要 サーバレス・外部サービス

Datadog のカスタムメトリクスは、
「標準メトリクスでは収集できない値」を可視化・観測するためのすばらしい手段です。

この記事の 3 方式を理解すれば、
どんな環境でも好きなメトリクスを送信できるようになります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?