[comment]: # ({f8c9b9d8-627e4087})
# 13 JMX agent

[comment]: # ({/f8c9b9d8-627e4087})

[comment]: # ({c24e6196-e3fddc4c})
#### 概述

JMX监控可用于监控Java应用程序的JMX计数器。

Zabbix通过名为"Zabbix Java网关"的守护进程原生支持JMX监控。

要获取一个主机上特定JMX计数器的值，Zabbix服务器queriesZabbix**Java网关**，后者使用[JMX
management
API](http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/)远程query目标应用程序。

更多详细信息和设置请参阅[Zabbix Java
gateway](/manual/concepts/java)部分。

::: notewarning
Java网关与被监控的JMX应用程序之间的通信不应设置防火墙。

:::

[comment]: # ({/c24e6196-e3fddc4c})

[comment]: # ({a779159e-7feef73e})
#### 为Java应用启用远程JMX监控

一个Java应用程序不需要安装任何额外的软件，但需要使用以下命令行选项启动，以便支持远程JMX监控。

最低要求是，如果您只是希望通过对本地主机上一个简单的Java应用程序的监控来启动get，请使用以下选项启动：

    java \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=12345 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.registry.ssl=false \
    -jar /path/to/your/application.jar

这将使Java在端口12345上监听来自本地主机的传入JMX连接，并告诉它不需要身份验证或SSL。

如果您希望允许在另一个接口上连接，请将-Djava.rmi.server.hostname参数设置为该接口的IP地址。

如果您希望对安全性有更严格的要求，还有许多其他Java选项可供使用。例如，下一个示例使用更通用的一组选项启动应用程序，并将其开放到更广泛的网络，而不仅仅是本地主机。

    java \
    -Djava.rmi.server.hostname=192.168.3.14 \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=12345 \
    -Dcom.sun.management.jmxremote.authenticate=true \
    -Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
    -Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
    -Dcom.sun.management.jmxremote.ssl=true \
    -Dcom.sun.management.jmxremote.registry.ssl=true \
    -Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
    -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
    -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
    -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
    -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
    -jar /path/to/your/application.jar

这些设置中的大多数（如果不是全部的话）都可以在`$JRE/lib/management/management.properties`中指定（或者在您的系统上该file所在的位置）。

请注意，如果您希望使用SSL，则必须通过向Java网关添加`-Djavax.net.ssl.*`选项来修改startup.sh脚本，以便它知道在哪里找到密钥和信任存储。

请参阅 [Monitoring and Management Using
JMX](http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html) 以获取详细描述。

[comment]: # ({/a779159e-7feef73e})

[comment]: # ({4b8fd32c-4b8fd32c})
#### 在 Zabbix 前端配置 JMX 接口和 监控项

在 Java 网关运行、服务器知道在哪里找到它，并且 Java 应用程序已启动并支持远程 JMX 监控的情况下，现在可以在 Zabbix GUI 中配置接口和 监控项。

[comment]: # ({/4b8fd32c-4b8fd32c})

[comment]: # ({1b504993-01c1becc})
##### 配置 JMX 接口

首先，在目标主机上创建一个 JMX 类型的接口。

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_interface.png){width="600"}

所有必填输入字段都用红色星号标记。

[comment]: # ({/1b504993-01c1becc})

[comment]: # ({80acb0d4-f55573f5})
##### 添加 JMX agent 监控项

对于您感兴趣的每个 JMX 计数器，都需要添加一个绑定到该接口的 **JMX agent** 监控项。

下图中的键值为
`jmx["java.lang:type=Memory","HeapMemoryUsage.used"]`。

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_item.png){width="600"}

所有必填输入字段都用红色星号标记。

JMX 监控项需要填写的特定字段如下：

