У меня есть служба, работающая в кластере k8s, которую я хочу отслеживать с помощью Prometheus Operator. Служба имеет конечную точку /metrics
, которая возвращает простые данные, такие как:
myapp_first_queue_length 12
myapp_first_queue_processing 2
myapp_first_queue_pending 10
myapp_second_queue_length 4
myapp_second_queue_processing 4
myapp_second_queue_pending 0
API работает в нескольких модулях за базовым c Service
объектом:
apiVersion: v1
kind: Service
metadata:
name: myapp-api
labels:
app: myapp-api
spec:
ports:
- port: 80
name: myapp-api
targetPort: 80
selector:
app: myapp-api
Я установил Prometheus, используя kube-prometheus
, и добавил объект ServiceMonitor
:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myapp-api
labels:
app: myapp-api
spec:
selector:
matchLabels:
app: myapp-api
endpoints:
- port: myapp-api
path: /api/metrics
interval: 10s
Prometheus обнаруживает все модули, на которых запущены экземпляры API, и я могу запрашивать эти метрики из графа Prometheus. Пока все хорошо.
Проблема в том, что эти показатели агрегированы - каждый экземпляр / модуль API не имеет своей собственной очереди, поэтому нет причин собирать эти значения из каждого экземпляра. На самом деле, кажется, что это вызывает путаницу - если Прометей собирает одно и то же значение из 10 пакетов, похоже, что общее значение в 10 раз больше, чем оно есть на самом деле, если только вы не знаете, применить что-то вроде avg
.
Есть ли способ сообщить Prometheus «это значение уже агрегировано и всегда должно быть представлено как таковое», или, что еще лучше, попросить Prometheus просто один раз очистить значения через внутренний балансировщик нагрузки для этой службы, а не поразить каждый модуль?
edit
Фактический API - это просто Deployment
объект:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-api
labels:
app: myapp-api
spec:
replicas: 2
selector:
matchLabels:
app: myapp-api
template:
metadata:
labels:
app: myapp-api
spec:
imagePullSecrets:
- name: mysecret
containers:
- name: myapp-api
image: myregistry/myapp:2.0
ports:
- containerPort: 80
volumeMounts:
- name: config
mountPath: "app/config.yaml"
subPath: config.yaml
volumes:
- name: config
configMap:
name: myapp-api-config