Nightingale 集成 SQL Server 监控:Categraf 采集配置、权限授予与告警验证实战
【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale
Nightingale 通过内置的 SQL Server 集成(integration)提供了对本地部署 SQL Server 的监控能力,采集端基于 Categraf 的 sqlserver input 实现,其查询逻辑源自 Telegraf SQL Server input,利用 DMV 与性能计数器获取实例、数据库、IO、内存等维度的指标。本篇指南以 integrations/SQLServer/markdown/README.md 为主体,结合仓库内真实配置文件、告警规则与监控面板,完整讲解从只读监控账号创建、Categraf 配置到数据验证的落地流程,并深入解析database_type、include_query/exclude_query、health_metric等关键参数,以及 SQL Server 2022 与 Always On 环境下的特殊处理。读完本文,你将能够在自己的 SQL Server 实例上复现一套可观测、可告警的完整监控链路。
采集原理:基于 DMV 与性能计数器的 Categraf input
SQL Server 集成并非通过插件式 API 或第三方 agent 实现,而是直接复用 Categraf 的 sqlserver input 插件。该插件的采集逻辑基于 Telegraf SQL Server input,通过连接 SQL Server 实例后执行一系列动态管理视图(DMV)查询与读取性能计数器来获取监控数据。
根据仓库中 integrations/SQLServer/collect/sqlserver/sqlserver.toml 的注释说明,以database_type = "SQLServer"为例,默认启用以下查询组:
SQLServerPerformanceCounters:性能计数器,如Percent Log Used、Page life expectancy、Number of Deadlocks/sec、Processes blocked、Memory Grants Pending等SQLServerWaitStatsCategorized:分类汇总的等待统计SQLServerDatabaseIO:数据库级 IO 延迟与读写计数SQLServerProperties:实例属性,如数据库状态(SUSPECT/OFFLINE 计数)SQLServerMemoryClerks:内存分配情况SQLServerSchedulers:调度器状态SQLServerRequests:当前请求SQLServerVolumeSpace:数据卷剩余空间SQLServerCpu:CPU 使用SQLServerRecentBackups:最近备份状态
另有SQLServerAvailabilityReplicaStates与SQLServerDatabaseReplicaStates两个查询组默认关闭,仅在需要监控 Always On 可用性组时按需启用(详见后文"Always On 环境的处理")。README 说明该方案已使用SQL Server 2022 与 Categraf 完成真实采集验证,因此在 2022 及相近版本上可以直接按本文步骤落地。
第一步:创建只读监控账号
SQL Server 集成需要一个具备只读权限的登录账号,用于执行上述 DMV 查询。请在master数据库中执行以下 SQL:
USE [master]; GO CREATE LOGIN [categraf] WITH PASSWORD = N'<strong-password>'; GO GRANT VIEW SERVER STATE TO [categraf]; GRANT VIEW ANY DEFINITION TO [categraf]; GO各语句的作用如下:
CREATE LOGIN:创建名为categraf的服务器级登录账号,密码请替换为强密码;GRANT VIEW SERVER STATE:允许账号查看服务器状态,这是执行 DMV 查询的基础权限;GRANT VIEW ANY DEFINITION:允许账号查看服务器上任意对象的元数据定义,支撑SQLServerProperties等查询。
SQL Server 2022 及以上版本还需要额外为性能 DMV 授予
VIEW SERVER PERFORMANCE STATE权限,否则相关性能查询会因权限不足而失败:
GRANT VIEW SERVER PERFORMANCE STATE TO [categraf]; GO安全注意事项:不要在文档或仓库中保存真实密码;示例中的<strong-password>仅为占位符。若企业安全策略要求更细粒度的授权,可结合实际启用的查询组进一步收敛权限(例如去掉VIEW ANY DEFINITION),但需以采集验证通过为前提。
第二步:Categraf 配置详解
SQL Server 监控的 Categraf 配置文件为conf/input.sqlserver/sqlserver.toml,仓库内提供了完整模板:integrations/SQLServer/collect/sqlserver/sqlserver.toml。核心配置如下:
interval = 15 [[instances]] servers = [ "Server=10.19.1.1;Port=1433;User Id=categraf;Password=<strong-password>;app name=categraf;log=1;" ] auth_method = "connection_string" database_type = "SQLServer" include_query = [] exclude_query = [ "SQLServerAvailabilityReplicaStates", "SQLServerDatabaseReplicaStates" ] health_metric = true下面结合模板注释逐项说明参数含义与取值。
interval
全局采集间隔,单位为秒,示例为15,即每 15 秒执行一轮查询。采集间隔与后文告警规则的评估周期、sqlserver_up的时效性直接相关,建议保持 15~30 秒量级。
servers:连接串列表
servers是一个连接串数组,每个元素对应一个被监控的 SQL Server 实例,格式为 ADO.NET 风格连接字符串,连接库为 go-mssqldb。所有参数均可选,默认 host 为localhost、默认端口1433(TCP):
servers = ["Server=server.xxx.com;Port=1433;User Id=monitor;Password=xxxxxx;app name=categraf;log=1;"]Server:主机名或 IP;Port:端口,默认 1433;User Id/Password:上一步创建的categraf账号;app name:应用程序名,建议设为categraf,便于在 SQL Server 侧识别连接来源;log=1:启用连接日志,便于排查;- TLS 连接可通过
encrypt=true;certificate=<cert>;hostNameInCertificate=<SqlServer host fqdn>追加配置。
auth_method:认证方式
auth_method = "connection_string"合法取值:"connection_string"、"AAD"。本地部署的 SQL Server 使用connection_string(账号密码写在连接串中);AAD用于 Azure Active Directory 认证场景。
database_type:查询集选择器
database_type = "SQLServer"database_type决定启用哪一组预设查询。可能取值为:"SQLServer"、"AzureSQLDB"、"AzureSQLManagedInstance"、"AzureSQLPool"。指定该参数后会取代旧版的azuredb = true/false与query_version = 2机制(旧机制在模板中已被标记为 deprecated,仅兼容旧版查询风味时使用)。若需要同时监控多种数据库类型,应在配置文件中重复该 plugin 小节,每个database_type对应一组servers。
include_query / exclude_query:查询集裁剪
include_query = [] exclude_query = [ "SQLServerAvailabilityReplicaStates", "SQLServerDatabaseReplicaStates" ]include_query:显式包含的查询列表;为空表示使用database_type对应的全部默认查询;exclude_query:显式排除的查询列表,优先级高于默认查询集。
默认启用的查询组已在前文列出。两个副本状态查询(SQLServerAvailabilityReplicaStates、SQLServerDatabaseReplicaStates)默认被排除,如果实例配置了 Always On 且需要监控副本状态,可从exclude_query中删除这两项;未配置 Always On 时排除它们,可以避免无意义的权限报错或空结果问题。
health_metric:健康指标开关
health_metric = true默认关闭(false)。置为true时,会额外产生一条名为sqlserver_telegraf_health的指标,记录每个实例尝试执行的查询数与成功执行的查询数,用于帮助识别连接或查询层面的问题——例如实例可达但某类查询持续失败时,通过该指标可以快速定位。同时,采集插件本身会输出sqlserver_up指标标识实例是否成功采集。
第三步:验证采集结果
配置完成后,使用 Categraf 的测试模式验证单次采集是否正常:
./categraf --test --inputs sqlserver验证通过的标准:
--test输出中包含预期的 sqlserver 指标(无查询报错);- 在时序库中确认
sqlserver_up为 1; - 指标带有模板使用的
sql_instance标签,用于区分多个实例。
需要特别强调的是:只验证 TCP 1433 端口可连接并不能证明采集成功。连接可达只是前置条件,DMV 权限不足、查询语法与版本不匹配、Always On 查询返回空结果等问题只有在实际执行采集时才会暴露,因此必须以--test输出与sqlserver_up的数值为准。
第四步:配套告警规则与监控面板
集成目录下除了采集配置,还提供了可直接导入 Nightingale 的告警规则与监控面板,形成"采集 → 可视化 → 告警"的完整闭环。
告警规则
integrations/SQLServer/alerts/sqlserver_by_categraf.json 内置了 12 条基于 PromQL 的告警规则(默认disabled: 1,需按需启用),覆盖实例可用性与性能风险:
| 告警名称 | PromQL 要点 | 级别 |
|---|---|---|
| SQL Server 实例不可达 | sqlserver_up == 0 | 严重 |
| SQL Server 存在 SUSPECT 状态的数据库 | sqlserver_server_properties_db_suspect > 0 | 严重 |
| SQL Server 存在 OFFLINE 状态的数据库 | sqlserver_server_properties_db_offline > 0 | 警告 |
| SQL Server 数据卷剩余空间不足 | sqlserver_volume_space_available_space_bytes / total * 100 < 10 | 严重 |
| SQL Server 事务日志使用率过高 | sqlserver_performance_value{counter="Percent Log Used", ...} > 85 | 严重 |
| SQL Server 页面生命周期过短 | sqlserver_performance_value{counter="Page life expectancy", ...} < 300 | 警告 |
| SQL Server 存在等待内存授予的查询 | sqlserver_performance_value{counter="Memory Grants Pending"} > 0 | 警告 |
| SQL Server 阻塞进程数过高 | sqlserver_performance_value{counter="Processes blocked"} > 5 | 警告 |
| SQL Server 发生死锁 | increase(sqlserver_performance_value{counter="Number of Deadlocks/sec"}[10m]) > 0 | 警告 |
| SQL Server 数据文件读延迟过高 | rate(sqlserver_database_io_read_latency_ms[5m]) / rate(reads[5m]) > 50 | 警告 |
| SQL Server 数据文件写延迟过高 | rate(sqlserver_database_io_write_latency_ms[5m]) / rate(writes[5m]) > 50 | 警告 |
值得关注的是,每条规则的annotations.action都内置了可执行的排障 SOP(如查看sys.databases状态、log_reuse_wait_desc判断日志膨胀原因、sys.dm_exec_query_memory_grants定位内存授予等待等),告警触发后可直接按步骤处理,这对值班排障非常实用。对应规则的英文文案与排障步骤翻译可在 integrations/SQLServer/i18n/en_US.json 中查看。
监控面板
integrations/SQLServer/dashboards/sqlserver.json 提供了名为SQLServer的监控面板,包含以下核心视图:
- Server resource overview:服务器资源总览(CPU、内存、磁盘等)
- Summary:实例级概要
- 当前数据库连接(Current Database Connections):连接数趋势
- DB Log growth since last restart:重启以来的日志增长
- Number of Deadlocks/sec:死锁速率
- 硬盘空闲空间(Disk Free Space):卷剩余空间
- CPU:CPU 使用
- Total wait time of I/O stall / Database I/O wait of stall:IO 等待时间
面板使用prometheus数据源(datasourceValue: ${datasource}),并提供datasource与instance两个变量,导入后按实际环境绑定数据源即可使用。
集成资源在 Nightingale 中的加载方式
上述采集模板、告警规则、面板与 README 均位于仓库的 integrations/SQLServer 目录下,其目录结构(collect/、alerts/、dashboards/、i18n/、markdown/)遵循 Nightingale 内置集成资源的组织约定。从源码结构看(参见 center/integration/init.go),Nightingale center 在启动时会对integrations目录做初始化扫描,加载各组件的内置 payload(告警规则、采集模板)与 README 文档,i18n 词条则按语言(如en_US)稀疏存储并在读取时回退到默认语言,Readmes中记录的是README.<lang>.md的内容——这也是README.md(中文)与README.en_US.md(英文)并存的机制来源。因此这套 SQL Server 集成可以直接在 Nightingale 平台上完成从采集模板下发、面板导入到告警规则启用的全流程。
常见问题与注意事项
- SQL Server 2022 上性能查询失败:多半是缺少
VIEW SERVER PERFORMANCE STATE授权,按第一步补齐即可; - 副本状态查询报错或返回空:未配置 Always On 时,建议保留
exclude_query中的两项排除,避免无效查询; sqlserver_up不为 1:使用./categraf --test --inputs sqlserver查看具体查询错误,优先排查账号权限与连接串(端口、app name、log=1);- 启用了
health_metric但未看到sqlserver_telegraf_health:确认该指标是否被采集侧过滤,或检查health_metric = true是否位于正确的[[instances]]小节内; - 多实例监控:在
servers数组中增加连接串即可,注意利用sql_instance标签区分实例。
按照本指南完成账号授权、Categraf 配置与验证后,即可在 Nightingale 中看到 SQL Server 的性能指标,并通过内置告警规则第一时间感知实例不可达、日志膨胀、IO 延迟等问题,形成一套完整的 SQL Server 可观测性方案。
【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考