使用阿里云ES监控RabbitMQ

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

RabbitMQ是一个开源的消息代理服务器,能够为您的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全性。本文介绍如何通过Filebeat,将RabbitMQ的日志采集到阿里云Elasticsearch(简称ES)中,并对日志进行可视化分析与监控。

操作流程

  1. 准备工作

    完成环境准备,包括创建实例、安装RabbitMQ等。

  2. 步骤一:配置RabbitMQ

    配置RabbitMQ的日志级别和文件名。

  3. 步骤二:安装RabbitMQ示例应用

    基于Spring Boot,使用RabbitMQ的JMS客户端生产日志数据到RabbitMQ中。

  4. 步骤三:创建并配置阿里云Filebeat

    配置Filebeat采集器,将RabbitMQ的日志数据发送到Logstash的8100端口。

  5. 步骤四:配置阿里云Logstash管道

    配置Logstash管道,使用基本的Grok模式从原始消息中分离出时间戳、日志级别和消息,然后发送到阿里云ES中。

  6. 步骤五:通过Kibana查看日志数据

    通过Kibana查看经Logstash处理后的数据。

  7. 步骤六:通过Kibana过滤日志数据

    在Kibana控制台的Discover页面,通过Filter过滤出RabbitMQ相关的日志。

  8. 步骤七:配置Metricbeat采集RabbitMQ指标

    通过Metricbeat采集RabbitMQ日志,并通过Kibana实现可视化指标监控。

准备工作

  1. 创建阿里云ES和Logstash实例,两者版本相同,并且在同一专有网络VPC(Virtual Private Cloud)下。

    具体操作步骤请参见创建阿里云Elasticsearch实例创建阿里云Logstash实例,本文以6.7版本为例。

  2. 开启阿里云ES实例的自动创建索引功能。

    具体操作步骤请参见快速访问与配置

  3. 创建阿里云ECS实例,要求与阿里云ES实例和Logstash实例处于同一VPC下。

    具体操作步骤请参见自定义购买实例

    重要

    该ECS实例用来安装Beats和RabbitMQ,由于Beats目前仅支持Alibaba Cloud Linux (Alinux)、RedHat和CentOS这三种操作系统,因此在创建时请选择其中一种操作系统。本文以CentOS为例。

  4. 在目标ECS实例上安装云助手和Docker服务。

  5. 在目标ECS实例上安装RabbitMQ。

    具体操作步骤请参见Downloading and Installing RabbitMQ

步骤一:配置RabbitMQ

