Add label and field selectors to prometheus input k8s discovery (#6969)

This commit is contained in:
mg03
2020-03-02 18:51:31 -08:00
committed by GitHub
parent 69554cd92e
commit dd1ace73b0
6 changed files with 102 additions and 3 deletions

View File

@@ -15,6 +15,8 @@ import (
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/internal/tls"
"github.com/influxdata/telegraf/plugins/inputs"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
)
const acceptHeader = `application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.7,text/plain;version=0.0.4;q=0.3,*/*;q=0.1`
@@ -29,6 +31,12 @@ type Prometheus struct {
// Location of kubernetes config file
KubeConfig string
// Label Selector/s for Kubernetes
KubernetesLabelSelector string `toml:"kubernetes_label_selector"`
// Field Selector/s for Kubernetes
KubernetesFieldSelector string `toml:"kubernetes_field_selector"`
// Bearer Token authorization file path
BearerToken string `toml:"bearer_token"`
BearerTokenString string `toml:"bearer_token_string"`
@@ -90,6 +98,11 @@ var sampleConfig = `
## Restricts Kubernetes monitoring to a single namespace
## ex: monitor_kubernetes_pods_namespace = "default"
# monitor_kubernetes_pods_namespace = ""
# label selector to target pods which have the label
# kubernetes_label_selector = "env=dev,app=nginx"
# field selector to target pods
# eg. To scrape pods on a specific node
# kubernetes_field_selector = "spec.nodeName=$HOSTNAME"
## Use bearer token for authorization. ('bearer_token' takes priority)
# bearer_token = "/path/to/bearer/token"
@@ -124,6 +137,21 @@ func (p *Prometheus) Init() error {
if p.MetricVersion != 2 {
p.Log.Warnf("Use of deprecated configuration: 'metric_version = 1'; please update to 'metric_version = 2'")
}
if len(p.KubernetesLabelSelector) > 0 {
_, err := labels.Parse(p.KubernetesLabelSelector)
if err != nil {
return fmt.Errorf("label selector validation failed %q: %v", p.KubernetesLabelSelector, err)
}
}
if len(p.KubernetesFieldSelector) > 0 {
_, err := fields.ParseSelector(p.KubernetesFieldSelector)
if err != nil {
return fmt.Errorf("field selector validation failed %s: %v", p.KubernetesFieldSelector, err)
}
}
return nil
}