Prometheus 是一种流行的开源系统监控和警报工具,可以在分布式系统中使用,通过收集指标并对任意时间范围的数据进行分析,可达到快速发现问题、诊断错误和评估性能瓶颈等目的。
在 Go 中,可以使用 Prometheus 的 Go 语言客户端来实现监控。一般情况下,需要实现以下几个步骤:
- 安装和配制 Prometheus 首先,需要在系统中安装 Prometheus 并进行配置。可以参考 Prometheus 官方文档来完成这一步骤。
- 引入 Prometheus Go 客户端 在 Go 程序中引入 Prometheus Go 客户端,通过它的 API 来暴露指标,并将其暴露给 Prometheus 服务器。
- 定义和注册指标 在程序中定义需要监控的指标,并设置其标签。标签是用于定义指标的不同实例或维度,例如 CPU,内存等。一旦指标定义完成,在客户端注册指标,以便 Prometheus 服务器可以访问它们。
- 统计指标 在需要监控的代码段中增加指标统计逻辑,以便能够捕获有关代码段执行性能、资源使用等方面的数据。
- 暴露指标 将收集到的指标暴露给 Prometheus 服务器。建议最好使用 HTTP 端点来暴露指标
docker-compose
搭建prometheus
采集服务
docker-compose启动Prometheus的示例:
Copy codeversion: '3'
services:
prometheus:
image: prom/prometheus:v2.28.1
restart: always
ports:
- 9090:9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
volumes:
prometheus_data:
说明:
- Prometheus使用官方的镜像
prom/prometheus
。 - 通过
volumes
挂载了本地的prometheus.yml
和一个名为prometheus_data
的卷,用于持久化存储Prometheus的度量数据。 - 使用
ports
将主机的9090端口映射到容器的9090端口,以便访问Prometheus Web UI。 - 指定了
command
选项,用于指定Prometheus的配置文件路径和度量数据存放位置。
要启动Prometheus,请在docker-compose.yml
文件所在的目录中运行以下命令:
Copy code
docker-compose up -d
现在,您可以通过浏览器访问http://localhost:9090 来查看Prometheus的Web UI。
golang
引入prometheus
包,接入监控
下面的代码演示了如何使用golang
向Prometheus
发送度量数据:
Copy codepackage main
import (
"math/rand"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
randomMetric = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "random_metric",
Help: "A random metric",
})
)
func init() {
prometheus.MustRegister(randomMetric)
}
func main() {
go func() {
for {
// 更新度量数据
value := rand.Float64() * 100
randomMetric.Set(value)
// 延迟2秒
time.Sleep(time.Second * 2)
}
}()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8080", nil)
}
- 定义一个名为
random_metric
的度量对象。 - 在
main()
函数中,定时更新random_metric
的值,并使用rand.Float64()
生成一个随机数作为度量值。 - 使用
prometheus.MustRegister()
函数将度量对象注册到Prometheus客户端库中。 - 在
main()
函数中,通过启动一个协程每2秒钟更新一次random_metric
的值。 - 创建一个HTTP处理程序,将度量指标暴露给Prometheus。