微服务的监控并实现钉钉图文告警

为了比较方便统计微服务服务器基础指标和相关运行状态,目前比较流行和成熟的方案是采用Prometheus+Grafana。本文主要基于docker的方式,快速搭建一套监控体系。

  1. 应用改造

为了整合Prometheus,需要在微服务应用中增加micrometer-registry-prometheus依赖:

<!-- Micrometer Prometheus registry  -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

配置中打开端点/actuator/prometheus

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS
  metrics:
    tags:
      application: ${spring.application.name}
  1. 启动prometheus

运行prometheus容器:

$ docker run -d --name=prometheus -p 9090:9090 -v /docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:v2.16.0 --config.file=/etc/prometheus/prometheus.yml

其中映射到主机的配置文件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).

# 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:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ['127.0.0.1:9090']

  - job_name: 'nacos-prometheus'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 15s
    consul_sd_configs:
      - server: '192.168.0.102:7000'
        services: []
  1. 启动Grafana

使用以下命令可以使Docker下载和运行Grafana:

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

为了能让Grafana的面板嵌入到应用中,需要更改配置
以root用户进入容器中

$ docker exec -u root -it grafana sh
# vi conf/defaults.ini

微服务的监控并实现钉钉图文告警
微服务的监控并实现钉钉图文告警

  1. 导入模版

使用dashboard模版,可以减少定制的时间。官网的dashboard广场,有很多现成的:
https://grafana.com/grafana/dashboards
在Grafana的面板中点击菜单Import:

微服务的监控并实现钉钉图文告警
从官网dashboard广场获取面板ID:
微服务的监控并实现钉钉图文告警

此处粘贴入模版ID:
微服务的监控并实现钉钉图文告警

微服务应用,推荐使用4701

  1. 将Grafana嵌入自己的应用页面

dashboard 和 panel都可以分享,如图点击share:
微服务的监控并实现钉钉图文告警
弹出的对话框中,可以自定义一些参数
微服务的监控并实现钉钉图文告警

分享出来的链接加入kiosk=tv参数还可以隐藏面板的左边菜单和上面标题栏。然后就可以用iframe标签嵌入到前端页面里去了。

  1. 告警配置

如需告警,则需要把配置文件中的这个地址改下,否则docker里的会是错误的
微服务的监控并实现钉钉图文告警
在Grafana的Alert面板中,可以根据需要配置告警的一些参数,如监测频率等

微服务的监控并实现钉钉图文告警

  1. 生成图文告警

首先在Grafana的Notification channels面板中配置告警通道:
微服务的监控并实现钉钉图文告警
有2个参数必须注意,Url填入告警分发的钉钉机器人的webhook。如何添加群机器人并获得webkook,请参考钉钉官网https://ding-doc.dingtalk.com/doc#/serverapi2/krgddi。此外,要注意勾选 Include image 选项。
配置好后,Grafana的告警图表还需要一个外部的图像渲染服务。我们依然使用docker来创建并启动此服务,
新建容器并对外开放8081端口:

$ docker run -d --name=grafana-image-renderer -p 8081:8081 --env GF_RENDERER_PLUGIN_TZ=Asia/Shanghai --env GF_RENDERER_PLUGIN_IGNORE_HTTPS_ERRORS=true grafana/grafana-image-renderer

进入容器中修改配置文件 /conf/defaults.ini

[rendering]
# 这里指定使用外部图像渲染,指向刚建立的容器 /render 路径不可少
server_url = http://192.168.0.102:8081/render
# If the remote HTTP image renderer service runs on a different server than the
callback_url = http://192.168.0.102:3000

还有:

[external_image_storage]
# 使用s3协议
provider = s3
[external_image_storage.s3]
# 这个链接必须要能连通互联网,否则图像能生成,但会无法访问
endpoint = http://www.xxx.com
# 这个参数必须设置成true,否则下面的bucket参数会加在上面endpoint最前面,导致访问不了,会变成 http://mybucket.www.xxx.com
path_style_access = true
# 不要配置
bucket_url =
bucket = mybucket
# minIO默认的region是us-east-1
region = us-east-1
path = images
access_key = AKIAIOSFODNN7EXAMPLE
secret_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY中的

我们用的是本地的minIO作为图像生成的存储服务。当然用阿里云的OSS应该也是没有问题的。

通过以上的配置,当Grafana监测到系统指标超过告警阀值,则就会向钉钉发送图文消息
微服务的监控并实现钉钉图文告警

上一篇:基于阿里云物联网平台实现的简易出入监控


下一篇:Swift - 自定义单元格实现微信聊天界面