Instrumenter une application avec Prometheus et Kubernetes

Photo by Nandhu Kumar from Pexels

TL;DR Instrumenter une application avec Prometheus permet de mettre en place des mesures et des alertes spéficiques qui servent de source à des rapports Grafana. Cet article propose un exemple en Go déployé sur Kubernetes et présente les différents aspects liés à cette mise en place.

Avant d'aller plus loin, n'hésitez pas à prendre connaissance des articles ci-dessous:

Prometheus propose un ensemble de bibliothèques clientes pour créer des mesures personnalisées et les exposer via un exporter. Vous trouverez ci-dessous:

  • Une implémentation avec la bibliothèque Go
  • Une configuration de prometheus pour une découverte automatique du service associé à l'aide des labels des pods
  • Un exemple d'utilisation à l'aide d'un manifest Kubernetes
  • Un rapport qui s'appuie sur les mesures exposées par l'application

Instrumenter une application Go avec Prometheus

Le répertoire blog/prometheus-app du projet easyteam-fr/side-effects contient un exemple d'application Go instrumentée avec Prometheus. Il s'appuie sur la bibliothèque Prometheus en Go. La section ci-dessous crée un ensemble de mesures avec un label url:

var (
	invocations = prometheus.NewCounterVec(prometheus.CounterOpts{
		Name: "app_requests_by_uri",
		Help: "Number of calls by URL",
	},
		[]string{"url"},
    )
)

La ligne suivante ajoute le vecteur invocations à Prometheus:

prometheus.MustRegister(invocations)

Les lignes ci-dessous exposent la route /metrics qui sert l'exporter sur un port dédié:

	server2 := http.NewServeMux()
	server2.Handle("/metrics", promhttp.Handler())
	go func() { log.Fatal(http.ListenAndServe(":8081", server2)) }()

Pour tester le code, vous pouvez compiler et exécuter l'application, puis exécuter les commandes ci-dessous:

go build .
./prometheus-app &

curl 0.0.0.0:8080/url1
curl 0.0.0.0:8080/url2
curl 0.0.0.0:8081/metrics | grep app_requests_by_uri

Configurer Prometheus

Prometheus est capable de découvrir l'application si celle-ci est déployée dans un Pod à condition que:

  • Prometheus ait accès à l'API Kubernetes
  • Le pod dispose d'un label monitoring: prometheus
  • Le port associé à l'exporter s'appelle name: prometheus

Le répertoire blog/kubernetes-prometheus du projet easyteam-fr/side-effects contient un exemple de configuration. Pour la déployer, allez dans le répertoire blog/kubernetes-prometheus et lancez le script ci-dessous:

git clone https://github.com/easyteam-fr/side-effects.git
cd side-effects/blog/kubernetes-prometheus
kubectl create namespace monitoring
kubectl apply -k .

La section de la configuration qui réalise la découverte est la suivante. Les commentaires expliquent l'utilité des sections liées à l'utilisation des labels Prometheus:

scrape_configs:
  - job_name: kubernetes-autoregistered-pods
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      # Conserve les pods avec le label `monitoring: prometheus`
      - source_labels: [__meta_kubernetes_pod_label_monitoring]
        action: keep
        regex: prometheus
      # Se connecte à l'adresse associé au port dont le nom est `prometheus`
      - source_labels: [__meta_kubernetes_pod_container_port_name]
        action: keep
        regex: prometheus
      # Renomme le label instance avec le nom du pod
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: instance

Déployer l'application sur Kubernetes

L'application Go est construite automatiquement sur le projet easyteam/prometheus-app du hub docker. Pour l'installer dans Kubernetes, vous appliquerez le manifest disponible dans le répertoire blog/prometheus-app du projet easyteam-fr/side-effects

kubectl apply -f kubernetes.yaml

Vous pouvez tester l'application à l'aide des commandes ci-dessous:

kubectl port-forward svc/prometheus-app 8080:80

while true; do 
  curl --silent localhost:8080/url1 2>/dev/null 
  curl --silent localhost:8080/url1 2>/dev/null 
  curl --silent localhost:8080/url2 2>/dev/null
done

Visualiser le rapport

Comme pour la configuration Prometheus, le rapport est installé dans Grafana et installé dans le namespace monitoring. Pour le visualiser, vous vous connecterez à l'URL localhost:3000 après avoir lancé la commande ci-dessous:

kubectl port-forward svc/grafana -n monitoring 3000:3000

Le dashboard Prometheus Application Monitoring affiche le indicateurs de votre application:

Prometheus Application Monitoring

Note: pour comprendre le fonctionnement du rapport éditez les panels du rapport.

Pour aller plus loin

Cet article montre tout l'intérêt de Prometheus pour superviser des composants applicatifs. L'exporter est découvert automatiquement et les données sont accessible simplement depuis Grafana ou des alertes. Dans les prochains articles vous découvrirez des exporters spécifiques à certains composants et des rapports associés.

Easyteam DevOps

Easyteam DevOps