零代码监控Azure SQL:Nightingale查询性能与存储全攻略
痛点直击:Azure SQL监控的三大挑战
你是否正面临这些困境?Azure SQL数据库性能突降却无法定位瓶颈,存储容量预警但缺乏历史趋势分析,自建监控脚本维护成本高昂。本文将详解如何利用Nightingale开源监控系统,通过无代码配置与自定义脚本两种方案,实现Azure SQL查询性能与存储容量的全方位监控,配套完整告警规则与可视化大盘。
读完本文你将掌握:
- 5分钟完成Azure SQL基础监控的配置方法
- 10个关键性能指标的采集与解读
- 3种自定义查询性能监控方案
- 存储容量趋势预测模型的搭建
- 开箱即用的告警规则与可视化模板
架构解析:Nightingale监控Azure SQL的实现原理
Nightingale通过数据源抽象层支持多类型数据库监控,其核心架构包含三大组件:
关键技术路径:
- 数据采集层:通过Exec插件执行TSQL查询或调用Azure Monitor API
- 数据处理层:PromQL函数计算性能指标的衍生指标
- 存储层:采用Prometheus或ClickHouse存储时序数据
- 展示层:自定义仪表盘展示性能与存储指标
环境准备:权限与前置条件
必要权限清单
| 角色 | 权限说明 | 适用场景 |
|---|---|---|
| Azure SQL DB Contributor | 读取数据库元数据 | 基础监控 |
| Monitoring Reader | 访问Azure Monitor指标 | 性能计数器采集 |
| SQL Security Manager | 查看登录统计信息 | 连接数监控 |
网络配置要求
- 允许Nightingale服务器访问Azure SQL的3342端口
- 配置Azure SQL防火墙规则,添加Nightingale服务器IP
- 启用Azure Monitor API访问(如需云指标集成)
方案一:基于SQLServer插件的快速配置
虽然Nightingale官方SQLServer插件已移除Azure相关代码,但可通过修改配置文件恢复Azure SQL支持:
1. 恢复Azure SQL连接支持
# integrations/SQLServer/markdown/README.md
- 这里去掉了Azure相关部分监控,只保留了本地部署sqlserver情况
+ 恢复Azure SQL监控支持,请添加以下配置
2. 配置文件修改
创建etc/input.sqlserver/azure_sql.toml:
[[instances]]
address = "yourserver.database.windows.net:1433"
username = "azureuser@yourserver"
password = "yourpassword"
database = "yourdatabase"
parameters = "encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net"
# 启用关键性能指标采集
extra_status_metrics = true
gather_schema_size = true
3. 验证连接
# 测试连接连通性
/opt/nightingale/cmd/cli/cli -test-sqlserver-connection \
--address yourserver.database.windows.net:1433 \
--username azureuser@yourserver \
--password yourpassword
方案二:基于Exec插件的自定义监控
当SQLServer插件无法满足需求时,Exec插件提供更大灵活性,支持执行自定义TSQL脚本:
1. 创建Azure SQL监控脚本
在/opt/nightingale/scripts/azure_sql/目录下创建collect_perf.sh:
#!/bin/bash
# 采集查询性能指标
sqlcmd -S yourserver.database.windows.net -d yourdatabase \
-U azureuser@yourserver -P yourpassword \
-Q "SELECT
SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1) AS query_text,
qs.total_elapsed_time/1000000 AS total_seconds,
qs.execution_count,
qs.total_logical_reads,
qs.total_logical_writes
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
WHERE qs.total_elapsed_time > 1000000
ORDER BY qs.total_elapsed_time DESC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY" \
-s "," -h -1 | awk -F ',' '{
gsub(/ /, "_", $1);
print "azure_sql_query_perf,query=" $1 " total_seconds=" $2 ",execution_count=" $3 ",logical_reads=" $4 ",logical_writes=" $5
}'
2. 配置Exec插件
修改etc/input.exec/exec.toml:
[[instances]]
commands = [
"/opt/nightingale/scripts/azure_sql/collect_perf.sh",
"/opt/nightingale/scripts/azure_sql/collect_storage.sh"
]
data_format = "influx"
timeout = 30
interval_times = 2
3. 脚本输出格式说明
脚本需输出InfluxDB行协议格式数据:
azure_sql_query_perf,query=SELECT_*_FROM_Orders total_seconds=2.5,execution_count=100,logical_reads=500,logical_writes=10
azure_sql_storage,database=Orders size_gb=12.5,growth_rate_mb_per_day=100
核心监控指标详解
查询性能指标
| 指标名称 | 类型 | 单位 | 说明 | 告警阈值 |
|---|---|---|---|---|
| sqlserver.query.exec_time | 计数器 | 秒 | 查询执行时间 | >5 |
| sqlserver.query.logical_reads | 计数器 | 次 | 逻辑读次数 | >1000 |
| sqlserver.query.executions | 计数器 | 次/分钟 | 查询执行频率 | >60 |
| sqlserver.deadlock.count | 计数器 | 次/小时 | 死锁数量 | >0 |
存储指标
关键存储指标计算公式:
- 预估耗尽时间 = (剩余空间GB) / (日均增长GB)
- 空间使用率 = (已用空间GB / 总空间GB) * 100%
自定义查询性能监控
使用动态管理视图(DMV)
推荐监控查询性能的核心DMV:
-- 执行时间最长的查询
SELECT TOP 10
SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1) AS query_text,
qs.total_elapsed_time/1000000 AS total_seconds,
qs.execution_count,
qs.total_logical_reads
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_elapsed_time DESC
慢查询追踪配置
通过修改数据库配置启用慢查询日志:
ALTER DATABASE [yourdatabase] SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE);
ALTER DATABASE [yourdatabase] SET QUERY_STORE (DATA_FLUSH_INTERVAL_SECONDS = 300);
在Nightingale中创建查询来监控慢查询:
topk(10, sqlserver.query.exec_time{database="yourdatabase"})
可视化大盘配置
导入官方模板
Nightingale提供MySQL监控大盘,可修改适配Azure SQL:
# 克隆MySQL仪表盘
cp -r integrations/MySQL/dashboards integrations/AzureSQL/
# 修改指标前缀
sed -i 's/mysql./azure_sql./g' integrations/AzureSQL/dashboards/*.json
自定义仪表盘示例
{
"title": "Azure SQL性能监控",
"rows": [
{
"panels": [
{
"title": "查询执行时间TOP10",
"type": "table",
"expr": "topk(10, sqlserver.query.exec_time)",
"columns": ["query", "exec_time", "executions"]
}
]
}
]
}
存储趋势预测图表
使用PromQL预测存储增长:
predict_linear(sqlserver.database_size{database="yourdb"}[7d], 30*24*3600)
告警规则配置
关键告警规则
groups:
- name: azure_sql_alerts
rules:
- alert: HighQueryLatency
expr: sqlserver.query.exec_time > 5
for: 5m
labels:
severity: critical
annotations:
summary: "慢查询告警: {{ $labels.query }}"
description: "查询执行时间超过5秒,执行次数: {{ $value }}"
- alert: StorageLow
expr: predict_linear(sqlserver.database_size[7d], 30*24*3600) > 90
labels:
severity: warning
annotations:
summary: "存储容量预警"
description: "预计30天后空间使用率将超过90%"
告警通知渠道配置
在Nightingale中配置通知渠道:
- 进入"告警设置" -> "通知渠道"
- 添加Microsoft Teams/Webhook渠道
- 配置通知模板包含关键指标
高级功能:Azure Monitor API集成
对于需要更全面云指标的场景,可通过Exec插件调用Azure Monitor API:
#!/bin/bash
# 获取Azure Monitor指标
TOKEN=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv)
curl -X GET "https://management.azure.com/subscriptions/$SUB_ID/resourceGroups/$RG/providers/Microsoft.Sql/servers/$SERVER/databases/$DB/providers/microsoft.insights/metrics?api-version=2018-01-01&metricnames=storage_percent&aggregation=Average" \
-H "Authorization: Bearer $TOKEN" | jq -r '.value[] | "azure_sql.storage_percent value=\(.timeseries[0].data[0].average) \(.timeseries[0].data[0].timeStamp | fromdateiso8601)"'
最佳实践与优化建议
性能优化
-
指标采集频率调整:
- 核心指标:1分钟采集一次
- 存储指标:5分钟采集一次
- 慢查询:10分钟采集一次
-
数据保留策略:
- 原始数据保留7天
- 聚合数据保留90天
- 趋势数据保留1年
安全加固
- 使用Azure Key Vault存储数据库凭证
- 为监控账号配置最小权限原则
- 启用TLS加密所有监控数据传输
总结与展望
通过本文介绍的两种方案,你已掌握Nightingale监控Azure SQL的完整流程。无论是快速配置的SQLServer插件方案,还是灵活强大的Exec自定义脚本方案,都能满足不同场景的监控需求。
后续发展方向:
- 社区正在开发Azure SQL专用插件,预计Q4发布
- 计划支持Azure AD认证集成
- 将推出AI辅助的异常查询检测功能
立即行动:
- 收藏本文以备后续配置参考
- 关注项目更新获取Azure专用插件
- 尝试搭建测试环境并导入提供的监控模板
记住,有效的监控不仅能及时发现问题,更能通过趋势分析帮助你提前预防性能瓶颈和存储危机。开始你的Azure SQL监控之旅吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



