Metricbeat + Jolokia Proxy + JMXでJVM監視 その2

Metricbeat + Jolokia Proxy + JMXでJVM監視 その1からの続きです。

1.Metricbeat(jolokiaモジュール)の設定

⓵ Metricbeatのインストール

Elastic Stack Server側へmetricbeatをインストール。

#
# yum -y install metricbeat
#

⓶ metricbeat.ymlの設定。(とりあえず出力先だけ設定)

###################### Metricbeat Configuration Example #######################

# This file is an example configuration file highlighting only the most common
# options. The metricbeat.reference.yml file from the same directory contains all the
# supported options with more comments. You can use it as a reference.
#
# You can find the full configuration reference here:
# https://www.elastic.co/guide/en/beats/metricbeat/index.html

#==========================  Modules configuration ============================

metricbeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml

  # Set to true to enable config reloading
  reload.enabled: false

  # Period on which files under path should be checked for changes
  #reload.period: 10s

~省略~

#================================ Outputs =====================================

# Configure what output to use when sending the data collected by the beat.

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]

  # Optional protocol and basic auth credentials.
  #protocol: "https"
  #username: "elastic"
  #password: "changeme"

~省略~

⓷ jolokia moduleの有効化

#
# metricbeat modules enable jolokia
Enabled jolokia
#

jolokia moduleが有効になったことを確認

#
# metricbeat modules list
Enabled:
jolokia
system

Disabled:
aerospike
apache
aws
ceph
consul
coredns
couchbase
couchdb
docker
dropwizard
elasticsearch
elasticsearch-xpack
envoyproxy
etcd
golang
graphite
haproxy
http
jolokia
kafka
kibana
kibana-xpack
kubernetes
kvm
logstash
memcached
mongodb
mssql
munin
mysql
nats
nginx
php_fpm
postgresql
prometheus
rabbitmq
redis
traefik
uwsgi
vsphere
windows
zookeeper
#

⓸ jolokia.ymlの編集

・収集間隔やjolokia proxyサーバの指定

- module: jolokia 
  metricsets: ["jmx"] 
  period: 10s ← 収集間隔(デフォルト10秒 、短くしても5秒くらいまでかと)
  hosts: ["sves0002:8080"] ←jolokia proxyサーバ名とポート(筆者の環境では Elastic Stack Server )
  namespace: "metrics"

・収集したいメトリックの指定

ここに記載していく値はAPサーバにより異なるのでJconsoleのMbeanタブ等で値を確認しながら設定すると間違いが少ないかと。

MbeanのObjectName毎に取得したいAttribute名を繰り返し書いていきます。 以下は、HeapMemoryUsageとNonHeapMemoryUsage の値を収集する場合の例。

 jmx.mappings:
   - mbean: 'java.lang:type=Memory' ← MbeanのObjectNameを指定
      attributes:
        - attr: HeapMemoryUsage  ← MbeanのAttribute名を指定
          field: memory.heap_usage ← elasticsearch出力時のフィールド名を指定
        - attr: NonHeapMemoryUsage  ← MbeanのAttribute名を指定
          field: memory.non_heap_usage ← elasticsearch出力時のフィールド名を指定
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi" ←取得したいターゲットサーバとJMX Port番号(筆者の環境ではApplication Server)

でいくつか取得したいMbeanの指定をしたjolokia.ymlが以下。

# Module: jolokia
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/7.0/metricbeat-module-jolokia.html

- module: jolokia
  metricsets: ["jmx"]
  period: 10s
  hosts: ["sves0002:8080"]
  namespace: "metrics"
