DEV Community

Cover image for How to Set Up Prometheus Exporters for PostgreSQL and MongoDB in Kubernetes
Dmitry Romanoff
Dmitry Romanoff

Posted on

How to Set Up Prometheus Exporters for PostgreSQL and MongoDB in Kubernetes

If you're running PostgreSQL and MongoDB databases in your Kubernetes cluster, monitoring them effectively is crucial to ensure high availability and performance. One of the most popular tools for database monitoring is Prometheus, but you don't necessarily need to set up a central Prometheus server just yet to begin monitoring your databases. By installing Prometheus exporters, you can directly access the metrics exposed by the databases.

In this guide, I'll walk you through the steps of installing and accessing Prometheus exporters for PostgreSQL and MongoDB within your Kubernetes cluster.

Prerequisites

A Kubernetes cluster with PostgreSQL and MongoDB already deployed.
kubectl access to your Kubernetes cluster.
minikube (if you're using Minikube locally) or the appropriate method for accessing your Kubernetes node IP.

In my setup, the PostgreSQL and MongoDB instances are running in the my-lab namespace.

Checking Existing Pods

Here’s a quick check of the pods running in my Kubernetes cluster:

$ kubectl get pods -n my-lab
NAME                                READY   STATUS    RESTARTS   AGE
my-mongo-mongodb-8688dcdd4b-tvwpl   1/1     Running   0          65m
my-postgres-postgresql-0            1/1     Running   0          73m
Enter fullscreen mode Exit fullscreen mode

We have my-postgres-postgresql-0 for PostgreSQL and my-mongo-mongodb-8688dcdd4b-tvwpl for MongoDB.

Step 1: Install the PostgreSQL Exporter

The PostgreSQL exporter exposes various performance and status metrics, such as database size, query performance, and connection statistics. The wrouesnel/postgres_exporter is one of the most common and widely used exporters for PostgreSQL.

1.1 Create the PostgreSQL Exporter Deployment

First, create a Kubernetes deployment for the PostgreSQL exporter. Save the following YAML definition in a file called postgres-exporter.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-exporter
  namespace: my-lab
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-exporter
  template:
    metadata:
      labels:
        app: postgres-exporter
    spec:
      containers:
        - name: postgres-exporter
          image: wrouesnel/postgres_exporter
          ports:
            - containerPort: 9187
          env:
            - name: DATA_SOURCE_NAME
              value: "postgres:https://postgres:<YOUR_PASSWORD>@my-postgres-postgresql-0.my-lab.svc.cluster.local:5432/postgres?sslmode=disable"
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-exporter
  namespace: my-lab
spec:
  type: NodePort
  ports:
    - port: 9187
      targetPort: 9187
      nodePort: 30087 # This is the external port
  selector:
    app: postgres-exporter
Enter fullscreen mode Exit fullscreen mode

1.2 Apply the Resources

Next, apply the YAML file to create the PostgreSQL exporter deployment and expose it through a NodePort service:

$ kubectl apply -f postgres-exporter.yaml
Enter fullscreen mode Exit fullscreen mode

This will deploy the exporter and expose the metrics at port 30087 on all Kubernetes nodes.

1.3 Access PostgreSQL Metrics

Once the exporter is deployed and exposed, you can access the PostgreSQL metrics directly by visiting the following URL:

https://<NodeIP>:30087/metrics
Enter fullscreen mode Exit fullscreen mode

If you're using Minikube, you can find the Node IP with:

$ minikube ip
Enter fullscreen mode Exit fullscreen mode

Now, you can see various PostgreSQL performance metrics being exposed in Prometheus-compatible format.

Step 2: Install the MongoDB Exporter

The MongoDB exporter exposes MongoDB-specific metrics, such as memory usage, index statistics, and replication status. A common choice for MongoDB metrics is the percona/mongodb_exporter.

2.1 Create the MongoDB Exporter Deployment

Save the following YAML definition for the MongoDB exporter as mongodb-exporter.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-exporter
  namespace: my-lab
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb-exporter
  template:
    metadata:
      labels:
        app: mongodb-exporter
    spec:
      containers:
        - name: mongodb-exporter
          image: percona/mongodb_exporter:0.42.0
          ports:
            - containerPort: 9216
          env:
            - name: MONGODB_URI
              value: "mongodb:https://my-mongo-mongodb.my-lab.svc.cluster.local:27017"
          # Replace with actual MongoDB URI if authentication is required
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-exporter
  namespace: my-lab
spec:
  type: NodePort
  ports:
    - port: 9216
      targetPort: 9216
      nodePort: 30094  # External port for accessing the exporter
  selector:
    app: mongodb-exporter
Enter fullscreen mode Exit fullscreen mode

2.2 Apply the Resources

Now apply the mongodb-exporter.yaml to create the MongoDB exporter deployment:

$ kubectl apply -f mongodb-exporter.yaml
Enter fullscreen mode Exit fullscreen mode

This will expose the MongoDB exporter at port 30094 on all nodes.

2.3 Access MongoDB Metrics

You can now access the MongoDB metrics at:

https://<NodeIP>:30094/metrics
Enter fullscreen mode Exit fullscreen mode

Again, if you're using Minikube, you can retrieve the Node IP using:

$ minikube ip
Enter fullscreen mode Exit fullscreen mode

How to Set Up Prometheus Exporters for PostgreSQL and MongoDB in Kubernetes

How to Set Up Prometheus Exporters for PostgreSQL and MongoDB in Kubernetes

Conclusion

You now have both PostgreSQL and MongoDB exporters set up in your Kubernetes cluster. The metrics are accessible via HTTP, which you can use for manual inspection or scrape with a Prometheus server later on when you're ready to centralize your monitoring.

PostgreSQL metrics: https://:30087/metrics
MongoDB metrics: https://:30094/metrics

This setup allows you to monitor your databases at the agent level without needing a centralized Prometheus server for now. When you're ready to scale up your monitoring, you can simply integrate these exporters with Prometheus for a more centralized approach to monitoring and alerting.

Top comments (0)