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 drationをmetrics_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