New Relic オンホストインテグレーションでMicrosoft SQL Serverを監視する

New RelicではOS単位のObservabilityを得るためのInfrastructureエージェントがあります。
https://docs.newrelic.co.jp/docs/infrastructure

さらに、OSの上で動くデータベースをはじめとする（いわゆる）ミドルウェアのObservabilityを得るためにOn-Host Integration（OHI）と呼ばれる機能があります。OHIはInfrastructureエージェントにインテグレーションごとに追加していきます。InfrastructureエージェントをインストールしているOS上のミドルウェアも監視できますし、エージェントごとに定められた方法で接続可能であればリモートにインストールされたミドルウェアも監視可能です。SQL as a Serviceのような、クラウド上のサービスとして提供されるミドルウェアでホストにアクセスできない場合でも、別のホストにインストールしたInfrastructureエージェントから監視することが可能です。

https://docs.newrelic.co.jp/docs/integrations/new-relic-integrations/getting-started/introduction-infrastructure-integrations

OHIはNew Relicが提供しているものと、OSSとしてコミュニティから提供されているものがあります。こちらにリストされているように様々なものがあります。

https://docs.newrelic.com/docs/integrations/host-integrations/host-integrations-list
https://docs.newrelic.com/docs/integrations/host-integrations/open-source-host-integrations-list

Integrationは今のところ、ほぼLinuxホストのInfrastrucutreエージェントのみサポートしています。この中で1つだけWindowsホストのみで動くものがあります。今回はそのMicrosoft SQL Serverのインテグレーションを紹介したいと思います。

https://docs.newrelic.co.jp/docs/integrations/host-integrations/host-integrations-list/mssql-monitoring-integration

Infrastructureエージェント本体はWindows Serverのみサポートですが、監視対象とするSQL Serverは（接続可能である限り）2008 R2 SP3以降をサポートしており、コンテナ上のSQL ServerやLinuxサーバー上のSQL Serverも監視可能です。

インストール手順も非常に簡単です。Infrastructure エージェントをインストールしていない場合はいくつかインストールの手順がありますが、インストーラーを利用する場合はこちらの手順ですぐにインストールできます。

https://docs.newrelic.com/docs/infrastructure/new-relic-infrastructure/installation/install-infrastructure-windows-server

次にデータベース監視用のログインとユーザー、および権限設定を行います。データベースに接続し、以下のコマンドを実行します。なお、日本語版(未翻訳)のドキュメントだとGRANT文の対象が`user_name`になっていますが、`login_name`の誤りだと思われます。修正依頼中ですのでお待ちください。

```sql
USE master;
CREATE LOGIN <login_name> WITH PASSWORD = 'tmp_password';
CREATE USER <user_name> FOR LOGIN <login_name>;
GRANT CONNECT SQL TO <login_name>;
GRANT VIEW SERVER STATE TO <login_name>;
```

参考:
https://docs.microsoft.com/ja-jp/sql/t-sql/statements/grant-server-permissions-transact-sql?view=sql-server-2017

次に以下のSQLでREAD権限を設定します。

```sql
DECLARE @name NVARCHAR(max)
DECLARE db_cursor CURSOR FOR
SELECT NAME
FROM master.dbo.sysdatabases
WHERE NAME NOT IN ('master','msdb','tempdb','model')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0
BEGIN
    EXECUTE('USE "' + @name + '"; CREATE USER user_name FOR LOGIN login_name;' );
    FETCH next FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
```

準備ができたらインテグレーションをダウンロードしてインストールします。

```powershell
Invoke-WebRequest http://download.newrelic.com/infrastructure_agent/windows/integrations/nri-mssql/nri-mssql-amd64.msi -OutFile nri-mssql-amd64.msi
msiexec.exe /qn /i nri-mssql-amd64.msi
```

インストールすると、`C:\Program Files\New Relic\newrelic-infra\integrations.d\mssql-config.yml.sample`というサンプル設定ファイルがあるので、`mssql-config.yml`にリネームして必要な内容を設定します。詳細な設定はドキュメントにありますが、例えば`sqsvronwin`と`sol.westus2.cloudapp.azure.com`にある2つのインスタンスを監視する場合はこのようになります。前者はInfraエージェントと同じホストにインストールしたインスタンス、後者はAKS上で動いているLinuxコンテナのインスタンスです。

```yaml
integration_name: com.newrelic.mssql
instances:
  - name: sqsvronwin
    command: all_data
    arguments:
      hostname: sqsvronwin
      username: nr_user
      password: <password>
      port: 1433
    labels:
      env: production
      role: mssql
      type: vm
  - name: sol-k8s
    command: all_data
    arguments:
      hostname: sol.westus2.cloudapp.azure.com
      username: nr_user
      password: <password>
      port: 1433
    labels:
      env: production
      role: mssql
      type: k8s
      app: contoso
```

設定が終わったらInfrastructureエージェントを再起動して反映させます。

```powershell
Restart-Service newrelic-infra
```

数分するとダッシュボードで確認できます。Infrastrucutreダッシュボードの`Third-party services`の`Active Integrations`に`MSSQL dashboard`へのリンクが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/6e55c035-1ba2-628b-f401-34cb7909bc12.png)

ここのダッシュボードではこのようなメトリクスを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/a387d595-9e7e-e1b7-59c7-3bc09c6d0921.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/2b52b08e-3a26-b205-97b2-176231820af6.png)

デフォルトでは監視しているインスタンス全てが表示されますが、適宜フィルターすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/37f3913f-5fe6-6369-e27d-0b1c37a33ec8.png)

収集している全てのメトリクスについてはドキュメント下部の`Metric data`セクションを参考にしてください。大きく分けて、データベース、インスタンス、待機の3つのカテゴリに分かれています。

https://docs.newrelic.co.jp/docs/integrations/host-integrations/host-integrations-list/mssql-monitoring-integration#metrics

また、`sp_configure`ストアードプロシージャと`sys.configurations`テーブルから収集して設定パラメーターをインベントリ機能から参照することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/008bfdbb-b3f8-0d53-f461-d07ed67c9c5e.png)

今の所収集できるメトリクスのカスタマイズなどはできませんが[^1]、このような機能が用意されています。ぜひご活用ください。

[^1]: インテグレーションSDKを使ってインテグレーションそのものを自分で作成することは可能