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

news2024/11/29 12:45:14

监控是一个系统必不可少的组成部分,实时,准确的监控,将会大大有助于我们排查问题。而当今微服务系统的话有一个监控组合很火那就是 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,赶紧睡觉呀。其实还差个告警,不过后期再加吧~~~

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

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

相关文章

手写实现一个ORM框架

手写实现一个ORM框架 什么是ORM框架、ORM框架的作用效果演示框架设计代码细节SqlBuilderSqlExecutorStatementHandlerParameterHandlerResultSetHandler逆序生成实体类 大家好,本人最近写了一个ORM框架,想在这里分享给大家,让大家来学习学习。…

10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中,可以使用不同的数据类型(字符、数字、矩阵、字符串和元胞)合并为字符串,然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码,展示如何将不同数据类型合并为字符串,并以不…

【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)

文章目录 定义装饰模式的结构 快速入门 | Demo顶层抽象DataSource数据源接⼝具体实现类引入BASE**64**编码装饰器客户端Client 定义 所谓装饰器模式其实就是在原有的功能上做一个增强!! 换句话说:以前你妈妈揍你的时候用的巴掌,但…

Android 简单快速实现 下弧形刻度尺(滑动事件)

效果图: 直接上代码: package com.my.view;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pai…

SQL注入【1】——通用漏洞/SQL注入/mysql跨库/ACCESS偏移

一、知识点: 1、脚本代码与数据库前置知识 2、Access数据库注入-简易&偏移 3、MYSQL数据库注入-简易:权限跨库 二、前置知识: (一)SQL注入漏洞产生原理分析 SQL注入产生条件:根本条件:可控变量、特定函数。 脚本代码在实现…

一气之下,关闭成都400多人的游戏公司

关注卢松松,会经常给你分享一些我的经验和观点。 最近,多益网络宣布关闭成都公司,在未来三年内,关闭成都所有的相关公司。原因竟然是输掉了劳动仲裁,赔偿员工38万多,然后一气之下要退出成都,…

windows下编译ffmpeg 最详细教程

1 Ffmpeg下载地址:FFmpeg 使用命令下载 git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg 下载完成后会发现如下目录: 2 msys2下载地址:MSYS2 解压好后,选择一个非空路径安装,安装好后路径如下: 为…

基于STM32的通用红外遥控器设计: 解码、学习与发射(代码示例)

摘要: 本文将带你使用STM32打造一款功能强大的万能红外遥控器,它可以学习和复制多种红外信号,并通过OLED屏幕和按键实现便捷操作。我们将深入探讨红外通信原理、STM32编程、OLED显示和EEPROM数据存储等关键技术,并提供完整的代码示…

【Qt】day3 自定义控件、框架、定时器、QPainter、QFile

文章目录 自定义控件封装自定义框架定时器第一种方式第二种方式 (推荐) 事件分发器QPainter基本操作高级设置抗锯齿移动坐标原点 画家画资源图片,并实现手动移动 作业QPaintDevice绘图设备QPixmapQimageQPicture QFile文件读写操作QFileInfo文…

FPGA_GTX:简要版

1. GTX介绍 Xilinx FPGA的GT意思是Gigabyte Transceiver。通常称呼为Serdes、高速收发器。GT在xilinx不同系列有着不同的产品,从7系列到UltraScale系列分别有GTP、GTX、GTZ、GTH、GTY和GTM。不同GT整体结构上类似,为了支持越来越高的line rate&#xff…

virtualbox窗口和win10窗口的切换

1、问题: 从windows切换到虚拟机可以用快捷键 ALTTAB,但是从虚拟机到windows使用 ALTTAB 无法成功切换 2、解决方法: 注意:发现设置为ctrlAlt会导致打开终端快捷键(CtrlAltT)失效,建议这里设置…

Lua语言入门

目录 Lua语言1 搭建Lua开发环境1.1 安装Lua解释器WindowsLinux 1.2 IntelliJ安装Lua插件在线安装本地安装 2 Lua语法2.1 数据类型2.2 变量全局变量局部变量命名规范局部变量作用域 2.3 注释单行注释多行注释 2.4 赋值2.5 操作符数学操作符比较操作符逻辑操作符连接操作符取长度…

HACCP体系认证:守护食品安全的黄金标准

在食品生产过程中,食品安全始终是重中之重。为了确保食品的安全性和质量,越来越多的企业开始采用HACCP(危害分析关键控制点)体系认证。这个体系不仅能帮助企业预防食品安全问题,还能显著提升产品质量和市场竞争力。 HA…

深入探索C语言中的结构体:定义、特性与应用

🔥 个人主页:大耳朵土土垚 目录 结构体的介绍结构体定义结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构体的介绍 在C语言中,结构体是一种用户自定义的数据类型,它允许开发者将不同类型的变量组合在一起…

适用于Mac和Windows的最佳iPhone恢复软件

本文将指导您选择一款出色的iPhone数据恢复软件来检索您的宝贵数据。 市场上有许多所谓的iPhone恢复程序。各种程序很难选择并选择其中之一。一旦您做出了错误的选择,您的数据就会有风险。 最好的iPhone数据恢复软件应包含以下功能。 1.安全可靠。 2.恢复成功率高…

郭明錤:苹果将为Vision Pro推出红外摄像头款AirPods

在科技界,苹果公司的每一次创新都备受瞩目。近日,著名苹果分析师郭明錤透露了一个令人振奋的消息:苹果计划在2026年推出配备红外摄像头的新款AirPods,这款耳机将特别优化与Apple Vision Pro头显的空间体验。这一消息不仅预示着苹果在音频设备领域的又一次技术飞跃,也进一步…

One day for Chinese families

周围生活中的普通家庭的一天流程: 【上班的一天】 【放假的一天】 有家庭的人,上班流程: 01)准备早餐,牛奶,面包 02)叫娃娃起床,一般要蛮久的;沟通交流 -- 哄娃娃 -- 生气…

【Linux进阶】文件系统8——硬链接和符号连接:ln

在Linux下面的链接文件有两种, 一种是类似Windows的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录);另一种则是通过文件系统的inode 链接来产生新文件名,而不是产生新文件,这种称为硬链接&…

html+css+js图片手动轮播

源代码在界面图片后面 轮播演示用的几张图片是Bing上的&#xff0c;直接用的几张图片的URL&#xff0c;谁加载可能需要等一下&#xff0c;现实中替换成自己的图片即可 关注一下点个赞吧&#x1f604; 谢谢大佬 界面图片 源代码 <!DOCTYPE html> <html lang&quo…

前端面试题9(JavaScript数组去重)

1. 使用Set ES6引入了Set数据结构&#xff0c;它只存储唯一的值&#xff0c;因此可以用来快速去重。 function uniqueWithSet(arr) {return [...new Set(arr)]; }// 示例 console.log(uniqueWithSet([1, 2, 2, 3, 4, 4, 5])); // 输出: [1, 2, 3, 4, 5]2. 使用indexOf或inclu…