当前位置: 首页 > news >正文

给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

监控是一个系统必不可少的组成部分,实时,准确的监控,将会大大有助于我们排查问题。而当今微服务系统的话有一个监控组合很火那就是 Prometheus + Grafana,嘿你别说 这俩兄弟配合的相当完美,Prometheus负责数据采集,Grafana负责可视化展示,各就其位,各司其职一起来完成 监控 这个活儿。

紧接着我们简单对这两工具做个介绍~

1、Prometheus 与 Grafana 简介

Prometheus

作用

  • 数据收集: Prometheus 是一个开源的系统监控和报警工具,主要用于收集、存储和查询时间序列数据。它通过 HTTP 抓取(scrape)方式从被监控的目标获取数据。
  • 数据存储:Prometheus 使用时间序列数据库来存储所有收集到的指标数据。时间序列数据包括指标名称和标签,标签用于唯一标识时间序列。
  • 数据查询:Prometheus 提供了一种强大的查询语言 PromQL,可以用来查询和分析收集到的数据(虽然语法强大, 但是还是不如可视化 。哈哈,所以要和grafana配合起来)。
  • 告警: Prometheus 内置告警管理器(Alertmanager),可以根据预定义的规则触发告警,并将告警发送到各种通知渠道(如邮件、Slack、PagerDuty 等)。

特点

  • 开源免费:Prometheus 是开源的,拥有活跃的社区和丰富的文档。
  • 自带存储:Prometheus 自带时间序列数据库(TSDB),无需外部依赖。
  • 多种数据源:支持从多种数据源采集指标数据,如 Kubernetes、MySQL、Linux 系统等。
  • 可扩展性强:可以通过自定义导出器(exporter)扩展数据采集能力。

Grafana

作用

  • 数据可视化:Grafana 是一个开源的平台,用于数据可视化和分析。它能够连接到多种数据源,并将数据以各种形式(图表、表格、仪表盘等)展示出来。
  • 仪表盘:Grafana 提供丰富的仪表盘功能,可以用来创建和共享实时的动态仪表盘。用户可以通过拖拽组件轻松构建仪表盘。
  • 多数据源支持:Grafana 支持多种数据源,包括 Prometheus、Graphite、InfluxDB、Elasticsearch、MySQL、PostgreSQL 等。
  • 告警:Grafana 也支持告警功能,用户可以在图表上设置告警规则,并通过通知渠道(如邮件、Slack、PagerDuty 等)接收告警。

特点

  • 开源免费:Grafana 也是开源的,拥有广泛的用户群体和丰富的插件。
  • 多数据源支持:Grafana 能够同时从多个数据源获取数据,并在同一个仪表盘中展示。
  • 灵活的可视化:提供丰富的图表类型和可定制的可视化选项,能够满足各种数据展示需求。
  • 仪表盘共享:可以轻松分享仪表盘,并支持权限控制和团队协作。

Prometheus 与 Grafana 之间是如何协作的 ?

  • 数据采集与存储:Prometheus 负责从各个监控目标收集指标数据,并存储在其时间序列数据库中。
  • 数据查询与分析:Prometheus 提供了强大的查询语言 PromQL,可以用来查询和分析数据。
  • 数据可视化:Grafana 连接到 Prometheus 作为数据源,使用 PromQL 查询数据,并将结果以图表的形式展示在仪表盘上。
  • 告警:Prometheus 可以管理和触发告警,而 Grafana 可以基于可视化图表设置告警规则。

示例场景

  1. 监控应用性能:使用 Prometheus 采集应用程序的性能指标(如 CPU 使用率、内存使用率、请求延迟等),并在 Grafana 中创建仪表盘实时展示这些指标。
  2. 告警管理:在 Prometheus 中定义告警规则,如 CPU 使用率超过阈值时触发告警,并通过 Alertmanager 发送通知。也可以在 Grafana 中基于图表设置告警规则。
  3. 系统健康检查:使用 Prometheus 监控系统的健康状况,收集系统级指标(如磁盘使用率、网络流量等),并在 Grafana 中创建健康检查仪表盘。

通过结合使用 Prometheus 和 Grafana,你可以实现强大且灵活的监控和可视化方案,帮助你更好地了解和管理应用程序和基础设施的性能和健康状况。

