From 8787f0aed79c5feffb0b18b6051e8ddd91d7bbce Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Thu, 18 Feb 2021 23:14:49 +0100 Subject: [PATCH] Update common to support credentials type Most of the backwards compat tests is done in common. Signed-off-by: Julien Pivotto --- config/config.go | 2 +- config/config_test.go | 28 ++- config/testdata/conf.good.yml | 12 +- ...kubernetes_authorization_basicauth.bad.yml | 13 ++ ...tes_http_config_without_api_server.bad.yml | 3 +- .../marathon_authtoken_authorization.bad.yml | 10 + config/testdata/roundtrip.good.yml | 3 +- discovery/digitalocean/digitalocean.go | 2 +- discovery/dockerswarm/dockerswarm.go | 2 +- discovery/hetzner/hetzner.go | 2 +- discovery/marathon/marathon.go | 3 + docs/configuration/configuration.md | 176 +++++++++++------- .../examples/prometheus-digitalocean.yml | 3 +- documentation/examples/prometheus-hetzner.yml | 6 +- .../examples/prometheus-kubernetes.yml | 15 +- go.mod | 2 +- go.sum | 2 + 17 files changed, 191 insertions(+), 93 deletions(-) create mode 100644 config/testdata/kubernetes_authorization_basicauth.bad.yml create mode 100644 config/testdata/marathon_authtoken_authorization.bad.yml diff --git a/config/config.go b/config/config.go index 8cb0e5e44..118b13d48 100644 --- a/config/config.go +++ b/config/config.go @@ -618,7 +618,7 @@ func (c *RemoteWriteConfig) UnmarshalYAML(unmarshal func(interface{}) error) err } for header := range c.Headers { if strings.ToLower(header) == "authorization" { - return errors.New("authorization header must be changed via the basic_auth, bearer_token, or bearer_token_file parameter") + return errors.New("authorization header must be changed via the basic_auth or authorization parameter") } if _, ok := unchangeableHeaders[strings.ToLower(header)]; ok { return errors.Errorf("%s is an unchangeable header", header) diff --git a/config/config_test.go b/config/config_test.go index bca8c98a3..bccae5cea 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -141,7 +141,10 @@ var expectedConf = &Config{ Scheme: DefaultScrapeConfig.Scheme, HTTPClientConfig: config.HTTPClientConfig{ - BearerTokenFile: filepath.FromSlash("testdata/valid_token_file"), + Authorization: &config.Authorization{ + Type: "Bearer", + CredentialsFile: filepath.FromSlash("testdata/valid_token_file"), + }, }, ServiceDiscoveryConfigs: discovery.Configs{ @@ -344,7 +347,10 @@ var expectedConf = &Config{ KeyFile: filepath.FromSlash("testdata/valid_key_file"), }, - BearerToken: "mysecret", + Authorization: &config.Authorization{ + Type: "Bearer", + Credentials: "mysecret", + }, }, }, { @@ -603,7 +609,10 @@ var expectedConf = &Config{ ServiceDiscoveryConfigs: discovery.Configs{ &digitalocean.SDConfig{ HTTPClientConfig: config.HTTPClientConfig{ - BearerToken: "abcdef", + Authorization: &config.Authorization{ + Type: "Bearer", + Credentials: "abcdef", + }, }, Port: 80, RefreshInterval: model.Duration(60 * time.Second), @@ -665,7 +674,10 @@ var expectedConf = &Config{ ServiceDiscoveryConfigs: discovery.Configs{ &hetzner.SDConfig{ HTTPClientConfig: config.HTTPClientConfig{ - BearerToken: "abcdef", + Authorization: &config.Authorization{ + Type: "Bearer", + Credentials: "abcdef", + }, }, Port: 80, RefreshInterval: model.Duration(60 * time.Second), @@ -919,6 +931,9 @@ var expectedErrors = []struct { }, { filename: "kubernetes_bearertoken_basicauth.bad.yml", errMsg: "at most one of basic_auth, bearer_token & bearer_token_file must be configured", + }, { + filename: "kubernetes_authorization_basicauth.bad.yml", + errMsg: "at most one of basic_auth & authorization must be configured", }, { filename: "marathon_no_servers.bad.yml", errMsg: "marathon_sd: must contain at least one Marathon server", @@ -931,6 +946,9 @@ var expectedErrors = []struct { }, { filename: "marathon_authtoken_bearertoken.bad.yml", errMsg: "marathon_sd: at most one of bearer_token, bearer_token_file, auth_token & auth_token_file must be configured", + }, { + filename: "marathon_authtoken_authorization.bad.yml", + errMsg: "marathon_sd: at most one of auth_token, auth_token_file & authorization must be configured", }, { filename: "openstack_role.bad.yml", errMsg: "unknown OpenStack SD role", @@ -957,7 +975,7 @@ var expectedErrors = []struct { errMsg: `x-prometheus-remote-write-version is an unchangeable header`, }, { filename: "remote_write_authorization_header.bad.yml", - errMsg: `authorization header must be changed via the basic_auth, bearer_token, or bearer_token_file parameter`, + errMsg: `authorization header must be changed via the basic_auth or authorization parameter`, }, { filename: "remote_write_url_missing.bad.yml", errMsg: `url for remote_write is empty`, diff --git a/config/testdata/conf.good.yml b/config/testdata/conf.good.yml index 6b71ca0da..33548f477 100644 --- a/config/testdata/conf.good.yml +++ b/config/testdata/conf.good.yml @@ -79,7 +79,8 @@ scrape_configs: replacement: static target_label: abc - bearer_token_file: valid_token_file + authorization: + credentials_file: valid_token_file - job_name: service-x @@ -158,7 +159,8 @@ scrape_configs: cert_file: valid_cert_file key_file: valid_key_file - bearer_token: mysecret + authorization: + credentials: mysecret - job_name: service-kubernetes @@ -263,7 +265,8 @@ scrape_configs: - job_name: digitalocean-droplets digitalocean_sd_configs: - - bearer_token: abcdef + - authorization: + credentials: abcdef - job_name: dockerswarm dockerswarm_sd_configs: @@ -284,7 +287,8 @@ scrape_configs: - job_name: hetzner hetzner_sd_configs: - role: hcloud - bearer_token: abcdef + authorization: + credentials: abcdef - role: robot basic_auth: username: abcdef diff --git a/config/testdata/kubernetes_authorization_basicauth.bad.yml b/config/testdata/kubernetes_authorization_basicauth.bad.yml new file mode 100644 index 000000000..cfa39bd6d --- /dev/null +++ b/config/testdata/kubernetes_authorization_basicauth.bad.yml @@ -0,0 +1,13 @@ +scrape_configs: + - job_name: prometheus + + kubernetes_sd_configs: + - role: pod + api_server: 'https://localhost:1234' + + authorization: + credentials: 1234 + basic_auth: + username: user + password: password + diff --git a/config/testdata/kubernetes_http_config_without_api_server.bad.yml b/config/testdata/kubernetes_http_config_without_api_server.bad.yml index db442c3bd..30cc3c3d7 100644 --- a/config/testdata/kubernetes_http_config_without_api_server.bad.yml +++ b/config/testdata/kubernetes_http_config_without_api_server.bad.yml @@ -2,4 +2,5 @@ scrape_configs: - job_name: prometheus kubernetes_sd_configs: - role: pod - bearer_token: 1234 + authorization: + credentials: 1234 diff --git a/config/testdata/marathon_authtoken_authorization.bad.yml b/config/testdata/marathon_authtoken_authorization.bad.yml new file mode 100644 index 000000000..d3112b12c --- /dev/null +++ b/config/testdata/marathon_authtoken_authorization.bad.yml @@ -0,0 +1,10 @@ +scrape_configs: + - job_name: prometheus + + marathon_sd_configs: + - servers: + - 'https://localhost:1234' + + auth_token: 1234 + authorization: + credentials: 4567 diff --git a/config/testdata/roundtrip.good.yml b/config/testdata/roundtrip.good.yml index 4aa3c432e..ab8ed8140 100644 --- a/config/testdata/roundtrip.good.yml +++ b/config/testdata/roundtrip.good.yml @@ -53,7 +53,8 @@ scrape_configs: key_file: valid_key_file digitalocean_sd_configs: - - bearer_token: + - authorization: + credentials: dockerswarm_sd_configs: - host: http://127.0.0.1:2375 diff --git a/discovery/digitalocean/digitalocean.go b/discovery/digitalocean/digitalocean.go index a82466831..e67afe8cb 100644 --- a/discovery/digitalocean/digitalocean.go +++ b/discovery/digitalocean/digitalocean.go @@ -89,7 +89,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { if err != nil { return err } - return nil + return c.HTTPClientConfig.Validate() } // Discovery periodically performs DigitalOcean requests. It implements diff --git a/discovery/dockerswarm/dockerswarm.go b/discovery/dockerswarm/dockerswarm.go index 2e0b477cd..92539bf97 100644 --- a/discovery/dockerswarm/dockerswarm.go +++ b/discovery/dockerswarm/dockerswarm.go @@ -102,7 +102,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { default: return fmt.Errorf("invalid role %s, expected tasks, services, or nodes", c.Role) } - return nil + return c.HTTPClientConfig.Validate() } // Discovery periodically performs Docker Swarm requests. It implements diff --git a/discovery/hetzner/hetzner.go b/discovery/hetzner/hetzner.go index 9d1e3b264..22f88cc2e 100644 --- a/discovery/hetzner/hetzner.go +++ b/discovery/hetzner/hetzner.go @@ -110,7 +110,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { if c.Role == "" { return errors.New("role missing (one of: robot, hcloud)") } - return nil + return c.HTTPClientConfig.Validate() } // Discovery periodically performs Hetzner requests. It implements diff --git a/discovery/marathon/marathon.go b/discovery/marathon/marathon.go index efd4769e3..9f046d196 100644 --- a/discovery/marathon/marathon.go +++ b/discovery/marathon/marathon.go @@ -111,6 +111,9 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { if (len(c.HTTPClientConfig.BearerToken) > 0 || len(c.HTTPClientConfig.BearerTokenFile) > 0) && (len(c.AuthToken) > 0 || len(c.AuthTokenFile) > 0) { return errors.New("marathon_sd: at most one of bearer_token, bearer_token_file, auth_token & auth_token_file must be configured") } + if c.HTTPClientConfig.Authorization != nil && (len(c.AuthToken) > 0 || len(c.AuthTokenFile) > 0) { + return errors.New("marathon_sd: at most one of auth_token, auth_token_file & authorization must be configured") + } return c.HTTPClientConfig.Validate() } diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 0aaf605b2..cd657035b 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -169,12 +169,16 @@ basic_auth: [ password_file: ] # Sets the `Authorization` header on every scrape request with -# the configured bearer token. It is mutually exclusive with `bearer_token_file`. -[ bearer_token: ] - -# Sets the `Authorization` header on every scrape request with the bearer token -# read from the configured file. It is mutually exclusive with `bearer_token`. -[ bearer_token_file: ] +# the configured credentials. +authorization: + # Sets the authentication type of the request. + [ type: | default: Bearer ] + # Sets the credentials of the request. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials of the request with the credentials read from the + # configured file. It is mutually exclusive with `credentials`. + [ credentials_file: ] # Configures the scrape request's TLS settings. tls_config: @@ -436,7 +440,7 @@ The following meta labels are available on targets during [relabeling](#relabel_ ```yaml # Authentication information used to authenticate to the API server. -# Note that `basic_auth`, `bearer_token` and `bearer_token_file` options are +# Note that `basic_auth` and `authorization` options are # mutually exclusive. # password and password_file are mutually exclusive. @@ -446,11 +450,16 @@ basic_auth: [ password: ] [ password_file: ] -# Optional bearer token authentication information. -[ bearer_token: ] - -# Optional bearer token file authentication information. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # Optional proxy URL. [ proxy_url: ] @@ -592,7 +601,7 @@ role: [ refresh_interval: | default = 60s ] # Authentication information used to authenticate to the Docker daemon. -# Note that `basic_auth`, `bearer_token` and `bearer_token_file` options are +# Note that `basic_auth` and `authorization` options are # mutually exclusive. # password and password_file are mutually exclusive. @@ -602,11 +611,16 @@ basic_auth: [ password: ] [ password_file: ] -# Optional bearer token authentication information. -[ bearer_token: ] - -# Optional bearer token file authentication information. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] ``` The [relabeling phase](#relabel_config) is the preferred and more powerful @@ -989,7 +1003,7 @@ The labels below are only available for targets with `role` set to `robot`: role: # Authentication information used to authenticate to the API server. -# Note that `basic_auth`, `bearer_token` and `bearer_token_file` options are +# Note that `basic_auth` and `authorization` options are # mutually exclusive. # password and password_file are mutually exclusive. @@ -1000,12 +1014,17 @@ basic_auth: [ password: ] [ password_file: ] -# Optional bearer token authentication information, required when role is hcloud -# Role robot does not support bearer token authentication. -[ bearer_token: ] - -# Optional bearer token file authentication information. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. required when role is +# hcloud. Role robot does not support bearer token authentication. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # Optional proxy URL. [ proxy_url: ] @@ -1154,7 +1173,7 @@ See below for the configuration options for Kubernetes discovery: role: # Optional authentication information used to authenticate to the API server. -# Note that `basic_auth`, `bearer_token` and `bearer_token_file` options are +# Note that `basic_auth` and `authorization` options are # mutually exclusive. # password and password_file are mutually exclusive. @@ -1164,11 +1183,16 @@ basic_auth: [ password: ] [ password_file: ] -# Optional bearer token authentication information. -[ bearer_token: ] - -# Optional bearer token file authentication information. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # Optional proxy URL. [ proxy_url: ] @@ -1253,15 +1277,19 @@ basic_auth: [ password: ] [ password_file: ] -# Sets the `Authorization` header on every request with -# the configured bearer token. It is mutually exclusive with `bearer_token_file` and other authentication mechanisms. -# NOTE: The current version of DC/OS marathon (v1.11.0) does not support standard Bearer token authentication. Use `auth_token` instead. -[ bearer_token: ] - -# Sets the `Authorization` header on every request with the bearer token -# read from the configured file. It is mutually exclusive with `bearer_token` and other authentication mechanisms. -# NOTE: The current version of DC/OS marathon (v1.11.0) does not support standard Bearer token authentication. Use `auth_token_file` instead. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +# NOTE: The current version of DC/OS marathon (v1.11.0) does not support +# standard `Authentication` header, use `auth_token` or `auth_token_file` +# instead. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # TLS configuration for connecting to marathon servers tls_config: @@ -1447,13 +1475,16 @@ basic_auth: [ password: ] [ password_file: ] -# Sets the `Authorization` header on every request with -# the configured bearer token. It is mutually exclusive with `bearer_token_file`. -[ bearer_token: ] - -# Sets the `Authorization` header on every request with the bearer token -# read from the configured file. It is mutually exclusive with `bearer_token`. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # Configures the scrape request's TLS settings. tls_config: @@ -1616,13 +1647,16 @@ basic_auth: [ password: ] [ password_file: ] -# Sets the `Authorization` header on every request with -# the configured bearer token. It is mutually exclusive with `bearer_token_file`. -[ bearer_token: ] - -# Sets the `Authorization` header on every request with the bearer token -# read from the configured file. It is mutually exclusive with `bearer_token`. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # Configures the scrape request's TLS settings. tls_config: @@ -1742,13 +1776,16 @@ basic_auth: [ password: ] [ password_file: ] -# Sets the `Authorization` header on every remote write request with -# the configured bearer token. It is mutually exclusive with `bearer_token_file`. -[ bearer_token: ] - -# Sets the `Authorization` header on every remote write request with the bearer token -# read from the configured file. It is mutually exclusive with `bearer_token`. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # Configures the remote write request's TLS settings. tls_config: @@ -1825,13 +1862,16 @@ basic_auth: [ password: ] [ password_file: ] -# Sets the `Authorization` header on every remote read request with -# the configured bearer token. It is mutually exclusive with `bearer_token_file`. -[ bearer_token: ] - -# Sets the `Authorization` header on every remote read request with the bearer token -# read from the configured file. It is mutually exclusive with `bearer_token`. -[ bearer_token_file: ] +# Optional the `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials with the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] # Configures the remote read request's TLS settings. tls_config: diff --git a/documentation/examples/prometheus-digitalocean.yml b/documentation/examples/prometheus-digitalocean.yml index bb8ee1744..b1ed4ed73 100644 --- a/documentation/examples/prometheus-digitalocean.yml +++ b/documentation/examples/prometheus-digitalocean.yml @@ -12,7 +12,8 @@ scrape_configs: - job_name: 'node' digitalocean_sd_configs: - - bearer_token: "" + - authorization: + credentials: "" relabel_configs: # Only scrape targets that have a tag 'monitoring'. - source_labels: [__meta_digitalocean_tags] diff --git a/documentation/examples/prometheus-hetzner.yml b/documentation/examples/prometheus-hetzner.yml index 158327bf1..4632f6692 100644 --- a/documentation/examples/prometheus-hetzner.yml +++ b/documentation/examples/prometheus-hetzner.yml @@ -12,7 +12,8 @@ scrape_configs: - job_name: 'node' hetzner_sd_configs: - - bearer_token: "" + - authorization: + credentials: "" platform: "hcloud" relabel_configs: # Use the public IPv4 and port 9100 to scrape the target. @@ -24,7 +25,8 @@ scrape_configs: - job_name: 'node_private' hetzner_sd_configs: - - bearer_token: "" + - authorization: + credentials: "" platform: "hcloud" relabel_configs: # Use the private IPv4 within the Hetzner Cloud Network and port 9100 to scrape the target. diff --git a/documentation/examples/prometheus-kubernetes.yml b/documentation/examples/prometheus-kubernetes.yml index dc702870b..9f5fe0528 100644 --- a/documentation/examples/prometheus-kubernetes.yml +++ b/documentation/examples/prometheus-kubernetes.yml @@ -25,7 +25,7 @@ scrape_configs: # `http`. scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape + # This TLS & authorization config is used to connect to the actual scrape # endpoints for cluster components. This is separate to discovery auth # configuration because discovery & scraping are two separate concerns in # Prometheus. The discovery auth config is automatic if Prometheus runs inside @@ -40,7 +40,8 @@ scrape_configs: # disable certificate verification by uncommenting the line below. # # insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + authorization: + credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token # Keep only the default/kubernetes service endpoints for the https port. This # will add targets for each API server which Kubernetes adds an endpoint to @@ -62,7 +63,7 @@ scrape_configs: # `http`. scheme: https - # This TLS & bearer token file config is used to connect to the actual scrape + # This TLS & authorization config is used to connect to the actual scrape # endpoints for cluster components. This is separate to discovery auth # configuration because discovery & scraping are two separate concerns in # Prometheus. The discovery auth config is automatic if Prometheus runs inside @@ -77,7 +78,8 @@ scrape_configs: # disable certificate verification by uncommenting the line below. # # insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + authorization: + credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node @@ -112,7 +114,7 @@ scrape_configs: # are used. metrics_path: /metrics/cadvisor - # This TLS & bearer token file config is used to connect to the actual scrape + # This TLS & authorization config is used to connect to the actual scrape # endpoints for cluster components. This is separate to discovery auth # configuration because discovery & scraping are two separate concerns in # Prometheus. The discovery auth config is automatic if Prometheus runs inside @@ -127,7 +129,8 @@ scrape_configs: # disable certificate verification by uncommenting the line below. # # insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + authorization: + credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node diff --git a/go.mod b/go.mod index 51cb409ac..f32297431 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( github.com/prometheus/alertmanager v0.21.0 github.com/prometheus/client_golang v1.9.0 github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.15.0 + github.com/prometheus/common v0.17.0 github.com/prometheus/exporter-toolkit v0.5.1 github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 diff --git a/go.sum b/go.sum index a3a989b87..e640af698 100644 --- a/go.sum +++ b/go.sum @@ -715,6 +715,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.17.0 h1:kDIZLI74SS+3tedSvEkykgBkD7txMxaJAPj8DtJUKYA= +github.com/prometheus/common v0.17.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/exporter-toolkit v0.5.1 h1:9eqgis5er9xN613ZSADjypCJaDGj9ZlcWBvsIHa8/3c= github.com/prometheus/exporter-toolkit v0.5.1/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=