Monitoreo de postgres dentro de Openshift

¡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: metrics

Tambié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: 9187

Y 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:
Lista de diferentes exportadores

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster