温馨提示×

CentOS上Golang日志如何监控性能

小樊
41
2025-12-23 13:02:39
栏目: 编程语言

CentOS上用日志做Golang性能监控的可落地方案

一 总体思路与架构

  • 在应用内用结构化日志输出关键性能事件与指标,如HTTP请求耗时、错误率、数据库/缓存耗时、队列长度等,便于检索与聚合分析。
  • 使用systemd托管进程,将日志统一到journald,或用logrotate做按日/按大小切分,避免磁盘被撑满。
  • 在主机或容器侧用Prometheus抓取应用暴露的**/metrics**,配合Grafana做可视化;用Loki + Promtail/Grafana Alloy对日志建立索引与查询,形成“日志+指标”的一体化可观测性。
  • 需要深入排查时,开启pprof采集CPU/内存/阻塞等性能剖析数据,与日志联动定位瓶颈。

二 应用侧改造 输出结构化性能日志

  • 选择高性能结构化日志库(如zap),统一日志字段:如ts、level、service、trace_id、method、uri、status、latency_ms、err等,便于后续在Loki/ELK中做统计分析。
  • 在关键路径埋点:HTTP中间件记录请求总数、状态码分布、P95/P99延迟;数据库/缓存/外部调用记录耗时与错误;周期性任务记录处理量与耗时
  • 示例(zap,记录HTTP中间件延迟与错误):
package main

import (
    "net/http"
    "time"

    "go.uber.org/zap"
)

var logger *zap.Logger

func init() {
    var err error
    logger, err = zap.NewProduction()
    if err != nil { panic(err) }
}

func timed(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        defer func() {
            latencyMs := time.Since(start).Milliseconds()
            logger.Info("http_request",
                zap.String("method", r.Method),
                zap.String("uri", r.URL.Path),
                zap.Int("status", http.StatusOK), // 实际应捕获真实状态码
                zap.Int64("latency_ms", latencyMs),
                zap.Error(nil), // 如有错误,替换为实际error
            )
        }()
        h(w, r)
    }
}

func main() {
    http.HandleFunc("/", timed(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("OK"))
    }))
    http.ListenAndServe(":8080", nil)
}
  • 建议将日志同时写到stdout/stderr(便于容器/系统收集)与滚动文件(便于本地排查)。

三 系统侧日志采集与轮转

  • 使用systemd托管应用,通过journalctl集中查看与检索日志:
    • 实时查看:journalctl -u my-golang-app.service -f
    • 按级别筛选:journalctl -u my-golang-app.service -p err -f
  • 使用logrotate对文件日志做按日/按大小切割、压缩与保留,示例配置:
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0644 myapp myapp
}
  • 如需更强大的检索与可视化,部署Loki + Promtail/Grafana Alloy采集日志,在Grafana中通过LogQLlatency_ms、status等字段做聚合与告警。

四 指标与可视化 用Prometheus + Grafana监控性能

  • 在应用中暴露**/metrics**端点(Prometheus客户端):
package main

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    httpRequestsTotal = prometheus.NewCounter(prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests.",
    })
    httpRequestLatency = prometheus.NewHistogram(prometheus.HistogramOpts{
        Name:    "http_request_latency_seconds",
        Help:    "Latency of HTTP requests in seconds.",
        Buckets: prometheus.DefBuckets,
    })
)

func init() {
    prometheus.MustRegister(httpRequestsTotal)
    prometheus.MustRegister(httpRequestLatency)
}

func handler(w http.ResponseWriter, r *http.Request) {
    start := time.Now()
    defer func() {
        httpRequestsTotal.Inc()
        httpRequestLatency.Observe(time.Since(start).Seconds())
    }()
    w.Write([]byte("OK"))
}

func main() {
    http.HandleFunc("/", handler)
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}
  • Prometheus中配置抓取目标,在Grafana中创建面板,绘制QPS、P50/P95/P99延迟、错误率等核心指标,并设置阈值告警。

五 深度性能分析与告警联动

  • 开启pprof进行CPU、内存、阻塞等剖析:
    • 引入 _ “net/http/pprof”,在6060端口提供调试端点;使用go tool pprof火焰图分析热点函数与内存分配。
  • 建立日志→指标→告警的闭环:
    • Prometheus基于指标(如5xx比例、P95延迟、错误日志计数)配置规则,联动Alertmanager发送邮件/企业微信/钉钉/Slack告警。
    • Grafana对日志与指标建立统一Dashboard,支持按trace_id串联请求全链路。

0