docker-compose環境のlaravelでdatadogにカスタムメトリクスやイベントを送信する方法

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を動かしているホストから送信してみます。
なお、成功しても失敗しても何も表示されません :disappointed_relieved:

```
echo "deploys.test.myservice:1|c" | nc -w 1 -u 127.0.0.1 8125
```

### Tinkerからメトリクス・イベントを送信

こちらも、成功しても失敗してもnullしか表示されません :disappointed_relieved:
初回のみ、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に表示されています。

![スクリーンショット 2020-11-01 13.29.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266846/e6e14267-d58c-8db8-255e-32e88e1e701b.png)
![スクリーンショット 2020-11-01 13.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266846/cec1c076-08f6-6471-c28f-ba2b923815ac.png)

他にも色々なログを送信できますが、とりあえずここまで作れば後はドキュメントを読めばなんとかなると思います。

## 参考URL（ものすごく不親切極まりない公式ドキュメント）

https://docs.datadoghq.com/ja/developers/dogstatsd/?tab=agent

https://docs.datadoghq.com/ja/developers/events/dogstatsd/?tab=php