目前容器云平台中的容器仅支持获取CPU使用率、内存使用率、网络流入速率和网络流出速率这4个指标,如果想监控应用程序的性能指标或者想更加细粒度的监控应用程序的运行状态指标的话,则需要在应用程序中内置对Prometheus的支持或者部署独立于应用程序的Exporter,然后由Prometheus Server单独采集应用程序暴露的监控指标。
Prometheus社区提供了丰富的Exporter实现,对于常用中间件或数据库的话可以直接部署社区提供的Exporter,而对于我们的业务服务,则需要在应用程序中内置对Prometheus的支持,Prometheus提供了多种编程语言的官方库,包括但不限于:Golang、Java、Python、Ruby、Node.js、C++、.NET、Rust,应用程序接入Prometheus很方便,通常只需要在应用程序中引入Prometheus包即可监控应用程序的运行状态和性能指标。
本文以Golang语言为例,为您介绍如何使用官方版 Golang 库来暴露 Golang runtime 相关的数据,以及其它一些基本简单的示例,并使用 Prometheus Server监控服务来采集指标,使用Prometheus UI和Grafana展示数据。
通过 go get
命令来安装相关依赖,示例如下:
1 2 3 4 5 6 |
|
创建个Golang项目,项目结构如下:
1)准备一个 HTTP 服务,路径通常使用 /metrics
。可以直接使用 prometheus/promhttp 里提供的 Handler 函数。 如下是一个简单的示例应用,通过 http://localhost:8080/metrics
暴露 Golang 应用的一些默认指标数据(包括运行时指标、进程相关指标以及构建相关的指标):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
2)执行以下命令启动应用:
1 |
|
3)执行以下命令,访问基础内置指标数据,其中以 go_ 为前缀的指标是关于 Go 运行时相关的指标,比如垃圾回收时间、goroutine 数量等,这些都是 Go 客户端库特有的,其他语言的客户端库可能会暴露各自语言的其他运行时指标;以 promhttp_ 为前缀的指标是 promhttp 工具包提供的,用于跟踪对指标请求的处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
|
所有的指标也都是通过如下所示的格式来标识的:
1 2 3 |
|
1)上述示例仅仅暴露了一些基础的内置指标。应用层面的自定义指标还需要额外添加。如下示例暴露了一个名为 http_request_total 的计数类型指标,用于统计应用被访问次数,每访问应用一次计数器加1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
promauto.NewCounter(...)方法默认会帮助我们注册指标:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
2)执行以下命令启动应用:
1 |
|
3)执行5次以下命令,访问应用:
1 |
|
4)执行以下命令,访问暴露的指标,可以发现不仅有示例1中暴露的基础内置指标数据,还有我们自定义指标(http_request_total),包括帮助文档、类型信息、指标名和当前值,如下所示:
1 2 3 4 5 |
|
上述我们提供了两个示例展示如何使用 Prometheus Golang 库来暴露应用的指标数据,但暴露的监控指标数据为文本类型,需要Prometheus Server来抓取指标。
1)Golang 应用一般可以使用如下形式的 Dockerfile(按需修改):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
2)构建应用容器镜像,并将镜像传到镜像仓库中,此步骤比较简单,本文不再赘余。
3)根据应用类型定义一个 Kubernetes 的资源,这里我们使用 Deployment,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
4)同时需要 Kubernetes Service 做服务发现和负载均衡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
注意:Service必须添加一个 Label 来标明目前的应用,Label 名不一定为 app,但是必须有类似含义的 Label 存在,ServiceMonitor资源与Service资源通过Service Label进行关联。
5)通过容器云平台图形化界面或者直接使用 kubectl 将这些资源定义提交给 Kubernetes,然后等待创建成功。
添加Service Monitor 让 Prometheus 监控服务并采集监控指标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
注意:port
的取值为 service yaml
配置文件里的 spec/ports/name
对应的值。
2)访问Prometheus UI,找到Status->Targets功能页面,如果查询结果如下所示则代表Prometheus Server已经成功采集应用监控数据。
如下,通过Prometheus UI使用PromQL语句查询应用访问次数。
如下,通过Grafana查看应用监控数据。
注意:可以通过Dashboards | Grafana Labs查找Go Metrics Dashbord模板,上图使用的Dashbord Id是240。
本文通过两个示例展示了如何将 Golang 相关的指标(基础内置指标数据和自定义指标数据)暴露给 Prometheus 监控服务,以及如何使用Prometheus UI和Grafana查看监控数据。