🐶

Datadogでエンドポイント毎のアクセス数を可視化してみた

2023/05/03に公開

はじめに

最近Datadogを使い始たのですが、ある時アクセス数をDashboardに表示する必要が出てきました。
ChatGPT-4先生に訪ねてみると、アクセスログをDatadog側で良い感じにグルーピングしてくれるそうで、その結果をDashboardに表示できそうです。
APMでもできるそうですが、今回はシンプルな方法でチャレンジしてみます。

出来上がったもの

最終的に下記のようなDashboardができました。
Datadog Dashboard

デモ用のアプリケーション
https://github.com/aozou99/datadog-demo

How to

1. Datadog Agentのインストール

今回はデモということでローカルのPCでアプリケーションサーバを起動させました。
まずはアプリケーションサーバからDatadogにログを送信するためのAgentをインストールしましょう。
私のPCはMacOSだったため下記の手順に従ってインストールしました。
(※前提としてDatadogのアカウントを作成している必要があります)
https://app.datadoghq.com/account/settings#agent/mac

2. Agentの初期設定

ログ収集を有効にする

デフォルトではDatadogにログを送信しない設定になっているため、ログ収集を有効にする必要があります。
~/.datadog-agent/datadog.yamllogs_enabledfalseになっているため、trueにしましょう。
もし、コメントアウトされているのであれば、コメントアウトも解除しましょう。
https://docs.datadoghq.com/ja/agent/logs/?tab=tailfiles#ログ収集を有効にする

アプリケーションの準備

まずは下記リポジトリをcloneしてください。
https://github.com/aozou99/datadog-demo

下記でログ出力先のファイルを指定しています。
次の手順でこのファイルを利用します。
https://github.com/aozou99/datadog-demo/blob/master/logger.js#L11

https://docs.datadoghq.com/ja/logs/log_collection/nodejs/?tab=winston30#ファイルへのログ記録

送信対象のログを指定する

Datadogに送信するログのinputとなるファイルを指定する必要があります。
~/.datadog-agent/nodejs.d/conf.yamlに下記の内容で作成してください。
demo.logにはアプリケーションのログが出力されるファイルを指定してください。

conf.yaml
init_config:

instances:

##Log section
logs:

  - type: file
    path: "<cloneしたアプリケーションのパス>/demo.log"
    service: datadog-demo
    source: nodejs
    sourcecategory: sourcecode

https://docs.datadoghq.com/ja/logs/log_collection/nodejs/?tab=winston30#datadog-agent-の構成

Agentの起動

下記コマンドでAgentを起動します。

起動コマンド
$ launchctl start com.datadoghq.agent

起動後ステータスを確認してLogs Agentのnodejsでエラーが発生していないことを確認します。

ステータス確認コマンド
$ datadog-agent status
Logs Agent
==========
    Reliable: Sending compressed logs in HTTPS to agent-http-intake.logs.ap1.datadoghq.com on port 443
    BytesSent: 1.53104883e+08
    EncodedBytesSent: 4.059543e+06
    LogsProcessed: 452050
    LogsSent: 452050

  nodejs
  ------
    - Type: file
      Path: <cloneしたアプリケーションのパス>/demo.log
      Service: datadog-demo
      Source: nodejs
      Status: OK
      Inputs:
        <cloneしたアプリケーションのパス>/demo.log  
      Bytes Read: 60512878   
      Pipeline Latency:
        Average Latency (ms): 0
        24h Average Latency (ms): 1
        Peak Latency (ms): 0
        24h Peak Latency (ms): 52

https://docs.datadoghq.com/ja/agent/basic_agent_usage/osx/?tab=agentv6v7

Datadogにログが送信されることを確認

先程cloneしたアプリを起動してみましょう。

起動コマンド
$ npm install
$ node app.js
Example app listening on port 3000

実際にアクセスしてみます。
http://localhost:3000/user/read

下記のようなログがコンソールとdemo.logに出力されます。

demo.log
{"level":"info","message":{"latency_ms":184,"method":"GET","path":"/user/read","status":200},"timestamp":"2023-05-03T06:30:27.887Z"}

Logsにアクセスすると下記のようにログが送信されていることを確認できます。

エンドポイント毎に集計できるように設定する

Dashboardで利用するクエリで集計するには対象の項目にfacetを作成する必要があります。
先程のログ詳細からpathをクリックし、Create facet for @pathをクリックします。

デフォルトのままAddをクリックします。
20230503.png)

https://docs.datadoghq.com/ja/logs/explorer/facets/#ログサイドパネル

latency_msを集計できるように設定する

先程のpathは単純なグルーピングでしたが、latency_msでは集計結果に対して平均値や中央値など計算を行いたいです。
この場合はfacetではなく、measureを作成する必要があります。
pathと同様にログ詳細からlatency_msをクリックし、Create measure for @latency_msをクリックします。

デフォルトのままAddをクリックします。

継続的にアクセスログを発生させる

そろそろDashboardを作成していくのですが、現時点だとログが全然流れていないので、可視化してもデータが無いため、本当に正しいクエリが書けているのか分かりづらいです。
デモ用のアプリケーションではartilleryというNode.js製のload-testingツールを使って各エンドポイントに負荷を掛け、常にアクセスログを流しながらDashboardを作成していました。
今回も負荷を掛けてみましょう。

まずはartilleryをインストールしてください。

インストール
$ npm install -g artillery

インストールが終わったら、下記のコマンドで負荷を掛けれます。

$ artillery run artillery.yaml

実施される負荷の内容はartillery.yamlになります。
興味があればこちらを御覧ください。

Dashboard作成

Dashboard画面からNew Dashboardをクリックしてください。
Dashboard Nameに任意の名前を入れて、New Dashboardをクリックします。

アクセス数の可視化

空のDashboardができるので、右のサイドバーからTimeseriesをドラッグ&ドロップしてください。

② Graph your dataを下記のように修正してください。
before

after

また線グラフを棒グラフに変えてみましょう。
before

after

最終的にグラフは下記のようになるはずです。

最後に右下のSaveをクリックして保存します。

レイテンシの可視化

アクセス数と同様の手順でグラフを追加します。
下記の通りに設定してください。

テーブル形式での可視化

右のサイドバーからTableをクリックしてください。

下記の通りに設定してください。

まとめ

後はラベル名やレイアウトを調整すれば下記のようになります。
エンドポイント毎とレイテンシを可視化できました!
意外にやることが多かったです😅

Discussion