New Relic Flexの定義をデバッグしたい

# なぜこの記事を書いたのか

任意のデータをNew RelicのDBへ送信できるNew Relic Flexを使って複数のAPIを組み合わせてデータをNew Relicに統合してきました。その際に同じデータを大量に送信したりAPIのエラーでデータが送信されなかったり苦労したためデバッグ方法をここにまとめます。同じデータを2000件以上送信して原因がわからず頭を抱える不幸な人が今後生まれないといいな…。

New Relic Flexの概要については[こちら](https://docs.newrelic.com/jp/docs/infrastructure/host-integrations/host-integrations-list/flex-integration-tool-build-your-own-integration)を参照してください。
任意のデータをNew RelicのDBへ送信する機能でNew Relicがサポートしていない製品の情報でも統合できる便利な機能です。

# 対象読者
* New Relic Flexをこれから使いたいけどどういったデータが送信されるのか確認しながら設定したい方
* データがNew Relic Oneに反映されないけど設定ファイルのどこに問題があるか調査したい方

# 事前準備
* EC2 ( Amazon Linux2 )を用意
* EC2にNewRelic Infrastructure agentをインストール

# 定義ファイルの作成
作業用のディレクトリ配下にyaml形式で定義ファイルを作成します。
```sample-nrflex.yml
integrations:
  - name: nri-flex
    interval: 60s
    config:
      name: linuxUptimeIntegration
      apis:
        - name: Uptime
          commands:
            - run: 'cat /proc/uptime'
              split: horizontal
              split_by: \s+
              set_header: [uptimeSeconds,idletimeSeconds]
```

上記の定義ファイルの内容について説明します。

cat /proc/uptimeを実行して取得した「システムが起動してから経過した合計秒数」と「アイドル状態で経過した合計時間の秒数」にそれぞれ「uptimeSeconds」と「idletimeSeconds」というヘッダーを付与してNew Relicへ送信します。

# 送信されるデータの確認
以下のコマンドを実行すると定義ファイルの実行結果が出力されます。
```
sudo /var/db/newrelic-infra/newrelic-integrations/bin/nri-flex -config_file sample-nrflex.yml
```
```
INFO[0000] com.newrelic.nri-flex                         GOARCH=amd64 GOOS=linux version=1.6.0
WARN[0000] config: testing agent config, agent features will not be available 
INFO[0000] flex: completed processing configs            configs=1

{
	"name": "com.newrelic.nri-flex",
	"protocol_version": "3",
	"integration_version": "1.6.0",
	"data": [
		{
			"metrics": [
				{
					"event_type": "UptimeSample",
					"idletimeSeconds": 2521.08,
					"integration_name": "com.newrelic.nri-flex",
					"integration_version": "1.6.0",
					"uptimeSeconds": 2578.14
				},
				{
					"event_type": "flexStatusSample",
					"flex.Hostname": "ip-172-31-40-6.ap-northeast-1.compute.internal",
					"flex.IntegrationVersion": "1.6.0",
					"flex.counter.ConfigsProcessed": 1,
					"flex.counter.EventCount": 1,
					"flex.counter.EventDropCount": 0,
					"flex.counter.UptimeSample": 1,
					"flex.time.elapsedMs": 5,
					"flex.time.endMs": 1671081996304,
					"flex.time.startMs": 1671081996299
				}
			],
			"inventory": {},
			"events": []
		}
	]
}
```

上記のdata.metrics.event_typeがUptimeSampleのブロックが連携したいデータです。ヘッダーに設定した通り、「uptimeSeconds」と「idletimeSeconds」に値がセットされていることが確認できます。定義ファイルに問題があるとデータがセットされないため定義内容を見直しましょう。

次に定義ファイルを所定のディレクトリへコピーしてNew Relicへデータが送信されていることを確認します。

# New Relicで送信されたデータを確認

New Relic Infrastructure agentをインストールすると/etc/newrelic-infra/integrations.dディレクトリが作成されます。
このディレクトリ配下に今回作成した定義したファイルをコピーします。コピーしたあとは、systemctl restart newrelic-infra.serviceを実行しておきましょう。

event_typeに設定されたUptimeSampleというEventでNew RelicのDBに登録されるので、Data explorerで見てみましょう。
![SS_Flex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/15dda4b2-1f87-6f37-fa28-0e708b009d9b.png)
このようにUptimeSampleに追加したヘッダーができており、値が記録されていることが確認できます。

# こんな使い方はいかがですか

New Relic Flexが対応しているデータソースはコマンド、ファイル、APIなどのURLです。
私は複数のAPIを組み合わせてファイルサーバのフォルダごとのファイル数を取得したり、New RelicがインストールできないOSのリソース使用量を取得したりしてNew Relicへデータを統合しています。

New Relic Flexを使うと外部に公開していないAPIの疎通確認やサーバの死活監視（ICMPのping）も実現できます。

詳しく知りたい方は[こちら](https://github.com/newrelic/nri-flex)を参考にしてください。

参考

https://newrelic.com/jp/blog/how-to-relic/how-to-use-new-relic-flex

https://newrelic.com/jp/blog/how-to-relic/flex-integration-serverless