#  path: "/jolokia/?ignoreErrors=true&canonicalNaming=false"
  http_method: "POST"
  jmx.mappings:
    - mbean: 'java.lang:type=Runtime'
      attributes:
        - attr: Uptime
          field: uptime
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
    - mbean: 'java.lang:type=Memory'
      attributes:
        - attr: HeapMemoryUsage
          field: memory.heap_usage
        - attr: NonHeapMemoryUsage
          field: memory.non_heap_usage
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
    - mbean: 'java.lang:type=MemoryPool,name=Eden Space'
      attributes:
        - attr: CollectionUsage
          field: memory.eden.collection_usage
        - attr: PeakUsage
          field: memory.eden.peak_usage
        - attr: Usage
          field: memory.eden.usage
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
    - mbean: 'java.lang:type=MemoryPool,name=Survivor Space'
      attributes:
        - attr: CollectionUsage
          field: memory.survivor.collection_usage
        - attr: PeakUsage
          field: memory.survivor.peak_usage
        - attr: Usage
          field: memory.survivor.usage
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
#   GC Metrics - this depends on what is available on your JVM
    - mbean: 'java.lang:type=GarbageCollector,name=MarkSweepCompact'
      attributes:
        - attr: CollectionTime
          field: gc.cms_collection_time
        - attr: CollectionCount
          field: gc.cms_collection_count
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
    - mbean: 'java.lang:type=GarbageCollector,name=Copy'
      attributes:
        - attr: CollectionTime
          field: gc.cp_collection_time
        - attr: CollectionCount
          field: gc.cp_collection_count
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
    - mbean: Catalina:type=ThreadPool,name="http-nio-8080"
      attributes:
        - attr: maxThreads
          field: tomcat.http_8080.thread.max
        - attr: currentThreadCount
          field: tomcat.http_8080.thread.count
        - attr: currentThreadsBusy
          field: tomcat.http_8080.thread.busy
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
    - mbean: Catalina:type=ThreadPool,name="ajp-nio-8009"
      attributes:
        - attr: maxThreads
          field: tomcat.ajp_8009.thread.max
        - attr: currentThreadCount
          field: tomcat.ajp_8009.thread.count
        - attr: currentThreadsBusy
          field: tomcat.ajp_8009.thread.busy
      target:
          url: "service:jmx:rmi:///jndi/rmi://sves0001:8686/jmxrmi"
  jmx.application:
  jmx.instance:

⑤ コンフィグの確認

metricbeatのtestコマンドでメトリックが取得できるか確認します。

#
# metricbeat test modules
jolokia...
  jmx...OK
    result:
    {
     "@timestamp": "2019-07-07T06:50:16.169Z",
     "event": {
      "dataset": "jolokia.metrics",
      "duration": 26398286,
      "module": "jolokia"
     },
     "jolokia": {
      "metrics": {
       "gc": {
        "cms_collection_count": 1,
        "cms_collection_time": 94,
        "cp_collection_count": 18,
        "cp_collection_time": 402
       },
       "memory": {
        "eden": {
         "collection_usage": {
          "committed": 286326784,
          "init": 286326784,
          "max": 286326784,
          "used": 0
         },
         "peak_usage": {
          "committed": 286326784,
          "init": 286326784,
          "max": 286326784,
          "used": 286326784
         },
         "usage": {
          "committed": 286326784,
          "init": 286326784,
          "max": 286326784,
          "used": 126392248
         }
        },
        "heap_usage": {
         "committed": 1037959168,
         "init": 1073741824,
         "max": 1037959168,
         "used": 197311512
        },
        "non_heap_usage": {
         "committed": 53149696,
         "init": 2555904,
         "max": -1,
         "used": 51440104
        },
        "survivor": {
         "collection_usage": {
          "committed": 35782656,
          "init": 35782656,
          "max": 35782656,
          "used": 759968
         },
         "peak_usage": {
          "committed": 35782656,
          "init": 35782656,
          "max": 35782656,
          "used": 35782656
         },
         "usage": {
          "committed": 35782656,
          "init": 35782656,
          "max": 35782656,
          "used": 759968
         }
        }
       },
       "tomcat": {
        "ajp_8009": {
         "thread": {
          "busy": 0,
          "count": 10,
          "max": 200
         }
        },
        "http_8080": {
         "thread": {
          "busy": 0,
          "count": 10,
          "max": 200
         }
        }
       },
       "uptime": 3630245
      }
     },
     "metricset": {
      "name": "jmx"
     },
     "service": {
      "address": "sves0002:8080",
      "type": "jolokia"
     }
    }

~省略~
#

2.Metricbeatの起動

#
# systemctl start metricbeat
#

3.メトリックデータの確認

Discoveryを使って収集したデータを見てみましょう。 jolokiaモジュールで設定したメトリックが収集できているようです。

4.VisualizeとDashboardで可視化

Visualizeでグラフを保存して、Dashboardを作成。これで、メトリックの保存と可視化ができるようになったので、Webシステムの分析が楽になるかな。他にも欲しい情報がありますがまたの機会に。お疲れさまでした。