はじめに
New Relic Flexを使ってSystemDタイマー(systemctl --type=timer)を監視する設定を行いました。 本記事では、構築の手順だけでなく、最初に躓いた「コマンド出力形式(Key-Value vs 表形式)」の技術的なハマりポイントについても共有したいと思います。
New Relic Flexとは
簡単にいうとNew Relicにメトリクスを送ってくれるものです。
New Relicは、AWSやGoogle Cloudなどにインテグレーションすることでメトリクスを収集することができます。基本的なモニタリングがインテグレーションすればいいですが、場合によってはインテグレーションでは取れないメトリクスも存在します。
そんな時に役に立つのが、「New Relic Flex」というツールになります!
New Relic Flexで自分が取得したいメトリクスを定義してあげれば、New Relicに送信してくれます!
試行錯誤:Key-Value形式の罠
最初は、詳細な情報を取ろうとして systemctl show コマンドの使用を検討しました。しかし、これはFlexの仕様とかみ合わず、採用を見送りました。
環境
今回は、Amazon Linux 2023で検証してみます。
また、事前にInfrastructure Agentをインストールする必要があります。
(公式ドキュメント:Infrastructureエージェントをインストールする)
1. 失敗アプローチ:systemctl show
このコマンドを実行すると、以下のような Key=Value形式 で出力されます 。
Id=logrotate.timer ActiveState=active
なぜFlexでうまくいかないのか
Flexの標準的なパース機能である split: horizontal は、「1行が1つの独立したメトリクス(レコード)である」という前提で設計されています 。 しかし、上記のKey-Value形式では、「1行目にはIDの情報しかない」「2行目にはステータスの情報しかない」という状態です。
これをFlexに取り込むと、「IDだけのデータ」と「ステータスだけのデータ」がバラバラのイベントとして送信されてしまい、「どのタイマーがActiveなのか」を紐付けることが困難になります。
New Relicで確認すると意図しないフォーマットで取り込まれてしまいました。

解決策:表形式(Table)の採用
そこで、出力が行列で整理されている systemctl --type=timer でやってみました。
$ systemctl --type=timer --no-page --no-legend --all
出力例:
logrotate.timer loaded active waiting logrotate.service
設定ファイル(YAML)の作成
/etc/newrelic-infra/integrations.d/sample.yaml を作成します 。
integrations:
- name: nri-flex
config:
name: systemctl
apis:
- name: systemtimer
commands:
# 必要な情報を1行に収めるためのオプションを指定
- run: systemctl --type=timer --no-page --no-legend --all
split: horizontal
# 各カラムのヘッダー定義
set_header: [unit, load, active, sub, description]
regex_match: true
split_by: (\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.*)
動作確認
設定ファイルを作成したら、想定通りに動作しているかを確認することができます。
公式では /var/db/... ですが、Amazon Linux 2023環境では /opt/... 配下
/opt/newrelic-infra/newrelic-integrations/bin/nri-flex -config_file /etc/newrelic-infra/integrations.d/sample.yaml | jq .
New Relicでの確認
New Relicの管理画面でクエリ(NRQL)を投げて確認します。以下のようにテーブル形式で各タイマーのステータス(Active/Inactive)が取得できていれば成功です!

まとめ
- Flexを使う際は、コマンドの出力が「1行=1レコード」になっているかを意識する 。
systemctl show(Key-Value) はFlexで扱いづらいため、systemctl --type=timer(Table) を活用するのが有効なアプローチです。- 正規表現
split_byを活用することで、自由なフォーマットを取り込める 。