ScrapeConfig CRD

Starting with prometheus-operator v0.65.x, one can use the ScrapeConfig CRD to scrape targets external to the Kubernetes cluster or create scrape configurations that are not possible with the higher level ServiceMonitor/Probe/PodMonitor resources.

Prerequisites

  • prometheus-operator >v0.65.1
  • ScrapeConfig CRD installed in the cluster. Make sure to (re)start the operator after the CRD has been created/updated.

Configure Prometheus or PrometheusAgent to select ScrapeConfigs

Both the Prometheus and PrometheusAgent CRD have a scrapeConfigSelector field. This field needs to be set to a list of labels to match ScrapeConfigs:

spec:  scrapeConfigSelector:  matchLabels:  prometheus: system-monitoring-prometheus 

With this example, all ScrapeConfig having the prometheus label set to system-monitoring-prometheus will be used to generate scrape configurations.

Use ScrapeConfig to scrape an external target

ScrapeConfig currently supports a limited set of service discoveries:

  • static_config
  • file_sd
  • http_sd
  • kubernetes_sd
  • consul_sd

The following examples are basic and don’t cover all the supported service discovery mechanisms. The CRD is constantly evolving, adding new features and support for new Service Discoveries. Check the API documentation to see all supported fields.

If you have an interest in another service discovery mechanism or you see something missing in the implementation, please open an issue.

static_config

For example, to scrape the target located at http://prometheus.demo.do.prometheus.io:9090, use the following:

apiVersion: monitoring.coreos.com/v1alpha1 kind: ScrapeConfig metadata:  name: static-config  namespace: my-namespace  labels:  prometheus: system-monitoring-prometheus spec:  staticConfigs:  - labels:  job: prometheus  targets:  - prometheus.demo.do.prometheus.io:9090 

file_sd

To use file_sd, a file has to be mounted in the Prometheus or PrometheusAgent pods. The following configmap is a service discovery file:

apiVersion: v1 kind: ConfigMap metadata:  name: scrape-file-sd-targets  namespace: monitoring  labels:  prometheus: system-monitoring-prometheus data:  targets.yaml: |  - labels:  job: node-demo  targets:  - node.demo.do.prometheus.io:9100  - labels:  job: prometheus  targets:  - prometheus.demo.do.prometheus.io:9090 

This ConfigMap will then need to be mounted in the Prometheus spec:

apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata:  name: your-prometheus  namespace: my-namespace  labels:  prometheus: system-monitoring-prometheus spec:  scrapeConfigSelector:  matchLabels:  prometheus: system-monitoring-prometheus  configMaps:  - scrape-file-sd-targets 

You can then use ScrapeConfig to reference that file and scrape the associated targets:

apiVersion: monitoring.coreos.com/v1alpha1 kind: ScrapeConfig metadata:  name: file-sd  namespace: my-namespace  labels:  prometheus: system-monitoring-prometheus  app.kubernetes.io/name: scrape-config-example spec:  fileSDConfigs:  - files:  - /etc/prometheus/configmaps/scrape-file-sd-targets/targets.yaml 

http_sd

http_sd uses an endpoint for data, unlike file_sd which uses a file, removing the need for a configmap. For instance:

apiVersion: monitoring.coreos.com/v1alpha1 kind: ScrapeConfig metadata:  name: http-sd  namespace: my-namespace  labels:  prometheus: system-monitoring-prometheus  app.kubernetes.io/name: scrape-config-example spec:  httpSDConfigs:  - url: http://my-external-api/discovery  refreshInterval: 15s