はじめに

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 を活用することで、自由なフォーマットを取り込める 。