CentOS上Golang日志如何监控性能
导读:CentOS上用日志做Golang性能监控的可落地方案 一 总体思路与架构 在应用内用结构化日志输出关键性能事件与指标,如HTTP请求耗时、错误率、数据库/缓存耗时、队列长度等,便于检索与聚合分析。 使用systemd托管进程,将日志统一...
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中通过LogQL对latency_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串联请求全链路。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS上Golang日志如何监控性能
本文地址: https://pptw.com/jishu/779021.html
