y-ohgi's blog

TODO: ここになにかかく

NewRelic でtd-agent(fluentd) にメトリクスを監視する

TL;DR

  • NewRelic でtd-agent のメトリクス(retry, buffer, ...)を監視する方法

概要

td-agent でEC2 インスタンス内のログをS3 へ転送していまして、そのtd-agent がちゃんと動いているかをNewRelic agent で監視する方法についてです。

※ NewRelic でロギングを行う方法についてではなく、ロギングを行っているtd-agent をNewRelic で監視する方法についてです。

方法

やることとしてはNewRelic のnri-flex 機能を使用して、td-agent のメトリクスエンドポイントのJSON をそのままNewRelic へ転送を行います。

EC2 インスタンスの準備

AmazonLinux2 を立ててセッションマネージャ経由でssh してroot ユーザーで操作します。
本番はPacker なりImageBuilder なりで適宜。

td-agent のインストールと設定

td-agent のインストール

# curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh

td-agent のコンフィグを設定します。
メトリクス用エンドポイント @type monitor_agent と、動作確認用に適当なログを収集するような設定ファイルを作成します。

# cat <<EOL > /etc/td-agent/td-agent.conf
<source>
  @type monitor_agent
  @id monitor_agent

  bind 0.0.0.0
  port 24220
</source>

<source>
  @type tail
  tag nr-test
  
  path /tmp/source
</source>

<match nr-test>
  @type file
  path /var/log/td-agent/match
</match>
EOL

ログを書き込んで取得できているかの確認

# echo "hoge" >> /tmp/source
# ls -lat /var/log/td-agent/match/
total 8
drwxr-xr-x 2 td-agent td-agent 115 Dec 22 09:48 .
-rw-r--r-- 1 td-agent td-agent  53 Dec 22 09:48 buffer.b5b70a7b130af335726bde2fcc60b9047.log

td-agent のメトリクスエンドポイントを叩いてメトリクスの取得ができるか確認します。
このメトリクスエンドポイントを叩く際、クエリストリングで属性をしていることができます。

# curl -s localhost:24220/api/plugins.json?@type=file | jq
{
  "plugins": [
    {
      "plugin_id": "object:3fcd047f5cb8",
      "plugin_category": "output",
      "type": "file",
      "config": {
        "@type": "file",
        "path": "/var/log/td-agent/match"
      },
      "output_plugin": true,
      "buffer_queue_length": 0,
      "buffer_timekeys": [
        1608595200
      ],
      "buffer_total_queued_size": 0,
      "retry_count": 0,
      "emit_records": 1,
      "emit_count": 1,
      "write_count": 1,
      "rollback_count": 0,
      "slow_flush_count": 0,
      "flush_time_count": 0,
      "buffer_stage_length": 0,
      "buffer_stage_byte_size": 0,
      "buffer_queue_byte_size": 0,
      "buffer_available_buffer_space_ratios": 100,
      "buffer_oldest_timekey": 1608595200,
      "buffer_newest_timekey": 1608595200,
      "retry": {}
    }
  ]
}

NewRelic のライセンスキーを取得

以下のNewRelic ページの右に表示されているlicense key を取得し、NewRelic の設定ファイルに書き込みます。
https://one.newrelic.com/launcher/account-settings-launcher.account-settings-launcher?pane=eyJuZXJkbGV0SWQiOiJhY2NvdW50LXNldHRpbmdzLWxhdW5jaGVyLmFjY291bnQtc2V0dGluZ3MifQ==&platform[accountId]=2924923&platform[timeRange][duration]=1800000&platform[$isFallbackTimeRange]=true

# echo "license_key: <YOUR LISENCE KEY>" > /etc/newrelic-infra.yml

NewRelic agent のインストール

newrelic agent のインストールを行います。

# curl -o /etc/yum.repos.d/newrelic-infra.repo https://download.newrelic.com/infrastructure_agent/linux/yum/el/7/x86_64/newrelic-infra.repo
# yum -q makecache -y --disablerepo='*' --enablerepo='newrelic-infra'
# yum install newrelic-infra -y

NewRelic のnri-flex を有効化し、td-agent のメトリクスを取得する

# cat <<EOL > /etc/newrelic-infra/integrations.d/tdagent-config.yml
integrations:
- name: nri-flex
  config:
    name: tdagent
    apis:
    - event_type: tdagent
      url: http://localhost:24220/api/plugins.json?@type=file
EOL
# systemctl start newrelic-infra td-agent

NewRelic Insights で取得できるのか確認

最後に

nri-flex ではなく custom-plugin で試行錯誤してたのですが心が折れ、NewRelic のサポートの方に泣きついて教えてもらいました。改めてありがとうございます 🙇
個人的に、Datadog を使用する環境だったのでNewRelic を久しぶりに触りました。触ってみると今年の料金プラン改正で課金額が明確になり採用しやすく、NRQL がとても優秀で、なおかつサポートの方が親切で、今後も積極的に使っていきたいなぁと思った次第です(忖度)。