Hello,

In this quick tutorial we will explore how to create a ServiceMonitor in microk8s when you have the observability addon enabled.

When you enable the observability addon with:

1
microk8s enable observability

It will create the obserability namespace and install the Kubernetes Prometheus Stack.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 k get pods -n observability
NAME                                                     READY   STATUS    RESTARTS      AGE
kube-prom-stack-prometheus-node-exporter-htzw9           1/1    
tempo-0                                                  2/2     Running   4 (16h ago)   27h
alertmanager-kube-prom-stack-kube-prome-alertmanager-0   2/2  
kube-prom-stack-kube-prome-operator-cbf896985-fb5fc      1/1     
kube-prom-stack-kube-state-metrics-57c8c84df6-hflgj      1/1   
kube-prom-stack-grafana-74d8979894-sjv77                 3/3     
prometheus-kube-prom-stack-kube-prome-prometheus-0       2/2    
loki-0                                                   1/1   
loki-promtail-sg8bv                                      1/1     Running   

You will get a Grafana configured with a Prometheus data source and other data sources as well.

To monitor a custom service, let’s say a prometheus metrics exporter for Apache Kafka you will need to create a ServiceMonitor. For the service monitor to be discovered you’ll need to add some labels to it.

To find out the labels you need to add describe the prometheus operator:

1
k describe prometheus/kube-prom-stack-kube-prome-prometheus -n observability
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[...]
  Pod Monitor Namespace Selector:
  Pod Monitor Selector:
    Match Labels:
      Release:  kube-prom-stack
  Service Account Name:  kube-prom-stack-kube-prome-prometheus
  Service Monitor Namespace Selector:
  Service Monitor Selector:
    Match Labels:
      Release:  kube-prom-stack

Then create the ServiceMonitor with the corresponding labels: kube-prom-stack.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: prometheus-exporter-kafka-monitor
  labels:
    team: observability
    release: kube-prom-stack
spec:
  selector:
    matchLabels:
      app: prometheus-kafka-exporter
      app.kubernetes.io/managed-by: Helm
      chart: prometheus-kafka-exporter-1.8.0
      heritage: Helm
      release: prometheus-exporter
  endpoints:
  - port: exporter-port

Thanks for reading!