Support Prometheus Operator
Feature Request
Currently, Telegraf supports the Prometheus annotations for service discovery in Kubernetes. With CRDs hitting GA, there's growing support for this workflow within the Kubernetes community; particularly around Prometheus.
The Prometheus Operator provides CRDs for directing Prometheus servers to metric endpoints, which Telegraf should support too.
Proposal:
Support the ServiceMonitor CRD, with the same behaviour as the annotation approach.
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
labels:
team: frontend
spec:
selector:
matchLabels:
app: example-app
endpoints:
- port: web
Current behavior:
Not supported
Desired behavior:
Scrape metrics as per instructions in ServiceMonitor CRD
Use case:
The Prometheus Operator is becoming the standard for Kubernetes monitoring and Telegraf could provide a drop-in replacement
High level sounds good, I'm assuming you are referring to the CoreOS Prometheus Operator? Can you pseudocode the calls we would make and what example responses would look like?
@danielnelson, you need to support the definition of the destination port, getting them not from labels, but from spec.ports[%PORT_NAME%]
Example service manifest:
apiVersion: v1
kind: Service
metadata:
name: pili
labels:
app: pili
spec:
type: ClusterIP
ports:
- name: uwsgi
protocol: TCP
port: 8080
targetPort: uwsgi
selector:
app: pili-web
tier: backend
Then the configuration of Prometheus is something like this:
[[inputs.prometheus]]
...
kubernetes_lablel_selector = "appl=pili"
kubernetes_monitor_endpoint = "uwsgi"
kubernetes_monitor_path = "/metrics"
kubernetes_monitor_scheme = "http"
...
In this form, it will be necessary to create one input line per service, but this is seen as a plus rather than a minus. It might be worth using an array of endpoints:
[[inputs.prometheus]]
[[inputs.prometheus.endpoints]]
selector = "appl=pili"
endpoint = "uwsgi"
path = "/metrics"
scheme = "http"
...
But, as it seems to me, such a refinement will cost more.
ServiceMonitor configuration example for the above service:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: monitoring-pili
namespace: monitoring
labels:
app: pili-service-monitor
spec:
selector:
matchLabels:
# Target app service
app: pili
endpoints:
- interval: 15s
path: /metrics
port: uwsgi
scheme: http
namespaceSelector:
matchNames:
- default
This logic allows you to use the same principle of collecting goals as ServiceOperator.
Or you can use the API of the prometheus operator - https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor
But this will require a deployed prometheus operator in the cluster, which, in some scenarios, I would like to avoid.
@M0rdecay work on this support actually started last week! We'll keep you updated with this issue 👍
hey guys! any news on that effort?
Is anyone trying to contribute this feature yet?
Would love to know if there has been any progress on this feature?