New Relic によるプロセス・サービスモニタリングの設定ポイント

# はじめに
New Relic でSeniorTechnicalSupportEngineerをしている九龍です。



New Relic ではInfrastructure Agentを利用してOSのプロセス情報
Windows Serviceの情報を収集することが出来ます。

これらの設定はデータ量が多いためデフォルトでは収集せず、明示的に設定を行ったりガイド付きインストールによって自動化する必要があります。

これらの設定には似たようなパラメーターやあまり認知されていないパラメーターもあるため、よく（社内で）問合せされるパラメーターについて解説をしたいと思います。

# プロセスモニタリング設定
New Relic Infrastructure ではOSのリソース情報だけではなくプロセス毎のCPU,Memory、Storage、Networkの利用状況を簡単に収集することが出来ます。

この機能は以下の場合に動作するようになります。

1. Infra Agentを[ガイド付きインストール](https://docs.newrelic.com/jp/docs/infrastructure/host-integrations/installation/new-relic-guided-install-overview/)でインストールした場合（自動的に下記の設定が追記されます。）
1. `enable_process_metrics` を 手動で`true` に[設定](https://docs.newrelic.com/jp/docs/infrastructure/install-infrastructure-agent/configuration/infrastructure-agent-configuration-settings/)した場合

これによってOS内部で動作している各種プロセス毎のリソース情報が収集されるようになります。

## コマンドライン引数の収集
プロセスモニタリングは情報漏洩リスクを軽減するためデフォルトではコマンドライン引数の情報を収集しません。
データを分析する際にコマンドライン引数まで含めて識別する必要がある場合にはコマンドライン引数の削除を無効化する必要があります。

`strip_command_line` を `false` に[設定](https://docs.newrelic.com/jp/docs/infrastructure/install-infrastructure-agent/configuration/infrastructure-agent-configuration-settings/#strip-command-line)することによって コマンドライン引数も収集されるようになります。

## 対象プロセスのフィルタリング
全てのプロセス情報を収集することによって自分たちが意図していないプロセスがリソースを浪費しているなどの問題に気づく事ができます。
適切な分析のためには全てのプロセス情報を収集することをおすすめします。

しかし、コスト制約などによって特定のプロセスの稼働状況だけを把握したい場合には指定したプロセスの情報だけを収集することも可能です。

`include_matching_metrics` Blockでプロセス名やコマンドライン引数を文字列もしくは正規表現で一致するプロセスの情報だけを収集するように指定する事ができます。

[Infrastructure Agent v1.57.0以降では`exclude_matching_metrics`で除外設定も行えるようになりました。]
```newrelic-infra.yml
include_matching_metrics: # You can combine attributes from different metrics
    process.name:
      - regex "^java"    # Include all processes starting with "java"
    process.executable:
      - "/usr/bin/python2"              # Include the Python 2.x executable
      - regex "\\System32\\svchost"     # Include all svchost executables
```

## Memoryを消費していないプロセスの情報を収集する
New Relic Infrastructure では、プロセスを消費している≒システムに負荷をかけているプロセスを分析することに主眼を置いているため、リソースを消費していない（メモリ消費をしていない）プロセスの情報は収集されません。

待機系プロセスなどの死活監視のために、メモリを消費していないプロセスの情報を収集し続ける必要がある場合にはこのフィルタを無効化する必要があります。

`disable_zero_mem_process_filter` を `true`に[設定](https://docs.newrelic.com/jp/docs/infrastructure/install-infrastructure-agent/configuration/infrastructure-agent-configuration-settings/#disable-zero-mem-process-filter)すればメモリを消費していないプロセスの情報も収集されるようになります。

※これはゼロメモリのプロセスフィルターを設定をdisable（無効）にするをtrueにするという事です。
ドラクエ風に表現すると設定値が理解しやすいと思います。

ゼロメモリーのプロセスフィルターをdisabled（無効）にしますか？
・はい（True）
・いいえ(false)

# Windows サービスのモニタリング
New Relic Infrastructure でWindows サービスの状態をモニタリングする場合には[Windows services integration](https://docs.newrelic.com/jp/docs/infrastructure/host-integrations/host-integrations-list/windows-services-integration/) を利用します。
これによって、Windows サービスの状態（実行中、停止中など）や開始モード（自動、手動）などの設定値を収集することが出来ます。
これらの値は`Metric` Sampleに収集されます。

動作していないサービスを検出するNRQLは以下のようになります。

```SQL
SELECT count(*) FROM Metric WHERE metricName = 'windows_service_state' AND state != 'running' FACET hostname, service_name
```
Windows services integrationでは各種アプリケーションのサービス情報を収集します。
Windows OS 自体のサービス情報（Win32.*）は収集しません。
Windows OS 自体の内部サービスの情報も収集する必要がある場合は`winservices-config.yml
`で以下のようにWin32 サービスを含めるように設定します。

```winservices-config.yml
integrations:
  - name: nri-winservices
    config:
      exporter_bind_address: 127.0.0.1  
      exporter_bind_port: 9182
      include_matching_entities:
        windowsService.name:
          - regex "win32.*"
          - "newrelic-infra"
      scrape_interval: 30s
    timeout: 60s
```

## Inventoryに記録されるサービス
Infrastructure Agentには`windows_services_refresh_sec` というパラメータが存在します。
このパラメーターもWindowsのサービスの情報を収集しますがこのパラメータによって収集されたWindows サービス情報は上記の**Windows services integration** とは関連がありません。
`windows_services_refresh_sec` によって収集されたデータはInventoryと`InfrastructureEvent`Sampleに記録されます。
以下のように設定した場合にはInfrastructureEventおよびInventoryへのWindows サービス情報の登録が停止します。

```YML
windows_services_refresh_sec : -1
```


# まとめ

プロセス情報・サービス情報を収集することによって、単なるサーバーリソースの監視では無く一体どのようなプロセス、サービスにリソースが消費されているのか本来目的としているサービスに利用されるべきサーバーリソースが想定外のプロセスに浪費されていないかなどを確認することが出来るようになります。
これにより、スケールアウトではなくスケールアップが適しているなどの適切なサービス構成を計画する事が出来るようになります。

New Relic Infrastructure Agentのパラメーターを適切に設定してよりよいInfrastructure オブザーバビリティを実現してください。