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エージェントから監視することが可能です。

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のインテグレーションを紹介したいと思います。

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

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

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

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権限を設定します。

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

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

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にリネームして必要な内容を設定します。詳細な設定はドキュメントにありますが、例えばsqsvronwinsol.westus2.cloudapp.azure.comにある2つのインスタンスを監視する場合はこのようになります。前者はInfraエージェントと同じホストにインストールしたインスタンス、後者はAKS上で動いているLinuxコンテナのインスタンスです。

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エージェントを再起動して反映させます。

Restart-Service newrelic-infra

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

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

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

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

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

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


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