likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 24

监控是一个系统必不可少的组成部分,实时,准确的监控,将会大大有助于我们排查问题。而当今微服务系统的话有一个监控组合很火那就是 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中定义 镜像,挂载,容器名称,端口,网络,依赖哪些容器启动 等配置,如下:
    prometheus:
      image: prom/prometheus
      container_name: prometheus
      volumes:
        # 数据挂载 防止容器重启/停止后  数据消失
        - /usr/local/soft_hzz/docker/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml
        - /usr/local/soft_hzz/docker/prometheus/data/prometheus_data:/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
      container_name: grafana
      ports:
        - "3000:3000"
      environment:
        - GF_SECURITY_ADMIN_PASSWORD=grafana123 # grafana 密码
      # 挂载数据到宿主机目录
      volumes:
      - /usr/local/soft_hzz/docker/grafana/grafana_data:/var/lib/grafana
    
      # 必须指定 网络,否则无法通过服务名 如:im-business 找到对应的ip
      networks:
        - default_network
      depends_on:
        - im-connect
        - im-console
        - im-business
        - im-gateway
        - im-auth
        - prometheus
    
  2. 之后需要有一个prometheus.yml文件,用于定义prometheus抓取指标的策略,如下: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 (注意上边这个prometheus.yml文件的路径一定要和docker-compose中的这个保持一致哦 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

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

监控IM服务和中间件

说明:

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

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

情况1: 硬件指标

  • 硬件指标没啥说的,人家已经贴心给你搞好了,就是使用 node-exporter这个 exporter去采集就行了,如下给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

情况2: SpringBoot搭建的http服务的指标

  • 这种服务的指标很好采集,因为SpringBoot框架也已经贴心的给你搞好了就是(SpringBoot Actuator 这个东东),你只需要引入下Maven配置下暴露的端点(url)就可以让prometheus 痛快的采集。给我的 IM 系统加上监控两件套:【Prometheus + Grafana】配置一下:给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

情况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,但是按部就班按官方的步骤来我还是遇到点问题所以写了个脚本解决这个问题,具体见下边脚本内容:给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

情况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端口(jmx_prometheus的端口)拿到指标,但是很迷我就算压测im-connect指标也不见多少变化,我严重怀疑我采集的不是im-connect而是jmx_prometheus进程本身,stackoverflow看到个人好像和我有类似的疑虑),后来干脆放弃了jmx_prometheus方式,反正条条大路通罗马,我换成 prometheus client方式采集长连接服务,效果也不错,还更灵活,挺香的~~~ (ps: 但是 prometheus client得自己写点代码,其实这点代码也可以将其封装为一个javaagent方式,不过时间原因先不搞agent了 先把最近的目标完成后边有时间再说正好我也可以再和javaagent叙叙旧)
    • 下边是代码片段,完整的在我的开源项目:xzll-im给我的 IM 系统加上监控两件套:【Prometheus + Grafana】给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

开干:

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

docker-compose.yaml文件编写

ps:注意有很多我在文件中注释了这里就不详细解释了,直接上 docker-compose.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
    container_name: im-connect
    restart: always
    ports:
      - "10000:10000" # prometheus指标采集端口 http (注:不采用jmx方式采集)
      - "10001:10001" # netty端口
    networks:
      - default_network
    volumes:
      - "/tmp/data/logs:/logs"
    depends_on:
      - nacos
      - zookeeper
      - redis
      - rmq_broker
      - rmq_namesrv

  im-console:
    build:
      context: ./im-console
      dockerfile: Dockerfile
    image: im-console:latest
    hostname: im-console
    container_name: im-console
    restart: always
    ports:
      - "8084:8084"
    networks:
      - default_network
    volumes:
      - "/tmp/data/logs:/logs"
    depends_on:
      - nacos
      - zookeeper
      - redis
      - rmq_broker
      - rmq_namesrv

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

  # rocketMq nameServer
  rmq_namesrv:
    image: apache/rocketmq:4.8.0
    container_name: rmq_namesrv
    hostname: rmq_namesrv
    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
  rmq_broker:
    image: apache/rocketmq:4.8.0
    container_name: rmq_broker
    restart: always
    hostname: rmq_broker
    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

  rocketmq_exporter:
    image: rocketmq-exporter:latest
    container_name: rocketmq-exporter
    restart: always
    hostname: rocketmq-exporter
    networks:
      - default_network
    ports:
      - "5557:5557"
    environment:
      - JAVA_OPTS=-Drocketmq.namesrv.addr=rmq_namesrv:9876 -Drocketmq.broker.addr=rmq_broker:10911
    depends_on:
      - rmq_namesrv
      - rmq_broker

  rocketmq-console:
    image: styletang/rocketmq-console-ng
    container_name: rocketmq-console
    restart: always
    ports:
      - "8080:8080"
    environment:
      JAVA_OPTS: "-Drocketmq.namesrv.addr=${LOCAL_IP}:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
    depends_on:
      - rmq_namesrv
      - rmq_broker
  # nacos
  nacos:
    image: nacos/nacos-server:2.0.3
    container_name: nacos
    restart: always
    ports:
      - "8848:8848"
    volumes:
      - /usr/local/soft_hzz/docker/nacos/data:/home/nacos/data
      - /usr/local/soft_hzz/docker/nacos/logs:/home/nacos/logs
    environment:
      MODE: standalone
  #redis
  redis:
    image: redis
    container_name: redis
    restart: always
    networks:
      - default_network
    ports:
      - "6379:6379"
    volumes:
      - /usr/local/soft_hzz/docker/redis/data:/data
      - /usr/local/soft_hzz/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
  # zk
  zookeeper:
    image: zookeeper
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"
    volumes:
      - /usr/local/soft_hzz/docker/zk/data:/data
      - /usr/local/soft_hzz/docker/zk/datalog:/datalog
      - /usr/local/soft_hzz/docker/zk/conf/zoo.cfg:/conf/zoo.cfg

  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      # 数据挂载 防止容器重启/停止后  数据消失
      - /usr/local/soft_hzz/docker/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml    #  prometheus配置文件,配置抓取的规则和抓取目标
      - /usr/local/soft_hzz/docker/prometheus/data/prometheus_data:/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
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=grafana123 # grafana 密码
    # 挂载数据到宿主机目录
    volumes:
    - /usr/local/soft_hzz/docker/grafana/grafana_data:/var/lib/grafana

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

  # 用于监控linux系统的信息
  node_exporter:
    image: prom/node-exporter
    container_name: node-exporter
    ports:
      - "9100:9100"
    networks:
      - default_network
  # 用于监控docker容器的信息
  cadvisor:
    image: google/cadvisor:latest
    container_name: 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
    container_name: mysqld-exporter
    hostname: mysqld-exporter
    networks:
      - default_network
    environment:
      DATA_SOURCE_NAME: 'root:xzllaigH95..@tcp(${LOCAL_IP}:3306)/'
    ports:
      - "9104:9104"

  # 监控redis
  redis-exporter:
    image: oliver006/redis_exporter:latest
    container_name: redis-exporter
    hostname: redis-exporter
    networks:
      - default_network
    environment:
      REDIS_ADDR: 'redis:6379'
      REDIS_PASSWORD: '123456' # redis密码
    ports:
      - "9121:9121"
    depends_on:
      - redis

