微服务之服务监控,一文秒懂

微服务之服务监控,一文秒懂

亲爱的探索者,当你踏入这片文字的海洋,你必定是那颗熠熠生辉、追逐前沿的星辰。然而,请允许我先为你铺设一条略带曲折的航道,因为尽管我将倾囊相授,这些知识的宝藏却如同浩渺的星河,深远而辽阔。但请坚定你的步伐,鼓起你的勇气,因为在这条求知的路上,每一步都充满了挑战与机遇。让我们携手共进,砥砺前行,用无尽的热情和毅力,书写属于我们的传奇。加油,探索者,让知识的光芒照亮你前行的道路!

一、引言

在现今的软件架构中,微服务架构因其高度的模块化、可扩展性和灵活性而备受青睐。然而,随着服务数量的增多和复杂性的增加,如何确保这些微服务能够稳定、高效地运行,成为了摆在每一个开发人员和运维人员面前的难题。服务监控,作为保障微服务稳定运行的重要手段,其重要性不言而喻。

二、 解释(什么是服务监控)

微服务监控是指对微服务架构中的各个服务进行实时、全面的性能、状态和安全等方面的监测与管理。在微服务架构中,由于服务众多且相互依赖,任何一个服务的故障都可能引发连锁反应,导致整个系统的崩溃。因此,微服务监控显得尤为重要。

三、微服务监控关注的方面

实时掌握系统中各个服务的运行状态和性能指标,包括服务的响应时间、吞吐量、错误率等,以便及时发现并处理异常情况,避免故障扩散和升级。监控服务间的依赖关系,确保服务之间的调用正常进行,及时发现并解决服务调用中的问题。监控服务的并发量和负载情况,以便根据实际需求调整服务的资源配置,保证服务的稳定性和高可用性。监控服务的日志和错误信息,以便及时记录并进行监控和分析,快速定位并解决问题。

本文我们将用springboot,spring boot actuator,docker,Prometheus,Grafana,alertManager 实现服务的监控告警组件介绍:

Spring Actuator

是Spring Boot提供的一个功能强大的管理和监控工具,用于监控和管理Spring Boot应用程序。它提供了一系列的端点endpoints),通过这些端点,我们可以轻松地获取应用程序的运行时信息、健康状况、性能指标、日志等。Prometheus

一个开源系统监控和告警工具包,提供了高效的时间序列数据库、简单的安装和配置、多样的数据模型及查询语言。Grafana一个跨平台的开源分析和监控解决方案,与Prometheus通常搭配使用,提供了丰富的仪表盘和图表,用于数据的可视化展示。Alertmanager是Prometheus生态中非常重要的一个核心模块,主要用于接收Prometheus发送的告警信息,并对其进行统一处理。它支持丰富的告警通知渠道,如电子邮件、待命通知系统和聊天平台等,且很容易实现告警信息的分组、静默、抑制等功能。

架构图:

这个图就是本文要实现的架构图,如果看不懂没关系,接下来我们会一给我一个实现哦。

四、springboot项目搭建

spring boot项目搭建就不过多赘述

项目结构

controller:

添加依赖:

org.springframework.boot

spring-boot-starter-actuator

io.micrometer

micrometer-registry-prometheus

在application.yml 中配置spring boot autuator

management:

endpoints:

web:

exposure:

include: "*"

exclude: configprops

base-path: /actuator

enabled-by-default: true

endpoint:

health:

show-details: always

metrics:

tags:

application: "demo"

这是什么意思呢?

management.endpoints.web.exposure.include 和 exclude

include: “*”:这个配置表示所有Actuator的web端点都将被包含(即对外暴露)。星号(*)是一个通配符,代表所有端点。exclude: configprops:尽管include设置了星号,但exclude会覆盖它,并明确排除configprops端点。configprops端点用于显示所有@ConfigurationProperties的配置属性。

management.endpoints.web.base-path

这个配置设置了Actuator web端点的基路径为/actuator。例如,如果你想要访问健康检查端点,你通常会访问/actuator/health(除非另有其他配置)。