|   |   |
|--|--------|
|*Type*|在此设置为 **JMX agent**。|
|*Key*|`jmx[]` 监控项键包含三个参数：<br>**object name** - MBean 的对象名称<br>**attribute name** - MBean 属性名称，可选的复合数据字段名用点号分隔<br>**unique short description** - 唯一描述，允许在主机上使用相同对象名称和属性名称的多个 JMX 监控项（可选）<br>有关 JMX 监控项键的更多详细信息，请参见下文。<br>您可以使用 `jmx.discovery[]` [低级别发现](/manual/discovery/low_level_discovery/examples/jmx) 监控项发现 MBeans 和 MBean 属性。|
|*JMX endpoint*|您可以指定自定义 JMX 端点。请确保 JMX 端点连接参数与 JMX 接口匹配。可通过使用 {HOST.\*} 宏来实现这一点，就像默认 JMX 端点中所做的那样。<br>支持 {HOST.\*} [宏](/manual/appendix/macros/supported_by_location) 和用户宏。|
|*User name*|如果您已在 Java 应用程序上配置了身份验证，请指定用户名（最多 255 个字符）。<br>支持用户宏。|
|*Password*|如果您已在 Java 应用程序上配置了身份验证，请指定密码（最多 255 个字符）。<br>支持用户宏。|

如果您希望监控一个值为 "true" 或 "false" 的布尔计数器，则应将信息类型指定为 "Numeric (unsigned)"，并在 Preprocessing 选项卡中选择 "Boolean to decimal" 预处理步骤。服务器将分别把布尔值存储为 1 或 0。

[comment]: # ({/80acb0d4-f55573f5})

[comment]: # ({9430cb1d-9430cb1d})
#### JMX监控项键详解

[comment]: # ({/9430cb1d-9430cb1d})

[comment]: # ({2fbbf1c5-105cc785})
##### 简单属性

一个 MBean object 名称只不过是您在 Java 应用程序中定义的一个 string。另一方面，属性名称可能更复杂。如果属性返回的是基本数据类型（如 integer、string 等），则无需担心，监控项键值将类似于以下形式：

    jmx[com.example:Type=Hello,weight]

在这个例子中，object 名称为 "com.example:Type=Hello"，属性名称为 "weight"，返回值类型应该为 "数值 (float)"。

[comment]: # ({/2fbbf1c5-105cc785})

[comment]: # ({00e3fc9b-00e3fc9b})
##### 返回复合数据的属性

当您的属性返回复合数据时，情况会变得更加复杂。  
例如：您的属性名称为 "apple"，并且它返回一个表示其参数的哈希值，如 "weight"、"color" 等。您的键可能如下所示：

    jmx[com.example:Type=Hello,apple.weight]

在这种情况下，属性名称和哈希键通过点符号进行分隔。同样地，如果属性返回嵌套的复合数据，则各部分也通过点符号进行分隔：

    jmx[com.example:Type=Hello,fruits.apple.weight]

[comment]: # ({/00e3fc9b-00e3fc9b})

[comment]: # ({ae61b0e7-ae61b0e7})
##### 返回表格数据的属性

表格数据属性由一个或多个复合属性组成。
如果在属性名称参数中指定了此类属性，则
此 监控项 值将以 JSON 格式返回该属性的完整结构。
表格数据属性中的各个元素值可以使用预处理进行检索。

表格数据属性示例：

     jmx[com.example:type=Hello,foodinfo]

监控项 值：

``` {.javascript}
[
  {
    "a": "apple",
    "b": "banana",
    "c": "cherry"
  },
  {
    "a": "potato",
    "b": "lettuce",
    "c": "onion"
  }
]
```

[comment]: # ({/ae61b0e7-ae61b0e7})

[comment]: # ({1c76819e-3a5802d2})
##### 点号问题

目前为止一切顺利。但如果属性名或哈希键中包含点号该怎么办？例如：

    jmx[com.example:Type=Hello,all.fruits.apple.weight]

这就带来一个问题。如何告诉Zabbix属性名是"all.fruits"，而不仅仅是"all"？如何区分名称中包含的点号与用于分隔属性名和哈希键的点号？

实现方式很简单，只需使用反斜杠对属于名称一部分的点号进行转义：

    jmx[com.example:Type=Hello,all\.fruits.apple.weight]

