CnOps 智能运维与可观测社区
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题
导航菜单
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题

CnOps 智能运维与可观测社区

愿景

CnOps 智能运维与可观测社区是一个以"智能运维与可观测"为核心的开放、包容、分享的技术社区,旨在聚集运维专家、开发者和爱好者,共同探讨、学习和分享可观测最佳实践与最新技术,与众多技术社区合作互动,共同探讨交叉领域的技术挑战,推动可观测领域的创新与进步。

内容社区

  • 实践文章
  • 视频课程
  • 开源项目
  • 常见问答
  • 开发者工具

友情链接

  • Prometheus
  • Grafana Lab
  • OpenTelemetry
  • LoongCollector

关注我们

阿里云云原生公众号阿里云云原生
阿里云可观测公众号阿里云可观测

Copyright © 2026 CnOps 社区. All rights reserved.

首页/开源项目/Prometheus/对用 Go 编写的 HTTP 服务器进行插桩
文档目录
Prometheus 入门Prometheus 入门使用基于文件的服务发现来发现抓取目标使用 Node Exporter 监控 Linux 主机指标理解指标类型对用 Go 编写的 HTTP 服务器进行插桩使用 Grafana 可视化指标基于指标的告警

Prometheus

对用 Go 编写的 HTTP 服务器进行插桩

在本教程中,我们将创建一个简单的 Go HTTP 服务器,并通过添加一个计数器指标来对其进行插桩,以记录服务器处理的请求总数。 这里有一个简单的 HTTP 服务器,带有一个 /ping 端点,返回 pong 作为响应。 编译并运行服务器 现在在浏览器中打开 http://localhost:8090/ping,你应该看到 pong。...

在本教程中,我们将创建一个简单的 Go HTTP 服务器,并通过添加一个计数器指标来对其进行插桩,以记录服务器处理的请求总数。

这里有一个简单的 HTTP 服务器,带有一个 /ping 端点,返回 pong 作为响应。

package main

import (
   "fmt"
   "net/http"
)

func ping(w http.ResponseWriter, req *http.Request) {
   fmt.Fprintf(w,"pong")
}

func main() {
   http.HandleFunc("/ping", ping)

   http.ListenAndServe(":8090", nil)
}

编译并运行服务器

go build server.go
./server

现在在浏览器中打开 http://localhost:8090/ping,你应该看到 pong。

Server

现在让我们为服务器添加一个指标,用于记录对 ping 端点发出的请求数量。Counter 指标类型适合此场景,因为我们知道请求计数不会下降,只会增加。

创建一个 Prometheus counter

type metrics struct {
	pingCounter prometheus.Counter
}

func newMetrics(reg prometheus.Registerer) *metrics {
	m := &metrics{
		pingCounter: promauto.With(reg).NewCounter(
			prometheus.CounterOpts {
				Name: "ping_request_count",
				Help: "No of requests handled by Ping handler",
			}),
	}
	return m
}

接下来,让我们更新 ping 处理函数,使用 metrics.pingCounter.Inc() 来增加计数器的值。

func ping(m *metrics) func(w http.ResponseWriter, req *http.Request) {
	return func(w http.ResponseWriter, req *http.Request) {
		m.pingCounter.Inc()
		fmt.Fprintf(w, "pong")
	}
}

然后将指标(在本例中只有一个计数器)注册到 Prometheus 注册表并暴露指标。

func main() {
	reg := prometheus.NewRegistry()
	m := newMetrics(reg)

	http.HandleFunc("/ping", ping(m))
	http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))
	http.ListenAndServe(":8090", nil)
}

prometheus.MustRegister 函数将 pingCounter 注册到默认注册表。
为了暴露指标,Go Prometheus 客户端库提供了 promhttp 包。
promhttp.Handler() 提供了一个 http.Handler,暴露默认注册表中注册的指标。

示例代码现在是:

package main

import (
	"fmt"
	"net/http"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promauto"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

type metrics struct {
	pingCounter prometheus.Counter
}

func newMetrics(reg prometheus.Registerer) *metrics {
	m := &metrics{
		pingCounter: promauto.With(reg).NewCounter(
			prometheus.CounterOpts{
				Name: "ping_request_count",
				Help: "No of request handled by Ping handler",
			}),
	}
	return m
}

func ping(m *metrics) func(w http.ResponseWriter, req *http.Request) {
	return func(w http.ResponseWriter, req *http.Request) {
		m.pingCounter.Inc()
		fmt.Fprintf(w, "pong")
	}
}

func main() {
	reg := prometheus.NewRegistry()
	m := newMetrics(reg)

	http.HandleFunc("/ping", ping(m))
	http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))
	http.ListenAndServe(":8090", nil)
}

运行示例

go mod init prom_example
go mod tidy
go run server.go

现在访问 localhost:8090/ping 端点几次,然后向 localhost:8090/metrics 发送请求以查看指标。

Ping Metric

这里,ping_request_count 显示 /ping 端点被调用了 3 次。

默认注册表自带 Go 运行时指标的收集器,这就是为什么我们看到了 go_threads、go_goroutines 等其他指标。

我们已经构建了第一个指标 exporter。让我们更新 Prometheus 配置来抓取服务器的指标。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: simple_server
    static_configs:
      - targets: ["localhost:8090"]

prometheus --config.file=prometheus.yml