Cloudinsight Agent 在 4.7.0 版本,将 Agent 名称从 oneapm-ci-agent 更换至 cloudinsight-agent。若您在使用过程中,出现无法正常工作的情况,请加入售后群:433349863
X

JMX 远程监控

介绍

Cloudinsight 通过使用 JMX 远程监控某些服务的应用指标。

为了收集这些指标,Cloudinsight 会调用一个轻量级的 Java 插件 JMXFetch 连接到 MBean 服务器,并通过 OneStatsd 服务器,将这些指标发送到 Cloudinsight Agent。

JMX 监控每个实例的 350 个指标应该足以满足需求,因为自定义指标是非常容易的。接下来我们来看看如何做到这一点。


启用 JMX 检查

建议您先看一下 启用JMX的通用方式,以及jmx的一些配置,不同服务启用JMX的方式原理都是类似的,只是配置的地方不同。

以下这些服务的数据需要通过 JMX 来实现远程监控:

使用 JMX 来监控 Java 系列的平台服务,需要先启用 JMX。我们以 Tomcat 为例,为大家介绍如何开启 JMX。

在 Tomcat 的 bin 目录下添加 setenv.sh 文件,在里面添加环境变量:

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=7199
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false"

此处设置连接 JMX 端口为 7199,因此在 tomcat.yaml 配置文件中也要写成相应的 7199。如下图所示:

之后请重启 Tomcat 与 Cloudinsight,再次执行 info 命令,出现下图即为配置成功。

修改配置文件

修改 conf.d/tomcat.yaml 配置文件,可以决定 Cloudinsight 通过 JMX 采集哪些性能指标,以及指定 Java 执行路径等重要信息。

为了更好让您理解如何配置 Cloudinsight Java 系列的平台服务,我们为您列举每一项配置参数的意义。

我们以 Tomcat 的配置文件为例,为大家介绍配置文件的参数意义。同理,ActiveMQ Kafka 等使用 JMX 来采集指标的平台服务的配置文件,结构类似。

instances:
  - host: localhost              # Tomcat 所在主机,默认为 localhost
    port: 9012                   # JMX 远程连接端口
    user: username               # JMX 远程连接用户名
    password: password           # JMX 远程连接密码
    # process_name_regex: .*process_name.*     # 实现 JMX 监控, 除了配置 host 和 port 外,还可通过 attach api的方式,具体见http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html

    # tools_jar_path: /usr/lib/jvm/java-7-openjdk-amd64/lib/tools.jar    # 通过 attach API 方式实现 JMX 监控时,需配置 tools.jar 的路径
    name: tomcat_instance                      # Tomcat 实例名称,将在 Cloudinsight 平台生成对应的标签,如: instance:tomcat_instance
    java_bin_path: /path/to/java               # 探针找不到 Java 可执行路径时,需配置此项
    java_options: "-Xmx200m -Xms50m"           # Java JVM 对应项
    trust_store_path: /path/to/trustStore.jks  # 若 JMX 远程连接开启 SSL,需配置此项
    trust_store_password: password             # SSL 证书密码
    tags:                 
      env: stage                               # 自定义标签,用于在 Cloudinsight 平台对 Tomcat 服务器进行分组
    #     newTag: test

查看可用指标

由于 JMX 采集的指标特别多,而 Cloudinsight 认为只选取一些常用的指标,就可以满足大部分的用户场景。所以我们针对采集指标的数量,做了最大 350 条的限制。

想要查看目前哪些指标被采集,需要运行指令,来自查.

  • 列出匹配的 attributes
sudo /etc/init.d/cloudinsight-agent jmx list_matching_attributes
  • 列出配置成功,却因为 Agent 采集限制,未被采集的 attributes:
sudo /etc/init.d/cloudinsight-agent jmx list_limited_attributes
  • 列出已被收集的 attributes
sudo /etc/init.d/cloudinsight-agent jmx list_collected_attributes
  • 列出不匹配任何 instances 配置的 attributes
sudo /etc/init.d/cloudinsight-agent jmx list_not_matching_attributes
  • 列出所有 JMXFetch 支持的 attributes
sudo /etc/init.d/cloudinsight-agent jmx list_everything
  • 开始采集已配置生效的指标,并在控制台显示它们:
sudo /etc/init.d/cloudinsight-agent jmx collect

如何自定义要收集的数据:

像其他的探针检查一样,JMX 检查有 2 个主要部分:

  • init_config :设置将要应用到每个实例
  • instances :用于配置的实例设置

JMX 检查需要的 conf 部分,它已经放在在 init_config 部分或 instances 部分里面。

通过 conf 部分将被用于确定什么 JMX 属性必须被收集和发送的 Cloudinsight。

配置部分如下所示:

# Make sure you replace the API and/or APP key below
# with the ones for your account

  conf:
    - include:
        domain: domain_name
        type:
          - bean_type
        bean:
          - first_bean_name
          - second_bean_name
        attribute:
          nameOfAttribute:
            metric_type: counter
            alias: jmx.my_metric_name
          nameOf2ndAttribute:
            metric_type: gauge
            alias: jmx.my2ndattribute
    - include:
        domain: 2nd_domain
      exclude:
        bean: 2nd_domain:type=BeanType,tag1=value1,tag2=value2
        # this line is equivalent to:
        # domain: 2nd_domain
        # type:
        #   - BeanType
        # tag1:
        #   - value1
        # tag2:
        #   - value2

conf 参数是一个字典列表。在这个字典只允许2个键:

  • include(强制性):词典中的过滤器,任何符合这些过滤器规则的将被收集,除非它也匹配属性中的 “exclude” 过滤器(见下文)

  • exclude(可选):过滤器的另一个字典。符合这些过滤器规则的属性将不会收集

对于给定的 bean,指标将以下列方式被标记:

mydomain:attr0=val0,attr1=val1

你的指标将被 mydomain(或一些变化取决于bean中的属性),并有 attr0:val0, attr1:val1, domain:mydomain 几种标签。


过滤器说明

每个 includeexclude 字典支持下列键:

  • domain:域名的列表(例如 java.lang

  • domain_regex:关于域名正则表达式的列表,(例如 java\.lang*

  • beanbean_name:全 bean 名称的列表(例如 java.lang:type=Compilation

  • bean_regex:在全豆名正则表达式的列表(例如 java\.lang.*[,:]type=Compilation.*

  • attribute:一个列表或属性名称词典(请参阅下面的详细介绍)

domain_regexbean_regex 定义的正则表达式必须符合 Java的正则表达式格式]。

这些参数之上,该过滤器支持“自定义”键,这意味着你可以通过 bean 的参数进行筛选。例如,如果你想就收集指标 Cassandra cache,您可以使用 type: - Caches 过滤器:

# Make sure you replace the API and/or APP key below
# with the ones for your account

  conf:
    - include:
        domain: org.apache.cassandra.db
        type:
          - Caches

attribute 过滤器

attribute 过滤器可以接受两种类型的值:

  • 字典的键是 attribute 的名称:
# Make sure you replace the API and/or APP key below
# with the ones for your account

  conf:
    - include:
        attribute:
          maxThreads:
            alias: tomcat.threads.max
            metric_type: gauge
          currentThreadCount:
            alias: tomcat.threads.count
            metric_type: gauge
          bytesReceived:
            alias: tomcat.bytes_rcvd
            metric_type: counter

在这种情况下,你可以给指标指定一个别名,这将成为 Cloudinsight 的标准指标名称。您还可以指定指标类型无论是常规规则或计数器。如果你选择计数器,探针将以每秒的速度计算这个指标。

  • 属性名称的列表:
# Make sure you replace the API and/or APP key below
# with the ones for your account

  conf:
    - include:
        domain: org.apache.cassandra.db
        attribute:
          - BloomFilterDiskSpaceUsed
          - BloomFilterFalsePositives
          - BloomFilterFalseRatio
          - Capacity
          - CompressionRatio
          - CompletedTasks
          - ExceptionCount
          - Hits
          - RecentHitRate

在这种情况下:

  • 指标标准类型将是一个常规规则
  • 指标名称将是 jmx.[DOMAINNAME].[ATTRIBUTENAME]

这里是另一个过滤示例:

instances:
  - host: 127.0.0.1
    name: jmx_instance
    port: 9999

init_config:
  conf:
    - include:
        bean: org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Latency
        attribute:
          - OneMinuteRate
          - 75thPercentile
          - 95thPercentile
          - 99thPercentile

指标

指标 具体含义
jvm.heap_memory(每30秒测量一次) 总的Java堆内存 (byte)
jvm.heapmemorycommitted(每30秒测量一次) 所用的总Java堆内存提交 (byte)
jvm.heapmemoryinit (每30秒测量一次) 初始Java堆内存分配 (byte)
jvm.heapmemorymax(每30秒测量一次) 最大Java堆内存 (byte)
jvm.nonheapmemory(每30秒测量一次) 总的Java非堆存储器 (byte)
jvm.nonheapmemory_committed(每30秒测量一次) 总的Java非堆内存提交 (byte)
jvm.nonheapmemory_init(每30秒测量一次) 初始Java非堆内存分配 (byte)
jvm.nonheapmemory_max(每30秒测量一次) 最大Java非堆内存可用 (byte)
jvm.thread_count(每30秒测量一次) 活动线程的数目
jvm.gc.cms.count(每30秒测量一次) 已发生的垃圾收集的总数
jvm.gc.parnew.time(每30秒测量一次) 累积的已过的垃圾收集的时间的近似值(毫秒)

故障排除

350 个指标限制

鉴于监控的这些服务的性质,有可能直接提交极高数量的指标到 Cloudinsight。因此,我们设定了 350 个指标的限制。

要查看您收集了什么,以及还剩下收集多少指标的限制,您可以通过使用上面的命令来查看那些指标是可用的。

如果您收集的指标超过 350 的指标,可以尝试去掉一些您不需要的指标或者用exclude过滤器来过滤掉一些指标,有问题请联系 support@oneapm.com

Java 的路径

Cloudinsight Agent 并不捆绑 JVM,但是需要您的系统已经安装 JVM。因此,您必须确保 Java 主目录存在于运行探针的用户的路径上。

另外,您也可以在某个集成的配置文件中指定 JVM 路径:

java_bin_path:/path/java

如果您对 Cloudinsight 感兴趣,可以选择试用我们的产品,只需要点击下面的按钮免费注册即可。


立即注册 Cloudinsight