グリフォン Advent Calendar 2018 2日目の記事を担当しました、エンジニアの西村(大)と申します。
Datadog Log ManagementをDocker Composeで試してみました!
※この記事はGRIPHONE Advent Calendar 2018 2日目の記事です。
https://adventar.org/calendars/3147
https://qiita.com/advent-calendar/2018/griphone
読むのめんどくさい人向けまとめ
試した事
PHPコンテナ内にあるログファイルをLog Managementに出力したい!
結果
Datadog AgentコンテナにPHPコンテナのログファイルをマウントして、そのファイルをDatadog Agentコンテナが読み込むyamlファイルに記述すればLog Managementの画面に出力する事が出来ました。
やりたい事
Docker ComposeでPHPコンテナとDatadog Agentコンテナがある状態のDocker Composeファイルを使ってPHPコンテナ内にあるログファイルをLog Managementの画面に出力させたいと思いました。
Datadog Log Managementとは
The Log Management solution is an all-in-one comprehensive solution that comprises collection, processing, live tailing, exploration, graphing, dashboarding, alerting and archival over all the logs generated by your application, and your infrastructure.
こちらに書いてある内容です。Google翻訳に聞いてみたら
ログ管理ソリューションは、アプリケーション、およびインフラストラクチャによって生成されたすべてのログに対して、収集、処理、ライブテーリング、探索、グラフ作成、ダッシュボード、アラート、アーカイブを含むオールインワンの包括的なソリューションです。
ログをいい感じに出してくれそうなオーラがすごい!
と言う訳で、早速Datadogのドキュメントを見てみましょう!
Datadog Agent version 6 and greater can collect logs from containers. Two installations are possible:
このイメージは「Datadog Agent 5.x Dockerfile」と書かれているので今回Datadog Agentのバージョンはversion 6以上使えとご指定なのでこのイメージを使って試したいと思います!
docker-compose.yamlファイルのサンプル
docker-compose.yamlファイルはこんな感じの内容を書きました。
One-step install to collect all the container logsに設定は概ね書いてあるのでそのまま使えばOKでした。
php:
image: hoge
container_name: php
volumes:
- /etc/localtime:/etc/localtime:ro
- ./httpd/vhosts.conf:/etc/httpd/conf.d/vhosts.conf
- ./php/:/var/www/
links:
- dd-agent:dd-agent
depends_on:
- dd-agent
labels:
com.datadoghq.ad.logs: '[{"service":"php2", "source":"php3", "sourcecategory":"sourcecode"}]'←【後で説明あります】
dd-agent:
container_name: dd-agent
image: datadog/agent:latest
environment:
- DD_API_KEY=【API_Key】
- DD_LOGS_ENABLED=true
- DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
- DD_AC_EXCLUDE="name:dd-agent"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /proc/:/host/proc/:ro
- /opt/datadog-agent/run:/opt/datadog-agent/run:rw
- /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
- ./php:/var/www/←【後で説明あります】
ports:
- "8126:8126/tcp"
Labelsの記述について
下を読んでいくとActivate Log Integrationsに書いてあるLabelsを使えば楽にできるんじゃね?と安直に考えてここで色々試しました。
Labelsを使う際、上のドキュメントには
Datadog Agent 6.2+ allows configuration of log collection directly in Docker container labels.
と書かれているので、Datadog Agentのversionは6.2以上を使いましょう。
PHPコンテナにLabelsを追加して、設定はConfigure your Datadog Agentに書いてあるtypeとpathを指定出来れば終わりなんじゃ?という安直な考えを試してみました。
labels:
com.datadoghq.ad.logs: '[{"type":"file", "path":"hogehoge", "service":"php2", "source":"php3", "sourcecategory":"sourcecode"}]'
が、ダメでしたw
試した限りではLabelsからtypeのfileを指定する事は出来ませんでした。
この時点でPHPコンテナの標準出力はLog Managementの画面に出力されています。
※ここからは推測になります
おそらくCustom log collectionのTail existing filesを見るとここのtypeにdockerというものがあり、Docker ComposeでLabelsを使うとtypeはdockerが指定されていると思われます。
Datadog Agent側にyamlファイルの追加
Configure your Datadog Agentに書かれている、Datadog Agent側にyamlファイルを作る方法でPHPコンテナのログを出したいと思います。
One-step install to collect all the container logsのHost Installationを見ると
Install the latest version of the Agent 6 on your host.
書かれているのでDatadog Agentのversionは6以上使いましょう!(3回目)
ドキュメントにはdatadog.yamlに
logs_enabled: true
を追記するように書かれていますがこの設定を追記しなくても動きました。
Docker ComposeのDatadog Agentのvolumesに
volumes:
- ./php:/var/www/
PHPコンテナのログを出力しているパスをマウントします。
Configure your Datadog Agent を参考にpathをマウントしたものに書き換えたyamlファイルを作成しDatadog Agentコンテナの/etc/datadog-agent/conf.d/以下に置く必要があります。
## Log section
logs:
## - type: file (mandatory) type of log input source (tcp / udp / file)
## port/path: (mandatory) Set port if type is tcp or udp. Set path if type is file
## service: (mandatory) name of the service owning the log
## source: (mandatory) attribute that defines which integration is sending the logs
## sourcecategory: (optional) Multiple value attribute. Can be used to refine the source attribute
## tags: (optional) add tags to each logs collected
- type: file
path: /var/wwww/webroot/test_log
service: fuga
source: php10
sourcecategory: hoge
このファイルを置いてDatadog Agentのコンテナを再起動すればLog Managementの画面に念願のアプリログが出力されていると思います!
最後に
Labelsを使えば簡単に出来るでしょ!と思ったのが良くありませんでした。
今回のようなケースでも、もしかしたらLabelsで出来るかもしれないので、気になった方は是非試して頂ければと思います。
ドキュメントを見ればやり方は書いてあったのでちゃんとドキュメントは読もうという反省しかありませんでした。
最後まで読んでいただいてありがとうございました。