普罗米修斯是一个系统监控和报警系统。2012年由SoundCloud开源,由云原生计算基金会孵化。普罗米修斯将所有度量数据存储为时间序列,即度量信息与记录它的时间戳一起存储,称为标签的可选键-值对也可以与度量一起存储。
外行术语中的度量是衡量的标准。我们要测量的内容取决于不同的应用程序。对于Web服务器,它可以是请求次数;对于数据库,它可以是CPU使用率或活动连接数等。
度量在理解应用程序以某种方式工作的原因方面起着重要作用。如果您运行一个Web应用程序,有人走到您跟前,说该应用程序很慢。您需要一些信息来了解您的应用程序发生了什么情况。例如,当请求数量很高时,应用程序可能会变得很慢。如果您有请求计数指标,您可以找出原因并增加服务器数量来处理繁重的负载。当您为您的应用程序定义度量时,您必须戴上侦探帽,并问这个问题,如果我的应用程序中出现任何问题,哪些信息对我调试是重要的?
比喻:我总是用这个比喻来简单地理解监控系统的作用。当我年轻的时候,我想长高,为了测量它,我用身高作为衡量标准。我让爸爸每天测量我的身高,每天都要有一张我的身高表。所以在这种情况下,我爸爸是我的监测系统,测量的是我的身高。
让我们考虑一下Web服务器作为示例应用程序。我想提取某个指标,比如我的Web服务器处理的API调用的数量。因此,我使用Prometheus客户端库添加了某些检测代码,并公开了度量信息。现在我的Web服务器也公开了它的指标,我希望它被普罗米修斯刮掉。因此,我单独运行Prometheus,并将其配置为在特定时间间隔(例如,每分钟)从侦听xyz IP地址端口7500的Web服务器获取指标。
我设置了普罗米修斯(Prometheus),并将我的Web服务器公开给前端或其他客户端使用。
晚上11点,当我让服务器开放供消费时。普罗米修斯抓取计数度量并将值存储为0。
到晚上11:01处理一个请求。我代码中的仪器逻辑将计数设为1。当普罗米修斯取消度量时,COUNT的值现在为1
到晚上11:02,处理了两个请求,现在请求计数为1+2=3。类似地,对指标进行抓取和存储。
(注:此表仅供理解之用。普罗米修斯没有以准确的格式存储值)。
普罗米修斯也有一个服务器,它公开通过抓取存储的指标。此服务器用于查询指标、在其上创建仪表板/图表等。PromQL用于查询指标。
我可以收集多个指标,这将有助于理解我的应用程序中正在发生的事情,并在这些指标上创建多个图表。将图表分组到仪表板中,并使用它了解我的应用程序中发生的情况。
让我们弄脏我们的手,设置普罗米修斯。普罗米修斯是用Golang编写的,您所需要的就是为您的操作系统编译的二进制文件。从此处下载与您的操作系统对应的二进制文件,并将该二进制文件添加到您的路径中。
普罗米修斯公开它自己的指标,这些指标可以由它自己或其他普罗米修斯服务器使用。
现在我们有了普罗米修斯,下一步就是运行它。我们所需要的只是二进制文件和一个配置文件。普罗米修斯使用YAML文件进行配置。
在上面的配置文件中,我们提到了sccrap_interval,即您希望普罗米修斯刮除指标的频率。我们已经添加了SCPRIVE_CONFIGURS,它有一个要从中抓取指标的名称和目标。默认情况下,普罗米修斯侦听端口9090。所以我把它加进去了。
现在,我们让普罗米修斯启动并运行起来,每隔15秒收集一次它自己的指标。普罗米修斯有标准的出口商可用于出口指标。接下来,我们将运行节点导出器,它是计算机指标的导出器,并使用prometheus进行擦除。从此处下载节点指标导出器。
全局:刮除间隔:15s刮除配置:-作业名称:普罗米修斯静态配置:-目标:[";本地主机:9090";]-作业名称:节点导出器静态配置:-目标:[";本地主机:9100";]。
截至2020年5月,普罗米修斯客户端库支持四种类型的指标。它们是:
计数器是只能增加或重置的度量值,即该值不能比前一个值减少。它可以用于诸如请求数、错误数等指标。
rate()函数获取一段时间范围内指标的历史记录,并计算值每秒增长的速度。Rate仅适用于计数器值。
仪表是一个可以向上或向下的数字。它可以用于集群中的实例数量、队列中的事件数量等指标。
与我们所看到的相比,直方图是一种有点复杂的度量类型。直方图可用于根据存储桶值计数的任何计算值,存储桶可由用户配置。它是一个累积指标,默认情况下提供所有值的总和。这适用于请求时间、CPU温度等指标。
示例:我想观察处理API请求所用的时间。直方图度量允许我们近似并存储落入特定存储桶的请求频率,而不是存储每个请求的请求时间。我为所用的时间定义桶,如0.3,0.5,0.7,1,1.2。这些是我的存储桶,一旦计算出请求所需的时间,我就将计数加到所有大于该值的存储桶中。
假设端点“/ping”的请求1花费0.25s。存储桶的计数值将为。
(由于直方图是累计频率,因此将1加到所有大于该值的存储桶中)。
端点“/ping”的请求2需要0.4s。存储桶的计数值如下所示。
由于0.4位于秒数桶(0.3-0.5)内,因此所有大于计算值计数的桶都会增加。直方图用于查找平均值和百分位数。
该图显示第90个百分位数为0.09,要查找过去5M内的直方图_分位数,可以使用rate()和时间帧。
汇总类似于直方图,它计算可以配置的分位数,但它是在应用程序级别计算的,因此无法聚合来自同一流程的多个实例的指标。在事先不知道指标的存储桶时使用,强烈建议尽可能使用直方图而不是汇总。在应用程序级别上计算摘要也相当昂贵,不建议使用。
包主要导入(";fmt";";net/http&34;)函数ping(使用http。ResponseWriter,请求*http。请求){fmt。Fprintf(w,#34;pong&34;)}func main(){http.。HandleFunc(";/ping";,ping)http。ListenAndServe(";:8090";,无)}。
现在,我们将向服务器添加一个度量,该度量将检测向ping端点发出的请求的数量。
我们将为此使用计数器度量类型,因为我们知道请求计数不会减少,只会增加。
var pingCounter=普罗米修斯。NewCounter(普罗米修斯)。CounterOpts{name:";ping_request_count";,help:";Ping处理程序处理的请求数";,},)。
接下来,我们使用pingCounter.Inc()更新ping处理程序以增加计数器的计数。
prometheus.MustRegister函数将pingCounter注册到默认寄存器。为了公开指标,Golang Prometheus客户端库提供了prohttp包。prohttp.Handler()提供一个http.Handler,它公开在默认注册中注册的指标。
包主要导入(";fmt&34;";NET/Http&34;";github.com/prometheus/client_golang/prometheus";";github.com/prometheus/client_golang/prometheus/promhttp&34;)var pingCounter=prometheus。NewCounter(普罗米修斯)。CounterOpts{name:";ping_request_count";,help:";ping处理程序处理的请求数";,},)函数ping(w http.。ResponseWriter,请求*http。请求){pingCounter。Inc()FMT。Fprintf(w,#34;pong&34;)}func main(){普罗米修斯。必须注册(PingCounter)http。HandleFunc(";/ping";,ping)http。句柄(";/metrics";,提示http。Handler())http。ListenAndServe(";:8090";,无)}。
现在点击localhost:8090/ping端点几次,向localhost:8090发送请求将提供度量。
DefaultRegister附带了GO运行时指标的收集器,这就是为什么我们看到其他指标,如GO_THREADS、GO_Goroutines等。
我们已经建造了我们的第一个公制导出器。让我们更新我们的普罗米修斯配置,以从我们的服务器中获取指标。
全局:刮除间隔:15s刮除配置:-作业名称:普罗米修斯静态配置:-目标:[";本地主机:9090";]-作业名称:简单服务器静态配置:-目标:[";本地主机:8090";]。
Handler对响应进行gzip压缩,如果您使用的是gzip中间件,则必须实现一些跳跃器逻辑,以避免对响应进行两次压缩。
广泛了解PromQL对于充分利用已收集的指标非常重要。请记住,我们的目标不仅是收集指标,而且是为与应用程序相关的问题得出答案。这是一个非常好的PromQL入门资源。