DatadogでAPMとLogsを良い感じに連携させる

TL;DR

  • Laravelでロギングする時のTips
  • アクセスログAPMがあるのであえて取得しないように書いた

Components

  • Laravel
  • Datadog

概要

DatadogでAPMとLogを連携できるらしいので、試した。
だいぶハマった。

完成図

f:id:y-ohgi:20190603225012p:plain

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の基本的な監視はできるはず