同理，如果您的哈希键中包含点号，也需要进行转义：

    jmx[com.example:Type=Hello,all\.fruits.apple.total\.weight]

[comment]: # ({/1c76819e-3a5802d2})

[comment]: # ({1fba2ed6-80aedcd9})
##### 其他问题

属性名中的反斜杠字符应进行转义：

    jmx[com.example:type=Hello,c:\\documents]

如需处理 JMX 监控项键中的其他特殊字符，请参见
监控项键格式
[章节](/manual/config/items/item/key#parameter--quoted-string)。

实际上就是这么简单。祝您 JMX 监控愉快！

[comment]: # ({/1fba2ed6-80aedcd9})

[comment]: # ({0a7df462-1813b2fc})
##### 非原始数据类型

可以使用自定义MBean进行工作，这些MBean返回覆盖了**toString()**方法的非原始数据类型。

[comment]: # ({/0a7df462-1813b2fc})

[comment]: # ({f719c9d8-ffdec0f9})
#### 使用自定义端点与 JBoss EAP 6.4

自定义端点允许使用其他不同的传输协议进行工作
比默认的 RMI 更高。

为了说明这种可能性，让我们尝试配置 JBoss EAP 6。4
监控作为一个示例。首先，让我们做一些假设：

-   您已经安装了 Zabbix Java 网关。如果没有，则可以
    请按照 [documentation](/manual/concepts/java) 中的说明进行操作。
-   Zabbix server 和 Java 网关将使用前缀进行安装
    /usr/local/
-   JBoss 已安装在 `/opt/jboss-eap-6.4/` 中并且正在运行
    单机模式
-   我们假设所有这些组件都在同一个 主机 上运行
-   防火墙和SELinux已禁用（或已相应配置）

让我们在 zabbix\_server.conf 中进行一些简单的设置：

    Java网关=127.0.0.1
    StartJavaPollers=5

并且在 `zabbix_java/settings.sh` 配置 file（或者
`zabbix_java_gateway.conf`

    START_POLLERS=5

检查 JBoss 是否正在监听其标准管理端口：

    $ netstat -natp | grep 9999
    tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      10148/java

现在让我们在Zabbix中使用JMX接口127.0.0.1:9999进行create 一个主机。

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example.png){width="600"}

众所周知，此 version 版本的 JBoss 使用了 JBoss Remoting
协议代替RMI，我们可以大规模使用update JMX端点参数
在我们的JMX模板中为 监控项 进行相应配置:

    服务：JMX：远程JMX：//{HOST.CONN}：{HOST.PORT}

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example_b.png)

让我们 update configuration cache：

    /usr/local/sbin/zabbix_server -R config_cache_reload

请注意，您可能会首先遇到一个错误。

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example4.png){width="600"}

“不支持的协议：remoting-jmx”表示Java网关不支持该协议。
了解如何使用指定的协议。可以通过以下方法解决：
创建一个 `~/needed_modules.txt` file，其内容如下：

    jboss-as-remoting
    jboss-logging
    jboss-logmanager
    jboss-marshalling
    jboss-remoting
    JBoss SASL
    jcl-over-slf4j
    jul-to-slf4j-stub
    log4j-jboss-logmanager
    远程JMX
    slf4j-api
    xnio-api
    xnio-nio

然后执行命令：

    for i in $(cat ~/needed_modules.txt); do find /opt/jboss-eap-6.4 -iname "${i}*.jar" -exec cp '{}'' /usr/local/sbin/zabbix_java/lib/ \; ; done

因此，Java 网关将包含所有用于工作的必要模块：
JMX-远程连接。剩下需要做的是重启 Java 网关，等待片刻然后
如果一切操作正确，您将看到JMX监控数据开始
到达 Zabbix（另请参见：[Latest data](/manual/web_interface/frontend_sections/monitoring/latest_data)）。

[comment]: # ({/f719c9d8-ffdec0f9})
