docker-composeで構築したマルチコンテナ環境に、datadog-agent、nginx、laravelがインストールされている状態で、laravelからdogstatsd経由でdatadogにカスタムメトリクスやイベントを送信する方法です。
Datadogの公式ドキュメントは相変わらず使い物にならないので、自分でなんとか設定構築しました。
docker-composeの設定
まず、docker-composeの設定です。
(参考)docker-composeを使ったdatadog-agentのインストール、設定する方法はこちら
https://qiita.com/reopa_sharkun/items/cd4dbfdaa60bcfbefd74
Laravelコンテナの設定
environment,linksの設定がポイントです。
linksでLaravelのコンテナとdatadog-agentのコンテナが通信できるようにして、
環境変数のDD_AGENT_HOST, DD_DOGSTATSD_PORTで接続先を設定しています。
(後述のdatadogstatsdがこの環境変数を読み込んで使います)
DD_ENTITY_IDはお好みで設定してください。
app:
build:
context: ./docker/php
dockerfile: Dockerfile
volumes:
- php-fpm-socket:/var/run/php-fpm
- ../backend:/work/backend:delegated
- ./docker/php/bash/.bash_history:/root/.bash_history
- ./docker/php/bash/psysh:/root/.config/psysh
environment:
- DD_AGENT_HOST=dd-agent
- DD_DOGSTATSD_PORT=8125
- DD_ENTITY_ID=Laravel
links:
- dd-agent:dd-agent
datadog-agentコンテナの設定
ここで重要なのは、
DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true です。
なお、
DD_DOGSTATSD_NON_LOCAL_TRAFFIC="true"にすると動きませんので注意!
dogstatsdは、UDPポート8215でリッスンするので
"8125:8125/udp" を追加します。
その他の設定はnginxを監視する設定等です。
dd-agent:
container_name: dd-agent
image: datadog/agent:7
environment:
- DD_API_KEY=ここに自分のAPIキーを書く
- DD_APM_ENABLED=true
- DD_LOGS_ENABLED=true
- DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
- DD_AC_EXCLUDE="name:dd-agent"
- DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc/:/host/proc/:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro
ports:
- "8125:8125/udp"
- "8126:8126/tcp"
上記のようにdocker-composeを設定すればOKです。
コンテナを再起動しましょう。
laravelにパッケージを追加
以下の2点のパッケージを追加します。
"datadog/php-datadogstatsd"
"chaseconey/laravel-datadog-helper"
composer require datadog/php-datadogstatsd
composer require chaseconey/laravel-datadog-helper
動作確認
docker ps で正しくコンテナが立ち上がっていることを確認。
dd-agentが0.0.0.0:8125->8125/udp でリッスンできています。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fa807546066 docker-laravel_app "docker-php-entrypoi…" 35 minutes ago Up 35 minutes 9000/tcp docker-laravel_app_1
8b970a3b89c3 datadog/agent:7 "/init" 35 minutes ago Up 35 minutes (healthy) 0.0.0.0:8125->8125/udp, 0.0.0.0:8126->8126/tcp dd-agent
cliからメトリクスを送信してみる
Dockerを動かしているホストから送信してみます。
なお、成功しても失敗しても何も表示されません
echo "deploys.test.myservice:1|c" | nc -w 1 -u 127.0.0.1 8125
Tinkerからメトリクス・イベントを送信
こちらも、成功しても失敗してもnullしか表示されません
初回のみ、noticeがいっぱい出ますが問題ありません。
Psy Shell v0.10.4 (PHP 7.4.11 — cli) by Justin Hileman
>>> Datadog::event('An test error occurred.',array( 'text' => 'Test Info message','alert_type' => 'error'));
=> null
>>> Datadog::increment('my.sweet.metrics');
=> null
>>>
うまく送信できていれば、以下のようにdatadogに表示されています。
他にも色々なログを送信できますが、とりあえずここまで作れば後はドキュメントを読めばなんとかなると思います。
参考URL(ものすごく不親切極まりない公式ドキュメント)