Monitor Java Application in Kubernetes
Overview
Java applications running in Kubernetes can be monitored in SnappyFlow using two approaches:
- sfKubeAgent as sidecar container.
- Prometheus exporter
Java monitoring with sfKubeAgent
In this option, the Java application should be run with Jolokia agent and sfKubeAgent running as a sidecar container and fetches metrics via Jolokia port. Refer to sfKubeAgent Overview
Prerequisites
Copy Jolokia JAR into docker image
Run the java application with Jolokia JAR in docker image:
-javaagent:/<path_jolokia_jar>/jolokia-jvm-<version>-agent.jar
Configurations
Run sfKubeAgent with JVMJolokia plugin, which is specified using the config map shown below:
apiVersion: v1
kind: ConfigMap
metadata:
name: jvm-configmap
data:
config.yaml: |-
key: <profile_key>
metrics:
plugins:
name: jvmjolokia
enabled: true
interval: 300 config:
ip: 127.0.0.1
protocol: http
port: <userDefinedJolokiaPort>
context: jolokia
monitorDeadlocks: false
deadLockMonitoringInterval: 300
The example illustrates instantiating sfKubeAgent with jvm-configmap. sfAKubeAgent talks to the Java application via userDefinedJolokiaPort (this example used 8778)
kind: Pod
apiVersion: v1
metadata:
name: my-first-pod-1
labels:
snappyflow/appname: <app_name>
snappyflow/projectname: <project_name>
spec:
containers:
name: java-container
image: <docker_id>/<docker_image>:<tag> ports:
name: jolokiaport
containerPort: <userDefinedJolokiaPort>
Snappyflow's sfkubeagent container
name: java-sfagent
image: snappyflowml/sfagent:latest
imagePullPolicy: Always command:
/app/sfagent
-enable-console-log
env:
name: APP_NAME
value: <app_name>
name: PROJECT_NAME
value: <project_name>
volumeMounts:
name: configmap-jvm
mountPath: /opt/sfagent/config.yaml
subPath: config.yaml
volumes:
name: configmap-jvm configMap:
name: jvm-configmap
Viewing data and dashboards
- Data generated by plugin can be viewed in
browse data
page inside the respective application underplugin=jvm_jolokia
anddocumentType=jvm
- Dashboard for this data can be instantiated by Importing dashboard template
JVM
to the application dashboard
Troubleshooting
Check if the Jolokia port is accessible
From inside the application container, run a curl command to the userDefinedJolokiaPort.
curl http://localhost:<userDefinedJolokiaPort>
Check the logs in sfKubeAgent container for any errors
JVM Monitoring with Prometheus exporter
Refer to Prometheus Exporter Overview. Prometheus exporter is deployed as a sidecar container in the application pod and connects to the JMX target exposed by the application to scrape the metrics. sfPod polls Prometheus exporter to scrape the metrics.
Pre-requisites
sfPod can access Prometheus exporter at Service IP: userDefinedPrometheusPort
Configurations
Run Java application with JMX options:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port= <userDefinedJMXPort> -Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.ssl=false
Start the Prometheus exporter with
java -jar jmx_prometheus_httpserver.jar <userDefinedPrometheusPort> <exporterConfigFile>
Configurations are passed using config map:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
snappyflow/appname: <app_name>
snappyflow/projectname: <project_name>
data:
jmx-config.yaml: |
---
jmxUrl: service:jmx:rmi:///jndi/rmi://127.0.0.1:<userDefinedJMXPort>/jmxrmi
ssl: false
rules:
- pattern: '.*'Prometheus exporter interfaces to JMX via
userDefinedJMXPort
. Example below uses 555S as the port.Prometheus exporter exposes
userDefinedPrometheusPort
for scraping. Example uses 5556 as the portPod definition YAML that illustrates the configuration for Java application and exporter
kind: Pod
apiVersion: v1
metadata:
name: my-first-pod
labels:
snappyflow/appname: <app_name>
snappyflow/projectname: <project_name>
spec:
containers:
name: app-container
image: <docker_id>/<docker_image>:<tag> command:
sh
-c
-x
java -jar -Dcom.sun.management.jmxremote - Dcom.sun.management.jmxremote.port=<userDefinedJMXPort> - Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.ssl=false <application_jar>
name: "exporter-container"
image: "bitnami/jmx-exporter:latest" imagePullPolicy:
command:
sh
-c
-x
java -jar jmx_prometheus_httpserver.jar <userDefinedPrometheusPort> /tmp/jmx-config.yaml
ports:
name: exporter-port
containerPort: <userDefinedPrometheusPort>
volumeMounts:
name: configmap-jmx
mountPath: /tmp
volumes:
name: configmap-jmx configMap:
name: jmx-configmap
Viewing data and dashboards
- Data generated by plugin can be viewed in “browse data” page inside the respective application under
plugin=‘kube-prom-jmx‘
anddocumentType=‘jmxStats’
- Dashboard for this data can be instantiated by Importing dashboard template “JVM” to the application dashboard.
Troubleshooting
Check if the JMX port is accessible .From inside the application container, run a curl command to the
userDefinedJMXPort
.curl http://localhost:<userDefinedJMXPort>
Check if metrics are getting scraped. From inside the exporter container, run a curl command to the
userDefinedPrometheusPort
curl http://localhost:<userDefinedPrometheusPort>/metrics