Go 指标监控实战:基于 Prometheus 的全方位食用手册
在微服务和分布式系统中,“看不见”的问题往往是最致命的——内存泄漏、接口响应延迟飙升、错误率突增,这些问题如果没有及时发现,很容易引发线上故障。而 指标监控 就是系统的“体温计”,能帮助我们实时掌握系统健康状态、快速定位问题。
本文将以 Go 语言 和 Prometheus 为核心,从基础概念到实战落地,手把手教你搭建一套完整的指标监控体系,涵盖指标埋点、数据采集、可视化与告警。因原图片链接失效,本文将通过 “文字精准描述 + 本地界面对照” 的方式替代图片,确保你能对照操作步骤看到实际效果。
一、前置知识:什么是 Prometheus 与 Go Metric?
在动手前,先搞懂两个核心工具的定位,避免后续“知其然不知其所以然”。
1. Prometheus 是什么?
Prometheus 是由 SoundCloud 开源的 时序数据库(Time-Series Database),专为监控系统设计,核心特点:
- 拉取模式(Pull):主动从目标服务拉取指标数据(而非等待推送),便于服务发现和水平扩展;
- 灵活的查询语言(PromQL):支持按时间范围、维度筛选指标,比如“查询过去5分钟内
/api/user
接口的 5xx 错误数”; - 内置告警能力:结合 Alertmanager 可实现阈值告警(如错误率超过 1% 时发邮件);
- 生态丰富:与 Grafana 无缝集成,可快速搭建可视化仪表盘。
Prometheus 官网:https://prometheus.io/
2. Go 中的 Metric 是什么?
Metric(指标)是系统状态的“量化描述”,比如“每秒请求数”“内存使用率”“接口响应时间”。在 Go 中,我们主要通过 Prometheus 官方提供的 prometheus/client_golang
库来定义和暴露指标,该库支持 4 种核心指标类型,覆盖 99% 的监控场景:
指标类型 | 用途 | 典型场景 | 特点 |
---|---|---|---|
Counter | 累计计数(只增不减) | 总请求数、错误数、任务完成次数 | 重启后重置为 0,支持 Inc() (+1)和 Add(n) (+n) |
Gauge | 瞬时值(可增可减,可波动) | 内存使用率、当前并发请求数、CPU 负载 | 支持 Inc() /Dec() /Set(v) ,反映实时状态 |
Histogram | 分布统计(按区间分组,计算分位数) | 接口响应时间、请求大小 | 自动将数据分到预定义区间(如 0.1s、0.5s、1s),支持计算 P95/P99 分位数 |
Summary | 分布统计(直接计算分位数,非区间) | 延迟统计(需要精确分位数) | 客户端直接计算分位数(如 P50/P90),减少服务端计算压力,但不支持区间查询 |
🔍 四种指标类型示意图(文字描述 + 获取方式)
你可以在本地绘制或搜索 “Prometheus 四种指标类型示意图” 查看,核心结构如下:
- Counter:一条从 0 开始持续向上的直线(如“总请求数”随时间递增);
- Gauge:一条上下波动的曲线(如“并发请求数”时而高时而低);
- Histogram:柱状图,X 轴是“区间(如 0.1s、0.5s)”,Y 轴是“该区间的请求数量”;
- Summary:表格或曲线,直接标注 P50(50% 请求的延迟≤X)、P90(90% 请求的延迟≤Y)等数值。
也可通过 Mermaid 代码本地生成(复制到 Mermaid 在线编辑器):
二、实战第一步:环境搭建
工欲善其事,必先利其器。我们需要先搭建三个核心组件:Go 项目、Prometheus 服务、Grafana(可视化)。
1. 安装 Prometheus
- 下载地址:Prometheus 官网下载页,选择对应系统版本(如 Linux、macOS、Windows);
- 解压并启动:
# 以 macOS 为例(其他系统步骤类似) tar -zxvf prometheus-2.45.0.darwin-amd64.tar.gz cd prometheus-2.45.0.darwin-amd64# 直接启动(默认使用 prometheus.yml 配置文件) ./prometheus
🔍 Prometheus 首页(本地查看)
启动后访问 http://localhost:9090
,你会看到如下界面:
- 顶部:蓝色导航栏,包含“Prometheus”logo、搜索框(输入 PromQL 查询)、“Status”“Graph”等菜单;
- 中间:欢迎文案“Welcome to Prometheus”,下方有“Documentation”“Guides”等链接;
- 底部:版本信息(如
Version 2.45.0
)。
如果能看到这个页面,说明 Prometheus 启动成功。
2. 安装 Grafana(可视化工具)
- 下载地址:Grafana 官网下载页,选择对应系统版本;
- 启动与初始化:
- macOS:通过
brew install grafana
安装后,执行brew services start grafana
启动; - Linux/Windows:解压后执行对应启动脚本(如
./bin/grafana-server
)。
- macOS:通过
🔍 Grafana 主界面(本地查看)
启动后访问 http://localhost:3000
,流程与界面如下:
- 首次登录:输入默认账号
admin
、默认密码admin
,点击“Log in”; - 密码修改:系统会提示“Change your password”,输入新密码(如
123456
)后点击“Save”; - 主界面:左侧是黑色导航栏(包含“Dashboards”“Data Sources”“Alerting”等),中间是“Home Dashboard”,显示“Welcome to Grafana”及常用功能卡片(如“Create your first dashboard”)。
3. 初始化 Go 项目
创建一个新的 Go 项目,引入 Prometheus 客户端库:
# 1. 创建项目目录
mkdir go-prometheus-demo && cd go-prometheus-demo# 2. 初始化 Go 模块(替换为你的仓库地址)
go mod init github.com/your-name/go-prometheus-demo# 3. 引入核心依赖
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp
go get net/http
三、实战第二步:Go 项目埋点指标
这是核心环节——在 Go 代码中定义指标,并在关键业务逻辑中更新指标。我们以一个 HTTP 服务 为例,埋点 4 种核心指标,覆盖“请求量、错误率、响应时间、并发数”。
1. 完整代码实现
创建 main.go
文件,代码如下(关键部分有详细注释):
package mainimport ("net/http""strconv""time""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp""github.com/prometheus/common/log"
)// 1. 定义全局指标(按业务模块划分,便于维护)
var (// Counter:HTTP 请求总数(按 method、path、status 维度拆分)httpRequestTotal = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "http_request_total", // 指标名:小写+下划线(Prometheus 规范)Help: "Total number of HTTP requests", // 指标说明(便于理解含义)},[]string{"method", "path", "status"}, // 标签(维度):区分不同场景的指标)// Gauge:当前活跃的 HTTP 请求数(实时波动)httpActiveRequests = prometheus.NewGauge(prometheus.GaugeOpts{Name: "http_active_requests",Help: "Current number of active HTTP requests",},)// Histogram:HTTP 请求响应时间(单位:秒),预定义区间 [0.1, 0.5, 1, 2, 5]httpRequestDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{Name: "http_request_duration_seconds",Help: "Duration of HTTP requests in seconds",Buckets: []float64{0.1, 0.5, 1, 2, 5}, // 区间边界:覆盖大多数接口延迟场景},[]string{"method", "path"}, // 按方法和路径拆分,便于定位慢接口)// Summary:HTTP 请求大小(单位:字节),计算 P50、P90、P99 分位数httpRequestSize = prometheus.NewSummaryVec(prometheus.SummaryOpts{Name: "http_request_size_bytes",Help: "Size of HTTP requests in bytes",Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, // 分位数精度:P50 误差≤5%},[]string{"method"}, // 按请求方法拆分(GET/POST 大小差异较大))
)// 2. 初始化指标:将指标注册到 Prometheus 默认注册器(必须!否则无法拉取)
func init() {prometheus.MustRegister(httpRequestTotal)prometheus.MustRegister(httpActiveRequests)prometheus.MustRegister(httpRequestDuration)prometheus.MustRegister(httpRequestSize)
}// 3. 自定义 HTTP 中间件:统一埋点指标(避免每个接口重复写逻辑)
func metricMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {// 记录请求开始时间(用于计算响应时间)startTime := time.Now()// 请求前:活跃请求数 +1(Gauge 指标递增)httpActiveRequests.Inc()// 包装 ResponseWriter:默认 ResponseWriter 不暴露状态码,需自定义获取lrw := &loggingResponseWriter{ResponseWriter: w, statusCode: http.StatusOK}// 延迟执行:请求完成后更新指标(defer 确保即使报错也会执行)defer func() {// 1. 计算请求耗时(秒)duration := time.Since(startTime).Seconds()// 2. 提取请求元信息method := r.Methodpath := r.URL.Pathstatus := strconv.Itoa(lrw.statusCode)requestSize := r.ContentLength // 请求体大小(字节)// 3. 更新各指标httpRequestTotal.WithLabelValues(method, path, status).Inc() // Counter:请求数+1httpActiveRequests.Dec() // Gauge:活跃请求数-1httpRequestDuration.WithLabelValues(method, path).Observe(duration) // Histogram:记录延迟if requestSize > 0 {httpRequestSize.WithLabelValues(method).Observe(float64(requestSize)) // Summary:记录请求大小}}()// 执行实际业务逻辑(如 /hello、/error 接口)next.ServeHTTP(lrw, r)})
}// 辅助结构体:包装 ResponseWriter 以获取响应状态码
type loggingResponseWriter struct {http.ResponseWriter // 嵌入原有 ResponseWriter,保留原有功能statusCode int // 新增状态码字段
}// 重写 WriteHeader 方法:记录状态码
func (lrw *loggingResponseWriter) WriteHeader(code int) {lrw.statusCode = codelrw.ResponseWriter.WriteHeader(code)
}// 4. 业务接口示例(模拟正常和错误场景)
func helloHandler(w http.ResponseWriter, r *http.Request) {// 模拟业务耗时(随机 0-1 秒,用于生成延迟数据)time.Sleep(time.Duration(time.Now().UnixNano()%1000) * time.Millisecond)w.Write([]byte("Hello, Prometheus!"))
}func errorHandler(w http.ResponseWriter, r *http.Request) {// 模拟 500 错误(用于生成错误率数据)w.WriteHeader(http.StatusInternalServerError)w.Write([]byte("Internal Server Error"))
}func main() {// 注册路由:业务接口 + Prometheus 指标暴露接口mux := http.NewServeMux()mux.HandleFunc("/hello", helloHandler) // 正常接口mux.HandleFunc("/error", errorHandler) // 错误接口mux.Handle("/metrics", promhttp.Handler()) // 指标暴露接口(必须!供 Prometheus 拉取)// 用中间件包装路由:所有接口自动埋点指标server := &http.Server{Addr: ":8080", // Go 服务端口Handler: metricMiddleware(mux), // 注入指标中间件}// 启动服务log.Infof("Go server starting on :8080")if err := server.ListenAndServe(); err != nil {log.Fatalf("Server failed to start: %v", err)}
}
2. 代码关键说明
- 指标定义:通过
prometheus.NewXXXVec
(带标签)或prometheus.NewXXX
(无标签)创建指标,Name
必须符合“小写+下划线”规范(如http_request_total
),否则 Prometheus 可能无法识别; - 指标注册:
prometheus.MustRegister
是“强制注册”,若指标名重复会直接 panic,确保指标名全局唯一; - 中间件埋点:
metricMiddleware
统一处理所有接口的指标更新,避免在helloHandler
、errorHandler
中重复写埋点逻辑,符合“单一职责”原则; - 指标暴露:
/metrics
接口是 Prometheus 拉取数据的入口,由promhttp.Handler()
实现,无需自定义逻辑; - 状态码获取:
loggingResponseWriter
重写WriteHeader
方法,解决默认ResponseWriter
无法获取状态码的问题。
3. 启动 Go 服务并验证指标
# 1. 启动 Go 服务
go run main.go# 2. 模拟请求(多次执行,生成指标数据)
curl http://localhost:8080/hello # 正常请求(200 状态码)
curl http://localhost:8080/error # 错误请求(500 状态码)
🔍 查看原始指标(本地查看)
访问 http://localhost:8080/metrics
,你会看到类似以下的文本格式指标数据(关键部分):
# HELP http_request_total Total number of HTTP requests
# TYPE http_request_total counter
http_request_total{method="GET",path="/hello",status="200"} 5 # 5 次正常请求
http_request_total{method="GET",path="/error",status="500"} 3 # 3 次错误请求# HELP http_active_requests Current number of active HTTP requests
# TYPE http_active_requests gauge
http_active_requests 0 # 当前无活跃请求# HELP http_request_duration_seconds Duration of HTTP requests in seconds
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{method="GET",path="/hello",le="0.1"} 2 # ≤0.1s 的请求数:2
http_request_duration_seconds_bucket{method="GET",path="/hello",le="0.5"} 5 # ≤0.5s 的请求数:5
http_request_duration_seconds_bucket{method="GET",path="/hello",le="+Inf"} 5 # 所有请求数:5# HELP http_request_size_bytes Size of HTTP requests in bytes
# TYPE http_request_size_bytes summary
http_request_size_bytes{method="GET",quantile="0.5"} 0 # GET 请求 P50 大小:0 字节(无请求体)
http_request_size_bytes{method="GET",quantile="0.9"} 0 # GET 请求 P90 大小:0 字节
如果能看到这些数据,说明 Go 服务的指标埋点成功。
四、实战第三步:Prometheus 拉取 Go 服务指标
Prometheus 默认只会拉取自身指标(localhost:9090
),需要修改配置文件,让它主动拉取我们的 Go 服务指标。
1. 修改 Prometheus 配置文件
找到 Prometheus 安装目录下的 prometheus.yml
文件,打开后在 scrape_configs
节点下添加一个新的 Job(任务):
global:scrape_interval: 15s # 全局拉取间隔:每 15 秒拉取一次所有目标的指标scrape_configs:# 原有 Job:监控 Prometheus 自身- job_name: "prometheus"static_configs:- targets: ["localhost:9090"]# 新增 Job:拉取 Go 服务指标(关键!)- job_name: "go-demo-service" # Job 名称:自定义,便于识别static_configs:- targets: ["localhost:8080"] # Go 服务地址:必须和 Go 服务启动地址一致scrape_interval: 5s # 单独设置拉取间隔(比全局更频繁,便于快速看到数据)
2. 重启 Prometheus 并验证
# 1. 先停止之前的 Prometheus 进程(如 macOS 用 kill 命令)
ps aux | grep prometheus # 找到进程 ID
kill -9 进程ID# 2. 用新配置文件启动
cd prometheus-2.45.0.darwin-amd64
./prometheus --config.file=prometheus.yml
🔍 查看拉取目标状态(本地查看)
访问 http://localhost:9090/targets
,你会看到一个表格,包含两个 Job:
- prometheus:
State
为UP
,Instance
为localhost:9090
; - go-demo-service:
State
为UP
,Instance
为localhost:8080
。
如果 go-demo-service
的 State
是 UP
,说明 Prometheus 已成功拉取 Go 服务指标;如果是 DOWN
,检查 Go 服务是否启动、地址是否写错。
🔍 用 PromQL 查询指标(本地操作)
访问 http://localhost:9090/graph
,在顶部搜索框输入 PromQL 语句,点击“Execute”查看结果:
- 查询
/hello
接口的总请求数:http_request_total{path="/hello"}
- 结果:表格形式,显示
method="GET"
、status="200"
对应的数值(如 5);
- 结果:表格形式,显示
- 查询过去 1 分钟内的错误数:
increase(http_request_total{status=~"5.."}[1m])
- 结果:若 1 分钟内有 3 次 5xx 错误,数值为 3;
- 查询
/hello
接口的 P95 响应时间:histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, path))
- 结果:按
path
分组,显示/hello
接口的 P95 延迟(如 0.8 秒)。
- 结果:按
五、实战第四步:Grafana 可视化指标
Prometheus 的查询界面只能看简单数据,而 Grafana 能将指标转化为直观的图表(折线图、柱状图、仪表盘等),便于日常监控。
1. 配置 Grafana 数据源(连接 Prometheus)
- 访问
http://localhost:3000
,登录 Grafana(用之前设置的账号密码); - 左侧导航栏点击 Configuration(齿轮图标)> Data Sources;
- 点击右上角 Add data source,在搜索框输入“Prometheus”,选择“Prometheus”;
- 配置数据源:
- HTTP > URL:输入
http://localhost:9090
(Prometheus 的地址); - 其他配置保持默认(如“Access”选择“Server(Default)”);
- HTTP > URL:输入
- 点击底部 Save & test,若显示“Data source is working”,说明配置成功。
🔍 数据源配置界面(文字描述)
- 界面左侧是“Settings”菜单(包含“Basic”“HTTP”“Auth”等);
- 中间是“HTTP”配置区,
URL
输入框是核心,下方有“Timeout”“Headers”等可选配置; - 底部是“Save & test”按钮,点击后会显示绿色提示“Data source is working”。
2. 导入现成仪表盘(快速可视化)
Grafana 有一个官方模板库,包含大量现成的监控仪表盘(无需从零开始画)。我们选择一个适合 Go 服务的模板:
- 左侧导航栏点击 Dashboards > New dashboard > Import;
- 在“Import via grafana.com”输入框中输入模板 ID
14513
(这是一个成熟的 Go 服务监控模板,支持请求数、响应时间、内存等指标),点击 Load; - 在“Import dashboard”页面:
- Name:自定义仪表盘名称(如“Go Demo Service Monitor”);
- Folder:选择“General”(默认文件夹);
- Data source:选择之前配置的“Prometheus”;
- 点击 Import,完成导入。
🔍 Go 服务仪表盘(本地查看)
导入成功后,你会看到一个分区域的仪表盘,核心内容如下:
- 顶部卡片区:显示 HTTP 请求总数、错误率(%)、活跃请求数、平均响应时间;
- 中间图表区:
- 折线图:HTTP 请求数趋势(按状态码拆分,200/500 分别用不同颜色);
- 柱状图:响应时间分布(按区间拆分,如 0-0.1s、0.1-0.5s);
- 表格:各接口的请求数、错误数、平均延迟(便于定位问题接口);
- 底部资源区:显示 Go 服务的内存使用率、Goroutine 数量、GC 次数(需确保 Go 服务埋点了这些指标,模板已兼容)。
如果某些面板没有数据,检查:
- Go 服务是否有足够的请求(多执行几次
curl
命令); - Prometheus 拉取间隔是否设置合理(如 5s);
- 模板指标名是否与 Go 服务的指标名一致(如模板用
http_requests_total
,而我们用http_request_total
,需修改模板的 PromQL 语句)。
六、实战第五步:配置告警(可选)
当指标超过阈值时(如错误率 > 1%、响应时间 P99 > 2s),需要及时通知运维人员,这就需要 Prometheus + Alertmanager 实现告警。
1. 配置 Prometheus 告警规则
-
在 Prometheus 安装目录下创建
alert_rules.yml
文件,写入以下规则:groups: - name: go-demo-alerts # 告警组名称rules:# 告警1:错误率超过 1%(持续 30 秒触发,避免瞬时波动)- alert: HighErrorRateexpr: sum(rate(http_request_total{status=~"5.."}[1m])) / sum(rate(http_request_total[1m])) > 0.01for: 30slabels:severity: critical # 告警级别:critical(紧急)/ warning(警告)/ info(通知)annotations:summary: "高错误率告警"description: "过去 1 分钟错误率为 {{ $value | humanizePercentage }},超过阈值 1%"# 告警2:响应时间 P99 超过 2 秒(持续 1 分钟触发)- alert: SlowResponseTimeexpr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, path)) > 2for: 1mlabels:severity: warningannotations:summary: "{{ $labels.path }} 接口响应缓慢"description: "{{ $labels.path }} 接口 P99 响应时间为 {{ $value | humanizeDuration }},超过阈值 2 秒"
-
修改
prometheus.yml
,引用告警规则文件并配置 Alertmanager 地址:# 新增告警配置 alerting:alertmanagers:- static_configs:- targets:- localhost:9093 # Alertmanager 启动地址(后续会启动)# 引用告警规则文件 rule_files:- "alert_rules.yml" # 确保路径正确(与 prometheus.yml 同级)
2. 安装并配置 Alertmanager
-
下载 Alertmanager:Alertmanager 官网下载页,选择对应系统版本;
-
解压并创建配置文件:
tar -zxvf alertmanager-0.25.0.darwin-amd64.tar.gz cd alertmanager-0.25.0.darwin-amd64 # 创建 alertmanager.yml 配置文件(以邮件通知为例) cat > alertmanager.yml << EOF global:smtp_smarthost: 'smtp.qq.com:587' # 邮箱 SMTP 服务器(QQ 邮箱示例)smtp_from: 'your-qq-email@qq.com' # 发件人邮箱smtp_auth_username: 'your-qq-email@qq.com' # 发件人账号smtp_auth_password: 'your-qq-auth-code' # 邮箱授权码(非登录密码,需在邮箱设置中开启)route:receiver: 'email-notify' # 默认接收者group_wait: 10s # 告警分组等待时间:同一组告警等待 10s 后一起发送group_interval: 10s # 同一组告警再次发送间隔repeat_interval: 1h # 同一告警重复发送间隔(避免频繁骚扰)receivers: - name: 'email-notify' # 接收者名称email_configs:- to: 'recipient-email@example.com' # 收件人邮箱(如你的工作邮箱) EOF
-
启动 Alertmanager:
./alertmanager --config.file=alertmanager.yml
🔍 告警邮件示例(文字描述)
当错误率超过 1% 时,你会收到一封类似以下的邮件:
- 主题:
[FIRING:1] HighErrorRate (critical)
(FIRING 表示告警触发,1 表示当前触发的告警数); - 内容:
- 告警级别:
severity: critical
; - 摘要:
高错误率告警
; - 描述:
过去 1 分钟错误率为 2.5%,超过阈值 1%
; - 触发时间:
Starts at: 2024-05-20 16:45:00 +0800 CST
; - 链接:Prometheus 告警页面链接(便于直接查看详情)。
- 告警级别:
七、最佳实践与避坑指南
-
指标命名规范:
- 遵循
{业务}_{指标}_{单位}
格式,如http_request_duration_seconds
(业务:http,指标:request_duration,单位:seconds); - 避免使用大写字母和特殊字符(如
-
、.
),用下划线分隔; - 标签命名简洁,如
method
(而非http_method
)、path
(而非request_path
),减少冗余。
- 遵循
-
避免高基数标签:
- 标签值不能是“无限枚举”类型(如用户 ID、请求 ID、订单号),否则会导致指标数量爆炸(如 10 万用户就会生成 10 万条指标),拖慢 Prometheus;
- 推荐标签:
method
(GET/POST)、path
(/hello)、status
(200/500)、env
(dev/prod)——这些标签值是有限的。
-
指标粒度控制:
- 不要过度埋点:无需为每个函数、每个分支都埋点,聚焦核心业务指标(请求量、错误率、延迟、资源使用率);
- Histogram 区间合理设置:根据接口实际延迟调整
Buckets
,如大多数接口延迟在 0.1-1s,就不要设置 10s、20s 等过大的区间(会浪费存储)。
-
生产环境配置建议:
- Prometheus 开启持久化:默认 Prometheus 数据存在内存,重启后丢失,需在
prometheus.yml
中配置storage.tsdb.path
指定数据存储目录; - Grafana 权限控制:生产环境中给不同角色分配不同权限(如开发人员只能看仪表盘,管理员可修改配置);
- 告警分级:避免所有告警都设为
critical
,按影响范围分级(如 P0 核心接口错误设为 critical,P1 非核心接口设为 warning),减少告警风暴。
- Prometheus 开启持久化:默认 Prometheus 数据存在内存,重启后丢失,需在
八、总结
- 理解 Prometheus 的拉取模式和 Go 语言的 4 种核心指标类型;
- 搭建 Prometheus、Grafana 环境,初始化 Go 项目;
- 在 Go 项目中用中间件统一埋点指标,暴露
/metrics
接口; - 配置 Prometheus 拉取指标,用 PromQL 查询数据;
- 导入 Grafana 模板实现可视化,配置 Alertmanager 实现告警。
指标监控是系统稳定性的“基石”——它不是“事后补救”的工具,而是“事前预防”的屏障。建议在项目初期就接入监控,让系统的“健康状态”始终处于可见、可控的状态。
最后,附上相关工具的官方文档,供深入学习:
- Prometheus 官方文档:https://prometheus.io/docs/
- client_golang 文档:https://pkg.go.dev/github.com/prometheus/client_golang
- Grafana 官方文档:https://grafana.com/docs/
- Alertmanager 官方文档:https://prometheus.io/docs/alerting/latest/alertmanager/