6.3 KiB
6.3 KiB
SQL健康监控使用指南
概述
本项目已集成了简单而高效的SQL健康监控功能,可以自动记录每条SQL语句的执行时间、成功状态和错误信息。
功能特性
- ✅ 自动记录SQL执行时间(毫秒级精度)
- ✅ 记录SQL执行成功/失败状态
- ✅ 记录错误信息和影响行数
- ✅ 支持慢查询检测
- ✅ 提供统计信息(成功率、平均耗时等)
- ✅ 提供Web仪表板实时监控
- ✅ 内存高效(可配置最大记录数)
API接口
1. 获取SQL执行统计信息
GET /api/sql-health/stats
响应示例:
{
"status": "success",
"data": {
"total_queries": 1250,
"success_queries": 1240,
"failed_queries": 10,
"success_rate": "99.20",
"avg_duration_ms": 45,
"max_duration_ms": 2300,
"min_duration_ms": 2,
"last_update": "2024-01-15 14:30:25"
},
"timestamp": "2024-01-15 14:30:25"
}
2. 获取最近的SQL执行记录
GET /api/sql-health/recent?limit=50
参数:
limit: 返回记录数量,默认50,最大500
响应示例:
{
"status": "success",
"data": {
"records": [
{
"id": 1001,
"query": "SELECT id, book_name FROM book_center WHERE vio_book = ? ORDER BY id DESC LIMIT ? OFFSET ?",
"duration_ms": 23,
"timestamp": "2024-01-15T14:30:25Z",
"success": true,
"error": "",
"endpoint": "/api/bookBase/GetBookBaseInfoOptimized",
"rows_affected": 0
}
],
"count": 50,
"limit": 50
},
"timestamp": "2024-01-15 14:30:25"
}
3. 获取慢查询
GET /api/sql-health/slow-queries?threshold=1000
参数:
threshold: 慢查询阈值(毫秒),默认1000ms
4. 获取失败查询
GET /api/sql-health/failed-queries
5. 清空记录
POST /api/sql-health/clear
6. Web仪表板
GET /api/sql-health/dashboard
访问此URL可以查看实时的SQL健康监控仪表板。
在代码中使用SQL监控
1. 查询操作(返回多行)
func (bc *BookCenterController) YourQueryMethod(c *gin.Context) {
query := "SELECT * FROM book_center WHERE category = ?"
endpoint := c.FullPath() // 获取当前接口路径
// 使用监控执行查询
rows, err := MonitorQuery(bc.db, query, endpoint, "小说")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "查询失败"})
return
}
defer rows.Close()
// 处理结果...
}
2. 单行查询操作
func (bc *BookCenterController) GetBookByISBN(c *gin.Context) {
isbn := c.Query("isbn")
query := "SELECT id, book_name, author FROM book_center WHERE isbn = ?"
endpoint := c.FullPath()
// 使用监控执行单行查询
row := MonitorQueryRow(bc.db, query, endpoint, isbn)
var id int64
var bookName, author string
if err := row.Scan(&id, &bookName, &author); err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "图书不存在"})
return
}
// 返回结果...
}
3. 更新/插入/删除操作
func (bc *BookCenterController) UpdateBook(c *gin.Context) {
query := "UPDATE book_center SET book_name = ? WHERE id = ?"
endpoint := c.FullPath()
// 使用监控执行更新操作
result, err := MonitorExec(bc.db, query, endpoint, "新书名", 123)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "更新失败"})
return
}
rowsAffected, _ := result.RowsAffected()
c.JSON(http.StatusOK, gin.H{
"message": "更新成功",
"rows_affected": rowsAffected,
})
}
监控配置
初始化配置
在 main.go 中的初始化:
func main() {
// 初始化SQL监控器,最多保存1000条记录
InitSQLMonitor(1000)
// ... 其他初始化代码
}
自定义配置
可以根据需要调整最大记录数:
// 保存更多记录(适合高流量应用)
InitSQLMonitor(5000)
// 保存较少记录(适合内存受限环境)
InitSQLMonitor(500)
性能影响
- 内存占用: 每条记录约占用200-500字节
- CPU开销: 每次SQL执行增加约0.1-0.5ms开销
- 并发安全: 使用读写锁,支持高并发访问
- 自动清理: 超过最大记录数时自动删除旧记录
监控指标说明
统计指标
total_queries: 总查询数success_queries: 成功查询数failed_queries: 失败查询数success_rate: 成功率(百分比)avg_duration_ms: 平均执行时间(毫秒)max_duration_ms: 最大执行时间(毫秒)min_duration_ms: 最小执行时间(毫秒)
记录字段
id: 记录唯一IDquery: SQL查询语句duration_ms: 执行时间(毫秒)timestamp: 执行时间戳success: 是否成功error: 错误信息(如果有)endpoint: 调用的API接口rows_affected: 影响的行数(仅适用于INSERT/UPDATE/DELETE)
最佳实践
- 接口标识: 使用
c.FullPath()作为endpoint参数,便于追踪问题 - 错误处理: 监控函数会自动记录错误,无需额外处理
- 性能优化: 对于非关键查询,可以考虑不使用监控以减少开销
- 定期清理: 在生产环境中定期调用清理接口,避免内存占用过多
- 阈值设置: 根据业务需求调整慢查询阈值
故障排查
常见问题
- 监控器未初始化: 确保在main函数中调用了
InitSQLMonitor() - 记录不显示: 检查是否使用了
MonitorQuery等监控函数 - 内存占用过高: 减少最大记录数或定期清理记录
调试技巧
- 查看控制台日志,监控函数会输出详细的执行信息
- 使用仪表板实时查看SQL执行情况
- 通过API接口获取详细的统计信息
示例场景
场景1: 性能优化
通过监控发现某个查询平均耗时过长,可以:
- 查看慢查询接口找到具体SQL
- 分析SQL执行计划
- 添加合适的索引
- 重新监控验证优化效果
场景2: 错误排查
当出现数据库错误时,可以:
- 查看失败查询接口
- 分析错误信息和SQL语句
- 定位问题原因
- 修复后验证
场景3: 容量规划
通过长期监控数据:
- 分析查询频率和耗时趋势
- 评估数据库负载
- 制定扩容计划