Docker——Prometheus监控服务治理

news2025/1/31 3:13:54

摘要

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: email
    match_re:
      serverity : email  # label 匹配email
    group_wait: 10s

receivers:
- 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: Node
  rules:

  # Alert for any instance that is unreachable for >5 minutes.
  - alert: InstanceDown
    expr: up == 0   # 监控状态的值为 0时,说明服务异常,1为正常
    for: 5m  # 保持时间,上面的状态持续时间内都为 0 ,则触发告警
    labels:
      severity: error
    annotations:
      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服务——云平台监控利器 - 腾讯云开发者社区-腾讯云

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

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

相关文章

uniapp vuex正确的打开方式

uniapp vuex正确的打开方式一、vuex与全局变量globalData的区别二、uniapp vuex使用目录结构如下1. 根目录创建vuex目录,创建index.js文件2. 模块化代码3. 在 main.js 中导入store文件4. 调用一、vuex与全局变量globalData的区别 uni-app像小程序一样有globalData&…

项目开发——【流程图】软件工程程序流程图详解《如何正确绘制项目开发流程图》

程序流程图详解 介绍:通过图形符号形象的表示解决问题的步骤和程序。好的流程图,不仅能对我们的程序设计起到作用;在帮助理解时,往往能起到"一张图胜过千言万语"的效果。 一、程序流程图基本控制结构 顺序型&#xf…

如何实现RTS游戏中鼠标在屏幕边缘时移动视角

文章目录🧨 Preface🎏 判断鼠标是否处于屏幕边缘⚽ 获取鼠标处于屏幕边缘时的移动方向🎨 控制相机在x、z轴形成的平面上移动🏓 完整示例代码🧨 Preface 本文简单介绍如何在Unity中实现即时战略游戏中鼠标在屏幕边缘的…

创新赋能合作伙伴,亚马逊云科技re:Invent科技盛宴

北京时间11月29号,亚马逊云科技年度峰会re:Invent 2022将在拉斯维加斯开幕。这场年度最重磅的云计算技术大会不仅是科技盛宴,也是亚马逊云科技与诸多客户交流互鉴的绝佳平台,今天带大家认识一下几位资深云计算用户,以及他们和re:I…

MyBatis ---- 搭建MyBatis

MyBatis ---- 搭建MyBatis1. 开发环境2. 创建maven工程a>打包方式:jarb>引入依赖3. 创建MyBatis的核心配置文件4. 创建mapper接口5. 创建MyBatis的映射文件6. 通过junit测试功能7. 加入log4j日志功能a>加入依赖b>加入log4j的配置文件1. 开发环境 IDE&a…

Linus 文件处理(四)

目录 一、前言 二、高级主题: fcntl和mmap 1、fcntl 2、mmap 3、Using mmap 一、前言 本文将简单介绍Linux文件和目录,以及如何操作它们(如何创建文件、打开、读、写和关闭,程序如何操作目录,如创建、扫描和删除目录等&…

池风水利用工具

引用 这篇文章的目的是介绍一种基于内核态内存的越界写入通用利用技术和相关工具复现. 文章目录引用简介分析调试分析漏洞利用工具使用方法工具使用效果相关引用参与贡献简介 笔者的在原作者池风水利用工具(以下简称工具)基础上进行二次开发,新增了全自动获取内核调试模块符号…

QT-QTableWidget中的cell和item的区别

文章目录QTableWidget中单击一个单元格响应不同的函数:cell和item的区别:单击单元格响应自定义函数我的错误思路:已剪辑自: https://blog.csdn.net/CCLasdfg/article/details/114691478 QTableWidget中单击一个单元格响应不同的函数&#xf…

【服务器搭建】教程三:怎样购买域名并怎样进行域名解析 来啦

前言 购买一台服务器,再来个域名,搭建一个自己的个人博客网站,把一些教程、源码、想要分享的好玩的放到网站上,供小伙伴学习玩耍使用。我把这个过程记录下来,想要尝试的小伙伴,可以按照步骤,自己…

多云加速云原生数仓生态,华为与 HashData 联合打造方案

多云的兴起,源于用户应用对于基础设施、云服务功能、安全性等的差异化需求,用户希望根据需求将应用、数据因“云”制宜,实现业务的高度灵活性和高效性。这也直接驱动着云原生数据仓库等一批云原生应用的流行,以及存储等基础设施加…

为什么用公钥加密却不能用公钥解密?

一直以来我都在逃避写HTTPS。 毕竟。 HTTPS里名词太多。概念又巨繁琐。 实在是太难解释了,能不写我尽量不写。。。。 但为了让图解网络的知识体系尽量完整些。 今天,大家忍一忍。 我们就从对称加密和非对称加密聊起吧。 对称加密和非对称加密 小学…

Python学习笔记-语言基础

1.基础语法特点 1.1 注释 注释,是用于在代码中添加的标注性的文字,程序中并不会执行,知识用于告知程序员,该代码是干什么的,怎么用的等。 注释主要用于防止别人阅读代码是可以识别到代码的意图或者一段时间之后我们…

教程五 在Go中使用Energy创建跨平台GUI - 执行开发者工具方法

教程-示例-文档 介绍 本文介绍在Energy中如何执行开发者工具方法 开发者工具方法,可以设置浏览器头,模拟仿真设备等. 使用方式 字典对象创建 cef.NewCefDictionaryValue() 字典对象是keyvalue方式, chromium定义的字典名称和对应的值,通…

APOLLO UDACITY自动驾驶课程笔记——感知、预测

1、计算机视觉 无人驾驶车有四个感知世界的核心任务:检测——指找出物体在环境中的位置;分类——指明确对象是什么;跟踪——指随时间的推移观察移动物体;语义分割——将图像中的每个像素与语义类别进行匹配如道路、汽车、天空。 …

Adb找不到设备解决方法

有时候使用adb devices 却找不到设备,而用一些第三方的软件却可以找的到, 除了没有打开USB调试模式,或者没装驱动,数据线有问题,操作系统是精简版系统外, 一般是因为设备的安卓版本太高,导致a…

操作系统内存管理-01分段

前言 本文讲述本文博主在学习80386下 window下段式内存管理。 内存管理往往需要软硬件结合进行管理,CPU定制一套官方规范,要求操作系统按要求实现某些操作即可。本文所述的CPU 分段规范 在intel 第三卷 第三章。 分段概述 我们知道每一个程序会被赋予…

可自定义评教系统(教学质量评估系统)设计与实现(SSM)毕业论文+设计源码+mysql文件

目 录 摘要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 研究意义 1 1.3 国内外研究现状分析 2 1.3.1 评教指标的过于简单化 2 1.3.2 评教指标的权重过于平均 2 1.3.3 评教结果的可信度和缺乏科学的数据分析 2 1.4 系统开发的主要目标和内容 3 1.4.1 开发目标 3 1.4.2 开发…

C++ 内存模型

1、内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的(所有代码包含中文注释)全局区:存放全局变量和静态变量以及常量栈区:由编译器自…

使用 Clion (cmake) 运行FreeRTOS

这里使用的是 f4071. 先用STM32CubeMX 建立一个可以运行的stm32项目,toolchain选择 SW4STM322. 官网下载源码www.freertos.org我这里下载的是FreeRTOSv202112.00.zip 解压缩后得到需要以下几个文件夹或档案FreeRTOS/Source下的所有的 .c 档案FreeRTOS/Source/includ…

【附源码】计算机毕业设计JAVA在线图书超市

【附源码】计算机毕业设计JAVA在线图书超市 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…