好了bb这么多 ~

下面我就开始对我的IM即时通讯系统做改造,让其也能被可视化,做到实时监控各项指标一目了然。

2、使用grafana + promethues 监控IM服务和中间件

因为我目前是使用docker-compose方式编排管理容器,所以也使用docker-compose安装promethues和grafana

grafana + promethues 使用示例

  1. 首先在docker-compose增加内容: 首先在我的docker-compose中定义 镜像,挂载,容器名称,端口,网络,依赖哪些容器启动 等配置,如下: ```java prometheus: image: prom/prometheus containername: prometheus volumes: # 数据挂载 防止容器重启/停止后 数据消失 - /usr/local/softhzz/docker/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml - /usr/local/softhzz/docker/prometheus/data/prometheusdata:/prometheus # 挂载数据到宿主机目录

    ports: - "9090:9090" networks: - defaultnetwork dependson: - im-connect - im-console - im-business - im-gateway - im-auth - nodeexporter - cadvisor grafana: image: grafana/grafana containername: grafana ports: - "3000:3000" environment: - GFSECURITYADMIN_PASSWORD=grafana123 # grafana 密码 # 挂载数据到宿主机目录 volumes:

    • /usr/local/softhzz/docker/grafana/grafanadata:/var/lib/grafana

      必须指定 网络,否则无法通过服务名 如:im-business 找到对应的ip

      networks:

      • defaultnetwork dependson:
      • im-connect
      • im-console
      • im-business
      • im-gateway
      • im-auth
      • prometheus ```
  2. 之后需要有一个prometheus.yml文件,用于定义prometheus抓取指标的策略,如下: image.png (注意上边这个prometheus.yml文件的路径一定要和docker-compose中的这个保持一致哦 image.png

这里我们不做运行了,因为这样运行的话没有意义,还需要给其配上一堆目标和一堆规则,下边我们就开搞。

监控IM服务和中间件

说明:

在配置和开干之前,我先根据我踩得坑,说明几个情况:

首先并不是所有的中间件或者服务都能直接让prometheus采集数据,因为有些压根就没暴露,面对这种情况,想要采集?要不就是人家写好的 各种 exporter ,要不就得自己根据 prometheus client采集 采集的话你也得收集指标并提供指标接口才行,我在采集的时候遇到了下边这几种情况。

情况1: 硬件指标
  • 硬件指标没啥说的,人家已经贴心给你搞好了,就是使用 node-exporter这个 exporter去采集就行了,如下image.png

    情况2: SpringBoot搭建的http服务的指标
  • 这种服务的指标很好采集,因为SpringBoot框架也已经贴心的给你搞好了就是(SpringBoot Actuator 这个东东),你只需要引入下Maven配置下暴露的端点(url)就可以让prometheus 痛快的采集。image.png配置一下:image.png

情况3: 中间件指标(我采集了Redis ,MySQL, RocketMQ )

(注意:目前只采集三个比较重要的中间件,因为采集越多越耗费资源其他中间件暂时不做监控我看了下基本这些中间件都得采用 exporter方式去搞)

  • 很多中间件比如这三个都是没有直接暴露监控指标的,也就是说prometheus无法直接向mysql或者redis或者rocketmq抓取指标数据,目前大多的方式都是搞了一个 exporter这么个中间人(其实也是个进程) ,让他去使用promethues客户端(client)来抓取指定的中间件的指标数据,然后再归并汇总为prometheus的格式,最终给到prometheus。
  • 这三个中间件使用的 exporter 介绍:

    • redis使用 redis-exporter 进行采集 镜像:oliver006/redis_exporter:latest
    • mysql使用 mysqld-exporter进行采集 镜像:prom/mysqld-exporter:latest
    • rocketMQ使用 rocketmq-exporter进行采集 注意:这个没有官方镜像,最好是下载代码自己打镜像这样靠谱些 仓库在这: rocketmq-exporter,但是按部就班按官方的步骤来我还是遇到点问题所以写了个脚本解决这个问题,具体见下边脚本内容:image.png
      情况4: 非http服务:无法暴露http接口给 prometheus
  • 在我的im项目中 im-connetc是一个比较特殊的服务,他使用Springboot框架搭建 但是服务器是netty ,也就是说他不是一个http服务而是一个长连接服务,他不提供http接口供prometheus采集(虽能在maven集成SpringBoot Actuator 但是你这不是http服务 Actuator的接口根本无法对外暴露出去),面对此情况,我一开始是准备搞个 jmx 但是这种方式比较麻烦而且采集的指标也有限,后来改用prometheus client我发现,我去 好像很爽 想采集什么你自己定 默认的gc 线程 内存 cpu(内存和cpu这些硬件指标需要结合dropwizard去采集) 都有 你也可以定义业务上的指标供 prometheus采集以及后续展示。

    情况5: 踩坑经历
  • 一开始 我想用 jmx_prometheus去采集我的im-connect服务的指标,他有两种方式一个是使用javaagent给目标程序插桩,一个是单独搞个jmx_prometheus进程去采集im-connect 但是折腾半天发现,不是采集不上就是连不上(但是可以通过访问5556端口(jmxprometheus的端口)拿到指标,但是很迷我就算压测im-connect指标也不见多少变化,我严重怀疑我采集的不是im-connect而是jmxprometheus进程本身,stackoverflow看到个人好像和我有类似的疑虑),后来干脆放弃了jmx_prometheus方式,反正条条大路通罗马,我换成 prometheus client方式采集长连接服务,效果也不错,还更灵活,挺香的~~~ (ps: 但是 prometheus client得自己写点代码,其实这点代码也可以将其封装为一个javaagent方式,不过时间原因先不搞agent了 先把最近的目标完成后边有时间再说正好我也可以再和javaagent叙叙旧)

    • 下边是代码片段,完整的在我的开源项目:xzll-im中image.pngimage.png

开干:

在有了上边的铺垫之后,接下来我们就开干!

docker-compose.yaml文件编写

ps:注意有很多我在文件中注释了这里就不详细解释了,直接上 docker-compose.yaml 文件 ```yaml version: '3.9' services: im-gateway: build: context: ./im-gateway dockerfile: Dockerfile image: im-gateway:latest

hostname: im-gateway
container_name: im-gateway
restart: always
ports:- "8081:8081"
networks:- default_network
volumes:- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

im-auth: build: context: ./im-auth dockerfile: Dockerfile image: im-auth:latest

hostname: im-auth
container_name: im-auth
restart: always
ports:- "8082:8082"
networks:- default_network
volumes:- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

im-business: # 可以根据Dockerfile构建镜像(但是,Docker Compose 会在检测到上下文变化时重新构建镜像。也就是说如果你不修改Dockerfile docker-compose应该不是每次都构建镜像 实测确实如此) build: context: ./im-business # 指定Dockerfile文件位置 dockerfile: Dockerfile # 指定名称 image: im-business:latest # 指定生成镜像的 名称

# 也可以直接指定镜像名 但是要确保镜像存在 (如果在docker仓库, 则不需要再本地存在镜像 会自动pull)
# image: im-business:0.0.2# 设置容器的主机名 即修改 : /etc/hosts 中的内容,注意 如果是在docker中 ,容器间相互访问的时使用的是 容器的hostname 那么必须配hostname
hostname: im-business
# 容器名称
container_name: im-business
# 重启策略, always 表示无论哪种状态退出,都会重启容器
restart: always
ports:# 设置主机与容器的端口映射- "8083:8083"
networks:# 使用默认网络即:docker0 桥接- default_network
volumes:# 将主机的 /tmp/data/logs 目录挂载到容器的 /logs 目录。这样可以实现数据的持久化,当容器重启时,数据不会丢失,注意 挂载文件需要给宿主机文件 添加最权限,chmod -R 777 目标文件夹- "/tmp/data/logs:/logs"
depends_on:- nacos- zookeeper- redis- rmq_broker- rmq_namesrv

im-connect: build: context: ./im-connect dockerfile: Dockerfile image: im-connect:latest hostname: im-connect containername: im-connect restart: always ports: - "10000:10000" # prometheus指标采集端口 http (注:不采用jmx方式采集) - "10001:10001" # netty端口 networks: - defaultnetwork volumes: - "/tmp/data/logs:/logs" dependson: - nacos - zookeeper - redis - rmqbroker - rmq_namesrv

im-console: build: context: ./im-console dockerfile: Dockerfile image: im-console:latest hostname: im-console containername: im-console restart: always ports: - "8084:8084" networks: - defaultnetwork volumes: - "/tmp/data/logs:/logs" dependson: - nacos - zookeeper - redis - rmqbroker - rmq_namesrv

# ######################################### 以下是此im项目 依赖的中间件 #########################################

# rocketMq nameServer rmqnamesrv: image: apache/rocketmq:4.8.0 containername: rmqnamesrv hostname: rmqnamesrv restart: always networks: - default_network ports: - "9876:9876"

- "1099:1099" # jmxremote暴露的端口

volumes:- /usr/local/soft_hzz/docker/rocketmq_namesrv/store:/root/store- /usr/local/soft_hzz/docker/rocketmq_namesrv/logs:/root/logs
environment:# 配置jmxremote 以便jmx监控- JAVA_OPTS=-Djava.rmi.server.hostname=rmq_namesrv -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
command: sh mqnamesrv

# rocketMq broker rmqbroker: image: apache/rocketmq:4.8.0 containername: rmqbroker restart: always hostname: rmqbroker networks: - default_network ports: - "10911:10911" # 外部通信端口。客户端(生产者和消费者)与 Broker 进行通信时使用此端口 - "10909:10909" # 内部通信端口。用于 Broker 间的同步、复制和其他内部通信

- "11099:11099" # jmxremote暴露的端口

volumes:- /usr/local/soft_hzz/docker/rocketmq_broker/store:/root/store- /usr/local/soft_hzz/docker/rocketmq_broker/logs:/root/logs- /usr/local/soft_hzz/docker/rocketmq_broker/conf/broker.conf:/opt/rocketmq-4.8.0/conf/broker.conf
environment:# 降低内存大小 防止启动失败 并配置 jmxremote 以便jmx监控- JAVA_OPT_EXT=-server -Xms512m -Xmx1g -Xmn256m#- JAVA_OPT_EXT=-server -Xms512m -Xmx1g -Xmn256m -Djava.rmi.server.hostname=rmq_broker -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
command: sh mqbroker -c /opt/rocketmq-4.8.0/conf/broker.conf

rocketmqexporter: image: rocketmq-exporter:latest containername: rocketmq-exporter restart: always hostname: rocketmq-exporter networks: - defaultnetwork ports: - "5557:5557" environment: - JAVAOPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Drocketmq.broker.addr=rmqbroker:10911 dependson: - rmqnamesrv - rmq_broker

rocketmq-console: image: styletang/rocketmq-console-ng containername: rocketmq-console restart: always ports: - "8080:8080" environment: JAVAOPTS: "-Drocketmq.namesrv.addr=${LOCALIP}:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" dependson: - rmqnamesrv - rmqbroker # nacos nacos: image: nacos/nacos-server:2.0.3 containername: nacos restart: always ports: - "8848:8848" volumes: - /usr/local/softhzz/docker/nacos/data:/home/nacos/data - /usr/local/softhzz/docker/nacos/logs:/home/nacos/logs environment: MODE: standalone #redis redis: image: redis containername: redis restart: always networks: - defaultnetwork ports: - "6379:6379" volumes: - /usr/local/softhzz/docker/redis/data:/data - /usr/local/softhzz/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf # zk zookeeper: image: zookeeper containername: zookeeper restart: always ports: - "2181:2181" volumes: - /usr/local/softhzz/docker/zk/data:/data - /usr/local/softhzz/docker/zk/datalog:/datalog - /usr/local/soft_hzz/docker/zk/conf/zoo.cfg:/conf/zoo.cfg

prometheus: image: prom/prometheus containername: prometheus volumes: # 数据挂载 防止容器重启/停止后 数据消失 - /usr/local/softhzz/docker/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml # prometheus配置文件,配置抓取的规则和抓取目标 - /usr/local/softhzz/docker/prometheus/data/prometheusdata:/prometheus # 挂载数据到宿主机目录

ports:- "9090:9090"
networks:- default_network
depends_on:- im-connect- im-console- im-business- im-gateway- im-auth- node_exporter- cadvisor

grafana: image: grafana/grafana containername: grafana ports: - "3000:3000" environment: - GFSECURITYADMINPASSWORD=grafana123 # grafana 密码 # 挂载数据到宿主机目录 volumes: - /usr/local/softhzz/docker/grafana/grafanadata:/var/lib/grafana

# 必须指定 网络,否则无法通过服务名 如:im-business 找到对应的ip
networks:- default_network
depends_on:- im-connect- im-console- im-business- im-gateway- im-auth- prometheus

# 用于监控linux系统的信息 nodeexporter: image: prom/node-exporter containername: node-exporter ports: - "9100:9100" networks: - defaultnetwork # 用于监控docker容器的信息 cadvisor: image: google/cadvisor:latest containername: cadvisor ports: - "9101:8080" # 8080已经被rocketMQ控制台占用 所以这里选择映射到主机的 9101端口 privileged: true

volumes:

#- /usr/local/soft_hzz/docker/cadvisor/run/docker.sock:/var/run/docker.sock#- /usr/local/soft_hzz/docker/cadvisor/sys:/sys# - /usr/local/soft_hzz/docker/cadvisor/lib/docker/:/var/lib/docker/
networks:- default_network

# 监控虚拟机上的mysql mysqld-exporter: image: prom/mysqld-exporter:latest containername: mysqld-exporter hostname: mysqld-exporter networks: - defaultnetwork environment: DATASOURCENAME: 'root:xzllaigH95..@tcp(${LOCAL_IP}:3306)/' ports: - "9104:9104"

# 监控redis redis-exporter: image: oliver006/redisexporter:latest containername: redis-exporter hostname: redis-exporter networks: - defaultnetwork environment: REDISADDR: 'redis:6379' REDISPASSWORD: '123456' # redis密码 ports: - "9121:9121" dependson: - redis

networks: default_network: # 桥接 driver: bridge ```

prometheus.yml 抓取规则配置文件

```yaml

prometheus 的配置文件,定义部分抓取规则以及 监控的目标实例

全局配置

global: scrape_interval: 15s # 抓取间隔:每 15 秒抓取一次所有配置的监控目标。

抓取规则:定义 Prometheus 要抓取的监控目标,以及抓取这些目标的相关配置

scrape_configs:

# # ----------------------------------------监控自己的几个服务----------------------------------------

  • job_name: 'im-gateway'

    static_configs:静态配置,定义了要抓取的目标地址和端口

    static_configs:

    • targets: [ 'im-gateway:8081' ]

      需要指定 否则的话 prometheus 默认找的路径是:ip:端口/metrics 而springboot2.7中是没有 /metrics 这个端点路径的

    metrics_path: /actuator/prometheus

  • jobname: 'im-auth' staticconfigs:

    • targets: [ 'im-auth:8082' ] metrics_path: /actuator/prometheus
  • jobname: 'im-business' staticconfigs:

    • targets: [ 'im-business:8083' ] metrics_path: /actuator/prometheus
  • jobname: 'im-console' staticconfigs:

    • targets: [ 'im-console:8084' ] metrics_path: /actuator/prometheus

    使用 prometheus 客户端采集netty服务的指标数据给 prometheus

  • jobname: 'im-connect' staticconfigs:

    md5-ddfe6145998a5d931151c8979b884716

    ----------------------------------------对硬件和中间件的监控----------------------------------------

    监控linux硬件系统和资源 grafana模板id: 1860 模板名称: Node Exporter Full

  • jobname: 'nodeexporter' static_configs:

    md5-35e0d4e81ba773d33aaf78fc38a4e6fd

    用于监控docker容器 grafana模板id: 893,名称: Docker and system monitoring

  • jobname: 'cadvisor' staticconfigs:

    md5-c713c6a83c68ba60e4a4c184180fae31

    监控 RocketMQ NameServer 和 RocketMQ Broker (此程序会有定时任务定时扫描rm指标 并归并上报给 prometheus,暂无docker镜像 需要手动下载并构建 详见)

    此监控也有grafana模板id : 10477 ,模板名称:Rocketmq_dashboard

  • jobname: 'rocketmqexporter' static_configs:

    md5-19b8ea741e1b3c34f63a3002e1835bbb

    监控虚拟机上的mysql(目前除了mysql 其余都是在docker部署) ,grfnada 模板id使用: 7362 模板名称: MySQL Overview

  • jobname: 'mysqld-exporter' staticconfigs:

    md5-807a23fb2de6d630db41ce82370be11d

    监控的reds ,grafana 模板id使用: 763,模板名称: Redis Dashboard for Prometheus Redis Exporter 1.x

  • jobname: 'redis-exporter' staticconfigs: md5-7ec1240a81fcbc786e1d92d4b84d31df
    本地上传到虚拟机并使用docker-compose部署
    我这里写个脚本,运行完后不用在虚拟机上执行命令了连上传带启动都有了,如下: ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ad1daa22949948ceae904fad309da3c3~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=3256&h=1776&s=489363&e=png&b=2c2c2c) 执行完了: ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3cadd92bc6e34c7c8c56d7cc8f59ce5e~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=2884&h=1352&s=284166&e=png&b=2c2c2c)
    观察指标数据
    选几个看下是否正常暴露指标: 注意在部署成功后,是可以请求如下会返回一堆promethues格式的指标数据 ```bash

    查看硬件指标指标

    curl 192.168.1.103:9100/metrics

    查看mysql指标

    curl 192.168.1.103:9104/metrics

    查看redis指标

    curl 192.168.1.103:9121/metrics

    查看rocketmq指标

    curl 192.168.1.103:5557/metrics

    查看im-connect指标

    curl 192.168.1.103:10000/metrics

    查看im-gateway指标

    curl 192.168.1.103:8081/actuator/metrics

    查看其余web服务指标

    ... ``` 返回数据像这样: image.png

    看下prometheus是否正常采集: image.png

    在gaafana展示

    注意在grafana展示的话 需要先选取数据源,告诉grafana去哪里取数据

    添加: image.png 设置数据源地址: image.png

    导入已有模板

    对于大多数常用的指标,都有对应的开源模板人家已经编写好了(见:grafana官网),

    我使用的几个模板大概就这些 - 模板id: 1860 模板名称: Node Exporter Full ,用于展示硬件指标数据 - 模板id: 10477 ,模板名称:Rocketmq_dashboard 展示rocketmq指标数据 - 模板id: 7362 模板名称: MySQL Overview 展示mysql指标数据 - 模板id: 763,模板名称: Redis Dashboard for Prometheus Redis Exporter 1.x 展示redis指标数据 - 模板id: 10280,模板名称:Spring Boot 2.1 Statistics 展示Springboot web服务的数据 - 模板id: 4701,模板名称:JVM (Micrometer) 展示JVM的数据

    这里我们以jvm为例演示下,直接点击加号导入: image.png 比如:输入4701,点击load,选择数据源并起名后,点击import导入JVM (Micrometer) 监控面板: image.png image.png 查看: image.png image.png

    自己定义数据看板

    我的im-connect我发现指标不太一样,以现有模板展示的不尽人意所以我决定自己编写个模板:

    当然自己搞你得知道每个指标的含义,否则还怎么玩。

    创建一个面板: image.png 根据内存指标,设置内存使用情况的视图: image.png 根据线程状态指标设置线程状态视图: image.png 根据内存指标 设置内存视图: image.png

    当然你也可以使用模糊匹配,设置变量然后再需要的地方引用: image.png image.png 根据xx指标 设置xx视图等等:最后看下我自定义的im-connect的效果: image.png 最后切记:当你自定义好自己的视图后一定要保存,并且grafana的数据要挂载到宿主机,如果没挂载也没保存的话,那数据就丢失了。挂载是必须的,保存也是必须的。当然如果你不还是担心辛辛苦苦配的模板丢失(其实配模板挺辛苦的,尤其是配好看的齐全的模板 我花了很久时间研究这玩意你说说😄😂😂😂😂 哎 ),那么你可以在最终编辑完后,从这里copy一份json数据,下次如果找不到这个视图了,在导入模板id那个界面从新导入一份json数据就行啦:image.png

    看下最终效果:

    我目前搞了这些 暂时应该够用了: image.png

    Springboot应用监控效果:

    image.png

    jvm效果:

    image.png

    自定义模板监控 im-connect效果

    花了那么久也没人家开源的那些好看😂😂 , 😌 ! image.png

    MySQL效果:

    image.png

    Redis效果:

    image.png

    RocketMQ效果:

    有一说一 其实RocketMQ这个视图面板颜值也就那样。不过好在重要指标也都有了。 image.png

    硬件效果:

    这颜值,杠杠的 花里胡哨的,我喜欢 😍😍😍 哈哈! image.png

    好了本文到此结束现在凌晨1.26,赶紧睡觉呀。其实还差个告警,不过后期再加吧~~~

相关文章:

给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

监控是一个系统必不可少的组成部分,实时,准确的监控,将会大大有助于我们排查问题。而当今微服务系统的话有一个监控组合很火那就是 Prometheus Grafana,嘿你别说 这俩兄弟配合的相当完美,Prometheus负责数据采集&…...

【Python】基于动态规划和K聚类的彩色图片压缩算法

引言 当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红、绿、蓝三个分量组成。因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量。为了减少数据量,我们可以尝试减少颜色…...

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2 示例 2: 输入:nums [1,2,3],…...

Facebook应用开发:认证与授权登录流程详解

Facebook作为全球最大的社交平台之一,提供了强大的认证与授权机制,允许第三方应用通过Facebook登录来简化用户的注册和登录流程。本文将详细介绍Facebook应用开发中的认证和授权登录流程,以及如何在应用中实现这一功能。 关键词 Facebook登…...

实战:搭建一款属于自己的个人知识库~docusaurus(强大且丝滑)-2024.7.7(测试成功)

目录 文章目录 目录docusaurus简介效果专题链接👏环境源码1、安装基础环境2、拉取代码3、安装坚果云并同步md核心文件4、构建运行5、配置脚本环境1.配置vscode终端到ecs的免密2.配置win10 vscode终端环境变量 6、构建并推送静态文件到ecs关于我最后最后 docusaurus简…...

Java教程之IO模式精讲,NIO+BIO

第一章 BIO、NIO、AIO介绍 背景 在java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或 者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说&#x…...

如何让代码兼容 Python 2 和 Python 3?Future 库助你一臂之力

目录 01Future 是什么? 为什么选择 Future? 安装与配置 02Future 的基本用法 1、兼容 print 函数 2、兼容整数除法 3、兼容 Unicode 字符串 03Future 的高级功能 1. 处理字符串与字节 2. 统一异常处理…...

AI让大龄程序员重新焕发活力

AI是在帮助开发者还是取代他们? 在软件开发领域,生成式人工智能(AIGC)正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试,AI工具正在成为开发者的得力助手。然而,这也引发了对开发者职业…...

Python在现代办公自动化中的应用:会不会被裁?就看你的效率了!

Python在现代办公自动化中的应用:提升效率的艺术 Python,作为一门简洁而强大的编程语言,已经成为许多办公室英雄优化日常工作的秘密武器。本文将带你探索Python如何在办公自动化领域大放异彩,并且会巧妙融入开源神器PlugLink&…...

Laravel5+mycat 报错 “Packets out of order”

背景 近期对负责项目,配置了一套 主从复制的 MySQL 集群 使用了中间件 mycat 但测试发现,替换了原来的数据连接后,会出现 Packets out of order 的报错 同时注意到,有的框架代码中竟然也会失效,比如 controller 类中&…...

使用androidx.appcompat:appcompat:1.7.0无法运行的问题

问题: 使用 implementation ‘androidx.appcompat:appcompat:1.7.0’ 出现无法运行的问题,编译都没有问题 AGPBI: {“kind”:“error”,“text”:“java.lang.NullPointerException”,“sources”:[{“file”:“C:\Users\10557\.gradle\caches\transfor…...

基于Java的水果商品销售网站

1 水果商品销售网站概述 1.1 课题简介 随着电子商务在当今社会的迅猛发展,水果在线销售已逐渐演变为一种极为便捷的购物方式,日益受到人们的青睐。本系统的设计初衷便是构建一个功能完备、用户体验友好的水果销售平台,致力于为用户提供优质、…...

Redis 线程模型

0、参考 【Redis线程模型】 【big key 排查和解决思路】 1、 Redis 单线程的理解 为什么单线程:CPU不是性能瓶颈(内存和网络),单线程能够达到业务要求 网络IO和键值对读写都是由一个线程完成的 2、 Redis 多线程的理解 持久化…...

栈和队列---循环队列

1.循环队列的出现 (1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接…...

打卡第4天----链表

通过学习基础,发现我的基本功还得需要再练练,思路得再更加清晰明了,这样子做算法题才能驾轻就熟。每天记录自己的进步。 一、两两交换 题目编号:24 题目描述: 给你一个链表,两两交换其中相邻的节点&#x…...

07-7.1.1 查找的基本概念

👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…...

【数据结构与算法】快速排序双指针法

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​...

GESP C++一级真题

PDF图片1-7 点赞❤️关注😍收藏⭐️ 互粉必回🙏🙏🙏...

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限,使我们拥有调用 aliyunAPI 的权限,之后会生成 AccessKeyID 和 AccessKey密码,后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来,否则后期无法查…...

pnpm的坑

请问pnpm的两个坑怎么解决: 第一个坑:没有节省磁盘空间 我已经配置了依赖的存储位置, 但我在项目里pnpm install以后,发现依赖包还是很大, 然后发现里面的链接并不是指向先前配置的依赖存储位置,而是指…...

如何监控和分析 PostgreSQL 中的查询执行计划?

文章目录 一、为什么监控和分析查询执行计划很重要二、PostgreSQL 中用于获取查询执行计划的方法三、理解查询执行计划的关键元素四、通过示例分析查询执行计划五、优化查询执行计划的常见策略六、使用工具辅助分析七、结合实际案例的详细分析八、总结 在 PostgreSQL 数据库中&…...

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码,我们用到的是tianai-captcha。 文档地址:http://doc.captcha.tianai.cloud/ 源码地址:https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…...

三坐标测量机:柔性生产制造中的高精度测量解决方案

柔性生产制造是制造业的核心竞争力之一。它强调生产线的灵活性和适应性,以满足市场对产品多样化和个性化的需求。在当今快速变化的工业环境中,随着消费者对产品个性化和定制化需求的增加,柔性生产制造和三坐标测量机的结合,为智能…...

puppeteer 爬虫初探

1. puppeteer 和 puppeteer-core 安装 puppeteer 会默认下载一个最新版本的 chrome 浏览器; 安装 puppeteer-core ,不会安装 chrome, 若要程序打开浏览器运行时,需手动指定电脑系统安装的 chrome 浏览器路径; 2. puppeteer-core …...

Pandas 入门 15 题

Pandas 入门 15 题 1. 相关知识点1.1 修改DataFrame列名1.2 获取行列数1.3 显示前n行1.4 条件数据选取值1.5 创建新列1.6 删去重复的行1.7 删除空值的数据1.9 修改列名1.10 修改数据类型1.11 填充缺失值1.12 数据上下合并1.13 pivot_table透视表的使用1.14 melt透视表的使用1.1…...

使用微信开发者工具连接gitee

编写代码 打开微信开发者工具 编写小程序代码 提交代码 在微信开发者工具提交代码到gitee仓库的步骤: 1.在gitee创建仓库,得到仓库url 2.微信开发者工具设置远程仓库 点击版本管理-->点击设置-->网络和认证-->认证方式选择 使用用户名和…...

论文复现-基于决策树算法构建银行贷款审批预测模型(金融风控场景)

作者Toby,来源公众号:Python风控模型,基于决策树算法构建银行贷款审批预测模型 目录 1.金融风控论文复现 2.项目背景介绍 3.决策树介绍 4.数据集介绍 5.合规风险提醒 6.技术工具 7.实验过程 7.1导入数据 7.2数据预处理 7.3数据可…...

力扣225题解析:使用队列实现栈的三种解法(Java实现)

引言 在算法和数据结构中,如何用队列实现栈是一个常见的面试题和实际应用问题。本文将探讨力扣上的第225题,通过不同的方法来实现这一功能,并分析各种方法的优劣和适用场景。 问题介绍 力扣225题目要求我们使用队列实现栈的下列操作&#…...

网络协议与标准

协议: 语法 ;计算机的算法,二进制 语义 ;不要有出现歧义的 同步 ; 同步还原信息,收发同步 标准: ISO(国际标准化组织) IEEE(电气和电子工程师学会) 局域网技术 一.协议…...

154. 寻找旋转排序数组中的最小值 II(困难)

154. 寻找旋转排序数组中的最小值 II 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:154. 寻找旋转排序数组中的最小值 II 2.详细题解 该题是153. 寻找旋转排序数组中的最小值的进阶题,在153. 寻找旋转排序数组中的最小值…...