Introduction
In modern cloud-native environments, monitoring is a critical aspect of maintaining application reliability and performance. Prometheus is a popular monitoring system, but its built-in exporters may not cover custom business logic or application-specific metrics.
In this guide, we will build a custom Prometheus exporter for a sample application, package it into a Docker container, and deploy it in Kubernetes. By the end of this tutorial, you’ll have a fully functional custom monitoring setup for your application.
Why Custom Prometheus Exporters?
Prometheus exporters are essential for collecting and exposing application-specific metrics. While standard exporters cover databases, queues, and system metrics, custom exporters allow you to:
Track business-specific metrics (e.g., user activity, sales data)
Gain real-time insights into application performance
Enable custom alerting based on key performance indicators
Building a Custom Prometheus Exporter
We will create a simple Python-based Prometheus exporter that exposes custom application metrics over an HTTP endpoint.
Step 1: Writing the Python Exporter
First, let’s create a simple Python script using the prometheus_client library.
Create exporter.py with the following content:
from prometheus_client import start_http_server, Counter
import time
import random
# Define a custom metric
REQUEST_COUNT = Counter("custom_app_requests_total", "Total number of processed requests")
def process_request():
"""Simulate request processing"""
time.sleep(random.uniform(0.5, 2.0)) # Simulate latency
REQUEST_COUNT.inc() # Increment counter
if __name__ == "__main__":
start_http_server(8000) # Expose metrics on port 8000
print("Custom Prometheus Exporter running on port 8000...")
while True:
process_request()
This script exposes a custom counter metric custom_app_requests_total, which simulates incoming application requests.
Step 2: Building and Pushing the Docker Image
Now, let’s containerize our exporter for easy deployment.
Create a Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY exporter.py /app/
RUN pip install prometheus_client
CMD ["python", "exporter.py"]
Build and push the image:
docker build -t myrepo/myapp-prometheus-exporter:latest .
docker push myrepo/myapp-prometheus-exporter:latest
Deploying in Kubernetes
Step 3: Kubernetes Deployment
To deploy our custom exporter in Kubernetes, we create a Deployment and Service.
Create exporter-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-prometheus-exporter
labels:
app: myapp-exporter
spec:
replicas: 1
selector:
matchLabels:
app: myapp-exporter
template:
metadata:
labels:
app: myapp-exporter
spec:
containers:
- name: myapp-exporter
image: myrepo/myapp-prometheus-exporter:latest
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: myapp-exporter-service
spec:
selector:
app: myapp-exporter
ports:
- protocol: TCP
port: 8000
targetPort: 8000
Apply the deployment:
kubectl apply -f exporter-deployment.yaml
Step 4: Configuring Prometheus to Scrape Custom Metrics
Next, we need to tell Prometheus to collect metrics from our exporter.
Create service-monitor.yaml:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myapp-exporter-monitor
labels:
release: prometheus
spec:
selector:
matchLabels:
app: myapp-exporter
endpoints:
- port: "8000"
interval: 10s
Apply the ServiceMonitor:
kubectl apply -f service-monitor.yaml
Verifying the Setup
Step 5: Checking Metrics Collection
Check if the exporter is running:
kubectl get pods -l app=myapp-exporter
Port forward and test the metrics endpoint:
kubectl port-forward svc/myapp-exporter-service 8000:8000
curl http://localhost:8000/metrics
Check if Prometheus is scraping the exporter:
kubectl port-forward svc/prometheus-service 9090:9090
Now, open http://localhost:9090 and search for custom_app_requests_total.
Conclusion
Building a custom Prometheus exporter enables deep observability for your application. By following these steps, we have:
Created a Python-based Prometheus exporter
Containerized it using Docker
Deployed it in Kubernetes
Integrated it with Prometheus using ServiceMonitor
This setup ensures that we collect meaningful application metrics, which can be visualized in Grafana dashboards and used for proactive monitoring and alerting.
Are you using custom Prometheus exporters in your projects? Let’s discuss in the comments!![]()