prometheus监控
指标是代表系统整体运行状况以及您认为对监视和警报或可观察性很重要的任何其他特定信息的主要方式 。 Prometheus是从2012年开始在SoundCloud上构建的领先的开源度量工具,收集和存储工具包。此后,它从Cloud Native Computing Foundation 毕业 ,并成为Kubernetes监控的事实上的标准。 它已在以下内容中进行了详细介绍:
但是,这些文章都没有集中讨论如何在Kubernetes上使用Prometheus。 本文:
- 描述Prometheus架构和数据模型,以帮助您了解其工作原理和功能
- 提供有关在Kubernetes集群中设置Prometheus以及如何使用它来监视集群和应用程序的教程
建筑
虽然了解Prometheus的工作原理对于有效使用它并不重要,但它可能会有所帮助,尤其是在您考虑将其用于生产时。 Prometheus文档提供了此图形以及有关Prometheus的基本元素以及各部分之间如何连接的详细信息。
对于大多数用例,您应该了解Prometheus的三个主要组成部分:
- Prometheus 服务器抓取并存储指标。 请注意,它使用了持久层,该持久层是服务器的一部分,文档中未明确提及。 服务器的每个节点都是自治的,并且不依赖于分布式存储。 稍后,当我希望使用专用的时间序列数据库来存储Prometheus数据而不是依赖服务器本身时,将再次进行讨论。
- Web UI允许您访问,可视化和绘制存储数据的图表。 Prometheus提供了自己的UI,但是您也可以配置其他可视化工具,例如Grafana ,以使用PromQL(Prometheus查询语言)访问Prometheus服务器。
- Alertmanager从客户端应用程序(尤其是Prometheus服务器)发送警报。 它具有用于重复数据删除,分组和路由警报的高级功能,并且可以路由其他服务,例如PagerDuty和OpsGenie。
理解Prometheus的关键是它从根本上依赖于从已定义的端点中刮取或拉取度量标准。 这意味着您的应用程序需要公开一个可以使用度量的端点,并指示Prometheus服务器如何对其进行爬网(下面的教程中对此进行了介绍)。 对于许多应用程序,有些导出器没有添加Web端点的简便方法,例如Kafka和Cassandra (使用JMX导出器)。
资料模型
Prometheus文档的“ 度量类型”部分。计数器和量规
两种最简单的度量标准类型是counter和gauge 。 当开始使用Prometheus(或更一般地说是时间序列监视)时,这些是最容易理解的类型,因为很容易将它们连接到您可以想象的监视值,例如应用程序正在使用多少系统资源或多少事件。已处理。
“ 计数器是一个累积量度,代表一个单调递增的计数器,其值只能在重新启动时增加或重置为零。例如,您可以使用计数器来代表已服务的请求数,已完成的任务或错误。”
因为您不能减少计数器,所以它可以并且应该仅用于表示累积指标。
“ 量规是代表单个数值的指标,该数值可以任意地上下波动。量规通常用于测量值,例如[CPU]或当前内存使用情况,也用于可以上下波动的“计数”,例如并发请求数。”
直方图和摘要
Prometheus支持两种更复杂的度量标准类型: 直方图 和 摘要 。 由于它们都跟踪观察次数和观察值的总和,因此这里有很多混淆的机会。 选择使用它们的原因之一是您需要计算观察值的平均值。 请注意,它们在数据库中创建了多个时间序列。 例如,它们各自创建带有_sum后缀的观测值的总和 。
“ 直方图对观测值(通常是请求持续时间或响应大小之类的东西)进行采样,并将其计数在可配置的存储桶中。它还提供所有观测值的总和。”
这使它成为跟踪诸如延迟之类的事情的最佳人选,这些事情可能针对它定义了服务级别目标(SLO)。 从文档中 :
您可能有一个SLO在300毫秒内处理95%的请求。 在这种情况下,请将直方图配置为具有0.3秒上限的存储桶。 然后,您可以直接表示300毫秒内服务的相对请求数量,并在该值降至0.95以下时轻松发出警报。 以下表达式按作业为最近5分钟内服务的请求计算它。 请求持续时间是使用称为http_request_duration_seconds的直方图收集的。
sum(rate(http_request_duration_seconds_bucket{le="0.3"}[5m])) by (job) / sum(rate(http_request_duration_seconds_count[5m])) by (job)
返回定义:
“类似于直方图, 摘要会采样观察值(通常是请求持续时间和响应大小之类的东西。虽然它还提供观察值的总数和所有观察值的总和,但它会在滑动时间窗口内计算可配置的分位数。”
汇总和直方图之间的本质区别在于,汇总在客户端上计算流φ分位数并直接公开它们,而直方图则公开了桶式观察计数,而直方图桶中的分位数的计算则在服务器端使用histogram_quantile()函数。
如果您仍然感到困惑,建议您采用以下方法:
- 大部分时间都使用量规来获取简单的时间序列指标。
- 将计数器用于您知道会单调增加的事物,例如,如果您要计算发生某事的次数。
- 使用直方图通过简单的存储桶进行延迟测量,例如,一个存储桶用于“ SLO以下”,另一个存储桶用于“ SLO之上”。
这对于绝大多数用例来说已经足够了,并且您应该依靠统计分析专家来帮助您解决更高级的情况。
现在,您已经对Prometheus是什么,它如何工作以及可以收集和存储的数据类型有了基本的了解,现在就可以开始本教程了。
Prometheus和Kubernetes动手教程
本教程包括以下内容:
- 在您的集群中安装Prometheus
- 下载示例应用程序并查看代码
- 构建和部署应用程序并为其生成负载
- 访问Prometheus UI并查看基本指标
本教程假定:
- 您已经部署了Kubernetes集群。
- 您已配置kubectl命令行实用程序进行访问。
- 您具有集群管理员角色(或至少具有足够的特权来创建名称空间和部署应用程序)。
- 您正在运行基于Bash的命令行界面。 如果您运行其他操作系统或外壳环境,请调整本教程。
如果您尚未运行Kubernetes,则此Minikube教程是在笔记本电脑上进行设置的简便方法。
如果您现在准备好了,那就走吧。
安装Prometheus
在本节中,您将克隆样本存储库并使用Kubernetes的配置文件将Prometheus部署到专用名称空间。
- 在本地克隆样本存储库,并将其用作您的工作目录: $ git clone https: // github.com / yuriatgoogle / prometheus-demo.git
$ cd prometheus-demo
$ WORKDIR =$ ( pwd ) - 为Prometheus部署创建专用的名称空间:
$ kubectl create namespace prometheus
- 为您的名称空间提供群集读取器角色: $ kubectl apply -f $WORKDIR / kubernetes / clusterRole.yaml
clusterrole.rbac.authorization.k8s.io / prometheus created
clusterrolebinding.rbac.authorization.k8s.io / prometheus created - 使用抓取和警报规则创建Kubernetes configmap: $ kubectl apply -f $WORKDIR / kubernetes / configMap.yaml -n prometheus
configmap / prometheus-server-conf created - 部署Prometheus: $ kubectl create -f prometheus-deployment.yaml -n prometheus
deployment.extensions / prometheus-deployment created - 验证Prometheus是否正在运行: $ kubectl get pods -n prometheus
NAME READY STATUS RESTARTS AGE
prometheus-deployment-78fb5694b4-lmz4r 1 / 1 Running 0 15s
查看基本指标
在本部分中,您将访问Prometheus UI并查看所收集的指标。
- 使用端口转发可在本地启用对Prometheus UI的Web访问:
注意:您的prometheus-deployment名称将与此示例不同。 在上一个命令的输出中检查并替换吊舱的名称。$ kubectl port-forward prometheus-deployment-7ddb99dcb-fkz4d 8080 : 9090 -n prometheus
Forwarding from 127.0.0.1: 8080 - > 9090
Forwarding from [ :: 1 ] : 8080 - > 9090 - 在浏览器中转到http:// localhost:8080 :
您现在可以查询Prometheus指标了!
- 一些基本的计算机指标(例如CPU内核和内存的数量)立即可用。 例如,在表达式字段中输入machine_memory_bytes ,切换到“图形”视图,然后单击“执行”以查看绘制的度量标准:
- 集群中运行的容器也会被自动监视。 例如,输入rate(container_cpu_usage_seconds_total {container_name =“ prometheus”} [1m])作为表达式,然后单击执行以查看Prometheus的CPU使用率:
现在,您知道如何安装Prometheus并使用它来测量一些现成的指标,是时候进行一些实际的监视了。
黄金信号
如Google SRE的“ 监视分布式系统 ”一章中所述:
“监视的四个黄金信号是等待时间,流量,错误和饱和。如果您只能测量面向用户系统的四个指标,请关注这四个。”
本书提供了对这四个方面的详尽描述,但是本教程重点介绍最容易充当用户幸福感的三个信号:
- 流量:您收到了多少个请求
- 错误率:您可以成功处理多少个请求
- 延迟:您可以多快的时间处理成功的请求
正如您现在可能已经意识到的那样,普罗米修斯(Prometheus)不会为您测量其中任何一个。 您必须对部署的所有应用程序进行检测以发出它们。 以下是示例实现。
打开$ WORKDIR / node / golden_signals / app.js文件,该文件是用Node.js编写的示例应用程序(回想一下,我们克隆了yuriatgoogle / prometheus-demo并导出了$ WORKDIR )。 首先查看第一部分,其中定义了要记录的指标:
// total requests - counter
const nodeRequestsCounter
=
new prometheus.
Counter
(
{
name
:
'node_requests'
,
help
:
'total requests'
}
)
;
第一个指标是一个计数器,将针对每个请求递增; 这是请求总数的计数方式:
// failed requests - counter
const nodeFailedRequestsCounter
=
new prometheus.
Counter
(
{
name
:
'node_failed_requests'
,
help
:
'failed requests'
}
)
;
第二个指标是另一个计数器,该计数器针对每个错误递增,以跟踪失败的请求数:
// latency - histogram
const nodeLatenciesHistogram
=
new prometheus.
Histogram
(
{
name
:
'node_request_latency'
,
help
:
'request latency by path'
,
labelNames
:
[
'route'
]
,
buckets
:
[
100
,
400
]
}
)
;
第三个指标是跟踪请求等待时间的直方图。 使用非常基本的假设(即SLO的延迟时间为100ms)工作,您将创建两个存储桶:一个存储桶为100ms,另一个存储桶为400ms延迟。
下一节将处理传入的请求,为每个请求增加总请求度量,在出现(人为引起的)错误时增加失败的请求,并记录每个成功请求的延迟直方图值。 我选择不记录错误的等待时间; 实施细节由您决定。
app.
get
(
'/'
,
( req
, res
)
=>
{
// start latency timer
const requestReceived
=
new
Date
(
) .
getTime
(
)
;
console.
log
(
'request made'
)
;
// increment total requests counter
nodeRequestsCounter.
inc
(
)
;
// return an error 1% of the time
if
(
(
Math .
floor
(
Math .
random
(
)
*
100
)
)
==
100
)
{
// increment error counter
nodeFailedRequestsCounter.
inc
(
)
;
// return error code
res.
send
(
"error!"
,
500
)
;
}
else
{
// delay for a bit
sleep.
msleep
(
(
Math .
floor
(
Math .
random
(
)
*
1000
)
)
)
;
// record response latency
const responseLatency
=
new
Date
(
) .
getTime
(
)
- requestReceived
;
nodeLatenciesHistogram
.
labels
( req.
route .
path
)
.
observe
( responseLatency
)
;
res.
send
(
"success in "
+ responseLatency
+
" ms"
)
;
}
}
)
本地测试
既然您已经了解了如何实现Prometheus指标,那么请看运行应用程序时会发生什么。
- 安装所需的软件包: $ cd $WORKDIR / node / golden_signals
$ npm install --save - 启动应用程序:
$ node app.js
- 打开两个浏览器选项卡:一个到http:// localhost:8080 ,另一个到http:// localhost:8080 / metrics 。
- 转到/ metrics页面时,您可以看到每次重新加载主页时Prometheus度量标准正在收集和更新:
现在,您可以将示例应用程序部署到Kubernetes集群并测试监视了。
在Kubernetes上将监视部署到Prometheus
现在是时候通过以下方法查看如何在部署在集群中的Prometheus实例中记录和表示指标了:
- 构建应用程序映像
- 将其部署到您的集群
- 针对应用程序生成负载
- 观察记录的指标
构建应用程序映像
该示例应用程序提供了一个Dockerfile,您将使用它来构建映像。 本节假定您具有:
- 在本地安装和配置Docker
- Docker Hub帐户
- 创建一个仓库
如果您使用Google Kubernetes Engine运行集群,则可以改用Cloud Build和Google Container Registry。
- 切换到应用程序目录:
$ cd $WORKDIR / node / golden_signals
- 使用以下命令构建映像:
$ docker build . --tag = < Docker username >/ prometheus-demo-node:latest
- 确保您已登录Docker Hub:
$ docker login
- 使用以下命令将映像推送到Docker Hub:
$ docker push < username >/ prometheus-demo-node:latest
- 验证图像是否可用:
$ docker images
部署应用
现在,应用程序映像位于Docker Hub中,您可以将其部署到集群中并运行该应用程序。
- 修改$ WORKDIR / node / golden_signals / prometheus-demo-node.yaml文件,以从Docker Hub中提取图像: spec :
containers :
- image : docker.io/<Docker username>/prometheus-demo-node:latest - 部署映像: $ kubectl apply -f $WORKDIR / node / golden_signals / prometheus-demo-node.yaml
deployment.extensions / prometheus-demo-node created - 验证该应用程序正在运行: $ kubectl get pods
NAME READY STATUS RESTARTS AGE
prometheus-demo-node-69688456d4-krqqr 1 / 1 Running 0 65s - 使用负载平衡器公开应用程序: $ kubectl expose deployment prometheus-node-demo --type =LoadBalancer --name =prometheus-node-demo --port = 8080
service / prometheus-demo-node exposed - 确认您的服务具有外部IP地址: $ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT ( S ) AGE
kubernetes ClusterIP 10.39.240.1 < none > 443 / TCP 23h
prometheus-demo-node LoadBalancer 10.39.248.129 35.199.186.110 8080 : 31743 / TCP 78m
生成负载以测试监控
现在您的服务已启动并正在运行,请使用Apache Bench对其产生一些负载。
- 获取您的服务的IP地址作为变量:
$ export SERVICE_IP =$ ( kubectl get svc prometheus-demo-node -ojson | jq -r '.status.loadBalancer.ingress[].ip' )
- 使用ab产生一些负载。 您可能要在单独的终端窗口中运行它。
$ ab -c 3 -n 1000 http: // ${SERVICE_IP} : 8080 /
查看指标
在负载运行时,再次访问群集中的Prometheus UI,并确认正在收集“黄金信号”度量标准。
- 建立与Prometheus的连接: $ kubectl get pods -n prometheus
NAME READY STATUS RESTARTS AGE
prometheus-deployment-78fb5694b4-lmz4r 1 / 1 Running 0 15s
$ kubectl port-forward prometheus-deployment-78fb5694b4-lmz4r 8080 : 9090 -n prometheus
Forwarding from 127.0.0.1: 8080 - > 9090
Forwarding from [ :: 1 ] : 8080 - > 9090注意:确保将第二个命令中的Pod名称替换为第一个命令的输出。
- 在浏览器中打开http:// localhost:8080 :
- 使用以下表达式衡量请求率:
rate ( node_requests [ 1m ] )
- 使用以下表达式来衡量您的错误率:
rate ( node_failed_requests [ 1m ] )
- 最后,使用此表达式来验证您的延迟SLO。 请记住,您设置了两个存储桶,分别为100ms和400ms。 此表达式返回满足SLO的请求的百分比:
sum ( rate ( node_request_latency_bucket { le = "100" } [ 1h ] ) ) / sum ( rate ( node_request_latency_count [ 1h ] ) )
大约10%的请求在SLO内。 这是您应该期望的,因为代码会在0到1,000之间随机Hibernate毫秒数。 这样,大约有10%的时间,它会在100毫秒内返回,并且此图表明您无法满足延迟SLO的要求。
摘要
恭喜你! 您已经完成了本教程,并希望对Prometheus的工作原理,如何使用自定义指标对应用程序进行检测以及如何使用它来衡量SLO遵从性有更好的了解。 本系列的下一篇文章将介绍使用OpenCensus的另一种度量工具方法。
翻译自: https://opensource.com/article/19/11/introduction-monitoring-prometheus
prometheus监控