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 datapage inside the respective application underplugin=jvm_jolokiaanddocumentType=jvm - Dashboard for this data can be instantiated by Importing dashboard template
JVMto 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=falseStart 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
userDefinedPrometheusPortfor 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
userDefinedPrometheusPortcurl http://localhost:<userDefinedPrometheusPort>/metrics