Добавление serviceMonitor в Prometheus

Как добавить новый serviceMonitor в Prometheus?

serviceMonitor – это один из способов описания ресурса (точки входа) для сбора метрик программой Prometheus в виде классического сервиса Kubernetes.

В этой статье вы найдете пример подключения serviceMonitor к Prometheus, как способ сбора метрик PostgreSQL и отображения их в Grafana путем установки Helm – файлов в окружении Kubernetes.

Posgresql

  • Будем использовать данный чарт: https://github.com/helm/charts/tree/master/stable/postgresql . Он уже включает в себя exporter (программу в виде контейнера в pod, выгружающего метрики).

  • Включаем метрики в values.yaml PostgreSQL:

metrics:
  enabled: true
  serviceMonitor:
    enabled: true

Если вы так же как и я используете helmfile, включите соответствующие значения:

    - name: metrics.enabled
      value: true
    - name: metrics.serviceMonitor.enabled
      value: true
  • Установите PostgreSQL:
helm install -f postgres-values.yaml stable/postgresql
  • Убедитесь, что новые метрики postgresql доступны как сервис k8s. В моем примере это релиз с именем gitea-db-postgresql:
kubectl get services | grep metrics
gitea-db-postgresql-metrics    ClusterIP      10.0.2.193    <none>           9187/TCP

Prometheus

  • Будем использовать следующий репозитарий: https://github.com/helm/charts/tree/master/stable/prometheus-operator

  • По умолчанию prometheus собирает метрики только с того же namespace, в котором он был развернут. По этому если вы хотите запустить prometheus в отдельном namespace, вы должны установить на другие namespace метки (labels), чтобы prometheus мог выбрать их, используя NamespaceSelector типа matchLabels. Для примеру новый label prometheus=enabled.

kubectl label --overwrite namespace --all "prometheus=enabled"

Включаем serviceMonitorNamespaceSelector в values.yaml prometheus:

prometheus:
  prometheusSpec:
    serviceMonitorNamespaceSelector:                     
       matchLabels:
         prometheus: enabled
  • Проверьте postgresql сервис метрик, обратите внимание на такие параметры, как Port, TargetPort, Labels. Они нам понадобятся для описания нового serviceMonitor в Prometheus:
kubectl describe service gitea-db-postgresql-metrics
Name:              gitea-db-postgresql-metrics
Namespace:         default
Labels:            app=postgresql
                   chart=postgresql-6.2.0
                   heritage=Tiller
                   release=gitea-db
Annotations:       prometheus.io/port: 9187
                   prometheus.io/scrape: true
Selector:          app=postgresql,release=gitea-db,role=master
Type:              ClusterIP
IP:                10.0.2.193
Port:              metrics  9187/TCP
TargetPort:        metrics/TCP
Endpoints:         10.52.3.156:9187
Session Affinity:  None
Events:            <none>
  • Добавьте поддержку нового serviceMonitor в prometheus values.yaml:
prometheus:
  prometheusSpec:
    additionalServiceMonitors:
    - name: "postgresql"
      namespaceSelector:
        any: true
      selector:
        matchLabels:
            app: postgresql
      endpoints:
      - port: "metrics"
      - targetPort: "metrics/TCP"
        scheme: tcp
  • Установите prometheus:
helm install -f prometheus-values.yaml stable/prometheus-operator

Проверьте ссылку /targets вашего Prometheus. Там вы должны обнаружить ваш новый serviceMonitor:

monitoring/postgresql/0 (1/1 up)
Endpoint    State   Labels  Last Scrape     Scrape Duration     Error
http://10.52.3.156:9187/metrics
    up  endpoint="metrics" instance="10.52.3.156:9187" job="gitea-db-postgresql-metrics" namespace="default" pod="gitea-db-postgresql-0" service="gitea-db-postgresql-metrics" 

Grafana

Для автоматической установки набора графиков (dashboard) в Grafana я использую готовый скрипт: prometheus-operator/hack/sync_grafana_dashboards.py с небольшими изменениями. Я добавляю туда необходимые мне dashboard-ы:

...
-        'source': 'https://raw.githubusercontent.com/etcd-io/etcd/master/Documentation/op-guide/grafana.json',
-        'destination': '../templates/grafana/dashboards',
+        'source': 'https://raw.githubusercontent.com/sinsengumi/grafana-dashboards/master/postgresql_statistics.json',
+        'destination': '../templates/grafana/dashboards/custom',
         'type': 'json',
         'min_kubernetes': '1.10.0-0',
         'max_kubernetes': '1.16.0-0'
     },
...

Также я немного исправил именование сервисов, т.к. они иногда могут вызывать ошибку, потому как должны соответствовать RFC DNS имен:

@@ -77,7 +57,7 @@ header = '''# Generated from '%(name)s'
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: {{ printf "%%s-%%s" (include "prometheus-operator.fullname" $) "%(name)s" | trunc 63 | trimSuffix "-" }}
+  name: {{ printf "%%s-%%s" (include "prometheus-operator.fullname" $) "%(name)s" | lower | replace "_" "-" | trunc 63 | trimSuffi
x "-" }}
   labels:
     {{- if $.Values.grafana.sidecar.dashboards.label }}
     {{ $.Values.grafana.sidecar.dashboards.label }}: "1"

После чего надо вызвать этот скрипт, чтобы он скачал json и конвертировал их в yaml-формат, пригодный для установки в Kubernets в качестве ConfigMap.

Плюс я заменил переменную источника данных ${DS_PROMETHEUS} на Prometheus

for files in ../templates/grafana/dashboards/custom/*.yaml
do
        echo "fixing $files..."
        sed 's#${DS_PROMETHEUS}#Prometheus#g' -i $files
done

Теперь вы можете применить изменения (используя helmfile или helm upgrade ). Ваши новые наборы графиков будут установлены автоматически.

Prometheus Grafana Postgresql

Tagged with:

Добавить комментарий

Ваш e-mail не будет опубликован.