networks:
  default_network:
    # 桥接
    driver: bridge

prometheus.yml 抓取规则配置文件

# 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

  - job_name: 'im-auth'
    static_configs:
      - targets: [ 'im-auth:8082' ]
    metrics_path: /actuator/prometheus

  - job_name: 'im-business'
    static_configs:
      - targets: [ 'im-business:8083' ]
    metrics_path: /actuator/prometheus

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

  # 使用 prometheus 客户端采集netty服务的指标数据给 prometheus
  - job_name: 'im-connect'
    static_configs:
      - targets: [ 'im-connect:10000' ]



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

  # 监控linux硬件系统和资源 grafana模板id: 1860 模板名称: Node Exporter Full
  - job_name: 'node_exporter'
    static_configs:
      - targets: [ 'node_exporter:9100' ]

  # 用于监控docker容器 grafana模板id: 893,名称: Docker and system monitoring
  - job_name: 'cadvisor'
    static_configs:
      - targets: [ 'cadvisor:8080' ] # 注意此处需要是docker容器 cadvisor 的端口 而不是映射到宿主机的910端口

  # 监控 RocketMQ NameServer 和 RocketMQ Broker (此程序会有定时任务定时扫描rm指标 并归并上报给 prometheus,暂无docker镜像 需要手动下载并构建 详见)
  # 此监控也有grafana模板id : 10477 ,模板名称:Rocketmq_dashboard
  - job_name: 'rocketmq_exporter'
    static_configs:
      - targets: [ 'rocketmq-exporter:5557' ]
        labels:
          # 这俩是必须的 详见这个提示: https://github.com/apache/rocketmq-exporter?tab=readme-ov-file#quick-start
          Env: 'develop'
          Cluster: 'local'

  # 监控虚拟机上的mysql(目前除了mysql 其余都是在docker部署) ,grfnada 模板id使用: 7362 模板名称: MySQL Overview
  - job_name: 'mysqld-exporter'
    static_configs:
      - targets: [ 'mysqld-exporter:9104' ]

  # 监控的reds ,grafana 模板id使用: 763,模板名称: Redis Dashboard for Prometheus Redis Exporter 1.x
  - job_name: 'redis-exporter'
    static_configs:
      - targets: [ 'redis-exporter:9121' ]

本地上传到虚拟机并使用docker-compose部署

我这里写个脚本,运行完后不用在虚拟机上执行命令了连上传带启动都有了,如下: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

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

观察指标数据

选几个看下是否正常暴露指标: 注意在部署成功后,是可以请求如下会返回一堆promethues格式的指标数据

# 查看硬件指标指标
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服务指标
...

返回数据像这样: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

看下prometheus是否正常采集: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

在gaafana展示

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

添加: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 设置数据源地址: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

导入已有模板

对于大多数常用的指标,都有对应的开源模板人家已经编写好了(见: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为例演示下,直接点击加号导入: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 比如:输入4701,点击load,选择数据源并起名后,点击import导入JVM (Micrometer) 监控面板: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 查看: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

自己定义数据看板

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

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

创建一个面板: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 根据内存指标,设置内存使用情况的视图: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 根据线程状态指标设置线程状态视图: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】 根据内存指标 设置内存视图: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

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

看下最终效果:

我目前搞了这些 暂时应该够用了: 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

Springboot应用监控效果:

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

jvm效果:

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

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

花了那么久也没人家开源的那些好看😂😂 , 😌 ! 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

MySQL效果:

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

Redis效果:

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

RocketMQ效果:

有一说一 其实RocketMQ这个视图面板颜值也就那样。不过好在重要指标也都有了。 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

硬件效果:

这颜值,杠杠的 花里胡哨的,我喜欢 😍😍😍 哈哈! 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

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

转载自:https://juejin.cn/post/7387690498003124274
评论
请登录