├── Dockerfile ├── README.md └── files ├── configs └── kafka-config.yaml └── jmx_prometheus_javaagent-0.15.0.jar /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.13.5 2 | 3 | COPY files/jmx_prometheus_javaagent-0.15.0.jar /files/jmx_prometheus_javaagent.jar 4 | COPY files/configs/* /files/configs/ 5 | 6 | ENV SHARED_VOLUME_PATH /shared 7 | RUN ["sh", "-c", "mkdir -p $SHARED_VOLUME_PATH"] 8 | 9 | CMD ["sh", "-c", "cp -a /files/* $SHARED_VOLUME_PATH"] 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Prometheus JMX Exporter container for Kubernetes 2 | 3 | This is a Docker container intended to be run in the same pod as your Java containers, to export their metrics for Prometheus. 4 | 5 | The default `CMD` copies over the required [JMX Exporter](https://github.com/prometheus/jmx_exporter) files to the directory specified by the `SHARED_VOLUME_PATH` environment variable. 6 | 7 | ## Files available 8 | 9 | * `$SHARED_VOLUME_PATH/jmx_prometheus_javaagent.jar`: the [JMX Exporter](https://github.com/prometheus/jmx_exporter) javaagent JAR file. 10 | * `$SHARED_VOLUME_PATH/config/*.yaml`: example config files for the exporter. 11 | * I only bothered to copy over the [example Kafka config from upstream](https://github.com/prometheus/jmx_exporter/blob/master/example_configs/kafka-0-8-2.yml) because that's what I was using. 12 | 13 | ## Using this as a Kubernetes Init Container 14 | 15 | This container is best used as an [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). 16 | 17 | Add this to `initContainers` of your `Deployment` or `StatefulSet`: 18 | 19 | ```yaml 20 | spec: 21 | initContainers: 22 | - name: prometheus-jmx-exporter 23 | image: spdigital/prometheus-jmx-exporter-kubernetes:0.3.1 24 | env: 25 | - name: SHARED_VOLUME_PATH 26 | value: /shared-volume 27 | volumeMounts: 28 | - mountPath: /shared-volume 29 | name: shared-volume 30 | ``` 31 | 32 | The init container and your Kafka container will share a volume: 33 | 34 | ```yaml 35 | volumes: 36 | - name: shared-volume 37 | emptyDir: {} 38 | ``` 39 | 40 | In your Kafka container, set `KAFKA_OPTS` to refer to files placed by the `prometheus-jmx-exporter` container into the shared volume: 41 | 42 | ```yaml 43 | - name: KAFKA_OPTS 44 | value: -javaagent:/shared-volume/jmx_prometheus_javaagent.jar=19000:/shared-volume/configs/kafka-config.yaml 45 | ``` 46 | 47 | Don't forget to annotate your resources so Prometheus will scrape your pod's `/metrics` endpoint: 48 | 49 | ```yaml 50 | annotations: 51 | "prometheus.io/scrape": "true" 52 | "prometheus.io/port": "19000" 53 | ``` 54 | -------------------------------------------------------------------------------- /files/configs/kafka-config.yaml: -------------------------------------------------------------------------------- 1 | # Copied from https://github.com/prometheus/jmx_exporter/blob/e123b63/example_configs/kafka-0-8-2.yml, 2 | # then modified. 3 | lowercaseOutputName: true 4 | rules: 5 | - pattern : kafka.cluster<>Value 6 | name: kafka_cluster_$1_$2 7 | labels: 8 | topic: "$3" 9 | partition: "$4" 10 | - pattern : kafka.log<>Value 11 | name: kafka_log_$1 12 | labels: 13 | topic: "$2" 14 | partition: "$3" 15 | - pattern : kafka.controller<>(Count|Value) 16 | name: kafka_controller_$1_$2 17 | - pattern : kafka.network<>Value 18 | name: kafka_network_$1_$2 19 | - pattern : kafka.network<>Count 20 | name: kafka_network_$1_$2_total 21 | labels: 22 | request: "$3" 23 | - pattern : kafka.network<>Count 24 | name: kafka_network_$1_$2 25 | labels: 26 | request: "$3" 27 | type: COUNTER 28 | - pattern : kafka.network<>Count 29 | name: kafka_network_$1_$2 30 | labels: 31 | request: "$3" 32 | - pattern : kafka.network<>Count 33 | name: kafka_network_$1_$2 34 | - pattern : kafka.server<>Count 35 | name: kafka_server_$1_$2_total 36 | labels: 37 | topic: "$3" 38 | - pattern : kafka.server<>Count 39 | name: kafka_server_$1_$2_total 40 | type: COUNTER 41 | 42 | - pattern : kafka.server<>(Count|Value) 43 | name: kafka_server_$1_$2 44 | labels: 45 | clientId: "$3" 46 | topic: "$4" 47 | partition: "$5" 48 | - pattern : kafka.server<>(Count|Value) 49 | name: kafka_server_$1_$2 50 | labels: 51 | topic: "$3" 52 | partition: "$4" 53 | - pattern : kafka.server<>(Count|Value) 54 | name: kafka_server_$1_$2 55 | labels: 56 | topic: "$3" 57 | type: COUNTER 58 | 59 | - pattern : kafka.server<>(Count|Value) 60 | name: kafka_server_$1_$2 61 | labels: 62 | clientId: "$3" 63 | broker: "$4:$5" 64 | - pattern : kafka.server<>(Count|Value) 65 | name: kafka_server_$1_$2 66 | labels: 67 | clientId: "$3" 68 | - pattern : kafka.server<>(Count|Value) 69 | name: kafka_server_$1_$2 70 | 71 | - pattern: kafka.consumer<>(Count|Value) 72 | name: kafka_consumer_$1_$2 73 | labels: 74 | clientId: "$3" 75 | 76 | - pattern : kafka.(\w+)<>Count 77 | name: kafka_$1_$2_$3_total 78 | - pattern : kafka.(\w+)<>Count 79 | name: kafka_$1_$2_$3_total 80 | labels: 81 | topic: "$4" 82 | type: COUNTER 83 | - pattern : kafka.(\w+)<>Count 84 | name: kafka_$1_$2_$3_total 85 | labels: 86 | topic: "$4" 87 | partition: "$5" 88 | type: COUNTER 89 | - pattern : kafka.(\w+)<>(Count|Value) 90 | name: kafka_$1_$2_$3_$4 91 | type: COUNTER 92 | - pattern : kafka.(\w+)<>(Count|Value) 93 | name: kafka_$1_$2_$3_$6 94 | labels: 95 | "$4": "$5" 96 | -------------------------------------------------------------------------------- /files/jmx_prometheus_javaagent-0.15.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chuyeow/prometheus-jmx-exporter-kubernetes/1721350d839b61fde49dd265b3ca0b2476bc0048/files/jmx_prometheus_javaagent-0.15.0.jar --------------------------------------------------------------------------------