management.endpoints.enabled-by-default

这个配置决定了默认情况下是否启用Actuator的端点。在这里,它被设置为true,意味着所有的端点默认情况下都是启用的(通过其他配置进行覆盖)。

management.endpoint.health.show-details

这个配置是关于健康检查端点的。它控制了在健康检查响应中应包含多少详细信息。always意味着无论应用程序的响应状态如何,都将显示详细信息。其他可能的值包括when-authorized(仅当授权用户请求时才显示)和never(从不显示)。

management.metrics.tags.application

这个配置用于为所有度量(metrics)添加一个标签(tag)。在这里,所有的度量都将有一个名为- application的标签,其值为demo。这对于在监控系统中区分不同的应用程序或实例非常有用。

通过这些配置,您可以自定义Spring Boot Actuator的行为,以便更好地满足您的监控和管理需求。不过,请注意,暴露某些端点(特别是包含敏感信息的端点)可能会带来安全风险,因此请确保您已经采取了适当的安全措施来保护这些端点。接下来我们把项目运行起来:并访问localhost:8080/user:

访问localhost:8080/actuator:

actuator成功将数据暴露出来当然你也可以访问这个链接看看,所有的链接都在暴露的数据里面

看到这里证明spring boot 整合spring boot actuator 项目已经完成。接下来我将带大家用docker 安装监控组件

五、linux服务器安装docker

安装所需的依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

看到此图片恭喜你下载成功。但在我安装的时候由于操作问题导致了yum死锁,在这里给大家分享一下

Another app is currently holding the yum lock; waiting for it to exit...

The other application is: yum

Memory : 23 M RSS (419 MB VSZ)

Started: Fri May 17 13:40:58 2024 - 1:40:10 ago

State : Traced/Stopped, pid: 8640

Another app is currently holding the yum lock; waiting for it to exit...

The other application is: yum

Memory : 23 M RSS (419 MB VSZ)

Started: Fri May 17 13:40:58 2024 - 1:40:12 ago

State : Traced/Stopped, pid: 8640

当你看到这种日志时证明出现了yum死锁。yum死锁是什么问题呢?

解释:

当您在使用 yum(Yellowdog Updater Modified)工具时遇到这样的错误信息:“Another app is currently holding the yum lock; waiting for it to exit…”,这通常意味着有一个 yum 进程正在运行,并且已经获取了包管理器的锁,以防止其他 yum 进程同时运行并可能导致包管理状态不一致。

这个日志信息中,yum 进程处于 Traced/Stopped 状态,这通常不是一个正常的状态。

这个问题该如何解决呢?

查找并杀死进程:使用 ps 命令来查找 yum 进程,并使用 kill 命令来杀死它。杀死所有的yum进程

ps -ef | grep yum

sudo kill -9 # 是 yum 进程的 PID

请注意,在上面的 sudo kill -9 命令中,-9 是一个强制杀死进程的信号。通常,你应该首先尝试不带 -9 的 kill 命令,如果不起作用,再使用 -9

清除锁文件:

如果杀死进程不起作用,或者你不确定如何找到进程,你可以尝试手动删除锁文件。但请注意,这样做可能会导致包管理状态不一致,因此请仅在确定没有其他 yum 进程正在运行时才这样做。

sudo rm -f /var/run/yum.pid

sudo rm -f /var/cache/yum/__db*

删除这些文件后,再次尝试运行 yum 命令。运行成功,死锁问题已经解决

然后我们继续使用上面的依赖安装命令完成之后

为了上高速我们设置 linux docker 阿里云镜像源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

设置成功后我们开始安装docker

注意

docker版本说明:

Docker从17.03版本之后分为两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。

企业版包含了一些收费服务,个人开发者一般用不到,所以我们只需要安装社区版docker-ce版本即可。

docker-ce安装

yum install -y docker-ce

恭喜你docker安装成功

配置 docker 镜像源,/etc/docker/ 目录下创建 daemon.json 添加以下内容

