跳转至

JMX 远程监控

介绍

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

为了收集这些指标,Cloud Insight 会调用一个轻量级的 Java 插件 JMXFetch 连接到 MBean 服务器,并通过 OneStatsd 服务器,将这些指标发送到 Cloud Insight 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 与 Cloud Insight,再次执行 info 命令,出现下图即为配置成功。

修改配置文件

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

为了更好让您理解如何配置 Cloud Insight 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 实例名称,将在 Cloud Insight 平台生成对应的标签,如: 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                               # 自定义标签,用于在 Cloud Insight 平台对 Tomcat 服务器进行分组
    #     newTag: test

查看可用指标

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

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

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

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

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

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

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

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

配置部分如下所示:

# 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

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

  • 属性名称的列表:
# 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.[DOMAIN_NAME].[ATTRIBUTE_NAME]

这里是另一个过滤示例:

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.heap_memory_committed(每30秒测量一次) 所用的总Java堆内存提交 (byte)
jvm.heap_memory_init (每30秒测量一次) 初始Java堆内存分配 (byte)
jvm.heap_memory_max(每30秒测量一次) 最大Java堆内存 (byte)
jvm.non_heap_memory(每30秒测量一次) 总的Java非堆存储器 (byte)
jvm.non_heap_memory_committed(每30秒测量一次) 总的Java非堆内存提交 (byte)
jvm.non_heap_memory_init(每30秒测量一次) 初始Java非堆内存分配 (byte)
jvm.non_heap_memory_max(每30秒测量一次) 最大Java非堆内存可用 (byte)
jvm.thread_count(每30秒测量一次) 活动线程的数目
jvm.gc.cms.count(每30秒测量一次) 已发生的垃圾收集的总数
jvm.gc.parnew.time(每30秒测量一次) 累积的已过的垃圾收集的时间的近似值(毫秒)

故障排除

350 个指标限制

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

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

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

Java 的路径

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

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

java_bin_path:/path/java

5分钟,开启你的跨云监控之旅 (`⌄´ )