Datadogでエンドポイント毎のアクセス数を可視化してみた
はじめに
最近Datadogを使い始たのですが、ある時アクセス数をDashboardに表示する必要が出てきました。
ChatGPT-4先生に訪ねてみると、アクセスログをDatadog側で良い感じにグルーピングしてくれるそうで、その結果をDashboardに表示できそうです。
APMでもできるそうですが、今回はシンプルな方法でチャレンジしてみます。
出来上がったもの
最終的に下記のようなDashboardができました。
Datadog Dashboard
デモ用のアプリケーション
How to
1. Datadog Agentのインストール
今回はデモということでローカルのPCでアプリケーションサーバを起動させました。
まずはアプリケーションサーバからDatadogにログを送信するためのAgentをインストールしましょう。
私のPCはMacOSだったため下記の手順に従ってインストールしました。
(※前提としてDatadogのアカウントを作成している必要があります)
2. Agentの初期設定
ログ収集を有効にする
デフォルトではDatadogにログを送信しない設定になっているため、ログ収集を有効にする必要があります。
~/.datadog-agent/datadog.yaml
のlogs_enabled
がfalse
になっているため、true
にしましょう。
もし、コメントアウトされているのであれば、コメントアウトも解除しましょう。
アプリケーションの準備
まずは下記リポジトリをcloneしてください。
下記でログ出力先のファイルを指定しています。
次の手順でこのファイルを利用します。
送信対象のログを指定する
Datadogに送信するログのinputとなるファイルを指定する必要があります。
~/.datadog-agent/nodejs.d/conf.yaml
に下記の内容で作成してください。
demo.log
にはアプリケーションのログが出力されるファイルを指定してください。
init_config:
instances:
##Log section
logs:
- type: file
path: "<cloneしたアプリケーションのパス>/demo.log"
service: datadog-demo
source: nodejs
sourcecategory: sourcecode
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
Datadogにログが送信されることを確認
先程cloneしたアプリを起動してみましょう。
$ npm install
$ node app.js
Example app listening on port 3000
実際にアクセスしてみます。
http://localhost:3000/user/read
下記のようなログがコンソールと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)
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