도커에서 이미 실행 중인 SQL Server 인스턴스의 형제 컨테이너로 NRDOT Collector를 사용하여 SQL Server 모니터링을 설정하십시오.
팁
이를 대규모로 자동화하거나 대신 Kubernetes에서 실행하시겠습니까? Ansible 설치, Chef 설치 또는 Helm 차트 설치를 참조하십시오.
전제 조건
- 호스트에 도커가 설치되어 있습니다.
- 이미 실행 중인 SQL Server 컨테이너(SQL Server 2017 이상)로, 내부에
sqlcmd유틸리티를 사용할 수 있어야 합니다. Microsoft의mssql-server이미지는 이를/opt/mssql-tools18/bin또는/opt/mssql-tools/bin에 번들로 포함합니다. sysadmin서버 역할(또는 동등한 역할)의 로그인 및 해당 비밀번호- 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;"도커 네트워크 연결을 확인하십시오.
공유 사용자 정의 네트워크를 생성하고(아직 없는 경우) 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을(를) 생성하려면 도커 호스트에서 다음을 실행하십시오:
$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 컨테이너의 이름(또는 도커 DNS로 해석 가능한 호스트명) |
<YOUR_DB_USERNAME> | 모니터링 사용자 생성 및 권한 부여에서 생성한 모니터링 로그인 |
<YOUR_DB_PASSWORD> | 모니터링 사용자 생성 및 권한 부여에서 생성한 모니터링 로그인의 비밀번호. |
<YOUR_NEWRELIC_OTLP_ENDPOINT> | 뉴렐릭 OTLP 엔드포인트(호스트만 해당, 스키마 또는 포트 없음, :4318은(는) 자동으로 추가됩니다). 자세한 내용은 뉴렐릭 OTLP 엔드포인트를 참조하십시오. |
<YOUR_NEWRELIC_LICENSE_KEY> | 귀하의 New Relic 라이센스 키 . |
전체 설정
이 설정은 도커 환경의 필수 데이터베이스 모니터링에 중점을 둡니다. 사용 가능한 모든 메트릭으로 포괄적인 모니터링을 활성화하려면 설정 참조를 확인하십시오.
NRDOT Collector 컨테이너를 시작하십시오.
SQL Server 컨테이너와 동일한 도커 네트워크에서 수집기를 실행하십시오:
$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데이터 찾기 및 사용
데이터가 수집되면 뉴렐릭 UI를 통해 포괄적인 SQL Server 데이터베이스 모니터링에 액세스할 수 있습니다.
뉴렐릭에서 SQL Server 데이터베이스를 찾으려면 다음을 수행하세요.
- one.newrelic.com > All capabilities > Databases 으)로 이동합니다.
- Entity type 드롭다운 메뉴에서 MSSQL instance을(를) 선택한 다음 Apply을(를) 클릭합니다.
- 모임 목록에서 SQL Server 데이터베이스를 선택합니다.