整理内容: - 删除 60+ 临时测试输出文件 (*.txt) - 移动二进制文件到 bin/ 目录 - 移动 Shell 脚本到 scripts/ 目录 - scripts/dev/: check_gitea.sh, check_sub2api.sh, run_tests.sh - scripts/deploy/: deploy_*.sh, simple_deploy.sh - scripts/ops/: fix_nginx.sh, fix_ssl.sh, install_docker.sh - scripts/test/: test_*.sh, test_*.bat - 移动批处理文件到 scripts/ - 移动 Python 脚本到 tools/ - 清理临时日志文件 保留根目录必要文件: - go.mod, go.sum, go.work - Makefile, docker-compose.yml - .env.example, .gitignore - README.md, AGENTS.md, DEPLOY_GUIDE.md 验证: go build ./... && go test ./... 通过
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package monitoring
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"log"
|
||
"runtime"
|
||
"time"
|
||
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// StartSystemMetricsCollector 启动后台系统指标采集循环
|
||
// 每 15 秒采集一次:Go runtime 指标 + 数据库连接池状态
|
||
// CRIT-03: 这是 SLO 错误预算追踪的基础数据来源
|
||
func StartSystemMetricsCollector(ctx context.Context, m *Metrics, slo *SLOMetrics, db *gorm.DB) {
|
||
ticker := time.NewTicker(15 * time.Second)
|
||
defer ticker.Stop()
|
||
|
||
log.Println("[monitoring] system metrics collector started (interval=15s)")
|
||
|
||
for {
|
||
select {
|
||
case <-ctx.Done():
|
||
log.Println("[monitoring] system metrics collector stopped")
|
||
return
|
||
case <-ticker.C:
|
||
collectRuntimeMetrics(m)
|
||
collectDBMetrics(slo, db)
|
||
}
|
||
}
|
||
}
|
||
|
||
// collectRuntimeMetrics 采集 Go runtime 指标
|
||
func collectRuntimeMetrics(m *Metrics) {
|
||
var memStats runtime.MemStats
|
||
runtime.ReadMemStats(&memStats)
|
||
|
||
m.SetMemoryUsage(float64(memStats.Alloc))
|
||
m.SetGoroutines(float64(runtime.NumGoroutine()))
|
||
}
|
||
|
||
// collectDBMetrics 采集数据库连接池指标并上报 SLO 指标
|
||
func collectDBMetrics(slo *SLOMetrics, db *gorm.DB) {
|
||
if db == nil {
|
||
return
|
||
}
|
||
|
||
sqlDB, err := db.DB()
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
updateDBConnectionMetricsFromStats(slo, sqlDB.Stats())
|
||
}
|
||
|
||
// updateDBConnectionMetricsFromStats 从 sql.DBStats 更新连接池指标
|
||
func updateDBConnectionMetricsFromStats(slo *SLOMetrics, stats sql.DBStats) {
|
||
if slo == nil {
|
||
return
|
||
}
|
||
slo.SetDBConnections(
|
||
float64(stats.InUse),
|
||
float64(stats.MaxOpenConnections),
|
||
)
|
||
}
|