配置RabbitMQ的日志记录级别和文件名,步骤如下:

  1. 连接安装了RabbitMQ的ECS服务器。

    具体操作步骤请参见连接实例

    说明

    本文档以普通用户权限为例。

  2. 执行以下命令,打开RabbitMQ的配置文件。

    sudo vim /etc/rabbitmq/rabbitmq.config
  3. 修改RabbitMQ的配置文件。

    {
      lager, [
      %% All log messages go to the default "sink" configured with
      %% the `handlers` parameter. By default, it has a single
      %% lager_file_backend handler writing messages to "$nodename.log"
      %% (ie. the value of $RABBIT_LOGS).
       {handlers, [
         {lager_file_backend, [{file, "rabbit.log"},
                               {level, info},
                               {date, ""},
                               {size, 0}]}
      ]},
    {extra_sinks, [
    
         {rabbit_channel_lager_event, [{handlers, [
                                         {lager_forwarder_backend,
                                          [lager_event, info]}]}]},
         {rabbit_conection_lager_event, [{handlers, [
                                           {lager_forwarder_backend,
                                            [lager_event, error]}]}]}
    
      ]}

    修改后,RabbitMQ的日志文件名变为rabbit.log

    说明

    日志级别(level)默认为info,您也可以将其设置为error,即记录出错日志。本文以info日志为例。

    修改配置文件后,需要启动RabbitMQ才能生效。

  4. 启动RabbitMQ服务。

    进入RabbitMQ安装目录的bin文件夹下,启动服务。

    sudo cd /usr/lib/rabbitmq/bin
    sudo rabbitmq-server start

    启动成功后,可在/var/log/rabbitmq下看到rabbit.log文件。

步骤二:安装RabbitMQ示例应用

本节基于Spring Boot,使用RabbitMQ的JMS客户端进行演示。具体操作步骤如下:

重要

由于示例需要编译应用,因此您必须先安装Java 8。

  1. 在ECS中,执行以下命令克隆示例。

    sudo git clone https://github.com/rabbitmq/rabbitmq-jms-client-spring-boot-trader-demo
  2. 进入该应用所在根目录。

    cd rabbitmq-jms-client-spring-boot-trader-demo
  3. 执行以下命令打包并运行应用。

    sudo mvn clean package
    sudo java -jar target/rabbit-jms-boot-demo-1.2.0-SNAPSHOT.jar

    运行成功后,返回结果如下。

    .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v1.5.8.RELEASE)
    2020-05-11 10:16:46.089  INFO 28119 --- [main] com.rabbitmq.jms.sample.StockQuoter      : Starting StockQuoterxxxxxx
    2020-05-11 10:16:46.092  INFO 28119 --- [main] com.rabbitmq.jms.sample.StockQuoter      : No active profile set,xxxxxx
    2020-05-11 10:16:46.216  INFO 28119 --- [main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.xxxxxx
    2020-05-11 10:16:47.224  INFO 28119 --- [main] com.rabbitmq.jms.sample.StockConsumer    : connectionFactory => RMQConnectionFactoryxxxxxx
    2020-05-11 10:16:48.054  INFO 28119 --- [main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposurexxxxxx 
    2020-05-11 10:16:48.062  INFO 28119 --- [main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0xxxxxx
     ......
  4. 进入log目录下查看RabbitMQ日志。

    sudo cd /var/log/rabbitmq
    sudo ls

    返回结果中的rabbit.log即为步骤一:配置RabbitMQ中配置的文件名。

步骤三:创建并配置阿里云Filebeat

配置Filebeat采集器,将RabbitMQ的日志信息发送到阿里云Logstash的8100端口。

  1. 登录阿里云Elasticsearch控制台
  2. 在左侧导航栏,单击Beats数据采集中心

  3. 创建采集器区域,选择Filebeat > ECS日志

  4. 配置采集器。

    更多信息,请参见采集ECS服务日志采集器YML配置。本文使用的配置如下。filebeat配置

    说明
    • 采集器Output需要指定目标阿里云Logstash的实例ID,在YML配置中不需要重新指定Output。

    • Filebeat文件目录需要填写RabbitMQ日志所在的目录,同时需要在YML配置中开启log数据采集,并配置log路径。

    本文使用的filebeat.yml中的filebeat.inputs配置如下。

    filebeat.inputs:
    # Each - is an input. Most options can be set at the input level, so
    # you can use different inputs for various configurations.
    # Below are the input specific configurations.
    
    - type: log
    
      # Change to true to enable this input configuration.
      enabled: true
      fields:
        log_type: rabbitmq-server
      # Paths that should be crawled and fetched. Glob based paths.
      paths:
        - /var/log/rabbitmq/*log
      fields_under_root: true
      encoding: utf-8
      ignore_older: 3h
  5. 安装并启动采集器。

    具体操作,请参见采集ECS服务日志。安装时所选的ECS实例要与阿里云Logstash在同一VPC下。选择采集器安装的实例

  6. 查看采集器安装情况。

    采集器状态变为已生效1/1,且查看采集器安装情况后显示为心跳正常,说明采集器安装成功。查看采集器安装状态

步骤四:配置阿里云Logstash管道

配置阿里云Logstash管道,使用基本的Grok模式从原始消息中分离出时间戳、日志级别和消息,然后发送到阿里云ES实例的指定索引中。

  1. 进入阿里云Elasticsearch控制台的Logstash页面
  2. 进入目标实例。
    1. 在顶部菜单栏处,选择地域。
    2. Logstash实例中单击目标实例ID。
  3. 在左侧导航栏,单击管道管理

  4. 单击创建管道

  5. 创建管道任务页面,输入管道ID并配置管道。

    本文使用的管道配置如下。

    input {
      beats {
        port => 8100
      }
    }
    
    filter {
      grok {
        match => { "message" => ["%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:log_level}\] \<%{DATA:field_misc}\> %{GREEDYDATA:message}"] }
      }
    }
    
    output {
       elasticsearch {
          hosts => "es-cn-4591jumei000u****.elasticsearch.aliyuncs.com:9200"
          user => "elastic"
          password => "your_password"
          index => "rabbitmqlog-%{+YYYY.MM.dd}"
      }
    }

    管道配置详情请参见Logstash配置文件说明

  6. 单击下一步,配置管道参数。

    管道参数配置

    参数

    说明

    管道工作线程

    并行执行管道的Filter和Output的工作线程数量。当事件出现积压或CPU未饱和时,请考虑增大线程数,更好地使用CPU处理能力。默认值:实例的CPU核数。

    管道批大小

    单个工作线程在尝试执行Filter和Output前,可以从Input收集的最大事件数目。较大的管道批大小可能会带来较大的内存开销。您可以设置LS_HEAP_SIZE变量,来增大JVM堆大小,从而有效使用该值。默认值:125。

    管道批延迟

    创建管道事件批时,将过小的批分派给管道工作线程之前,要等候每个事件的时长,单位为毫秒。默认值:50ms。

    队列类型

    用于事件缓冲的内部排队模型。可选值:

    • MEMORY:默认值。基于内存的传统队列。

    • PERSISTED:基于磁盘的ACKed队列(持久队列)。

    队列最大字节数

    请确保该值小于您的磁盘总容量。默认值:1024 MB。

    队列检查点写入数

    启用持久性队列时,在强制执行检查点之前已写入事件的最大数目。设置为0,表示无限制。默认值:1024。

    警告

    配置完成后,需要保存并部署才能生效。保存并部署操作会触发实例重启,请在不影响业务的前提下,继续执行以下步骤。

  7. 单击保存或者保存并部署

    • 保存:将管道信息保存在Logstash里并触发实例变更,配置不会生效。保存后,系统会返回管道管理页面。可在管道列表区域,单击操作列下的立即部署,触发实例重启,使配置生效。

    • 保存并部署:保存并且部署后,会触发实例重启,使配置生效。

步骤五:通过Kibana查看日志数据

  1. 登录目标阿里云ES的Kibana控制台。

    具体步骤请参见登录Kibana控制台

  2. 在左侧导航栏,单击Dev Tools

  3. Console中执行以下命令,查看Logstash处理后的RabbitMQ日志数据。

    GET rabbitmqlog-*/_search
    {
      "query": {
        "match_all": {
       }}
    }

    执行成功后,返回如下结果。返回结果

步骤六:通过Kibana过滤日志数据

  1. 登录目标阿里云ES实例的Kibana控制台。

    具体步骤请参见登录Kibana控制台

  2. 创建一个索引模式。

    1. 在左侧导航栏,单击Management

    2. 在Kibana区域,单击Index Patterns

    3. 单击Create index pattern

    4. 输入Index pattern(本文使用rabbitmqlog-*),单击Next step

      Index pattern
    5. 选择Time Filter field name(本文选择@timestamp),单击Create index pattern

      Time Filter field name
  3. 在左侧导航栏,单击Discover

  4. 从页面左侧的下拉列表中,选择您已创建的索引模式(rabbitmqlog-*)。

  5. 在页面右上角,选择一段时间,查看对应时间段内的RabbitMQ日志数据。

    查看日志数据
  6. 单击Add a filter,设置过滤条件,查看符合条件的日志数据。

    Add a filter

步骤七:配置Metricbeat采集RabbitMQ指标

您也可以通过Metricbeat采集RabbitMQ日志数据,并通过Kibana可视化监控RabbitMQ的各项指标。

  1. 登录目标阿里云ES的Kibana控制台。

    具体步骤请参见登录Kibana控制台

  2. 在页面左上角,单击Kibana

  3. Add Data to Kibana区域,单击Add metric data

    Add metric data
  4. Metrics页签,单击RabbitMQ metrics

    RabbitMQ metrics
  5. 单击RPM,按照页面提示在ECS中安装并配置Metricbeat。

    配置Metricbeat时,需要修改/etc/metricbeat/metricbeat.yml文件,设置Kibana和ES集群的连接信息,本文使用的配置如下。

    setup.kibana:
    
      # Kibana Host
      # Scheme and port can be left out and will be set to the default (http and 5601)
      # In case you specify and additional path, the scheme is required: http://localhost:5601/path
      # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
       host: "https://es-cn-4591jumei000u****.kibana.elasticsearch.aliyuncs.com:5601"
    output.elasticsearch:
      # Array of hosts to connect to.
      hosts: ["es-cn-4591jumei000u****.elasticsearch.aliyuncs.com:9200"]
    
      # Enabled ilm (beta) to use index lifecycle management instead daily indices.
      #ilm.enabled: false
    
      # Optional protocol and basic auth credentials.
      #protocol: "https"
      username: "elastic"
      password: "your_password"
  6. 启动RabbitMQ模块及Metricbeat服务。

    • 启动RabbitMQ模块

      sudo metricbeat modules enable rabbitmq
    • 启动Metricbeat服务并设置仪表盘

      sudo metricbeat setup
      sudo service metricbeat start
  7. RPM页签中,单击Check data

    Check data
  8. 单击RabbitMQ metrics dashboard,查看Dashboard监控大盘。

    查看Dashboard监控大盘