Docker——Prometheus监控服务治理
创始人
2024-04-13 11:57:27
0次

摘要

Prometheus是继Kubernetes之后,第二个从云原生计算基金会(CNCF)毕业的项目。Prometheus是Google监控系统BorgMon类似实现的开源版,整套系统由监控服务、告警服务、时序数据库等几个部分,及周边生态的各种指标收集器(Exporter)组成,是在当下主流的云原生监控告警系统,Prometheus有这些特性:

  • 开箱即用的各种服务发现机制,可以自动发现监控端点;
  • 专为监控指标数据设计的高性能时序数据库TSDB;
  • 强大易用的查询语言PromQL以及丰富的聚合函数;
  • 可以配置灵活的告警规则,支持告警收敛(分组、抑制、静默)、多级路由等等高级功能;
  • 生态完善,有各种现成的开源Exporter实现,实现自定义的监控指标也非常简单。

本博文将详细的介绍基于Prometheus的生产环境下的基础服务的监控与自定义服务的监控服务治理。帮助大家在项目生产环境中能够时间集监控与预警和自动化脚本处理等功能。

一、Prometheus的基础原理简介

二、Prometheus+Alertmanager实战

通过Prometheus+Alertmanager+docker(部署该服务,包括四个组件:Prometheus Server、Node Exporter、cAdvrisor、Grafana。)其他组件来进行相关的配置实战。

  • Prometheus Server:Prometheus服务的主服务器 ;
  • Node Exporter:收集Host硬件和操作系统的信息;
  • cAdvrisor:负责收集Host上运行的容器信息;
  • Grafana:用来展示Prometheus监控操作界面(给我们提供一个友好的web界面)

2.1 docker 运行组件

运行Node Server容器:该组件需要运行在所有需要监控的主机上,也就是,我这里三台服务器都需要执行下面的命令,运行此容器组件。

docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host --restart=always prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

每台服务器运行上述命令后,浏览器访问docker服务器的IP地址+9100端口,能够看到以下界面,即说明容器运行没有问题。看到的网页如下就表示部署成功了: 

运行cAdvisor容器:CAdvrisor是负责收集Host上运行的容器信息的,同样,在所有需要监控的服务器上执行下面的命令运行cAdvisor容器即可:

docker run -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -p 8080:8080 --detach=true --name=cadvisor google/cadvisor

如果访问IP+8080断后的页面有这样的页面就表示cAdvrisor部署成功了。

Prometheus Server:是监控的主f服务,所以只需要在其中一台运行此容器,也可以多台机器部署。本案例中就以一台为例子:

[root@xjl ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
#先基于prom/prometheus镜像随便运行一个容器,我们需要将其主配置文件复制一份进行更改[root@xjl ~]# docker cp prometheus:/etc/prometheus/prometheus.yml /root/
#复制prometheus容器中的主配置文件到宿主机本地[root@xjl ~]# docker rm -f prometheus [root@xjl ~]# vim prometheus.yml #找到如下行并修改- targets: ['localhost:9090','localhost:8080','localhost:9100']#修改为需要监控的数据端口。[root@xjl ~]# docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus --net=host prom/prometheus#执行上述命令,运行新的prometheus容器,并将刚刚修改的主配置文件挂载到容器中的指定位置#以后若要修改主配置文件,则直接修改本地的即可。#挂载主配置文件后,本地的和容器内的相当于同一份,在本地修改内容的话,会同步到容器中

Grafana容器监控数据可视化:可以将Prometheus Server的监控数据展示在相关的看板上。

[root@docker01 ~]# mkdir grafana-storage[root@docker01 ~]# chmod 777 -R grafana-storage/[root@docker01 ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=admin" grafana/grafana#上述命令中的“-e”选项是为了设置默认的登录用户admin,密码为“123.com”。
#如果启动容器的过程中,提示iptables等相关的错误信息,
#则需要执行命令systemctl restart docker,重启docker服务,然后重新运行容器
#但是需要注意,若运行容器时没有增加“--restart=always”选项的话,
#那么在重启docker服务后,还需将所有容器手动重启。
#重启所有容器命令“docker ps -a -q | xargs docker start”

上述配置完成后,我们就需要配置它以什么样的形式来给我们展示了,可以自定义,但是很麻烦,也选择直接去grafana官网寻找现成的模板。

2.2 启动Alertmanager组件

Prometheus的告警方式有好几种方式,邮箱、钉钉、微信等,我这里选择邮箱的告警方式。本案例选择以邮件的方式和web-hook的方式来完成的相关的告警,其他的方式类似.大家可以自行探索。

[root@xjl ~]# docker run --name alertmanager -d -p 9093:9093 prom/alertmanager            # 先简单运行一个容器[root@xjl ~]# doc
ker cp alertmanager:/etc/alertmanager/alertmanager.yml /root           # 将容器中的配置文件复制到本地[root@docker01 ~]# docker rm -f alertmanager           # 然后卸磨杀驴,把他给删[root@docker01 ~]# vim alertmanager.yml #配置文件中可以分为以下几组:
#global:全局配置。设置报警策略,报警渠道等;
#route:分发策略;
#receivers:接收者,指定谁来接收你发送的这些信息;
#inhibit_rules:抑制策略。当存在于另一组匹配的警报,抑制规则将禁用于一组匹配的警报global:
# 在没有报警的情况下声明为已解决的时间resolve_timeout: 2m
# 配置邮件发送信息smtp_smarthost: 'smtp.qiye.aliyun.com:465'smtp_from: 'your_email'smtp_auth_username: 'your_email'smtp_auth_password: 'email_passwd' # 邮箱授权码,不是登录密码smtp_hello: 'your_email'smtp_require_tls: false# 所有报警信息进入后的根路由,用来设置报警的分发策略
route:
# 这里的标签列表是接收到报警信息后的重新分组标签,例如,接收到的报警信息里面有许多具有 cluster=A 和 alertname=LatncyHigh 这样的标签的报警信息将会批量被聚合到一个分组里面group_by: ['alertname', 'cluster']
# 当一个新的报警分组被创建后,需要等待至少group_wait时间来初始化通知,这种方式可以确保您能有足够的时间为同一分组来获取多个警报,然后一起触发这个报警信息。group_wait: 30s# 当第一个报警发送后,等待'group_interval'时间来发送新的一组报警信息。group_interval: 5m# 如果一个报警信息已经发送成功了,等待'repeat_interval'时间来重新发送他们repeat_interval: 5m# 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器receiver: default  # 优先使用default发送# 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖。routes: #子路由,使用email发送- receiver: emailmatch_re:serverity : email  # label 匹配emailgroup_wait: 10sreceivers:
- name: 'default'webhook_configs:- url: http://localhost:8060/web-hook/  send_resolved: true # 发送已解决通知- name: 'email'email_configs:- to: 'email@qq.com'send_resolved: true[root@docker01 ~]# docker run -d --name alertmanger -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml --restart=always prom/alertmanager#运行新的alertmanager容器,并挂载更改后的配置文件 如果配置文件有错误,那么这个容器是运行不了的。

配置prometheus与alertmanager通信

vim prometheus.yml

# my global config
global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# scrape_timeout is set to the global default (10s).# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets: ["192.168.25.142:9093"]  # 配置的Alertmanager的服务的ip+端口# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:  - "/usr/local/prometheus/rules/*.yaml"  # 配置的相关的rules路径,这个容器的内部地址。启动的时候需要挂载到容器内,采用的正则表达式的方式来实现。

vim rules.yml

groups:     # 报警组
- name: Noderules:# Alert for any instance that is unreachable for >5 minutes.- alert: InstanceDownexpr: up == 0   # 监控状态的值为 0时,说明服务异常,1为正常for: 5m  # 保持时间,上面的状态持续时间内都为 0 ,则触发告警labels:severity: errorannotations:summary: "Instance {{ $labels.instance }} 停止工作"description: "{{ $labels.instance }} of job {{ $labels.job }} 已经停止1分钟以上."

2.3 Prometheus+Alertmanager告警测试

三、Prometheus+Alertmanager+Jenkins自动化实战

四、基于Prometheus的自定义export监控服务实现

博文参考

Overview | Prometheus

docker容器部署Prometheus服务——云平台监控利器 - 腾讯云开发者社区-腾讯云

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...