{

"registry-mirrors": ["https://rsk59qvc.mirror.aliyuncs.com"]

}

刷新 docker 配置

sudo systemctl daemon-reload

启动docker 并设置开机自启动

#启动docker命令

systemctl start docker

#设置开机自启命令

systemctl enable docker

#查看docker版本命令

docker version

恭喜你docker 安装启动完成,记下来我们一起全装监控组件Prometheus

六、Prometheus安装

介绍:

Prometheus是一个开源的服务监控系统和 时序数据库 ,它提供了通用的数据模型和快捷数据采集、存储和查询接口。

Prometheus的特点包括

易管理性:Prometheus的核心部分由一个单独的二进制文件构成,这使得它容易部署和管理。它可以在本地运行,不依赖于分布式存储系统。高效性:Prometheus设计上能够处理大量的监控指标,即使是单个Prometheus实例也能够每秒处理数百万的数据点。灵活性:Prometheus支持通过配置文件定义监控目标,用户可以根据自己的需求灵活配置监控项。

强大的查询语言:Prometheus提供了一个功能强大的查询语言PromQL(Prometheus Query Language),用户可以使用这个语言对收集到的时序数据进行查询和分析。

Prometheus的主要功能包括:

收集和存储时间序列数据:Prometheus能够从各种来源收集和存储时间序列数据,包括应用程序、服务、操作系统和网络设备等。实时监控和警报:Prometheus可以实时监控各种指标,并根据预定义的规则进行警报和通知。它提供了一个灵活的警报管理系统,可以定义警报规则、接收警报通知,并对警报进行静音或处理。多维数据模型:Prometheus使用时间序列数据模型,可以对多种维度的数据进行监控和分析。高效的数据存储:Prometheus使用本地存储方式,可以高效地存储监控数据,而且支持数据压缩和数据刷写等功能。

docker安装prometheus

docker run --name prometheus -d -p 9090:9090 -v

/opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

prom/prometheus --config.file=/etc/prometheus/prometheus.yml

复制的时候请注意:这里是一条命令,小心换行符哦

命令解释:

这个 docker run 命令是用来启动一个 Docker 容器的,并且特别针对 prom/prometheus 这个镜像,该镜像是 Prometheus 监控系统的 Docker 镜像。下面我为你详细解释这个命令的每一个部分:

docker run:这是 Docker 的一个基本命令,用于从指定的镜像创建并启动一个新的容器。

–name prometheus:这个标志用于为新容器指定一个名称,这里是 prometheus。如果你不提供这个标志,Docker 会自动为容器生成一个随机名称。

-d:这个标志使容器在后台运行(即“detached”模式)。如果没有这个标志,容器将在前台运行,并且你会在终端中看到容器的输出。

-p 9090:9090:这个标志用于端口映射。它将宿主机的 9090 端口映射到容器的 9090 端口。这样,你就可以通过访问宿主机的 9090 端口来访问容器内的 Prometheus 服务。

-v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

这个标志用于挂载卷(volume)。它将宿主机上的 /opt/prometheus/prometheus.yml 文件挂载到容器内的 /etc/prometheus/prometheus.yml 路径。这样,容器内的 Prometheus 服务将使用宿主机上的 prometheus.yml 配置文件。

prom/prometheus:这是你想要从中创建容器的 Docker 镜像的名称。在这种情况下,它是 Prometheus 官方提供的 Docker 镜像

–config.file=/etc/prometheus/prometheus.yml:这个参数实际上可能是多余的,因为你已经通过 -v 标志将配置文件挂载到了容器内的正确位置。Prometheus 容器默认会查找 >/etc/prometheus/prometheus.yml 作为其配置文件。但是,如果你想要确保 Prometheus 使用这个文件(尽管它是默认的),或者你的 Prometheus 镜像需要这个参数来覆盖默认行为,那么你可以包含这个参数。

