# Prometheus integration We have [prometheus integration](https://github.com/elastic/integrations/tree/main/packages/prometheus), that supports collecting metrics: - from Prometheus endpoint (`collector` data_stream) to get metrics, exposed by the service in prometheus format - from Prometheus server using `remote_write` (`remote_write` data_stream) to get metrics, that prometheus server collects from various endpoints it scrapes - using PromQL (`query` data_stream) ## How to setup and test different prometheus configuration 1. Install prometheus server using helm: ``` helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus-server prometheus-community/prometheus ``` ### Scraping metrics from Prometheus endpoint on kubernetes `prometheus.collector` works for both managed and standalone elastic-agent. **Managed elastic-agent** 1. Enabled `Prometheus collector metrics` configuration 2. Use prometheus service as a host value, example: `prometheus-server-server.default:80`. 3. Adjust `FLEET_URL` and `FLEET_ENROLLMENT_TOKEN` and apply [manifest](https://github.com/elastic/elastic-agent/blob/main/deploy/kubernetes/elastic-agent-managed-kubernetes.yaml). **Standalone configuration** 1. Use [standalone manifest](https://github.com/elastic/elastic-agent/blob/main/deploy/kubernetes/elastic-agent-standalone-kubernetes.yaml) and replace `inputs`, defined in `agent.yml`: ```yaml inputs: - name: prometheus type: prometheus/metrics use_output: default meta: package: name: prometheus version: 0.7.0 data_stream: namespace: default streams: - data_stream: dataset: prometheus.collector type: metrics period: 10s hosts: - 'prometheus-server-server.default:80' metricsets: - collector # ssl.certificate_authorities: # - /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt use_types: true # bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token # metrics_filters.exclude: null # metrics_filters.include: # - prometheus_tsdb_* # - prometheus_http_* rate_counters: true # metrics_path: /metrics # password: changeme # username: elastic ``` In case there are multiple pods of the prometheus server and all pods should be scraped individually (example: prometheus server deployment has 2 replicas): now it is only possible with elastic-agent standalone. To use predefined integration (prometheus integration), should be used autodiscover like in this example - [doc](https://www.elastic.co/guide/en/fleet/current/running-on-kubernetes-standalone.html#_autodiscover_targeted_pods). To run elastic-agent standalone to scrape each pod of prometheus service individually [elastic-agent standalone](https://github.com/elastic/elastic-agent/blob/main/deploy/kubernetes/elastic-agent-standalone-kubernetes.yaml) should be deployed with next input configuration: ```yaml inputs: - name: prometheus type: prometheus/metrics use_output: default meta: package: name: prometheus version: 0.7.0 data_stream: namespace: default streams: - data_stream: dataset: prometheus.collector type: metrics metricsets: - collector hosts: - '${kubernetes.pod.ip}:9090' period: 10s use_types: true rate_counters: true # metrics_path: /metrics # metrics_filters.include: # - prometheus_tsdb_* # - prometheus_http_* # metrics_filters.exclude: # - prometheus_api_* # - go_* # username: "user" # password: "secret" #bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token #ssl.certificate_authorities: # - /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt condition: ${kubernetes.container.name} == 'prometheus-server' ``` All metrics exposed by the prometheus server `/metrics` endpoint will be scraped by default. Additionally you can modify extracted scraped metrics by configuring `metrics_filters` ### Scraping metrics from Prometheus server using remote_write on kubernetes When prometheus.remote_write metricset is enabled - metricbeat starts listening on the defined in the configuration `host`:`port` (default: `localhost:9201`). Prometheus must use this address as a `remote_write` URL. `prometheus.remote_write` works with both managed and standalone elastic-agent, the only missing part for both - we do not have a `Service` for elastic-agent to be able to refer it as a remote_write URL (in prometheus config). Prometheus Remote_Write: **Managed elastic-agent** 1. Add Prometheus Integration configuration `Prometheus remote write metrics`: set host `0.0.0.0` 2. Use next [manifest](https://github.com/elastic/elastic-agent/blob/main/deploy/kubernetes/elastic-agent-managed-kubernetes.yaml) and add kubernetes `Service` resource: ```yaml --- apiVersion: v1 kind: Service metadata: name: elastic-agent namespace: kube-system labels: app: elastic-agent spec: ports: - port: 9201 protocol: TCP targetPort: 9201 selector: app: elastic-agent sessionAffinity: None type: ClusterIP ``` 2. Adjust `FLEET_URL` and `FLEET_ENROLLMENT_TOKEN` and apply manifests. 4. Update prometheus release with modified configuration ``` helm upgrade --install prometheus-server prometheus-community/prometheus -f values.yml $ cat values.yml server: remoteWrite: - url: http://elastic-agent.kube-system:9201/write ``` **Standalone configuration** 1. Use [standalone manifest](https://github.com/elastic/elastic-agent/blob/main/deploy/kubernetes/elastic-agent-standalone-kubernetes.yaml) and replace `inputs`, defined in `agent.yml`: ```yaml inputs: - name: prometheus type: prometheus/metrics use_output: default meta: package: name: prometheus version: 0.7.0 data_stream: namespace: default streams: - data_stream: dataset: prometheus.remote_write type: metrics metricsets: - remote_write host: '0.0.0.0' port: 9201 ``` ### Scraping metrics using PromQL on kubernetes **Managed elastic-agent** 1. Enable `Prometheus query metrics` 2. Set prometheus service as a Host value, example: `prometheus-server-server.default:80`. 3. Adjust `FLEET_URL` and `FLEET_ENROLLMENT_TOKEN` and apply [manifest](https://github.com/elastic/elastic-agent/blob/main/deploy/kubernetes/elastic-agent-managed-kubernetes.yaml). **Standalone configuration** 1. Use [standalone manifest](https://github.com/elastic/elastic-agent/blob/main/deploy/kubernetes/elastic-agent-standalone-kubernetes.yaml) and replace `inputs`, defined in `agent.yml`: ```yaml inputs: - name: prometheus type: prometheus/metrics use_output: default meta: package: name: prometheus version: 0.7.0 data_stream: namespace: default streams: - data_stream: dataset: prometheus.query type: metrics metricsets: - query hosts: - 'prometheus-server-server.default:80' period: 10s queries: - name: instant_vector params: query: 'sum(rate(prometheus_http_requests_total[1m]))' path: /api/v1/query ``` Metrics will be stored under `prometheus.query.*`.