监控神器:Prometheus 轻松入门,真香!

点击关注公众号,实用技术文章及时了解a1d7a6164bd73ea6ef19ec3640c0c833.png

导语 :Prometheus是一个开源的完整监控解决方案,本文将从指标抓取到查询及可视化展示,以及最后的监控告警,对Prometheus做一个基本的认识。

一、简介

Prometheus是古希腊神话里泰坦族的一名神明,名字的意思是“先见之明”,下图中是Prometheus被宙斯惩罚,饱受肝脏日食夜长之苦。

8a5325373c9439475ea4d817924c4c10.png下面就是我们CRUD Boy所了解的Prometheus,下面是其官网封面图引导语:From metrics to insight,从指标到洞察力,通过指标去洞察你的系统,为我们的系统提供指标收集和监控的开源解决方案。

也就是说,Prometheus是一个数据监控的解决方案,让我们能随时掌握系统运行的状态,快速定位问题和排除故障。

60fdf6db897aadf71da05ef328f2fa20.pngPrometheus发展速度很快,12年开发完成,16年加入CNCF,成为继K8s 之后第二个CNCF托管的项目,目前Github 42k的🌟,而且社区很活跃,维护频率很高,基本稳定在1个月1个小版本的迭代速度。

f4cf13a37a6b5bcd8083c39411a76912.png

二、整体生态

Prometheus提供了从指标暴露,到指标抓取、存储和可视化,以及最后的监控告警等一系列组件。

5a56216e7cba451034577b0ecb3579bc.png

(一)指标暴露

每一个被Prometheus监控的服务都是一个Job,Prometheus为这些Job 提供了官方的SDK ,利用这个SDK可以自定义并导出自己的业务指标,也可以使用Prometheus官方提供的各种常用组件和中间件的Exporter(比如常用的MySQL,Consul等等)。

对于短时间执行的脚本任务或者不好直接 Pull指标的服务,Prometheus提供了PushGateWay网关给这些任务将服务指标主动推Push到网关,Prometheus再从这个网关里Pull指标。

(二)指标抓取

上面提到了Push和Pull,其实这是两种指标抓取模型。

  • Pull模型: 监控服务主动拉取被监控服务的指标。

f1c841d08cbc2a46684f4c2cd642b62a.png

被监控服务一般通过主动暴露metrics端口或者通过Exporter的方式暴露指标,监控服务依赖服务发现模块发现被监控服务,从而去定期的抓取指标。

  • Push模型: 被监控服务主动将指标推送到监控服务,可能需要对指标做协议适配,必须得符合监控服务要求的指标格式。

ab8d90ce13a437b849b0c7c10ccb0450.png对于Prometheus中的指标抓取,采用的是Pull模型,默认是一分钟去拉取一次指标,通过Prometheus.yaml配置文件中的scrape_interval配置项配置,Prometheus对外都是用的Pull模型,一个是Pull Exporter的暴露的指标,一个是Pull PushGateway暴露的指标。

(三)指标存储和查询

指标抓取后会存储在内置的时序数据库中,Prometheus也提供了PromQL 查询语言给我们做指标的查询,我们可以在Prometheus的WebUI上通过 PromQL,可视化查询我们的指标,也可以很方便的接入第三方的可视化工具,例如grafana

(四)监控告警

prometheus提供了alertmanageer基于promql来做系统的监控告警,当promql查询出来的指标超过我们定义的阈值时,prometheus会发送一条告警信息到alertmanager,manager会将告警下发到配置好的邮箱或者微信。

三、工作原理

Prometheus的从被监控服务的注册到指标抓取到指标查询的流程分为五个步骤:

11df982e61207ea78ded39c0a4d341ad.png

(一)服务注册

被监控服务在Prometheus中是一个Job存在,被监控服务的所有实例在 Prometheus中是一个target的存在,所以被监控服务的注册就是在 Prometheus中注册一个Job和其所有的target,这个注册分为:静态注册和动态注册

静态注册: 静态的将服务的IP和抓取指标的端口号配置在Prometheus yaml文件的scrape_configs配置下:

scrape_configs:- job_name: "prometheus"static_configs:- targets: ["localhost:9090"]

以上就是注册了一个名为prometheus的服务,这个服务下有一个实例,暴露的抓取地址是localhost:9090

动态注册: 动态注册就是在Prometheus yaml文件的scrape_configs配置下配置服务发现的地址和服务名,Prometheus会去该地址,根据你提供的服务名动态发现实例列表,在Prometheus中,支持consul,DNS,文件,K8s等多种服务发现机制。基于consul的服务发现:

- job_name: "node_export_consul"metrics_path: /node_metricsscheme: httpconsul_sd_configs:- server: localhost:8500services:- node_exporter

我们consul的地址就是:localhost:8500,服务名是node_exporter,在这个服务下有一个exporter实例:localhost:9600

576798bb9dca5e50c62fdd2c132e080e.png注意:如果是动态注册,最好加上这两配置,静态注册指标拉取的路径会默认的帮我们指定为 metrics_path:/metrics,所以如果暴露的指标抓取路径不同或者是动态的服务注册,最好加上这两个配置。

不然会报错“INVALID“ is not a valid start token,演示下,百度了一下,这里可能是数据格式不统一导致。

metrics_path: /node_metrics
scheme: http

最后可以在webUI中查看发现的实例:

3cffc3edaae8c734e8b01dbceec2e7a3.png目前,Prometheus支持多达二十多种服务发现协议:

<azure_sd_config>
<consul_sd_config>
<digitalocean_sd_config>
<docker_sd_config>
<dockerswarm_sd_config>
<dns_sd_config>
<ec2_sd_config>
<openstack_sd_config>
<file_sd_config>
<gce_sd_config>
<hetzner_sd_config>
<http_sd_config>
<kubernetes_sd_config>
<kuma_sd_config>
<lightsail_sd_config>
<linode_sd_config>
<marathon_sd_config>
<nerve_sd_config>
<serverset_sd_config>
<triton_sd_config>
<eureka_sd_config>
<scaleway_sd_config>
<static_config>

(二)配置更新

在更新完Prometheus的配置文件后,我们需要更新我们的配置到程序内存里,这里的更新方式有两种,第一种简单粗暴,就是重启Prometheus,第二种是动态更新的方式。如何实现动态的更新Prometheus配置。

第一步:首先要保证启动Prometheus的时候带上启动参数:--web.enable-lifecycle

prometheus --config.file=/usr/local/etc/prometheus.yml --web.enable-lifecycle

第二步:去更新我们的Prometheus配置:

curl -v --request POST 'http://localhost:9090/-/reload'

第三步:更新完配置后,我们可以通过Post请求的方式,动态更新配置:

原理:

Prometheus在web模块中,注册了一个handler

if o.EnableLifecycle {router.Post("/-/quit", h.quit)router.Put("/-/quit", h.quit)router.Post("/-/reload", h.reload)  // reload配置router.Put("/-/reload", h.reload)   
}

通过h.reload这个handler方法实现:这个handler就是往一个channle中发送一个信号:

func (h *Handler) reload(w http.ResponseWriter, r *http.Request) {rc := make(chan error)h.reloadCh <- rc    // 发送一个信号到channe了中if err := <-rc; err != nil {http.Error(w, fmt.Sprintf("failed to reload config: %s", err), http.StatusInternalServerError)}
}

在main函数中会去监听这个channel,只要有监听到信号,就会做配置的reload,重新将新配置加载到内存中

case rc := <-webHandler.Reload():if err := reloadConfig(cfg.configFile, cfg.enableExpandExternalLabels, cfg.tsdb.EnableExemplarStorage, logger, noStepSubqueryInterval, reloaders...); err != nil {level.Error(logger).Log("msg", "Error reloading config", "err", err)rc <- err} else {rc <- nil}

(三)指标抓取和存储

Prometheus对指标的抓取采取主动Pull的方式,即周期性的请求被监控服务暴露的metrics接口或者是PushGateway,从而获取到Metrics指标,默认时间是15s抓取一次,配置项如下:

global:scrape_interval: 15s

抓取到的指标会被以时间序列的形式保存在内存中,并且定时刷到磁盘上,默认是两个小时回刷一次。并且为了防止Prometheus 发生崩溃或重启时能够恢复数据,Prometheus也提供了类似MySQL中binlog一样的预写日志,当Prometheus崩溃重启时,会读这个预写日志来恢复数据。

四、Metric指标

(一)数据模型

6b856a76d8ca772995d86ea720a8290b.pngPrometheus采集的所有指标都是以时间序列的形式进行存储,每一个时间序列有三部分组成:

  • 指标名和指标标签集合:metric_name{<label1=v1>,<label2=v2>....},指标名:表示这个指标是监控哪一方面的状态,比如http_request_total表示:请求数量;指标标签,描述这个指标有哪些维度,比如http_request_total这个指标,有请求状态码code= 200/400/500,请求方式:method=get/post等,实际上指标名称实际上是以标签的形式保存,这个标签是name,即:name=

  • 时间戳:描述当前时间序列的时间,单位:毫秒。

  • 样本值:当前监控指标的具体数值,比如http_request_total的值就是请求数是多少。

可以通过查看Prometheusmetrics接口查看所有上报的指标:

d26230b00636fa74cea05b9d7854b6b7.png所有的指标也都是通过如下所示的格式来标识的:

# HELP    // HELP:这里描述的指标的信息,表示这个是一个什么指标,统计什么的
# TYPE    // TYPE:这个指标是什么类型的
<metric name>{<label name>=<label value>, ...}  value    // 指标的具体格式,<指标名>{标签集合} 指标值

(二)指标类型

Prometheus底层存储上其实并没有对指标做类型的区分,都是以时间序列的形式存储,但是为了方便用户的使用和理解不同监控指标之间的差异,Prometheus定义了4种不同的指标类型:计数器counter,仪表盘gauge,直方图histogram,摘要summary

3135dce7c07715b06e4c3dc352d974fe.png
Counter计数器:

Counter类型和redis的自增命令一样,只增不减,通过Counter指标可以统计Http请求数量,请求错误数,接口调用次数等单调递增的数据。同时可以结合increase和rate等函数统计变化速率,后续我们会提到这些内置函数。

729932fc13c3ffc32097ca0d3a092867.png
Gauge仪表盘:

Counter不同,Gauge是可增可减的,可以反映一些动态变化的数据,例如当前内存占用,CPU利用,Gc次数等动态可上升可下降的数据,在Prometheus上通过Gauge,可以不用经过内置函数直观的反映数据的变化情况,如下图表示堆可分配的空间大小:

7f0c77d2dc73124b83346ae21b0ddc17.png上面两种是数值指标,代表数据的变化情况,HistogramSummary是统计类型的指标,表示数据的分布情况。

Histogram直方图:

Histogram是一种直方图类型,可以观察到指标在各个不同的区间范围的分布情况,如下图所示:可以观察到请求耗时在各个桶的分布。

5fbb1e84fbe64483eb4f66d867514a28.png有一点要注意的是,Histogram是累计直方图,即每一个桶的是只有上区间,例如下图表示小于0.1毫秒(le=“0.1”)的请求数量是18173个,小于 0.2毫秒(le=“0.2”)的请求是18182 个,在le=“0.2”这个桶中是包含了 le=“0.1”这个桶的数据,如果我们要拿到0.1毫秒到0.2毫秒的请求数量,可以通过两个桶想减得到。

300fa0d847e322d6f12208300ba555b9.png在直方图中,还可以通过histogram_quantile函数求出百分位数,比如 P50,P90,P99等数据。

Summary摘要

Summary也是用来做统计分析的,和Histogram区别在于,Summary直接存储的就是百分位数,如下所示:可以直观的观察到样本的中位数,P90和P99。

4c6ab1f4c7c0c057a89dc855561de95d.pngSummary的百分位数是客户端计算好直接让Prometheus抓取的,不需要 Prometheus计算,直方图是通过内置函数histogram_quantilePrometheus服务端计算求出。

(三)指标导出

指标导出有两种方式,一种是使用Prometheus社区提供的定制好的 Exporter对一些组件诸如MySQL,Kafka等的指标作导出,也可以利用社区提供的Client来自定义指标导出。

github.com/prometheus/client_golang/prometheus/promhttp

自定义Prometheus exporter

package mainimport ("net/http""github.com/prometheus/client_golang/prometheus/promhttp"
)func main()  {http.Handle("/metrics", promhttp.Handler())http.ListenAndServe(":8080", nil)
}

访问:http://localhost:8080/metrics,即可看到导出的指标,这里我们没有自定义任何的指标,但是能看到一些内置的Go的运行时指标和promhttp相关的指标,这个Client默认为我们暴露的指标,go_:以 go_ 为前缀的指标是关于Go运行时相关的指标,比如垃圾回收时间、goroutine 数量等,这些都是Go客户端库特有的,其他语言的客户端库可能会暴露各自语言的其他运行时指标。promhttp_:来自promhttp工具包的相关指标,用于跟踪对指标请求的处理。

1a02f481e5b24834edf6422a8f14fd92.png添加自定义指标:

package mainimport ("net/http""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp"
)func main() {// 1.定义指标(类型,名字,帮助信息)myCounter := prometheus.NewCounter(prometheus.CounterOpts{Name: "my_counter_total",Help: "自定义counter",})// 2.注册指标prometheus.MustRegister(myCounter)// 3.设置指标值myCounter.Add(23)http.Handle("/metrics", promhttp.Handler())http.ListenAndServe(":8080", nil)
}

运行:

f9501cc74447ada94c16cb21d3e84532.png模拟下在业务中上报接口请求量:

package mainimport ("fmt""net/http""github.com/prometheus/client_golang/prometheus"
)var (MyCounter prometheus.Counter
)// init 注册指标
func init() {// 1.定义指标(类型,名字,帮助信息)MyCounter = prometheus.NewCounter(prometheus.CounterOpts{Name: "my_counter_total",Help: "自定义counter",})// 2.注册指标prometheus.MustRegister(MyCounter)
}// Sayhello
func Sayhello(w http.ResponseWriter, r *http.Request) {// 接口请求量递增MyCounter.Inc()fmt.Fprintf(w, "Hello Wrold!")
}

main.go:

package mainimport ("net/http""github.com/prometheus/client_golang/prometheus/promhttp"
)func main() {http.Handle("/metrics", promhttp.Handler())http.HandleFunc("/counter",Sayhello)http.ListenAndServe(":8080", nil)
}

一开始启动时,指标counter是0

3a261197bbf7156e62c5c1763a706595.png调用:/counter接口后,指标数据发生了变化,这样就可以简单实现了接口请求数的统计:

26a24fb2bec154b9f5b0326ee0f0b07d.png对于其他指标定义方式是一样的:

var (MyCounter prometheus.CounterMyGauge prometheus.GaugeMyHistogram prometheus.HistogramMySummary prometheus.Summary
)// init 注册指标
func init() {// 1.定义指标(类型,名字,帮助信息)MyCounter = prometheus.NewCounter(prometheus.CounterOpts{Name: "my_counter_total",Help: "自定义counter",})// 定义gauge类型指标MyGauge = prometheus.NewGauge(prometheus.GaugeOpts{Name: "my_gauge_num",Help: "自定义gauge",})// 定义histogramMyHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{Name: "my_histogram_bucket",Help: "自定义histogram",Buckets: []float64{0.1,0.2,0.3,0.4,0.5},   // 需要指定桶})// 定义SummaryMySummary = prometheus.NewSummary(prometheus.SummaryOpts{Name: "my_summary_bucket",Help: "自定义summary",// 这部分可以算好后在setObjectives: map[float64]float64{0.5: 0.05,0.9: 0.01,   0.99: 0.001, },})// 2.注册指标prometheus.MustRegister(MyCounter)prometheus.MustRegister(MyGauge)prometheus.MustRegister(MyHistogram)prometheus.MustRegister(MySummary)
}

d9f412fba0f21072e37744338358ab87.png上面的指标都是没有设置标签的,我们一般的指标都是带有标签的,如何设置指标的标签呢?

如果我要设置带标签的counter类型指标,只需要将原来的NewCounter方法替换为NewCounterVec方法即可,并且传入标签集合。

MyCounter *prometheus.CounterVec
// 1.定义指标(类型,名字,帮助信息)
MyCounter = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "my_counter_total",Help: "自定义counter",},// 标签集合[]string{"label1","label2"},
)
// 带标签的set指标值
MyCounter.With(prometheus.Labels{"label1":"1","label2":"2"}).Inc()

e42b308d079da654b7b1c0b546745ff9.png其他同理。

五、PromQL

刚刚提到了Prometheus中指标有哪些类型以及如何导出我们的指标,现在指标导出到Prometheus了,利用其提供的PromQL可以查询我们导出的指标。

PromQL是Prometheus为我们提供的函数式的查询语言,查询表达式有四种类型:

  • 字符串:只作为某些内置函数的参数出现;

  • 标量:单一的数字值,可以是函数参数,也可以是函数的返回结果;

  • 瞬时向量:某一时刻的时序数据;

  • 区间向量:某一时间区间内的时序数据集合。

(一)瞬时查询

直接通过指标名即可进行查询,查询结果是当前指标最新的时间序列,比如查询Gc累积消耗的时间:

go_gc_duration_seconds_count

fb6bafe9d63f40a4de25721a529f3a7b.png我们可以看到查询出来有多个同名指标结果 可以用{}做标签过滤查询:比如我们想查指定实例的指标:

go_gc_duration_seconds_count{instance="127.0.0.1:9600"}

df6fcded3bac763b40c0688f2297a49a.png而且也支持则表达式,通过=~指定正则表达式,如下所示:查询所有instancelocalhost开头的指标

go_gc_duration_seconds_count{instance=~"localhost.*"}
fc70433488052e1788c3d0d3d5767f26.png

(二)范围查询

范围查询的结果集就是区间向量,可以通过[]指定时间来做范围查询,查询5分钟内的Gc累积消耗时间:

go_gc_duration_seconds_count{}[5m]

注意:这里范围查询第一个点并不一定精确到刚刚好5分钟前的那个时序样本点,他是以5分钟作为一个区间,寻找这个区间的第一个点到最后一个样本点。

f7b43b7afada0c691258ef4b5de22635.png时间单位:

dfa337b0c0049151d2b195d7910b5d1d.png
d:天,h:小时,m:分钟,ms:毫秒,s:秒,w:周,y:年

同样支持类似SQL中的offset查询,如下:查询一天前当前5分钟前的时序数据集:

go_gc_duration_seconds_count{}[5m] offset 1d

(三)内置函数

Prometheus内置了很多函数,这里主要记录下常用的几个函数的使用:

rate和irate函数:rate函数可以用来求指标的平均变化速率

rate函数=时间区间前后两个点的差 / 时间范围

一般rate函数可以用来求某个时间区间内的请求速率,也就是我们常说的QPS

5999bdca94118b2afaadbbf55805826a.png但是rate函数只是算出来了某个时间区间内的平均速率,没办法反映突发变化,假设在一分钟的时间区间里,前50秒的请求量都是0到10左右,但是最后10秒的请求量暴增到100以上,这时候算出来的值可能无法很好的反映这个峰值变化。

这个问题可以通过irate函数解决,irate函数求出来的就是瞬时变化率。

时间区间内最后两个样本点的差 / 最后两个样本点的时间差
7cd3116e60b1cf44284a156c152703cd.png

可以通过图像看下两者的区别:irate函数的图像峰值变化大,rate函数变化较为平缓。

rate函数
d29f06c6b935e443ad9c5b7e93545614.png
irate函数
5836d96208c3b7394a2c9564bf497e46.png
聚合函数:Sum() by() without()

也是上边的例子,我们在求指定接口的QPS的时候,可能会出现多个实例的QPS的计算结果,如下是存在多个接口,三个服务的QPS。

rate(demo_api_request_duration_seconds_count{job="demo", method="GET", status="200"}[5m])

d5e3e59fe32bd68912093e20d1fff469.png利用sum函数可以将三个QPS聚合,即可得到整个服务该接口的QPS:其实Sum就是将指标值做相加。

c85276d5c25b5ce242231dd243e6f422.png但是这样直接的相加太笼统抽象了,可以配合by和without函数在sum的时候,基于某些标签分组,类似SQL中的group by

例如,我可以根据请求接口标签分组:这样拿到的就是具体接口的QPS:

sum(rate(demo_api_request_duration_seconds_count{job="demo", method="GET", status="200"}[5m])) by(path)

770a4356c0f5b37e92a9bfa11eb36809.png也可以不根据接口路径分组:通过without指定:

sum(rate(demo_api_request_duration_seconds_count{job="demo", method="GET", status="200"}[5m])) without(path)

fb04ac0d948ce34b9ec825657ecb74e9.png可以通过histogram_quantile函数做数据统计:可以用来统计百分位数:第一个参数是百分位,第二个histogram指标,这样计算出来的就是中位数,即P50

histogram_quantile(0.5,go_gc_pauses_seconds_total_bucket)
46f7f0084cf0d3fbc20b57e718ac9314.png
分享之前和同事一起发现的坑:

在刚刚写的自定义exporter上新增几个histogram的样本点:

MyHistogram.Observe(0.3)
MyHistogram.Observe(0.4)
MyHistogram.Observe(0.5)

histogram的桶设置:

MyHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{Name: "my_histogram_bucket",Help: "自定义histogram",Buckets: []float64{0,2.5,5,7.5,10},    // 需要指定桶
})

如果这样的话,所有指标都会直接进入到第一个桶,即0到2.5这个桶,如果我要计算中位数,那么这个中位数按照数学公式来算的话,肯定是在0到2.之间的,而且肯定是0.3到0.5之间。

我用histogram_quantile函数计算下:计算结果是1.25,其实已经不对了。

histogram_quantile(0.5,my_histogram_bucket_bucket)

0281b7e39a3b59fd86d348ca5ec6fdbe.png我在计算下P99,等于2.475:

histogram_quantile(0.99,my_histogram_bucket_bucket)

c663ae1eddc6b086f8fbb0a7570c84bd.png我的指标都是不大于1的,为啥算出来的P50和P99都这么离谱呢?

这是因为Prometheus他是不保存你具体的指标数值的,他会帮你把指标放到具体的桶,但是他不会保存你指标的值,计算的分位数是一个预估的值,怎么预估呢?

就是假设每个桶内的样本分布是均匀的,线性分布来计算的,比如刚刚的P50,其实就是算排在第50%位置的样本值,因为刚刚所有的数据都落在了第一个桶,那么他在计算的时候就会假定这个50%值在第一个桶的中点,他就会假定这个数就是0.5_ 2.5,P99就是第一个桶的99%的位置,他就会假定这个数就是0.99 _ 2.5

导致这个误差较大的原因就是我们的bucket设置的不合理。

重新定义桶:

// 定义histogram
MyHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{Name: "my_histogram_bucket",Help: "自定义histogram",Buckets: []float64{0.1,0.2,0.3,0.4,0.5},   // 需要指定桶
})

上报数据:

MyHistogram.Observe(0.1)
MyHistogram.Observe(0.3)
MyHistogram.Observe(0.4)

953a0dc6dab025aefb67d0bfa373a8e3.png重新计算 P50,P99:

c0b20b8f0de991ef2db23eed6e873d6b.png

d320097ce1cdd56db815e05ae13fb8d3.png桶设置的越合理,计算的误差越小。

六、Grafana可视化

除了可以利用Prometheus提供的webUI可视化我们的指标外,还可以接入Grafana来做指标的可视化。

第一步,对接数据源:

3a7700cfd6e4b90d729ffa67d32847b0.png配置好prometheus的地址:

961df5cd513690cd40edb13d8d3dacf7.png
第二步:创建仪表盘

4b5d87250142705c586d7150ea5ad594.png编辑仪表盘:

795b9b3ec9d41c301f8b46df9d538bb0.pngmetrics处编写PromQL即可完成查询和可视化:

ea72f89a221254820c99317e28232827.png仪表盘编辑完后,可以导出对应的 json 文件,方便下次导入同样的仪表盘:

dd5b9b398ce1aa01e98f813eb57c0a71.png以上是我之前搭建的仪表盘:

6b66634dea1dffbabfc7d01a442215cf.png

七、监控告警

AlertManagerprometheus提供的告警信息下发组件,包含了对告警信息的分组,下发,静默等策略。配置完成后可以在webui上看到对应的告警策略信息。告警规则也是基于PromQL进行定制的。

编写告警配置:当Http_srv这个服务挂了,Prometheus采集不到指标,并且持续时间1分钟,就会触发告警

groups:
- name: simulator-alert-rulerules:- alert: HttpSimulatorDownexpr: sum(up{job="http_srv"}) == 0 for: 1mlabels:severity: critical

prometheus.yml中配置告警配置文件,需要配置上alertmanager的地址和告警文件的地址

# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets: ['localhost:9093']
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "alert_rules.yml"#- "first_rules.yml"

配置告警信息,例如告警发送地址,告警内容模版,分组策略等都在alertmanager的配置文件中配置:

global:smtp_smarthost: 'smtp.qq.com:465'smtp_from: 'xxxx@qq.com'smtp_auth_username: 'xxxx@qq.com'smtp_auth_password: 'xxxx'smtp_require_tls: falseroute:group_interval: 1mrepeat_interval: 1mreceiver: 'mail-receiver'#  group_by             //采用哪个标签作为分组
#  group_wait           //分组等待的时间,收到报警不是立马发送出去,而是等待一段时间,看看同一组中是否有其他报警,如果有一并发送
#  group_interval       //告警时间间隔
#  repeat_interval      //重复告警时间间隔,可以减少发送告警的频率
#  receiver             //接收者是谁
#  routes               //子路由配置
receivers:
- name: 'mail-receiver'email_configs:- to: 'xxxx@qq.com'

当我kill进程:

3e8f5927b929fcb1633e6df285f363ee.pngprometheus已经触发告警:

b070356abbd716713dafbb31f360bf73.png在等待1分钟,如果持续还是符合告警策略,则状态为从pending变为FIRING会发送邮件到我的邮箱

e172f83f620ef6954f34e2c7581cf8ac.png此时我的邮箱收到了一条告警消息:

1951b3b2e7185085986178252b18e218.pngalertmanager也支持对告警进行静默,在alertmanagerWEBUI中配置即可:

9b088b83318504fdfd174e457acd1b57.png间隔了4分钟,没有收到告警,静默生效:

9ae3b6e9de247470b47c2251b7e61e7d.png一个小时没有收到告警信息:

08330f5bc239d83200a69f4cdc8769c8.png

参考资料:

  1. Pull or Push?监控系统如何选型-阿里云开发者社区

  2. 为go应用添加prometheus监控指标-SegmentFault思否

  3. GitHub-prometheus/client_golang

  4. Material for MkDocs - Prometheus入门到实战

  5. 终于有人把Prometheus入门讲明白了-DockOne.io

  6. Prometheus报警AlertManager实战

  7. 如何热加载新配置·Prometheus实战

  8. https://www.youtube.com/watch?v=qB40kqhTyYM&t=2261s

  9. https://www.youtube.com/watch?v=SOTxSSiLtuA&t=141s

作者:kevinkrcai

来源:【腾讯云开发者】

推荐

Java面试题宝典

技术内卷群,一起来学习!!

c89481dbea2a679b6107bd1b2c1495f4.jpeg

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

c8a20b8b539486afcc8278ca826ca482.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255113.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

底层节点到节点上层是端到端_nEqual发布全新一代CDP平台宙斯版,解构企业营销数字化的底层逻辑...

企业数字化的浪潮已经向前奔涌了几年之久&#xff0c;随着包括消费者在内的外部环境和节奏已经全面数字化&#xff0c;企业数字化几乎是一个必行之举。到了今年&#xff0c;成熟的环境和疫情的到来使得行业中绝大多数从业者&#xff0c;都看见了实施数字化后的增长势能。 加之不…

记录对接京东宙斯API -- 同步订单信息到自身系统

记录对接京东宙斯API -- 同步订单信息到自身系统 目录1. 需求2. 准备工作一: 查看官方文档3. 准备工作二: 申请京东云鼎并入驻4. 创建一个新的项目并部署到云鼎.5. 调用订单API代码.6. JdService 目录 1. 需求 根据产品大大的需求描述&#xff1a; 对客户的京东旗舰店里的订…

php对接京东宙斯平台,利用京东联盟API获取自定义推广链接

本文将简单介绍下京东联盟、京东宙斯两个平台,以及如何利用京东宙斯平台的京东联盟API来快速获取自定义推广链接。 关于京东联盟 京东联盟(去官网看看)是一个CPS模式的营销平台,我们可以使用自己的网站放置联盟的推广链接为京东推销产品,当用户在我们的网站上点击了某个推广…

SpringBoot框架总结

一、SpringBoot框架的概念 1、传统框架的弊端 例如传统的SSM框架整合了MyBatis、Spring、SpringMVC框架&#xff0c;但其需要繁琐且重复的配置使程序员很是痛苦 2、SpringBoot框架 SpringBoot框架在传统框架的基础上对其进一步封装&#xff0c;只需要一些简单的配置&#x…

chatgpt赋能python:Python中最大公约数计算

Python中最大公约数计算 在Python编程中&#xff0c;求最大公约数是一个非常常见的需求。最大公约数一般简称为gcd&#xff0c;其定义为两个或多个整数的最大公因数。 在本篇文章中&#xff0c;我们将介绍Python中最常用的两种计算gcd的方法&#xff0c;并深入讲解它们的实现…

M7650DNF 打印机 word打印时候提示手动进纸的解决方法

两个地方需要设置&#xff0c;光一个地方设置不够&#xff1a;

东芝2323AM复印机双面打印设置方法

东芝DP-2323AM打印机&#xff0c;想要进行双面打印&#xff0c;到底应该如何设置呢&#xff1f;自动双面的话又该如何操作呢&#xff1f;这样就可以很好的解放双手了。 首先我们需要安装好完整的复印机驱动及应用程序 1、点击屏幕左下角的“开始”菜单&#xff0c;选择“打印机…

wps计算机打印双面输出,WPS轻松办公—-文档双面打印的两种方法

大家好&#xff0c;我们在利用&#xff0c;WPS文字&#xff0c;进行日常办公室经常需要运用到双面打印的功能&#xff0c;但是有些打印机不支持双面打印&#xff0c;需要手动进行双面打印&#xff0c;有的需要打印部分文档&#xff0c;有的需要打印全部文档&#xff0c;那么这两…

M7206手动进行双面打印步骤

一般以PDF文件格式打印&#xff08;若为word文件&#xff0c;则先另存为PDF&#xff0c;并检查排版等细节问题&#xff0c;再行打印&#xff09; 第一遍&#xff0c;打印正面&#xff1a; 打开文档&#xff0c;点击“打印”进入打印预览。“选择打印机”确认打印机是否已正常…

标签打印软件如何输出双面打印的文档

