New Relic のプロセス監視を導入してみたので手順をまとめました。

1. New Relic エージェントインストール

まずは以下の手順に従ってNew Relicのエージェントをインストールします。
https://docs.newrelic.com/jp/docs/infrastructure/infrastructure-agent/linux-installation/package-manager-install/

2. newrelic エージェントをインストールしたら、/etc/newrelic-infra.yml を編集します。

設定例

# プロセスメトリクス収集の有効化(trueで有効)
enable_process_metrics: true

# ステータスサーバーの有効化(エージェント監視用)
status_server_enabled: true
# ステータスサーバーのポート番号
status_server_port: 18003

# New Relicライセンスキー(デフォルトで記載されている)
license_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# メモリ使用量0のプロセスを除外するか(trueで除外)
disable_zero_mem_process_filter: false
# コマンドライン引数の収集有無(falseで収集する)
strip_command_line: false

# カスタム属性(追加メタデータ付与)
custom_attributes:
  nr_deployed_by: newrelic-cli  

# プロセスメトリクス設定
process_metrics:
  # newrelic に送信するプロセスを指定。 exclude_metching_metrics で除外も指定できる。
  include_matching_metrics:
    # プロセス名によるフィルタリング(正規表現可能)
    process.name:
      - httpd
      - sshd
      - "^master"
      - "^chronyd"
      - "^java$"

    # 実行ファイルパスによるフィルタリング(完全一致)
    process.executable:
      - /usr/sbin/httpd
      - /usr/sbin/sshd
      - /usr/libexec/postfix/master
      - /usr/sbin/chronyd
      - /bin/java

    # コマンドライン引数によるフィルタリング(ワイルドカード使用可)
    process.command_line:
      - "*odsnmp.xml*"
      - "*deploy.cfg*"

 #サンプリング間隔
metrics_process_sample_rate: 30

解説

enable_process_metrics: true から strip_command_line: false について本記事では、詳細は割愛しますが、例と同じように設定すればとりあえず動きます。

custom_attributes:
好きな属性(タグみたいな)を自由につけることができます。NRQLのWHERE句などで対象を絞るのに使えます。

process.command_line:
例えば設定例に記載の二つは、サーバー上でのプロセス名は java と表示されます。java の中でも特定のこのプロセスを指定したい、というようなときに使えます。

process.name:process.executable:process.command_line: はどれかを設定すれば大丈夫です。(設定例では解説のために過剰な記述になっています。)
例えば、htttpd のプロセスを監視したい時は、process.name:process.executable: のどちらかを設定すれば大丈夫です。
実行ファイルパスが明確なら、process.executable: で指定すればいいし、ファイルパスに関わらずプロセス名が httpd であるもの全てを指定したければ、process.name: を使えばいいです。

metrics_process_sample_rate:
データをサーバーからnewrelicに送信する間隔を定義します。
プロセス数を監視したい場合は、window drationと同じ値に設定する必要があります。
window drationmetrics_process_sample_rateより大きい値に設定した場合、プロセス数が加算されてしまいます。

例えば、
window durationを1分で設定し、metrics_process_sample_rateを20秒で設定した場合、
60秒/20秒で計3回の、データが取得され、3回分の同時実行数が加算されます。

サンプル1 pid=1001 pid=1002 pid=1003
サンプル2 pid=1001 pid=1002 pid=1004
サンプル3 pid=1001 pid=1002 pid=1005

サンプルが上記の通りだった場合、同時実行数はいずれのサンプルも3であるのにも関わらず、同時実行数は9と評価されます。

3. newrelic エージェントの再起動

/etc/newrelic-infra.yml を編集した後は、newrelic エージェントの再起動が必要です。

sudo systemctl restart newrelic-infra

4. プロセスが newrelic に送信されていることを確認

newrelic コンソールのQuery Your Dataから以下のNRQLで、newrelic へ送信された直近10個のプロセスを確認できます。

FROM ProcessSample SELECT * LIMIT 10

以下のように、WHERE句を調整して、設定したプロセスが送信されているか確認できます。

FROM ProcessSample SELECT * LIMIT 10 WHERE hostname IN ('admin2023-01','web2023-02','stg2023-02','cms2023-01') AND  commandName IN ('httpd','master')

5. alert condition 作成

nrql 例

"SELECT filter(Count(*), where processDisplayName = 'httpd') FROM ProcessSample FACET aws.accountId, aws.region, label.Name, provider.ec2InstanceId WHERE aws.accountId = '${var.aws_account_id}' AND tags.cloudpack_newrelic = 'enabled' AND hostname IN ('admin2023-01','web2023-02','stg2023-02','cms2023-01')"

/etc/newrelic-infra.yml 内で、process.command_line: で指定したプロセスは、属性をcommandLineで指定し、RLIKE を使って以下のように作成します。

"SELECT filter(Count(*), where commandLine RLIKE '.*iwutild.cfg.*') FROM ProcessSample FACET aws.accountId, aws.region, label.Name, provider.ec2InstanceId WHERE aws.accountId = '${var.aws_account_id}' AND tags.cloudpack_newrelic = 'enabled' AND hostname IN ('admin2023-01','web2023-02','stg2023-02','cms2023-01')"

参考ドキュメント

https://docs.newrelic.com/jp/docs/infrastructure/infrastructure-agent/configuration/infrastructure-agent-configuration-settings/
https://github.com/newrelic/infrastructure-agent/blob/master/assets/examples/infrastructure/newrelic-infra-template.yml.example