总的来说,这个命令的目的是启动一个名为 prometheus 的 Docker 容器,该容器运行 Prometheus 服务,并使用宿主机上的 /opt/prometheus/prometheus.yml 作为其配置文件。容器将在后台运行,并且宿主机的 9090 端口将映射到容器的 9090 端口,以便你可以访问 Prometheus 的 Web UI。

注意:

你的docker拉取的速度可能会很慢,直到你奔溃。放心我会帮你解决问题。

为什么会很慢?

因为你没有配置docker的镜像源,Docker默认的镜像源是Docker Hub。Docker Hub是Docker官方提供的一个公共镜像仓库,但需要注意的是,由于Docker Hub位于国外,访问速度可能受到网络环境的影响,会很慢。

该怎么解决?解决办法很简单:修改mirror,换成国内mirror(阿里云)。

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

解释一下:

sudo 这是一个命令前缀,表示以超级用户(root)的权限执行命令。

mkdir: 这是创建目录的命令。

-p: 这个选项允许你创建多级目录,并且如果目录已经存在,则不会报错。

/etc/docker: 这是Docker的配置目录,用于存放Docker的配置文件。

tee: 这是一个用于读取标准输入并将其写入一个或多个文件的命令。同时,它也可以将文件内容输出到标准输出。

/etc/docker/daemon.json: 这是Docker守护进程的配置文件,用于配置Docker守护进程的各种参数。

<<-'EOF’: 这是一个“here document”的语法,它允许你将多行文本作为输入传递给命令。'EOF’是这里文档的结束标记,而前面的-意味着忽略这里的所有行首的制表符(tab)。

然后执行命令你会发现已经上高速了

docker run --name prometheus -d -p 9090:9090 -v

/opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --

config.file=/etc/prometheus/prometheus.yml

命令执行完成后访问:http://your path:9090/你会看到

恭喜你Prometheus安装成功

这时你点击targets发现没有任何数据,当然没有啦,有才怪呢,因为我们没有配置让Prometheus去哪里拿数据。

接下来我们配置让Prometheus去springboot项目里拿数据

还记的这条命令吗?

docker run --name prometheus -d -p 9090:9090 -v

/opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

prom/prometheus --config.file=/etc/prometheus/prometheus.yml

启动prometheus时我们在将它的配置文件prometheus.yml 挂到了 /opt/prometheus/这个目录下

首先停止启动 Prometheus docker 容器

查找启动的docker 容器

docker ps

docker stop CONTAINER ID

接下来我们开始配置这个文件(注意:这是一个yml文件,遵循严格的缩进)

global:

scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is 1 minute.

evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is 1 minute.

# scrape_timeout is set to the global default (10s).

# Alertmanager configuration

alerting:

alertmanagers:

- static_configs:

- targets:

# - alertmanager:9093 # Uncomment and set to your Alertmanager instance address

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.

rule_files:

# - "first_rules.yml"

# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:

# Here it's Prometheus itself.

scrape_configs: # 注意修正拼写错误为 scrape_configs

- job_name: 'prometheus'

# metrics_path defaults to '/metrics'

# scheme defaults to 'http'.

static_configs:

- targets: ['localhost:9090']

# 示例:其他 job 配置可以添加在这里

- job_name: 'springboot'

metrics_path: '/actuator/prometheus'

scheme: 'http'

static_configs:

- targets: ['yourIP:8080']

这段配置是什么意思呢?别害怕。在这里我会做出详细解释

全局配置 (global):

scrape_interval: 设置为 15 秒,意味着 Prometheus 每 15 秒从目标端点抓取一次监控数据。默认值是 1 分钟。scrape_timeout:这个值代表 Prometheus 在等待目标端点响应时的超时时间。默认值是 10 秒。Alertmanager 配置 (alerting):

定义了 Prometheus 如何与 Alertmanager 通信以发送警报。在这个例子中,配置了一个静态的 Alertmanager 目标,但是地址(alertmanager:9093)被注释掉了。你需要取消注释并设置为你自己的 Alertmanager 实例地址。(想要了解,请阅读后文)规则文件 (rule_files):

