Как добавить новый 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
). Ваши новые наборы графиков будут установлены автоматически.