You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang中如何用Prometheus统计服务A到B的出站请求计数与耗时?

如何统计服务A到服务B的出站请求指标(基于Prometheus)

完全可以统计服务A到B的请求计数、耗时这类指标,下面是几种常用的实现方案:

1. 代码埋点(最直接灵活的方式)

在服务A的代码中使用Prometheus客户端库直接埋点,自定义指标来追踪请求数据:

  • 定义两个核心指标:
    • 计数器(Counter):统计请求总次数,可附加method、status_code等标签区分请求类型和结果
    • 直方图(Histogram)/摘要(Summary):统计请求耗时,直方图适合做分位数分析,摘要适合直接获取百分位数值
  • 以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:55:06