允许你指定一个或多个包含告警规则的 YAML 文件。在这个例子中,两个示例规则文件被注释掉了,但你可以取消注释并指向你自己的规则文件。(想要了解,请阅读后文)第一个 job_name: ‘prometheus’ 是 Prometheus 自身的监控配置,它默认从 localhost:9090(Prometheus 的默认端口)抓取数据。第二个 job_name: ‘springboot’ 是为 Spring Boot 应用程序配置的。它从 yourIP:8080(这里的 yourIP 需要替换为实际的 IP 地址或主机名)的 /actuator/prometheus 路径抓取数据。/actuator/prometheus 是 Spring Boot Actuator 提供的 Prometheus 监控端点。

现在我们主要配置的就是这个片段:

# 示例:其他 job 配置可以添加在这里

- job_name: 'springboot'

metrics_path: '/actuator/prometheus'

scheme: 'http'

static_configs:

- targets: ['yourIP:8080']

配置完成后,重启Prometheus docker 容器

docker ps -a

docker start CONTAINER ID

重启成功后你去看:http://your path:9090/ 你会神奇的发现targets里依然没有任何数据

注意: 我们的spring boot 项目启动在本地,只能在局域网里访问,当然可能有一些技术能结局(内网穿透等技术),但我们是Java程序员,可能对这方面不太了解,那怎么办呢?那就用程序员的方式解决

直接用docker把我们的Java项目打包部署到服务器上,开始喽~~

首先用maven打包spring boot项目

把 jar 文件上传到服务器

把 jar 文件改名 demo.jar (当然可以改你喜欢的文件名) —>2、在服务器你喜欢的位置创建一个文件目录(上传文件我用的是可视化工具,就不过多解释了)接下来重点来了。

编写Dockerfile

在demo.jar的同级目录下创建Dockerfile 文件

touch Dockerfile

vim Dockerfile

粘贴下面的命令

FROM java:8-alpine

COPY demo.jar app.jar

RUN /bin/sh -c "touch /app.jar"

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

这段代码其实很简单,我就不过多赘述了

3.打包镜像

打包

docker build -t demo .

注意后面的小点哦

查看镜像

docker images

启动镜像

docker run -d -p 8080:8080 demo

然后访问http://yourPath:8080/actuator/

看到这里,spring boot项目部署完毕,又学了个新技术哦,docker 部署Java项目

接下来记得改prometheus 拿取数据的ip地址哦(修改为你服务器地址,怎么修改可以参考上文的Prometheus.yml讲解)

打开prometheus的Targets你会神奇的发现多了一个 Endpoint 并且 state 为 up

去首页查询你会发现有很多数据:

指标记不住怎么办?可以看这里

到这里我们Prometheus 就介绍完毕了

七 、Grafana安装

介绍

Grafana是一个开源的数据可视化工具,主要用于将数据源中的数据以图形化的形式展示并进行实时监控

数据源支持:

-Grafana支持多种数据源,包括Graphite、Elasticsearch、InfluxDB、Prometheus等,这使得用户能够整合来自不同来源的数据,并在一个统一的界面中进行展示和分析。数据可视化:

Grafana提供了丰富的可视化图表类型,如折线图、直方图、热力图等,以满足各种数据可视化需求。用户可以通过简单的配置和自定义设置,将数据转化为易于理解的图表和仪表盘,并在一个界面中集中展示多个数据源的数据。实时监控:

Grafana支持实时监控功能,可以实时反映系统状态、性能等指标的变化情况。这使得用户能够及时发现潜在问题,并采取相应措施进行解决。

告警与通知:Grafana可以设置告警规则,当某些指标达到预设的阈值时,系统会自动发送通知,提醒用户关注和处理。这种功能可以帮助用户保持对关键指标的持续监控,确保系统的稳定运行。灵活的布局:

Grafana允许用户通过拖拽和配置的方式,自由调整图表的位置和大小,实现个性化的界面布局。这使得用户能够根据自己的需求定制仪表板,提高工作效率。数据采集与清洗:

