TL;DR
Components
- Laravel
- Datadog
- APM
- Logs
概要
DatadogでAPMとLogを連携できるらしいので、試した。
だいぶハマった。
完成図
Laravelプロジェクトの作成
$ composer create-project --prefer-dist laravel/laravel <YOUR PROJECT NAME>
Dockerize
雑にコンテナに固める。
詳細は以下。特別なことは特にしてないはず。。。。
dockerize by y-ohgi · Pull Request #1 · y-ohgi/datadog-laravel
Datadog
APMの有効化、ログの整形、Datadogサイドカーの用意をする
APMの有効化
Dockerfile
へDatadogのパッケージをインストールして、Datadogのコンテナをサイドカーで動かすとよしなに動く。
サイドカーとして追加する時、phpのコンテナからDatadogのコンテナへ疎通するために環境変数を書き換える必要があることに注意(Dockerのネットワークでコンテナ間の疎通はDNSを使用するお作法にのっとる。コード的には以下
https://github.com/y-ohgi/datadog-laravel/pull/2/files#diff-eb672b1ddd3aa7dae5f2577f38daa271R18
ログの整形
Datadogの trace_id
をログへ出力するよう、Monologのドライバを書いてやる必要あり。
// app/Logging/DatadogFormatter.php <?php namespace App\Logging; use \Illuminate\Log\Logger; /** * Datadogへ対応したログへ整形を行う */ class DatadogFormatter { /** * APMで出力されたTraceIdをログへ追加 * * @param \Illuminate\Log\Logger $logger * @return void */ public function __invoke(Logger $logger) { foreach ($logger->getHandlers() as $handler) { // extraへ"url", "ip" ,"http_method", "server", "referrer"を追加 $handler->pushProcessor(new \Monolog\Processor\WebProcessor()); // extraへ"file", "line", "class", "function"を追加 $handler->pushProcessor(new \Monolog\Processor\IntrospectionProcessor()); // Datadog APMとログを紐付けるために、 "trace_id" を追加 $handler->pushProcessor(function ($record) { $span = \DDTrace\GlobalTracer::get()->getActiveSpan(); if (null === $span) { return $record; } $record['dd.trace_id'] = $span->getTraceId(); return $record; }); } } }
https://github.com/y-ohgi/datadog-laravel/pull/2/files#diff-c6220e830749944811b2d9641f16adf5R1
標準出力へよしなに吐き出すため、phpのコンフィグも書き換える。
主に標準出力する際にログへ装飾が行われることの制御(OFFにする)と、アクセスログをOFFにする。
https://github.com/y-ohgi/datadog-laravel/pull/2/files#diff-b88834a778003b9a23b9cea63567fb72R1
Datadogサイドカーの用意をする
コンテナを用意してやる
https://github.com/y-ohgi/datadog-laravel/pull/2/files#diff-eb672b1ddd3aa7dae5f2577f38daa271R35
まとめ
あとはメトリクス監視だけしてあげればLaravelの基本的な監視はできるはず