VTRyo Blog

一歩ずつ前に進むブログ

Dockerログ収集にDatadogのAuto Discovery機能を使う

ども。

Datadogのログ収集の話。

本番や開発環境はKubernetesで動いているものの、一部のコンテナは諸事情でDocker on EC2になっている。

このDocker on EC2のログをDatadogで収集したかったのだが、とにかくハマってしまった。

何がしたいのか

さてログを収集するだけならそんなに難しくない。datadog.ymlというconfigでlogs_enabled: trueと設定すれば基本はOK。 ところが、収集したログはあとで簡単に検索したりしたい。

たとえばこういうカラムにしてあってService名やSource名、Env名で絞ったりする。

f:id:vtryo:20200416170217p:plain
Datadog Logsのカラム例

なので、この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の設定。

app.datadoghq.com

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が実行コンテナに対して付与するもののようだ。

docs.datadoghq.com

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の値が自動で入ってくる。

docs.datadoghq.com

再起動

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が入ることになる。

f:id:vtryo:20200416171919p:plain

これでenvironmentの値も上書きすることができた。

docs.datadoghq.com

起動時の引数

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'

みたいな感じ。

docs.datadoghq.com

Host側でやること(おまけ)

Permission

ログを標準出力しているのにDatadogに転送されないときがある。 忘れてる可能性としては、ログ出力先へのアクセス権がない。

usermod -a -G docker dd-agent

これでOK。

確認

  • 各種設定を追加して、restart datadog-agentを済ませている
  • dockerは標準出力するようになっている
  • アクセス権もある

ここまでやったら実際にログを吐かせてみる。 意図した通りにログが収集できていれば完了なり。

f:id:vtryo:20200416173729p:plain

トラブルシュート

ハマってしまったところ。

どうしてこんなことに……まあできてしまえば何に困ってたんだって感じなんだけど、ハマるときはハマる。

記事内に小さくヒョイって書いてあっても読み落とすので、あえてここに大題にしておく。

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通ものメールのやりとりをしていた。 昼夜逆なので時間もかかるしつらい。日本人サポートは復活したのだろうか……。