Grafana支持从各种数据源采集数据,并进行聚合、清洗和存储。这样可以确保数据的准确性和完整性,为后续的分析和展示提供可靠的数据支持。插件和扩展:Grafana支持多种插件和扩展,可以定制用户的监控和数据可视化体验。这些插件和扩展可以帮助用户扩展Grafana的功能,满足特定的业务需求。

总之,Grafana是一个功能强大、易于使用的数据可视化工具,可以帮助用户更好地理解和分析数据,提高工作效率。

安装

拉取Grafana Docker镜像:

docker pull grafana/grafana

运行Grafana容器:

docker run -d -p 3000:3000 --name=grafana grafana/grafana

访问 http://yourPath:3000 你会看到一下界面

到这里grafana安装就完毕了,接下来我们配置

配置

添加数据源

选择数据源

Prometheus地址配置

导入视图

选择 import 搜索 4701

选择Prometheus,然后导入(解释,我已经导入过模板了,所以有提示)

导入成功后你会看到以下界面(很多的指标都图形化显示了)

到这里 grafana 安装完毕。

八、linux node-exporter安装

介绍:

node-exporter是一个Prometheus的exporter,它主要用于监控Linux系统的节点信息。这个工具可以采集Linux服务器的多种资源数据,包括但不限于服务器的进程数、CPU、内存消耗、磁盘空间、IOPS(输入/输出操作每秒)、TCP连接数等。

node-exporter的工作方式是暴露主机的指标,如CPU、内存、磁盘等信息。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。然而,与传统的指标数据收集组件不同的是,node-exporter只负责收集数据,并不直接向Server端发送数据,而是等待Prometheus Server主动抓取。默认的抓取URL地址是http://ip:9100/metrics。

安装:

同样的方式,用docker 安装

docker run -d -p 9100:9100 --restart=always -m 5G --memory-swap=5G \

-v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" \

--name node_exporter quay.io/prometheus/node-exporter --path.procfs \

/host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points\

"^/(sys|proc|dev|host|etc)($|/)"

访问:http://yourIp:9100/metrics

node-exporter安装成功

然后去grafana import 8919 (数据源继续选择promtheus)你会看到如下页面,服务器已经开始监控

九、Altermanager安装

1、介绍

当Prometheus服务器根据报警规则发现异常时,它会将警报发送到Alertmanager。Alertmanager负责处理这些警报,包括进行去重、分组,并通过路由发送到正确的接收器,如电子邮件、Slack、HipChat等。Alertmanager还支持多种告警方式,如邮件告警、微信告警、短信告警、Slack告警、电话告警和PagerDuty告警等。通过配置,用户可以根据自己的需求选择适合的告警方式,以便及时采取行动来处理问题。总的来说,Alertmanager是Prometheus生态系统中的一个重要组件,它负责处理Prometheus生成的警报,并通过各种方式通知用户,以便用户能够及时发现和处理潜在问题。

2、安装

创建数据挂载目录

/opt/alertmanager/config目录,准备用来放置alertmanager的配置文件

/opt/alertmanager/template目录,准备用来挂载放置alertmanager的模板文件

mkdir -p /opt/alertmanager/{config,template}```

## 授权权限

```linux

chmod -R 777 /opt/alertmanager/config

chmod -R 777 /opt/alertmanager/template

创建Altermanager配置文件alertmanager.yml

cat > /opt/alertmanager/config/alertmanager.yml << \EOF

global:

resolve_timeout: 5m

# 发件人

smtp_from: 1229495577@qq.com'

# 邮箱服务器的 POP3/SMTP 主机配置 smtp.qq.com 端口为 465 或 587

smtp_smarthost: 'smtp.qq.com:465'

# 用户名

smtp_auth_username: 1229495577@qq.com'

# 授权码 或 密码

smtp_auth_password: '你的qq授权码'

smtp_require_tls: false

smtp_hello: 'qq.com'

templates:

# 指定预警内容模板

- '/etc/alertmanager/template/email.tmpl'

route:

# 指定通过什么字段进行告警分组(如:alertname=A和alertname=B的将会被分导两个组里面)

