¡Buenas tardes, habitantes de Habr!
Hoy quiero contarles cómo queríamos monitorear Postgres y un par de entidades más dentro del clúster de OpenShift y cómo lo hicimos.
Teníamos lo siguiente:
- OpenShift
- Helm
- Prometheus
Para trabajar con la aplicación Java, todo fue bastante simple y transparente, o más bien:
1) Agregar en build.gradle
implementation "io.micrometer:micrometer-registry-prometheus"2) Iniciar Prometheus con la configuración
- job_name: 'job-name'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- 'name'3) Añadir visualización en Grafana
Todo fue bastante sencillo y prosaico hasta que llegó el momento de monitorear las bases de datos que están junto a nosotros en el namespace (sí, esto es malo, nadie hace esto, pero hay circunstancias).
¿Cómo funciona esto?
Además del pod con Postgres y Prometheus, necesitamos otra entidad: el Exporter.
El exporter en un sentido abstracto es un agente que recopila métricas de una aplicación o incluso servidores. El exporter para Postgres está escrito en Go, funciona en base a ejecutar scripts SQL en la base de datos y luego Prometheus recoge los resultados. Esto también permite ampliar las métricas recopiladas, añadiendo las propias.
Lo desplegamos de esta manera (ejemplo deployment.yaml, no vinculante):
---
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: metricsTambién necesitábamos un servicio y un image stream para él.
Después del despliegue, queremos que todos se vean entre sí.
Añadimos este fragmento a la configuración de Prometheus:
- job_name: 'postgres_exporter'
metrics_path: '/metrics'
scrape_interval: 5s
dns_sd_configs:
- names:
- 'postgres-exporter'
type: 'A'
port: 9187Y aquí es donde todo funcionó, solo queda agregar todo esto a Grafana y disfrutar del resultado.
Además de la posibilidad de agregar sus propias consultas, en prometheus se pueden modificar configuraciones para recopilar métricas más específicas.
De manera similar se hizo para:
- Kafka
- Elasticsearch
- Mongo
P.D. Todos los datos sobre nombres, puertos y demás son ficticios y no contienen información real.
Enlaces útiles:
Fuente: habr.com
