LoginSignup
0
0

図解で、Datadogのログからメトリックを生成する

Last updated at Posted at 2024-04-13

図解で、Datadogのログからメトリックを生成する

Datadog で収集したテキストログはログ・パイプラインを使って、アラート閾値やグラフ可視化するためのメトリックを生成することが可能です。例えばテキストログ[20:57:37 load average 11 minutes]があったとして動作時間の折れ線グラフを描くためにメトリック[load.average]とその値[11]を生成できたりします。テキストログから特定の文字列を抽出して(パースして)、[Generate Metrics]という機能でメトリックを生成します。その手順を検証しました。

シナリオ

サードパーティのソフトウェア製品が出力するテキストログをパースしてメトリック生成してみます。マルチプレイ用のマインクラフトサーバーにログインしたユーザー名を記録して遊び過ぎを抑制するというシナリオを想定。

image.png

テキストログからメトリック生成手順(STEP)

  • STEP1. ログの取り込み(Datadogエージェントの設定)
  • STEP2. ログ送信を検査
  • STEP3. ログ・パイプラインの設定
  • STEP4. メトリックの生成
  • STEP5. メトリックを検索

STEP1. ログの取り込み(Datadogエージェントの設定)

ゲームサーバーのログをDatadogエージェント経由で、インターネット側のDatadogインテークサーバーに転送します。ログファイルのパスを指定した設定ファイルを記述してDatadogエージェントを再起動します。

/etc/datadog-agent/conf.d/custom_log_collection.yaml
logs:
  - type: file
    path: /opt/minecraft-server/logs/latest.log
    source: kanoGame
    service: minecraft

STEP2. ログ送信を検査

Datadogポータルにログインして、ログエクスプローラー[Logs]でログを受信できたことを検査します。[Logs] > [Search]

image.png

STEP3. ログ・パイプラインの設定

受信したログを抽出(パース)するため、テキストログのサンプルをクリップボードにコピーします。

image.png

ログパイプラインに新しい[pipeline]を追加します。
[Logs] > [Configuration]
パイプラインの入口として、様々なログの中から対象とするログをフィルタリングします。このシナリオの場合は[kanogameサーバー]の[minecraftサービス]だけ抽出します。Name項目には好きな説明を記入します。

image.png

パースの設定

次にパースを追加します[Add processor]です。
DatadogはJSON形式のログならば自動でパースしてくれますが、JSON形式でないテキストログなどはGrokパーサーを使います。

image.png

Grok パーサーにテキストログから属性を抽出するルールを定義します。
ここで貼り付けたテキストログは『[20:57:37]  [Server  thread/INFO]:  FunnyKano joined the game』です。一旦、抽出ルールにも同じテキストを貼り付けます。この時点ではルールに「ルール名」の記載がなかったり、特殊記号をスケープしていないので[NO MATCH]と赤く表示されています。

image.png

この時点のルールでは何もログ属性を取得できていません。

image.png

Grok パーサーのルール定義

ルール名称を追加します。続けて、パースの規則を記載します。テキストログの[時刻]情報は刻々と変化するので時刻属性かもしくは無視します。今回はシンプルに無視するので[notSpace]でマスクします。特殊記号部分[カギカッコ]はエスケープ文字”[”で置き換えるかもしくは無視します。その他のテキストは一旦、残します。下記のルールを設定すると[Match]になりました。日付やINFOステータスもパースする場合は後述のパースルールサンプルに記載します。
意味のあるパースなら『 rule [%{date("HH: mm: ss"):date}] [Server thread/%{word:level}]: %{word:userName} joined the game 』とします。
ユーザー名以外は無視するなら『 rule %{notSpace} %{notSpace} %{notSpace} %{word:userName} joined the game 』でもMATCHになります。

image.png

image.png

ユーザー名を取得したいので、ユーザー名をパースします。

image.png

このルール規則の場合、属性 userName にユーザー名を取得できました。

image.png

ログのパース規則を書くためのヒント

テキストログをパースするために「パース規則(Parsing rules)」を記載しますが、記載方法を忘れた時に便利な、パース規則を自動生成してくれる機能「Show Parse Rule」があります。機能を見つけにくいので下記に別途記載しました。

パース規則の自動生成はこちら「Show Parse Rule」

STEP4. メトリックの生成

ログパイプラインをずっと下にスクロールすると見えてくる[Generate Metrics]というメニューを選択して、新しいメトリック[New Metric]を実行します。
(1) Set Metric Name には自由に新しいメトリックの名称を決めます。
(2) Define Query ではメトリックの値を選びます。ログをパースして取得した userName属性 をセットします。

今回は[kanoGameUser]という新しいメトリックを生成しました。値は userName:属性にパースしたユーザ名を設定します。
メトリック[kanoGameUser]には、[userName:<ユーザー名1>]や[userName:<ユーザー名2>]などの値が追加されます。

image.png

STEP5. メトリックを検索

メトリックエクスプローラーを使って生成したメトリックを検索できることを検査します。
新しく生成したメトリック[kanoGameUser]を検索して値を見つけました。

image.png

メトリックの可視化

ログから生成したメトリックを可視化できました(ユーザー名毎のログイン数をカウントしています)

image.png

まとめ

テキストログでもメトリックを取得できれば、監視もしやすいです。

  • グラフで可視化できる(ダッシュボードでのグラフ共有等)
  • アラート通知できる(例えばユーザーが5人以上ログインしたら等)

テキストログからメトリックを生成して可視化できました。

  • ログをパースできた
  • パースしたログ属性のメトリックを生成できた
  • メトリックをグラフ化できた

image.png

(おまけ)パースのサンプル1

テキストログが[時刻]、[特殊記号 "[" や "]" の時]
時刻が 'HH : mm : ss' の形式だったら date 属性に値を代入する。
INFO箇所は、文字列'word'形式で level 属性に代入する。

image.png

このルールの結果はこうなりました(↓)
image.png

(おまけ)パースのサンプル2

マイクラのログインログには、IPアドレスやゲーム世界のXYZ座標が含まれていて複雑です。この場合のパースルールを試します。

image.png

image.png

その他 パース規則の例

ログタイプ ログ例 パース規則
日付  [21:48:09]   [%{date("HH: mm: ss"):date}]
ステータス  [Server thread/INFO]:     [Server thread/%{word:level}]:
ユーザ名とかテキスト  FunnyKano   %{word:username}
IPアドレス  [/220.000.000.000]  [/%{ipv4:ipv4}]
数値変数  47, 69, 101   (%{number:x}, %{number:y}, %{number:z}
0
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
0
0