group_by: ['alertname']

# 在组内等待所配置的时间,如果同组内,5 秒内出现相同报警,在一个组内出现

group_wait: 5s

# 如果组内内容不变化,合并为一条警报信息,5 分钟后发送

group_interval: 5m

# 发送告警间隔时间 s/m/h,如果指定时间内没有修复,则重新发送告警

repeat_interval: 5m

# 默认的receiver。 如果一个报警没有被任何一个route匹配,则发送给默认的接收器

receiver: 'justrydeng163email'

#子路由(上面所有的route属性都由所有子路由继承,并且可以在每个子路由上进行覆盖)

routes:

# 当触发当前预警的prometheus规则满足:标签alarmClassify的为normal时(标签名、标签值可以自定义,只要和编写的prometheus的rule里面设置的标签呼应上即可),往justrydeng163email发送邮件

- receiver: justrydeng163email

match_re:

alarmClassify: normal

# 当触发当前预警的prometheus规则满足:标签alarmClassify的值为special时(标签名、标签值可以自定义,只要和编写的prometheus的rule里面设置的标签呼应上即可),往justrydengQQemail发送邮件

- receiver: justrydengQQemail

match_re:

alarmClassify: special

receivers:

- name: 'justrydeng163email'

email_configs:

# 如果想发送多个人就以 ',' 做分割

- to: burger2325@163.com'

send_resolved: true

# 接收邮件的标题

headers: {Subject: "alertmanager报警邮件"}

- name: 'justrydengQQemail'

email_configs:

# 如果想发送多个人就以 ',' 做分割

- to: 1229495577@qq.com'

send_resolved: true

# 接收邮件的标题

headers: {Subject: "alertmanager报警邮件"}

inhibit_rules:

- source_match:

severity: 'critical'

target_match:

severity: 'warning'

equal: ['alertname', 'dev', 'instance']

EOF

告警内容模板文件创建

cat > /opt/alertmanager/template/email.tmpl << \EOF

{{ define "email.html" }}

{{ range $i, $alert := .Alerts }}

{{ end }}

报警项 实例 报警阀值 开始时间 告警信息
{{ index $alert.Labels "alertname" }} {{ index $alert.Labels "instance" }} {{ index $alert.Annotations "value" }} {{ $alert.StartsAt }} {{ index $alert.Annotations "description" }}

{{ end }} EOF

docker 部署Alertmanager

docker run -d --name=alertmanager -p 9093:9093 -v /etc/localtime:/etc/localtime:ro

-v /opt/alertmanager/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml

-v /opt/alertmanager/template:/etc/alertmanager/template prom/alertmanager

访问 http://yourIp:9093,看到以下界面,部署成功

配置

Prometheus.yml文件配置

添加Alertmanager 的地址和Prometheus 的告警规则文件地址

告警规则文件配置

创建文件夹/opt/prometheus/rules

mkdir -p /opt/prometheus/rules

/opt/prometheus/rules下创建 springboot-service-rule.yml

cd /opt/prometheus/rules

touch springboot-service-rule.yml

粘贴以下内容

groups:

- name: springboot-service-alerts

rules:

- alert: SpringBootServiceDown

# 这个地方是 PromQL 不能随写哦,是否宕机

expr: up{job="springboot"} == 0

# 持续时间

for: 10s

labels:

# 告警级别

severity: critical

annotations:

summary: "Spring Boot服务宕机"

# {{ $labels.instance }} 其实就是ip,在prometheus 里可以看到

description: "Spring Boot服务 {{ $labels.instance }} 已经在过去5秒内不可用了,请立即检查!"

#cpu使用率过高

- alert: SpringBootHighCPUUsage

expr: (1 - avg by(instance) (irate(process_cpu_seconds_total{job="springboot"}[5m]))) * 100 > 80

for: 10s

labels:

severity: warning

annotations:

summary: "Spring Boot服务CPU使用率过高"

