Golang中如何用Prometheus统计服务A到B的出站请求计数与耗时?
如何统计服务A到服务B的出站请求指标(基于Prometheus)
完全可以统计服务A到B的请求计数、耗时这类指标,下面是几种常用的实现方案:
1. 代码埋点(最直接灵活的方式)
在服务A的代码中使用Prometheus客户端库直接埋点,自定义指标来追踪请求数据:
- 定义两个核心指标:
- 计数器(Counter):统计请求总次数,可附加
method、status_code等标签区分请求类型和结果 - 直方图(Histogram)/摘要(Summary):统计请求耗时,直方图适合做分位数分析,摘要适合直接获取百分位数值
- 计数器(Counter):统计请求总次数,可附加
- 以Go语言为例的代码片段:
import ( "strconv" "time" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) // 初始化指标 var ( abRequestCount = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "service_a_to_b_requests_total", Help: "Total requests sent from service A to service B", }, []string{"method", "status"}, ) abRequestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "service_a_to_b_request_duration_seconds", Help: "Duration of requests from service A to service B", Buckets: prometheus.DefBuckets, // 默认耗时分桶,可自定义 }, []string{"method", "status"}, ) ) func init() { prometheus.MustRegister(abRequestCount) prometheus.MustRegister(abRequestDuration) // 暴露metrics端点 http.Handle("/metrics", promhttp.Handler()) go http.ListenAndServe(":8080", nil) } // 调用服务B时埋点 func callServiceB() { start := time.Now() resp, err := http.Get("http://service-b/api/endpoint") duration := time.Since(start).Seconds() status := "success" if err != nil { status = "error" } else { status = strconv.Itoa(resp.StatusCode) resp.Body.Close() } // 更新指标 abRequestCount.WithLabelValues("GET", status).Inc() abRequestDuration.WithLabelValues("GET", status).Observe(duration) } - 采集后可通过PromQL查询:
- 总请求数:
sum(service_a_to_b_requests_total) - 平均耗时:
avg(service_a_to_b_request_duration_seconds_sum / service_a_to_b_request_duration_seconds_count) - 某状态码的请求占比:
sum(service_a_to_b_requests_total{status="500"}) / sum(service_a_to_b_requests_total)
- 总请求数:
2. 代理/中间件方案(无需修改服务代码)
如果不想侵入服务A的代码,可以用代理或网关拦截流量并收集指标:
- 比如用Nginx、Envoy这类组件,配置流量转发的同时开启Prometheus指标采集,通过标签区分源服务(A)和目标服务(B)
- 以Envoy为例,配置
stats_config开启Prometheus导出,就能自动获取请求数、延迟、错误率等指标,无需服务侧改动
3. 服务网格方案(大规模场景推荐)
如果是微服务集群,可采用Istio、Linkerd这类服务网格:
- 服务网格会自动给服务注入Sidecar代理,全程拦截服务间通信,无需修改业务代码就能收集所有服务间的请求指标
- 直接通过Prometheus采集服务网格的指标,就能筛选出服务A到B的请求计数、耗时等数据
内容的提问来源于stack exchange,提问作者Nija
相关产品推荐
相关产品推荐

