LoginSignup
4
3

More than 5 years have passed since last update.

docker-composeのPHPでDatadogAPMを試してみる

Last updated at Posted at 2018-11-09

docker-composeでDatadog Agentを使うの続きです。

準備

とりあえず
https://github.com/DataDog/dd-trace-php/blob/master/docs/getting_started.md
を元に進めていきます。
(コンテナにdd-trace-phpをあらかじめ設定するのは一旦後回しで・・・)

上のドキュメントには

mkdir dd-trace
cd dd-trace
curl -L https://github.com/DataDog/dd-trace-php/archive/v0.2.5.tar.gz | tar x --strip-components=1
phpize # generate files needed to build PHP extension
./configure
make
sudo make install

と書かれていますが、curlコマンドを実行するとxオプションが無いとエラーで怒られるのでこの行だけ

curl -L https://github.com/DataDog/dd-trace-php/archive/v0.2.5.tar.gz | tar xz --strip-components=1

とzオプションを加えて実行すれば良さそうな感じでした。
(コンテナによってはMakeコマンド使えないかもしれないので、「yum install make」とかで入れておいてください)

「Enabling the extension」に書かれている

dd.ini
extension=ddtrace.so

の設定を追加するのを忘れないようにする。「/etc/php.d/」以下とかに追加して

php -m | grep ddtrace

このコマンドで確認しておく。この辺りはドキュメント通りに進めていけばOK。

前回設定したdocker-compose.ymlを使います

docker-compose.yml
  hogehoge:
    image: hogehoge
    container_name: hogehoge
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./httpd/vhosts.conf:/etc/httpd/conf.d/vhosts.conf
      - ./admin/:/var/www/
    links:
      - dd-agent:dd-agent
    depends_on:
      - dd-agent

  dd-agent:
    container_name: dd-agent
    image: datadog/docker-dd-agent
    environment:
      - API_KEY=[API_KEY]
      - DD_APM_ENABLED=true
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /proc/mounts:/host/proc/mounts:ro
     - /sys/fs/cgroup:/host/sys/fs/cgroup:ro
    ports:
      - "8126:8126/tcp"

APMを使う場合、Datadog Agent側に

DD_APM_ENABLED=true

この設定を忘れないようにする。

endpoint設定

Advanced APM Setupに書かれたManual Instrumentationと
dd-trace-phpに書かれたUsing the tracerを元にそれっぽいサンプルを作ってみる。
んだけど、そのままじゃ動かなくて一部変えないといけない所の説明。
DDTrace/Transport/Http.phpのDEFAULT_ENDPOINTがlocalhostを向いているのでDatadog Agentを向くようにする。

DDtrace/Transport/Http.php
final class Http implements Transport
{
    const DEFAULT_ENDPOINT = 'http://localhost:8126/v0.3/traces';

    /**
     * @var Encoder
     */
    private $encoder;

    /**
     * @var array
     */
    private $headers = [];

    /**
     * @var array
     */
    private $config;

    /**
     * @var LoggerInterface
     */
    private $logger;

    public function __construct(Encoder $encoder, LoggerInterface $logger = null, array $config = [])
    {
        $this->encoder = $encoder;
        $this->logger = $logger ?: new NullLogger();
        $this->config = array_merge([
            'endpoint' => self::DEFAULT_ENDPOINT,
        ], $config);

        $this->setHeader('Datadog-Meta-Lang', 'php');
        $this->setHeader('Datadog-Meta-Lang-Version', \PHP_VERSION);
        $this->setHeader('Datadog-Meta-Lang-Interpreter', \PHP_SAPI);
        $this->setHeader('Datadog-Meta-Tracer-Version', Version\VERSION);
    }

実装を見るとconfigがarray_mergeになっているので、endpointを渡せば良さそうに見えるので

AdvancedAPMSetupとdd-trace-phpのsampleMergeしたやつ
<?php
use DDTrace\Tracer;
use DDTrace\Transport\Http;
use DDTrace\Encoders\Json;
use OpenTracing\GlobalTracer;
use DDTrace\Tags;
use DDTrace\Types;

$tracer = new Tracer(
    new Http(
        new Json(),
        null,
        [
            'endpoint' => 'http://dd-agent:8126/v0.3/traces',
        ]
    )
);
GlobalTracer::set($tracer);
$scope = GlobalTracer::get()->startActiveSpan("web.request");
$span = $scope->getSpan();
$span->setResource('testResource');
$span->setTag(Tags\SPAN_TYPE, Types\WEB_SERVLET);
$span->setTag('http.method', 'testMethod');
$span->finish();
GlobalTracer::get()->flush();

HttpとJsonは

use DDTrace\Transport\Http;
use DDTrace\Encoders\Json;

こいつらをuseして使えるようにする。
あとは上に書いた通りendpointをDatadog Agentの名前に書き換える。

で、
apm.png
とりあえず無事動いた模様。
DatadogAPMが対応しているframework使ったらきっともっと楽にできるはず。

※ API_KEY見た人はスーパー察してください

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3