1. 概述

本文将介绍如何从 Tomcat 服务器采集 JMX 数据,并将其传输到 Elastic Stack(原 ELK)技术栈。我们将重点讲解如何配置 Logstash 读取 JMX 数据并推送到 Elasticsearch,最终通过 Kibana 实现可视化监控。

2. 安装 Elastic Stack

首先需要安装 Elastic Stack 组件:

安装完成后,我们将通过发送 JMX 数据到 Logstash 并在 Kibana 中可视化,验证整个链路是否正常工作。

2.1 测试 Logstash

进入 Logstash 安装目录(以 Ubuntu 为例):

cd /opt/logstash

通过命令行快速配置 Logstash:

bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["localhost:9200"] } }'

在控制台输入测试数据,完成后使用 CTRL-D 关闭管道。

2.2 测试 Elasticsearch

添加测试数据后,检查 Elasticsearch 中的 Logstash 索引:

curl -X GET 'http://localhost:9200/_cat/indices'

预期输出示例:

yellow open logstash-2017.11.10 5 1 3531 0 506.3kb 506.3kb 
yellow open .kibana             1 1    3 0   9.5kb   9.5kb 
yellow open logstash-2017.11.11 5 1 8671 0   1.4mb   1.4mb

2.3 测试 Kibana

Kibana 默认运行在 5601 端口,访问地址:

http://localhost:5601/app/kibana

创建索引模式 *logstash-*,确认能查看到测试数据。

3. 配置 Tomcat

在 Tomcat 中启用 JMX,需在 CATALINA_OPTS 添加以下参数:

-Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=9000
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false

⚠️ 注意事项

  • 通过修改 setenv.sh 配置 CATALINA_OPTS
  • Ubuntu 用户可在 /usr/share/tomcat8/bin 找到该文件

4. 连接 JMX 与 Logstash

现在需要将 JMX 指标接入 Logstash,前提是已安装 JMX 输入插件。

4.1 配置 JMX 指标

创建 JSON 格式的 JMX 配置文件 jmx_config.json

{
  "host" : "localhost",
  "port" : 9000,
  "alias" : "reddit.jmx.elasticsearch",
  "queries" : [
  {
    "object_name" : "java.lang:type=Memory",
    "object_alias" : "Memory"
  }, {
    "object_name" : "java.lang:type=Threading",
    "object_alias" : "Threading"
  }, {
    "object_name" : "java.lang:type=Runtime",
    "attributes" : [ "Uptime", "StartTime" ],
    "object_alias" : "Runtime"
  }]
}

⚠️ 关键点

  • 端口需与 CATALINA_OPTS 中配置的 JMX 端口一致
  • 所有配置文件需存放在同一目录(示例路径:/monitor/jmx/

4.2 JMX 输入插件

在 Logstash 安装目录执行命令安装插件:

bin/logstash-plugin install logstash-input-jmx

创建 Logstash 配置文件 jmx.conf

input {
  jmx {
    path => "/monitor/jmx"
    polling_frequency => 60
    type => "jmx"
    nb_thread => 3
  }
}

output {
    elasticsearch {
        hosts => [ "localhost:9200" }
    }
}

启动 Logstash 并指定配置文件:

bin/logstash -f jmx.conf

验证点

  • 配置文件需存放在 Logstash 根目录(示例路径:/opt/logstash

5. 可视化 JMX 指标

最后在 Kibana 中创建 JMX 指标的可视化图表,以堆内存使用监控为例。

5.1 创建新搜索

创建堆内存使用相关的搜索:

  1. 点击搜索栏的"New Search"图标
  2. 输入查询语句:
    metric_path:reddit.jmx.elasticsearch.Memory.HeapMemoryUsage.used
    
  3. 从侧边栏添加 metric_pathmetric_value_number 字段
  4. 点击"Save Search"并命名为"used memory"

踩坑提示:若侧边栏字段显示为未索引,需在"Settings"标签页刷新 logstash-* 索引的字段列表。

5.2 创建折线图

创建堆内存使用趋势的折线图:

  1. 进入"Visualize"标签页
  2. 选择"Line Chart"
  3. 选择"From saved search"
  4. 选择之前创建的"used memory"搜索

配置坐标轴:

  • Y 轴
    • 聚合方式:Average
    • 字段:metric_value_number
  • X 轴:选择"Date Histogram"
  • 保存可视化图表

5.3 使用脚本字段

由于内存使用量以字节为单位显示,可读性差。通过添加脚本字段转换数据格式:

  1. 进入"Settings" > "Indices" > logstash-* 索引
  2. 切换到"Scripted fields"标签页
  3. 点击"Add Scripted Field"
  4. 配置字段:
    • 名称:metric_value_formatted
    • 格式:Bytes
    • 脚本内容:
      doc['metric_value_number'].value
      

将搜索和可视化图表中的字段从 metric_value_number 替换为 metric_value_formatted,数据将以易读格式展示。

最终仪表盘效果示例: kibana tomcat simple example

6. 总结

至此,我们完成了 JMX 数据接入 Elastic Stack 的全流程配置。整个过程并不复杂,关键在于正确配置 JMX 端点和 Logstash 管道。一旦 JMX 数据在 Kibana 中可视化,就能构建强大的生产环境监控仪表盘,为系统运维提供有力支持。


原始标题:JMX Data to the Elastic Stack (ELK)