1. Answers
  2. Configuring Prometheus to scrape application metrics using Pod annotations

How Do I Configure Prometheus to Scrape Application Metrics Using Pod Annotations?

Introduction

This guide provides a comprehensive walkthrough on configuring Prometheus to automatically scrape application metrics using Pod annotations within a Kubernetes cluster. By leveraging Pod annotations, Prometheus can efficiently discover and collect metrics, facilitating enhanced monitoring and observability of your applications.

Step-by-Step Guide

  1. Set up Prometheus in your Kubernetes cluster: Begin by deploying Prometheus using the Prometheus Operator, which simplifies managing Prometheus instances and related resources in your Kubernetes environment.

  2. Annotate your Pods: Add specific annotations to your Pods so that Prometheus can identify and scrape metrics from them.

Here’s a detailed guide on how to implement this using Pulumi and TypeScript:

  1. Install Prometheus Operator: Use the kubernetes package in Pulumi to install the Prometheus Operator in your Kubernetes cluster.

  2. Create a ServiceMonitor: Define a ServiceMonitor resource to instruct Prometheus on how to scrape metrics from your services, selecting Pods based on annotations.

  3. Annotate your Pods: Ensure your Pod templates include the necessary annotations for Prometheus to discover and scrape metrics.

Here’s how you can do this using Pulumi and TypeScript:

import * as pulumi from "@pulumi/pulumi";
import * as k8s from "@pulumi/kubernetes";

// Create a namespace for Prometheus
const prometheusNamespace = new k8s.core.v1.Namespace("prometheus", {
    metadata: {
        name: "prometheus",
    },
});

// Install the Prometheus Operator
const prometheusOperator = new k8s.helm.v3.Chart("prometheus-operator", {
    chart: "kube-prometheus-stack",
    version: "16.5.0",
    fetchOpts: {
        repo: "https://prometheus-community.github.io/helm-charts",
    },
    namespace: prometheusNamespace.metadata.name,
});

// Create a ServiceMonitor to scrape metrics from Pods with specific annotations
const serviceMonitor = new k8s.apiextensions.CustomResource("serviceMonitor", {
    apiVersion: "monitoring.coreos.com/v1",
    kind: "ServiceMonitor",
    metadata: {
        name: "example-service-monitor",
        namespace: prometheusNamespace.metadata.name,
    },
    spec: {
        selector: {
            matchLabels: {
                app: "example-app",
            },
        },
        endpoints: [
            {
                port: "metrics",
                interval: "30s",
            },
        ],
    },
});

// Annotate your Pods with Prometheus-specific annotations
const appLabels = { app: "example-app" };
const deployment = new k8s.apps.v1.Deployment("example-app", {
    metadata: {
        labels: appLabels,
    },
    spec: {
        selector: { matchLabels: appLabels },
        replicas: 1,
        template: {
            metadata: {
                labels: appLabels,
                annotations: {
                    "prometheus.io/scrape": "true",
                    "prometheus.io/port": "9090",
                    "prometheus.io/path": "/metrics",
                },
            },
            spec: {
                containers: [
                    {
                        name: "example-app",
                        image: "example/app:latest",
                        ports: [{ containerPort: 9090 }],
                    },
                ],
            },
        },
    },
});

Key Points

  • Namespace Creation: Establish a dedicated namespace for Prometheus to organize its resources.
  • Prometheus Operator: Utilize the Prometheus Operator Helm chart for deploying Prometheus and its components.
  • ServiceMonitor Configuration: Define a ServiceMonitor to guide Prometheus in scraping metrics from Pods with specified labels.
  • Pod Annotations: Apply annotations such as prometheus.io/scrape, prometheus.io/port, and prometheus.io/path to enable Prometheus to locate and collect metrics.

Conclusion

By following this guide, you can effectively configure Prometheus to scrape metrics from your Kubernetes Pods using annotations. This setup allows for seamless integration and monitoring of your applications, ensuring Prometheus can automatically discover and collect the necessary metrics. Customize your annotations and ServiceMonitor configurations to suit your specific application needs.

Deploy this code

Want to deploy this code? Sign up for a free Pulumi account to deploy in a few clicks.

Sign up

New to Pulumi?

Want to deploy this code? Sign up with Pulumi to deploy in a few clicks.

Sign up