监控

健康检查

go-zero 启动的服务(RPC Server 或 HTTP Server)默认集成健康检查,健康检查默认端口为6470,默认 Path 为/healthz,服务启动后访问健康检查地址会返回OK

  1. curl -i http://127.0.0.1:6470/healthz
  2. HTTP/1.1 200 OK
  3. Date: Thu, 09 Mar 2023 02:34:17 GMT
  4. Content-Length: 2
  5. Content-Type: text/plain; charset=utf-8
  6. OK

禁用健康检查配置如下:

  1. srv := rest.MustNewServer(rest.RestConf{
  2. Port: 8080,
  3. ServiceConf: service.ServiceConf{
  4. DevServer: devserver.Config{
  5. Enabled: true,
  6. },
  7. },
  8. })

对应配置开启:

  1. Name: user-api
  2. Host: 0.0.0.0
  3. Port: 8002
  4. ......
  5. DevServer:
  6. Enabled: true

可以通过配置修改健康检查端口和 Path,比如把健康检查端口和 Path 修改为8080ping

  1. srv := rest.MustNewServer(rest.RestConf{
  2. Port: 8080,
  3. ServiceConf: service.ServiceConf{
  4. DevServer: devserver.Config{
  5. Enabled: true,
  6. Port: 8080,
  7. HealthPath: "/ping",
  8. },
  9. },
  10. })

对应配置开启:

  1. Name: user-api
  2. Host: 0.0.0.0
  3. Port: 8002
  4. ......
  5. DevServer:
  6. Enabled: true
  7. Port: 8080
  8. HealthPath: "/ping"

日志收集

链路追踪

go-zero 中基于OpenTelemetry集成了链路追踪,配置如下:

  1. type Config struct {
  2. Name string `json:",optional"`
  3. Endpoint string `json:",optional"` // trace信息上报的url
  4. Sampler float64 `json:",default=1.0"` // 采样率
  5. Batcher string `json:",default=jaeger,options=jaeger|zipkin|otlpgrpc|otlphttp"`
  6. }

go-zero链路追踪支持(jaeger\zipkin)只需要在配置中添加几行配置就可开启,无需修改任何代码,示例如下:

1)api配置

  1. Name: user-api
  2. Host: 0.0.0.0
  3. Port: 8002
  4. Mode: dev
  5. ......
  6. #链路追踪
  7. Telemetry:
  8. Name: user-api
  9. Endpoint: http://jaeger:14268/api/traces
  10. Sampler: 1.0
  11. Batcher: jaeger

2)rpc配置

  1. Name: user-rpc
  2. ListenOn: 0.0.0.0:9002
  3. Mode: dev
  4. .....
  5. #链路追踪
  6. Telemetry:
  7. Name: user-rpc
  8. Endpoint: http://jaeger:14268/api/traces
  9. Sampler: 1.0
  10. Batcher: jaeger

更多详细示例请参考 tracing 示例

指标监控

go-zero 中 prometheus 指标默认启动收集,默认端口为6470,默认 Path 为/metrics,启动服务后访问指标监控地址如下:

  1. $ curl http://127.0.0.1:6470/metrics
  2. # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
  3. # TYPE go_gc_duration_seconds summary
  4. go_gc_duration_seconds{quantile="0"} 7.3427e-05
  5. go_gc_duration_seconds{quantile="0.25"} 7.3427e-05
  6. go_gc_duration_seconds{quantile="0.5"} 7.3427e-05
  7. go_gc_duration_seconds{quantile="0.75"} 7.3427e-05
  8. go_gc_duration_seconds{quantile="1"} 7.3427e-05
  9. go_gc_duration_seconds_sum 7.3427e-05
  10. go_gc_duration_seconds_count 1
  11. # HELP go_goroutines Number of goroutines that currently exist.
  12. # TYPE go_goroutines gauge
  13. go_goroutines 12

通过 EnableMetrics 禁用指标监控,通过 MetricsPath 修改指标监控 Path,如下:

  1. srv := rest.MustNewServer(rest.RestConf{
  2. Port: 8080,
  3. ServiceConf: service.ServiceConf{
  4. DevServer: devserver.Config{
  5. Enabled: true,
  6. Port: 6470,
  7. MetricsPath: "/metrics",
  8. EnableMetrics: false,
  9. },
  10. },
  11. })

go-zero 默认集成的 prometheus 指标如下:

RPC Server

指标名Label说明
rpc_server_requests_duration_msmethodHistogram,耗时统计单位为毫秒
rpc_server_requests_code_totalmethod、codeCounter,错误码统计

RPC Client

指标名Label说明
rpc_client_requests_duration_msmethodHistogram,耗时统计单位为毫秒
rpc_client_requests_code_totalmethod、codeCounter,错误码统计

HTTP Server

指标名Label说明
http_server_requests_duration_mspathHistogram,耗时统计单位为毫秒
http_server_requests_code_totalpath、codeCounter,错误码统计

Mysql

指标名Label说明
sql_client_requests_duration_mscommandHistogram,耗时统计单位为毫秒
sql_client_requests_error_totalcommand、errorCounter,错误统计

Redis

指标名Label说明
redis_client_requests_duration_mscommandHistogram,耗时统计单位为毫秒
redis_client_requests_error_totalcommand、errorCounter,错误统计

自定义监控指标

在包 go-zero/core/metric 下提供了 Histogram、Counter、Gauge 三种 prometheus 指标数据类型,用户可以使用该包下提供的方法自定义业务指标,如使用 Counter 来统计用户访问某一资源的总数,定义如下:

  1. // 定义Counter
  2. userVisitResourceTotal = metric.NewCounterVec(&metric.CounterVecOpts{
  3. Namespace: "user",
  4. Subsystem: "visit_resource",
  5. Name: "total",
  6. Help: "user visit resource count.",
  7. Labels: []string{"user_id", "resource_id"},
  8. })
  9. // 用户每次访问资源通过如下方法增加计数
  10. userVisitResourceTotal.Inc("userId", "resourceId")