Dockerですでに実行されているSQL ServerインスタンスのシブリングコンテナとしてNRDOT Collectorを使用して、SQL Serverの監視を設定します。
ヒント
これを大規模に自動化するか、代わりにKubernetesで実行することをお考えですか?Ansibleのインストール、Chefのインストール、またはHelmチャートのインストールを参照してください。
前提条件
- ホストにインストールされているDocker。
- すでに実行中のSQL Serverコンテナ(SQL Server 2017以降)があり、その内部で
sqlcmdユーティリティが利用可能である必要があります。Microsoftのmssql-serverイメージでは、これが/opt/mssql-tools18/binまたは/opt/mssql-tools/binの下にバンドルされています。 sysadminサーバーロール(または同等のもの)のログインとそのパスワード。- NewRelicライセンスキー。
- コレクターコンテナからNew Relic OTLPエンドポイントへのネットワーク接続。
監視ユーザーを作成し、権限を付与します。
docker execを使用して、SQL Serverコンテナ内でgrantスクリプトを実行してください。<YOUR_MSSQL_CONTAINER_NAME>、<YOUR_ADMIN_USERNAME>、<YOUR_ADMIN_PASSWORD>、<YOUR_DB_USERNAME>、および<YOUR_DB_PASSWORD>を独自の値に置き換えてください。イメージに合わせてsqlcmdのパス(/opt/mssql-tools18/bin/sqlcmdまたは/opt/mssql-tools/bin/sqlcmd)を調整してください。
$docker exec -i <YOUR_MSSQL_CONTAINER_NAME> /opt/mssql-tools18/bin/sqlcmd \> -S localhost -U <YOUR_ADMIN_USERNAME> -P '<YOUR_ADMIN_PASSWORD>' -C \> -Q "$USE [master];$GO$CREATE LOGIN [<YOUR_DB_USERNAME>] WITH PASSWORD = '<YOUR_DB_PASSWORD>';$GO$-- Instance-level permissions$GRANT VIEW SERVER STATE TO [<YOUR_DB_USERNAME>];$GRANT VIEW ANY DEFINITION TO [<YOUR_DB_USERNAME>];$GRANT VIEW ANY DATABASE TO [<YOUR_DB_USERNAME>];$GO$-- Grant read access privileges to all user databases$DECLARE @name SYSNAME;$DECLARE db_cursor CURSOR READ_ONLY FORWARD_ONLY FOR$SELECT [name]$FROM [master].[sys].[databases]$WHERE [name] NOT IN ('master', 'msdb', 'model', 'rdsadmin', 'distribution')$AND [state] = 0;$OPEN db_cursor;$FETCH NEXT FROM db_cursor INTO @name;$WHILE @@FETCH_STATUS = 0$BEGIN$ BEGIN TRY$ EXEC('USE [' + @name + '];$ IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = ''<YOUR_DB_USERNAME>'')$ BEGIN$ CREATE USER [<YOUR_DB_USERNAME>] FOR LOGIN [<YOUR_DB_USERNAME>];$ END;$ GRANT VIEW DATABASE STATE TO [<YOUR_DB_USERNAME>];');$ END TRY$ BEGIN CATCH$ PRINT 'Error on ' + @name + ': ' + ERROR_MESSAGE();$ END CATCH$ FETCH NEXT FROM db_cursor INTO @name;$END$CLOSE db_cursor;$DEALLOCATE db_cursor;$GO$"ヒント
このスクリプトは、実行時にONLINEであるデータベース(master、msdb、model、rdsadmin、およびdistributionを除く)に対してのみ、データベースレベルのユーザーを作成し、権限を付与します。モニターしたい新しいデータベースを追加するたびに、再実行してください。
(オプション)ログインとそのサーバーレベルの権限を確認します:
$docker exec -i <YOUR_MSSQL_CONTAINER_NAME> /opt/mssql-tools18/bin/sqlcmd \> -S localhost -U <YOUR_ADMIN_USERNAME> -P '<YOUR_ADMIN_PASSWORD>' -C \> -Q "SELECT sp.name AS [User], p.permission_name AS [Permission_Granted] FROM sys.server_permissions p JOIN sys.server_principals sp ON p.grantee_principal_id = sp.principal_id WHERE sp.name = '<YOUR_DB_USERNAME>';"(オプション)監視ユーザーが認証でき、すべてのデータベースを表示できることを確認します:
$docker exec -i <YOUR_MSSQL_CONTAINER_NAME> /opt/mssql-tools18/bin/sqlcmd \> -S localhost -U <YOUR_DB_USERNAME> -P '<YOUR_DB_PASSWORD>' -C \> -Q "SELECT name FROM sys.databases;"Dockerネットワークの接続を確認してください。
共有のユーザー定義ネットワークを作成し(まだ作成していない場合)、SQL Serverコンテナをそれに接続して、コレクターコンテナが名前で解決できるようにしてください:
$docker network create <YOUR_DOCKER_NETWORK> 2>/dev/null || true$docker network connect <YOUR_DOCKER_NETWORK> <YOUR_MSSQL_CONTAINER_NAME> 2>/dev/null || trueヒント
どちらのコマンドも安全に再実行できます:|| true は、前回の実行による "already exists" または "already connected" エラーを無視します。
NRDOT Collector の設定を作成します
この設定は、nrsqlserverレシーバーを使用した基本的なSQL Server監視に焦点を当てています。現在のディレクトリにmssql-config.yamlを生成するには、Dockerホストで以下を実行します:
$cat << 'EOF' > mssql-config.yaml$receivers:$ nrsqlserver:$ collection_interval: 15s$ username: "<YOUR_DB_USERNAME>"$ password: "<YOUR_DB_PASSWORD>"$ server: "<YOUR_MSSQL_CONTAINER_NAME>"$ port: 1433$
$ # Enable comprehensive database metrics$ metrics:$ sqlserver.database.count:$ enabled: true$ sqlserver.database.io:$ enabled: true$ sqlserver.database.latency:$ enabled: true$ sqlserver.database.operations:$ enabled: true$ sqlserver.database.tempdb.space:$ enabled: true$ sqlserver.database.tempdb.version_store.size:$ enabled: true$ sqlserver.deadlock.rate:$ enabled: true$ sqlserver.os.wait.duration:$ enabled: true$ sqlserver.processes.blocked:$ enabled: true$ sqlserver.memory.grants.pending.count:$ enabled: true$ sqlserver.database.file.size:$ enabled: true$ sqlserver.memory.area:$ enabled: true$
$ # Enable query sample, top query, query plan, and top procedure log collection$ events:$ db.server.query_sample:$ enabled: true$ db.server.top_query:$ enabled: true$ db.server.query_plan:$ enabled: true$ db.server.top_procedure:$ enabled: true$
$ # Top query collection configuration$ top_query_collection:$ lookback_time: 60s$ max_query_sample_count: 1000$ top_query_count: 250$ collection_interval: 60s$ collect_full_query_text: true$ allowed_comment_keys:$ - nr_service_guid$
$ # Query sample collection configuration$ query_sample_collection:$ max_rows_per_query: 100$ collect_full_query_text: true$ allowed_comment_keys:$ - nr_service_guid$
$ # Top stored procedure collection configuration$ top_procedure_collection:$ max_procedure_sample_count: 1000$ top_procedure_count: 250$ collection_interval: 60s$
$ resource_attributes:$ db.system.version:$ enabled: true$ sqlserver.db.edition:$ enabled: true$
$processors:$ memory_limiter:$ check_interval: ${env:NR_MEM_LIMITER_CHECK_INTERVAL:-1s}$ limit_mib: ${env:NR_MEM_LIMITER_LIMIT_MIB:-200}$ spike_limit_mib: ${env:NR_MEM_LIMITER_SPIKE_MIB:-50}$
$exporters:$ otlp:$ endpoint: "<YOUR_NEWRELIC_OTLP_ENDPOINT>:4318"$ headers:$ api-key: "<YOUR_NEWRELIC_LICENSE_KEY>"$ tls:$ insecure: false$ compression: gzip$
$ sending_queue:$ enabled: true$ sizer: bytes$ queue_size: 100_000_000$ num_consumers: 10$ batch:$ sizer: bytes$ max_size: 1_000_000$ min_size: 0$ flush_timeout: 5s$
$service:$ telemetry:$ metrics:$ level: none$
$ pipelines:$ metrics:$ receivers: [nrsqlserver]$ processors: [memory_limiter]$ exporters: [otlp]$
$ logs:$ receivers: [nrsqlserver]$ processors: [memory_limiter]$ exporters: [otlp]$EOF設定パラメーター
| パラメータ | 説明 |
|---|---|
<YOUR_MSSQL_CONTAINER_NAME> | 実行中のSQL Serverコンテナの名前(またはDockerでDNS解決可能なホスト名)。 |
<YOUR_DB_USERNAME> | 監視ユーザーを作成して権限を付与するで作成した監視ログイン。 |
<YOUR_DB_PASSWORD> | 監視ユーザーの作成と権限の付与で作成した監視ログインのパスワード。 |
<YOUR_NEWRELIC_OTLP_ENDPOINT> | New Relic OTLPエンドポイント(ホストのみ、スキームやポートは不要;:4318は自動的に追加されます)。詳細については、New Relic OTLPエンドポイントを参照してください。 |
<YOUR_NEWRELIC_LICENSE_KEY> | あなたのNew Relic ライセンスキー 。 |
完全な設定
この設定は、Docker環境の基本的なデータベース監視に焦点を当てています。利用可能なすべてのメトリクスを使用した包括的な監視を有効にするには、設定リファレンスを参照してください。
NRDOT Collectorコンテナを起動してください。
SQL Serverコンテナと同じDockerネットワークでコレクターを実行してください:
$docker run -d \> --name nrdot-collector \> --network <YOUR_DOCKER_NETWORK> \> -v "$PWD/mssql-config.yaml:/etc/nrdot-collector/mssql-config.yaml" \> newrelic/nrdot-collector:latest \> --config /etc/nrdot-collector/mssql-config.yamlコレクターコンテナが実行されていることを確認します:
$docker ps --filter name=nrdot-collector実行されていない場合は、ログでエラーを確認してください。最も一般的な原因は、mssql-config.yamlでのYAMLインデントの問題、または到達できないSQL Serverコンテナです:
$docker logs nrdot-collectorヒント
mssql-config.yamlを変更した後、コンテナを再起動して変更を適用してください:
$docker restart nrdot-collectorデータを探す、使う
データの収集が開始されると、New Relic UIを通じて包括的なSQL Serverデータベース監視にアクセスできます。
New Relic で SQL Server データベース エンティティを見つけるには:
- one.newrelic.com > All capabilities > Databasesに移動します。
- Entity typeドロップダウンからMSSQL instanceを選択し、Applyをクリックします。
- エンティティのリストから SQL Server データベースを選択します。