Bonjour à tous les habitants de Habr !
Aujourd'hui, je veux vous parler de notre envie de surveiller Postgres et quelques autres entités à l'intérieur du cluster OpenShift, et comment nous l'avons fait.
Nous avions en entrée :
- Openshift
- Helm
- Prometheus
Pour travailler avec l'application Java, tout était plutôt simple et clair, ou pour être plus précis :
1) Ajout dans build.gradle
implementation "io.micrometer:micrometer-registry-prometheus"2) Lancer Prometheus avec la configuration
- job_name: 'job-name'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- 'name'3) Ajout de l'affichage dans Grafana
Tout était assez simple et prosaïque jusqu'à ce que le moment de surveiller les bases de données qui se trouvent à proximité dans le namespace soit arrivé (oui, c'est mal, personne ne fait ça, mais il y a des circonstances).
Comment cela fonctionne-t-il ?
En plus du pod contenant Postgres et de Prometheus lui-même, nous avons besoin d'une autre entité : l'exporter.
Un exporter, de manière abstraite, est un agent qui collecte des métriques d'une application ou même de serveurs. L'exporter pour Postgres est écrit en Go, fonctionne sur le principe d'exécuter des scripts SQL dans la base, puis récupère les résultats obtenus par Prometheus. Cela permet également d'élargir les métriques collectées en ajoutant les vôtres.
Nous le déployons de cette manière (exemple de deployment.yaml, sans engagement) :
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: postgres-exporter
labels:
app: {{ .Values.name }}
monitoring: prometheus
spec:
serviceName: {{ .Values.name }}
replicas: 1
revisionHistoryLimit: 5
template:
metadata:
labels:
app: postgres-exporter
monitoring: prometheus
spec:
containers:
- env:
- name: DATA_SOURCE_URI
value: postgresdb:5432/pstgr?sslmode=disable
- name: DATA_SOURCE_USER
value: postgres
- name: DATA_SOURCE_PASS
value: postgres
resources:
limits:
cpu: 100m
memory: 50Mi
requests:
cpu: 100m
memory: 50Mi
livenessProbe:
tcpSocket:
port: metrics
initialDelaySeconds: 30
periodSeconds: 30
readinessProbe:
tcpSocket:
port: metrics
initialDelaySeconds: 10
periodSeconds: 30
image: exporter
name: postgres-exporter
ports:
- containerPort: 9187
name: metricsIl a également besoin d'un service et d'un imagestream.
Après le déploiement, nous souhaitons vraiment que tout le monde puisse se voir.
Ajoutons dans la configuration de Prometheus un extrait comme celui-ci :
- job_name: 'postgres_exporter'
metrics_path: '/metrics'
scrape_interval: 5s
dns_sd_configs:
- names:
- 'postgres-exporter'
type: 'A'
port: 9187Et à ce moment-là, tout a fonctionné, il ne reste plus qu'à ajouter tout cela dans Grafana et profiter du résultat.
En plus de la possibilité d'ajouter vos propres requêtes, dans prometheus, il est possible de modifier les paramètres pour collecter plus précisément les métriques nécessaires.
De la même manière, cela a été fait pour :
- Kafka
- Elasticsearch
- Mongo
P.S. Toutes les données concernant les noms, les ports et autres ont été inventées et ne contiennent aucune information.
Liens utiles :
Source : habr.com
