Awesome
Prometheus Jmx Exporter Operator
This operator using Jmx Exporter enables Java processes running ok Kubernetes Pods to expose metrics collected form mBeans via JMX to Prometheus.
Usage
Prometheus JMX Exporter Configuration
Create a configuration file for the JMX Exporter.
Note that in our case hostPort
and jmxUrl
should not be set as the Jmx Exporter agent will be loaded into the Java process and we want it to talk to the local JVM. More configuration examples of Prometheus JMX Exporter can be found here
Add to configuration to a Kubernetes config map
kubectl create cm <your-prometheus-jmx-exporter-configmap-name> --from-file=<path-to-the-config-file>
e.g.:
kubectl create cm prometheus-jmx-exporter-config --from-file=javadummy/config.yaml
kubectl describe cm prometheus-jmx-exporter-config
RBAC
If RBAC is enabled in your Kubernetes cluster than a service account is needed to be created with the approprite role binding for the operator. Download the rbac.yaml file then execute:
kubectl create -f <path-to-rbac-yaml-file>
Deploy the operator to Kubernetes
Download the operator.yaml deployment file. If you don't have RBAC enabled than remove
serviceAccountName: prometheus-jmx-exporter-operator
kubectl create -f <path-to-your-operator-yaml-file>
Create prometheus-jmx-exporter
resources
Download cr.yaml and customize it for your needs.
spec:
labelSelector:
app: dummyapp
The label selector specifies what pods the operator to watch. The operator will investigate the pods that have labels which matches what is specified in labelSelector
.
It checks the containers of the pod and the Java applications running in these containers.
It will load the Prometheus JMX Exporter into the Java applications and passes to it the configuration from the config map.
config:
configMapName: prometheus-jmx-exporter-config
configMapKey: config.yaml
Note: see Prometheus JMX Exporter Configuration above
port: 9400
This is the port number at which Prometheus server can scrape the metrics exported by Prometheus JMX exporter. Chose a port that is not conflicting with any of the container ports already used by the applications running in the containers.
List the JMX Exporter endpoints managed by the operator
kubectl get prometheusjmxexporter
kubectl get prometheusjmxexporter <name-of-the-prometheus-jmx-exporter> -o yaml
The status
section lists the endpoints.
Limitations
Currently only one Java process per pod is being supported. In case a pod has multiple containers than the operator will select the first container from the list of containers returned by Kubernetes API. Also if a container has multiple java processes running than the operator works on the first process.
Future work
-
Currently the user is required to provide a port for the Prometheus JMX Exporter that doesn't conflict with ports already being used by processes running on the pod. The operator should take care of this by choosing a free port available in the container.
-
Investigate the possibility of supporting pods with multiple containers and multiple Java processes per container. This operator best works with microservices where there is one process per container.