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