Files
user-system/internal/monitoring/collector.go
long-agent 5b6bd93179 refactor: 整理项目根目录结构
整理内容:
- 删除 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 ./... 通过
2026-04-07 18:10:36 +08:00

67 lines
1.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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),
)
}