现在印刷行业使用的设备越来越先进&#xff0c;其中打印彩色功能、打印奇/偶数页已经是比较常见的设置&#xff0c;而且现在一些专业的打印设备支持打印双面的文档&#xff0c;那么我们在制作标签文件时&#xff0c;如何输出双面打印的文档呢&#xff0c;下面就来详细看一下&am…

设置手动双面打印_双面打印文档,你会吗?学会这几招,自动双面打印问题轻松解决...

在办公中打印耗材是非常昂贵的&#xff0c;所以为了尽量节省纸张&#xff0c;我们往往会将一张纸正面和反面都用上(双面打印)。毕竟支持自动双面打印的打印机很少&#xff0c;大多数情况下的打印机都是不支持双面打印的&#xff0c;这个时候我们就必须来手动设置双面打印了。 0…

Word 2007~2010手动双面打印设置

&#xff08;类似于2003及之前版本中的背面逆序&#xff09; 安装好word之后最需要设置的有&#xff1a;改写模式、打印选项、输入法控制处于活动状态。 在用word2003时&#xff0c;为了使手动双面打印的最终结果是正序的&#xff0c;而且打印背面时不用整理纸张次序&#xff0…

双面打印无效选择了文件服务器,记得要收藏!如何手动完成双面打印文档

【中关村在线办公打印频道原创】打印机不像手机电脑一样属于消费类电子产品&#xff0c;作为小众的办公设备&#xff0c;很多人在首次使用时会遇到不少小问题&#xff0c;就比如下面这位处女座朋友&#xff0c;收入一台打印机&#xff0c;没有自动双面功能&#xff0c;自己浪费…

wps计算机打印双面输出,在wps中双面打印的方法步骤详解

我们在打印word文档的时候往往都会使用到双面打印&#xff0c;那么今天小编教你怎么在wps中双面打印。希望对你有帮助&#xff01; WPS双面打印的步骤 首先点击wps上的文字选项。找到打印按钮。点击打开之后&#xff0c;会跳出这样一个页面。 PS双面打印的步骤图1 页面内&#…

wps计算机打印双面输出,如何在电脑wps软件内设置双面打印

如何在电脑wps软件内设置双面打印 腾讯视频/爱奇艺/优酷/外卖 充值4折起 当我们在使用电脑的时候,可以使用wps软件内进行文档的编辑操作,那么文档编辑结束后需要对其进行打印的话,应如何设置双面打印呢?接下来就由小编来告诉大家。 具体如下: 1. 第一步,打开电脑中要进行…

打印机手动打印双面的防止顺序

经过一系列浪费大量墨水和纸张的测试以后&#xff0c;得到以下经验&#xff1a; 文章目录 1. 将打印的文档转换成PDF后点击打印2. 先选择打印奇数页面&#xff0c;不勾选逆序打印。3. 打印完成后&#xff0c;如果总页数为奇数&#xff0c;那么抽掉最后一页。如果是偶数则不用。…

计算机手动双面打印,记得要收藏 如何手动完成双面打印文档

【中关村在线办公打印频道原创】打印机不像手机电脑一样属于消费类电子产品&#xff0c;作为小众的办公设备&#xff0c;很多人在首次使用时会遇到不少小问题&#xff0c;就比如下面这位处女座朋友&#xff0c;收入一台打印机&#xff0c;没有自动双面功能&#xff0c;自己浪费…

我们是冠军 恭喜ASTER.Y夺得2021极限冲层赛第二赛季全球总冠军

12月13日清晨&#xff0c;为期三天的2021史诗钥石地下城&#xff1a;极限冲层赛第2赛季全球总决赛完美收官。来自国服的Aster.Y战队以174分的优异成绩击败Echo Guardians、Method SHEEESH等诸多强队&#xff0c;拿下国服首个全球赛事冠军&#xff0c;恭喜他们&#xff01;在比赛…

一生要做的99件事

今生&#xff0c;你的感觉如何 泰戈尔说&#xff1a;“大地的幻想之花&#xff0c;是由死亡来永葆新鲜的。”也许正是生命的不可恒久性&#xff0c;人生才充满的神秘的力量,美的震撼与难以割舍的依恋。对于带着纯真的愿望与无尽的想像降临与世的人类来说&#xff0c;生命永远都…

80后看过的动画片

动画介绍&#xff1a; 以下动画内容介绍来自网络&#xff0c;感谢所有的原作者。介绍和曲目顺序相同&#xff0c;是按照动画中文译名的首字母排序的。 阿尔卑斯山的少女海蒂 【原文片名】アルプスの少女ハイジ 【出品年代】1974年 【国别归属】日本 【剧集总数】52集 【内容简介…