当前位置: 首页 > 科技观察

使用PrometheusPushgateway推送监控指标

时间:2023-03-13 20:07:20 科技观察

我们知道Prometheus使用的pull模式,但是在某些网络场景下(比如不在子网或防火墙内),Prometheus无法直接拉取监控指标数据。这时候,我们可能就需要一种能够主动推送的模式。Pushgateway是Prometheus生态系统中解决这个问题的工具。不过Pushgateway也不是万能的,它也有一些缺点:多个节点的数据聚合到pushgateway,如果pushgateway挂了,影响的范围会更大。Prometheuspullstatus只针对pushgateway,并不能对每个target都有效。由于Pushgateway可以持久化所有推送给它的监控数据,即使你的监控离线了,Prometheus还是会拉取旧的监控数据,你需要手动清理Pushgateway不要的数据。Pushgateway的存在是为了允许临时和批处理作业将其指标公开给Prometheus。由于这些类型的任务存在的时间可能不够长,无法被抓取,因此它们可以将指标推送到Pushgateway,然后后者将这些指标公开给Prometheus。我们需要了解的一点是,Pushgateway并不是主动向Prometheus推送指标,而是通过脚本主动向Pushgateway推送指标数据,Prometheus仍然采用pull方式抓取指标。前面我们也介绍过,node-exporter中的textfilecollector也可以用来收集指标。它似乎类似于Pushgateway。两者之间有什么区别吗?文本文件通常用于节点级指标,而Pushgateway用于服务级指标。安装Pushgateway的安装也非常简单,直接从Release页面下载适合你平台的二进制版本解压即可使用。如果想从源码编译,可以直接在代码根目录下执行make命令进行编译。直接执行Pushgateway二进制文件即可启动。要更改侦听地址,您可以使用--web.listen-address标志指定它(例如,0.0.0.0:9091或:9091)。默认情况下,Pushgateway不保留指标。但是--persistence.file标志允许我们指定一个文件来保存推送的指标,以便在Pushgateway重新启动时这些指标仍然存在。另外,当然我们也可以直接使用Docker镜像启动:dockerrun-d-p9091:9091prom/pushgateway同样,我们还是在Kubernetes集群中部署P??ushgateway,对应的资源列表文件如下:#pushgateway.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:pushgateway-datanamespace:kube-monspec:accessModes:-ReadWriteOnceresources:requests:storage:2GistorageClassName:local-path---apiVersion:apps/v1kind:Deploymentmetadata:name:pushgateway资源:命名空间:kube-mon标签:app:pushgatewayspec:选择器:matchLabels:app:pushgateway模板:元数据:标签:app:pushgateway规范:卷:-名称:数据persistentVolumeClaim:claimName:pushgateway-data容器:-名称:pushgateway图像:舞会/推送网关:v1.4.3imagePullPolicy:IfNotPresent参数:-“--persistence.file=/data”端口:-容器端口:9091名称:httpvolumeMounts:-mountPath:"/data"name:dataresources:requests:cpu:100mmemory:500Milimits:cpu:100mmemory:500Mi---apiVersion:v1kind:Servicemetadata:name:pushgateway命名空间:kube-mon标签:app:pushgatewayspec:selector:app:pushgatewaytype:NodePortports:-name:httpport:9091targetPort:http这里我们--persistence.file指定持久化文件,然后通过一个Service暴露服务,直接套用上面的Resourcemanifest文件:??kubectlapply-fhttps://p8s.io/docs/pushgateway/manifests/pushgateway.yaml??kubectlgetpods-nkube-mon-lapp=pushgatewayNAMEREADYSTATUSRESTARTSAGEpushgateway-7684cbb67d-6mbjn1/1运行099s??kubectlgetsvc-nkube-mon-lapp=pushgatewayNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEpushgatewayNodePort10.106.136.2079091:30893/TCP107s默认情况下,Pushgateway会提供一个简单的网页,您可以查看当前有哪些指标可用。Pushgateway基本上支持PrometheusClientSDK推送和API推送两种数据推送方式。ClientSDKPushPrometheus本身提供了支持多种语言的SDK。通过SDK可以生成相关数据并推送到Pushgateway。当然这种方式需要客户端代码支持,这也是官方推荐的方案。目前的SDK覆盖语言是官方的:GoJava或者ScalaPythonRuby还有很多第三方库,具体可以参考这个链接:https://prometheus.io/docs/instrumenting/clientlibs/。这里我们以Python为例进行说明。首先安装PrometheusPythonSDK:??pipinstallprometheus-client然后创建一个名为app.py的文件,内容如下:'容器内存数据',['node'],registry=registry)g.labels(node='node1').inc()#+1g.labels(node='node2').dec(10)#-10g.labels(node='node3').set(4.2)#4.2c=Counter('my_requests_total','HTTP请求总数',['method','endpoint'],registry=registry)c.labels(method='get',endpoint='/').inc()c.labels(method='post',endpoint='/submit').inc()push_to_gateway('192.168.0.106:30893',job='batchA',registry=registry)首先介绍一下Prometheus的PythonSDK,然后创建一个CollectorRegistry实例,分别创建一个Gauge和Counter类型的指标,其中第一个参数是指标名称,第二个参数是指标信息的注释,第三个参数是相关标签,然后为不同的标签值设置不同的指标值,最后通过push_to_gateway函数将指标数据发送到指定的Pushgateway服务。直接执行上面的Python文件,将数据推送到Pushgateway:??pythonapp.pyAPIpush另外,使用Prometheus文本协议,推送指标也很简单,不需要提供单独的CLI。只需使用像curl这样的命令行工具。但需要注意的是,在文本协议中,每行必须以换行符('LF'或'\n')结束,其他方式结束一行,如使用'CR'('\r'),'CRLF'('\r\n')或只是数据包的结尾,将导致协议错误。推送的指标按组进行管理,由由任意数量的标签组成的分组键标识,其中第一个必须是作业标签。假设我们现在将单个样本推入由{job="some_job"}标识的组中:??echo"some_metric3.14"|curl--data-binary@-http://192.168.0.106:30893/metrics/job/some_job请注意,由于未提供类型信息,因此此处的some_metric将为UNTYPED。上述命令执行完毕后,我们可以再次进入Pushgateway的网页查看。可以看到页面上出现了我们上面推送的some_metric指标,它位于job="some_job"组下。接下来,我们将向{job="some_job",instance="some_instance"}标识的分组推送一些相对复杂的指标。记得在继续之前删除上面的组,然后执行以下命令:??cat<