
1) 【一句话结论】:核心是通过设计请求延迟、错误率、并发连接数等关键指标,利用Prometheus客户端库(client_golang)实现指标收集,并通过监控数据(如时间序列指标)分析,定位性能瓶颈(如延迟升高、错误率上升或连接数超限)。
2) 【原理/概念讲解】:性能监控的关键指标分为三类:
Prometheus通过HTTP端点暴露指标,Golang客户端通过实现Collector接口(如prometheus/client_golang的Metric和Collector)注册指标,实现指标收集。指标以时间序列数据存储,便于后续分析。
3) 【对比与适用场景】:
| 指标类型 | 定义 | 特性 | 适用场景 | 注意点 |
|---|---|---|---|---|
| Counter | 递增的计数器,无初始值 | 值只能递增,不能递减 | 记录错误数、成功请求数(如HTTP 200计数) | 不能用于表示当前状态,如连接数 |
| Gauge | 实时值,可增可减 | 值随时间变化,反映当前状态 | 当前连接数、内存使用量、CPU负载 | 需要实时更新 |
| Summary | 延迟的分布统计 | 记录延迟的样本,计算分位数(如95%延迟) | 请求延迟、数据库查询延迟 | 样本数量有限,需定期清理 |
4) 【示例】:
伪代码示例(用prometheus/client_golang收集指标):
package main
import (
"log"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// RequestLatencySummary 记录请求延迟的分布
var RequestLatencySummary = prometheus.NewSummary(
prometheus.SummaryOpts{
Name: "api_request_latency_seconds",
Help: "API请求延迟的分布(秒)",
},
)
// RequestErrorCounter 记录请求错误数
var RequestErrorCounter = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "api_request_error_total",
Help: "API请求错误的总数",
},
)
func init() {
prometheus.MustRegister(RequestLatencySummary)
prometheus.MustRegister(RequestErrorCounter)
}
func main() {
http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
if r.URL.Path == "/api/error" {
RequestErrorCounter.Inc()
w.WriteHeader(http.StatusInternalServerError)
return
}
latency := time.Since(start).Seconds()
RequestLatencySummary.WithLabelValues("success").Observe(latency)
w.Write([]byte("success"))
})
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":8080", nil))
}
5) 【面试口播版答案】:
面试官:“好未来在线教育平台需要监控服务性能,请设计关键指标并说明如何用Golang实现指标收集及发现瓶颈。”
我回答:“核心是通过设计请求延迟、错误率、并发连接数等关键指标,利用Prometheus客户端库(client_golang)实现指标收集,并通过监控数据发现瓶颈。具体来说,请求延迟用Summary指标记录延迟分布(如95%分位数),错误率用Counter指标记录错误总数,并发连接数用Gauge指标实时反映当前连接数。实现上,通过实现Collector接口注册这些指标,然后通过Prometheus的HTTP端点暴露。监控发现瓶颈时,比如延迟的95%分位数持续升高,或错误率超过阈值,或连接数接近资源上限,就说明存在性能瓶颈,可能需要优化代码、增加资源或调整配置。”
6) 【追问清单】:
api_request_latency_seconds),便于统一管理和查询。7) 【常见坑/雷区】: