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 がとても優秀で、なおかつサポートの方が親切で、今後も積極的に使っていきたいなぁと思った次第です(忖度)。