ども。
Datadogのログ収集の話。
本番や開発環境はKubernetesで動いているものの、一部のコンテナは諸事情でDocker on EC2になっている。
このDocker on EC2のログをDatadogで収集したかったのだが、とにかくハマってしまった。
何がしたいのか
さてログを収集するだけならそんなに難しくない。datadog.ymlというconfigでlogs_enabled: true
と設定すれば基本はOK。
ところが、収集したログはあとで簡単に検索したりしたい。
たとえばこういうカラムにしてあってService名やSource名、Env名で絞ったりする。
なので、このService名やSource名はこちらで設定したい(何も設定しないとdocker image名でログが収集されてしまったため)。
それから、このホストで動くコンテナは常時起動しているわけではなくdocker run
で都度実行されるため、dockerのログパスは毎回全部異なることになる。
よって標準出力されたログをDatadogに全部拾って貰う必要がある。
【今回実現したいこと】
- service, source, environmentの値を設定したい
- 標準出力されるログを収集したい
環境
結論から言うとこのバージョンでなら大丈夫。DatadogのAgentバージョンが古いと意図したとおりに動かない。 EC2はさすがに古すぎるとかはないと思うけど……。
- datadog-agent version(Agent 6.18.1 - Commit: 84d743e - Serialization version: 4.25.0 - Go version: go1.12.9)
- AmazonLinux(Amazon Linux AMI release 2017.09)
※agentはホストインストール型
Datadog側でやること
主に設定ファイルを書いていく作業。
datadog.yml
以下、必要な設定だけ抜粋して記述。
dd_url: https://app.datadoghq.com api_key: <YOUR_DD_API_KEY> logs_enabled: true # Autodiscovery listeners: #Autodiscovery機能の有効化 https://docs.datadoghq.com/ja/agent/docker/log/?tab=hostinstallation - name: docker config_providers: - name: docker polling: true logs_config: container_collect_all: true docker_env_as_tags: #後述 RAILS_ENV: environment
conf.d/xxx/conf.yml
/etc/datadog-agent配下にあるconf.d内の設定値
- docker.d/conf.yml
Docker Integrationの設定。
init_config: instances: ## The agent honors the DOCKER_HOST, DOCKER_CERT_PATH and DOCKER_TLS_VERIFY ## environment variables to setup the connection to the server. ## See https://docs.docker.com/engine/reference/commandline/cli/#environment-variables - url: "unix://var/run/docker.sock" new_tag_names: true
- rails.d/conf.yml
今回はrailsを実行するコンテナなのでrails.d/conf.ymlに記述する。
#Log section # - type : (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 attribtue # tags: (optional) add tags to each logs collected ad_identifiers: - <short_image> init_config: instances: - host: "%%host%%" logs: service: <ANY_SERVICE_NAME> source: <ANY_SOURCE_NAME>
<short_image>は、Datadogが実行コンテナに対して付与するもののようだ。
This matches ANY httpd container image on your host. Suppose you have one container running library/httpd:latest and another running
/httpd:v2. The Agent applies the above template to both containers since you have to provide short names for container images, e.g. httpd, NOT library/httpd:latest.
たとえばPullするdocker imageがxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-api:v1
なら、short_imageはhoge-api
になる。
そのshort_imageが同じコンテナのログを自動で検知してログを収集する。
logs:
下にあるservice
, source
の値は、ここで指定した値に上書きすることができる。
なお、何も指定しなければshort_imageの値が自動で入ってくる。
再起動
restart datadog-agent
で設定を読み込ませる。
Docker側でやること
Docker側でやることは次のもの。
docker_env_as_tags
用の記述を加える- 起動時の引数に
-l com.datadoghq.ad.check.id='<ad_identifiers_name>'
を渡す
docker_env_as_tags
最初のdadadog-agent.ymlで指定したこの部分について。
docker_env_as_tags: RAILS_ENV: environment
これはdatadog側にDockerの環境変数 RAILS_ENVの値をDatadogではenvironmentタグをキーとしてマッピングする
と指示するもの。
dockerの環境変数に
RAILS_ENV=development
とあれば、Datadogのenvironmentのカラムにはdevelopmentが入ることになる。
これでenvironmentの値も上書きすることができた。
起動時の引数
docker runをしているなら、引数に-l com.datadoghq.ad.check.id='<ad_identifiers_name>'
を渡す。
例えば
docker run --env-file-/path/to/env.txt $(docker images -q | head -1) bundle exec rails hogecommand -l com.datadoghq.ad.check.id='hoge-api'
みたいな感じ。
Host側でやること(おまけ)
Permission
ログを標準出力しているのにDatadogに転送されないときがある。 忘れてる可能性としては、ログ出力先へのアクセス権がない。
usermod -a -G docker dd-agent
これでOK。
確認
- 各種設定を追加して、
restart datadog-agent
を済ませている - dockerは標準出力するようになっている
- アクセス権もある
ここまでやったら実際にログを吐かせてみる。 意図した通りにログが収集できていれば完了なり。
トラブルシュート
ハマってしまったところ。
どうしてこんなことに……まあできてしまえば何に困ってたんだって感じなんだけど、ハマるときはハマる。
記事内に小さくヒョイって書いてあっても読み落とすので、あえてここに大題にしておく。
datadog-agentのバージョン
最初取り掛かったとき、6.9だったのだが古すぎてAuto Discoveryが機能してなさそうだった。 6系であればなるべく最新くらいにまであげておきたい。
- 6系内で最新化する場合
DD_UPGRADE=true bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)"
Auto Discoveryのad_identifiers
short_imageを指定すべきと理解するまですごい時間がかかった。 ドキュメント穴が開くほど読んだのに……って過信しがち。
おわり
実はサポートと37通ものメールのやりとりをしていた。 昼夜逆なので時間もかかるしつらい。日本人サポートは復活したのだろうか……。