description: "实例 {{ $labels.instance }} 的CPU使用率超过80%已经持续了10分钟,请检查服务负载或进行性能调优!"

#内存使用过高

- alert: SpringBootHighMemoryUsage

expr: (container_memory_usage_bytes{job="springboot"} / container_spec_memory_limit_bytes{job="springboot"}) * 100 > 80

for: 10m

labels:

severity: warning

annotations:

summary: "Spring Boot服务内存使用率过高"

description: "实例 {{ $labels.instance }} 的内存使用率超过80%已经持续了10分钟,请检查内存泄露或进行资源调整!"

# 这里可以添加更多针对Spring Boot服务的告警规则

这个时候我们停掉以前的Prometheus,然后挂在这个规则文件重新创建容器并运行

#停止

docker stop CONTAINER ID

重建新创建容器并启动

docker run -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

-v /opt/prometheus/rules/rule.yml:/etc/prometheus/rules/rule.yml --name prometheus3 prom/prometheus

然后停掉你的 springboot 项目

docker stop CONTAINER ID

在Prometheus你会看到:

在Alertmanager你会看到

到这里,我们还有最后一步啦,配置邮件告警,我们的微服务之服务告警就完结散花啦

十、配置告警

首先带大家看一下alertmanagr的配置文件

global:

resolve_timeout: 5m

# 发件人

smtp_from: 1229495@qq.com'

# 邮箱服务器的 POP3/SMTP 主机配置 smtp.qq.com 端口为 465 或 587

smtp_smarthost: 'smtp.qq.com:465'

# 用户名

smtp_auth_username: 122945577@qq.com'

# 授权码 或 密码

smtp_auth_password: '你的qq授权码'

smtp_require_tls: false

smtp_hello: 'qq.com'

templates:

# 指定预警内容模板

- '/etc/alertmanager/template/email.tmpl'

route:

# 指定通过什么字段进行告警分组(如:alertname=A和alertname=B的将会被分导两个组里面)

group_by: ['alertname']

# 在组内等待所配置的时间,如果同组内,5 秒内出现相同报警,在一个组内出现

group_wait: 5s

# 如果组内内容不变化,合并为一条警报信息,5 分钟后发送

group_interval: 5m

# 发送告警间隔时间 s/m/h,如果指定时间内没有修复,则重新发送告警

repeat_interval: 5m

# 默认的receiver。 如果一个报警没有被任何一个route匹配,则发送给默认的接收器

receiver: 'justrydeng163email'

#子路由(上面所有的route属性都由所有子路由继承,并且可以在每个子路由上进行覆盖)

routes:

# 当触发当前预警的prometheus规则满足:标签alarmClassify的为normal时(标签名、标签值可以自定义,只要和编写的prometheus的rule里面设置的标签呼应上即可),往justrydeng163email发送邮件

- receiver: justrydeng163email

match_re:

alarmClassify: normal

@

配置文件里给大家解释的很详细,这里就不过都赘述,相信大家看完注释因该知道该怎么配置了。

亲爱的探索者,我们一同走过了这片知识的海洋,历经曲折与艰辛,却也收获了无尽的宝藏与智慧。愿你在前行的道路上,始终保持那份对技术的热爱与追求,让智慧的火花在你的心中燃烧,照亮你探索未知的道路。愿你的每一次努力都能化作成功的基石,每一次挑战都能让你更加坚韧不拔。最后,衷心地感谢你与我一同分享这段精彩的旅程,期待在未来的日子里,我们能够继续携手并进,共同书写更多属于技术狂人的辉煌篇章。加油,探索者,愿你的未来因知识而更加精彩!

愿我们的热情永不消退,愿我们的智慧永远闪烁

相关画作

深圳华强北的组装机只要500、600元,这种手机可以买吗?
和平精英滑翔机刷新点 和平精英滑翔机会在哪刷新
皇冠365bet体育投

和平精英滑翔机刷新点 和平精英滑翔机会在哪刷新

📅 07-31 👁️ 853
买土按“升”算?到底谁傻?切记,买土按斤算,不要被忽悠了