Remove InfluxDB v1 metrics middleware
This commit is contained in:
parent
2b67f1f66f
commit
943238faba
19 changed files with 55 additions and 959 deletions
|
@ -58,7 +58,7 @@ _(But if you'd rather configure some of your routes manually, Traefik supports t
|
||||||
- Circuit breakers, retry
|
- Circuit breakers, retry
|
||||||
- See the magic through its clean web UI
|
- See the magic through its clean web UI
|
||||||
- Websocket, HTTP/2, gRPC ready
|
- Websocket, HTTP/2, gRPC ready
|
||||||
- Provides metrics (Rest, Prometheus, Datadog, Statsd, InfluxDB)
|
- Provides metrics (Rest, Prometheus, Datadog, Statsd, InfluxDB 2.X)
|
||||||
- Keeps access logs (JSON, CLF)
|
- Keeps access logs (JSON, CLF)
|
||||||
- Fast
|
- Fast
|
||||||
- Exposes a Rest API
|
- Exposes a Rest API
|
||||||
|
|
|
@ -523,16 +523,6 @@ func registerMetricClients(metricsConfig *types.Metrics) []metrics.Registry {
|
||||||
Msg("Configured StatsD metrics")
|
Msg("Configured StatsD metrics")
|
||||||
}
|
}
|
||||||
|
|
||||||
if metricsConfig.InfluxDB != nil {
|
|
||||||
logger := log.With().Str(logs.MetricsProviderName, "influxdb").Logger()
|
|
||||||
|
|
||||||
registries = append(registries, metrics.RegisterInfluxDB(logger.WithContext(context.Background()), metricsConfig.InfluxDB))
|
|
||||||
logger.Debug().
|
|
||||||
Str("address", metricsConfig.InfluxDB.Address).
|
|
||||||
Str("pushInterval", metricsConfig.InfluxDB.PushInterval.String()).
|
|
||||||
Msg("Configured InfluxDB metrics")
|
|
||||||
}
|
|
||||||
|
|
||||||
if metricsConfig.InfluxDB2 != nil {
|
if metricsConfig.InfluxDB2 != nil {
|
||||||
logger := log.With().Str(logs.MetricsProviderName, "influxdb2").Logger()
|
logger := log.With().Str(logs.MetricsProviderName, "influxdb2").Logger()
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ In v3, the reported status code for gRPC requests is now the value of the `Grpc-
|
||||||
- The `tls.caOptional` option has been removed from the ForwardAuth middleware, as well as from the HTTP, Consul, Etcd, Redis, ZooKeeper, Consul Catalog, and Docker providers.
|
- The `tls.caOptional` option has been removed from the ForwardAuth middleware, as well as from the HTTP, Consul, Etcd, Redis, ZooKeeper, Consul Catalog, and Docker providers.
|
||||||
- `sslRedirect`, `sslTemporaryRedirect`, `sslHost`, `sslForceHost` and `featurePolicy` options of the Headers middleware have been removed.
|
- `sslRedirect`, `sslTemporaryRedirect`, `sslHost`, `sslForceHost` and `featurePolicy` options of the Headers middleware have been removed.
|
||||||
- The `forceSlash` option of the StripPrefix middleware has been removed.
|
- The `forceSlash` option of the StripPrefix middleware has been removed.
|
||||||
- the `preferServerCipherSuites` option has been removed.
|
- The `preferServerCipherSuites` option has been removed.
|
||||||
|
|
||||||
## Matchers
|
## Matchers
|
||||||
|
|
||||||
|
@ -76,3 +76,7 @@ As such, Rancher 2.x users should utilize the [Kubernetes CRD provider](../provi
|
||||||
## Marathon provider
|
## Marathon provider
|
||||||
|
|
||||||
In v3, the Marathon provider has been removed.
|
In v3, the Marathon provider has been removed.
|
||||||
|
|
||||||
|
## InfluxDB v1
|
||||||
|
|
||||||
|
In v3, the InfluxDB v1 metrics provider has been removed because InfluxDB v1.x maintenance [ended in 2021](https://www.influxdata.com/blog/influxdb-oss-and-enterprise-roadmap-update-from-influxdays-emea/).
|
||||||
|
|
|
@ -1,268 +0,0 @@
|
||||||
---
|
|
||||||
title: "Traefik InfluxDB Documentation"
|
|
||||||
description: "Traefik supports several metrics backends, including InfluxDB. Learn how to implement it for observability in Traefik Proxy. Read the technical documentation."
|
|
||||||
---
|
|
||||||
|
|
||||||
# InfluxDB
|
|
||||||
|
|
||||||
To enable the InfluxDB:
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB: {}
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb=true
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `address`
|
|
||||||
|
|
||||||
_Required, Default="localhost:8089"_
|
|
||||||
|
|
||||||
Address instructs exporter to send metrics to influxdb at this address.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
address: localhost:8089
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
address = "localhost:8089"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.address=localhost:8089
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `protocol`
|
|
||||||
|
|
||||||
_Required, Default="udp"_
|
|
||||||
|
|
||||||
InfluxDB's address protocol (udp or http).
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
protocol: udp
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
protocol = "udp"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.protocol=udp
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `database`
|
|
||||||
|
|
||||||
_Optional, Default=""_
|
|
||||||
|
|
||||||
InfluxDB database used when protocol is http.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
database: db
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
database = "db"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.database=db
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `retentionPolicy`
|
|
||||||
|
|
||||||
_Optional, Default=""_
|
|
||||||
|
|
||||||
InfluxDB retention policy used when protocol is http.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
retentionPolicy: two_hours
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
retentionPolicy = "two_hours"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.retentionPolicy=two_hours
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `username`
|
|
||||||
|
|
||||||
_Optional, Default=""_
|
|
||||||
|
|
||||||
InfluxDB username (only with http).
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
username: john
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
username = "john"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.username=john
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `password`
|
|
||||||
|
|
||||||
_Optional, Default=""_
|
|
||||||
|
|
||||||
InfluxDB password (only with http).
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
password: secret
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
password = "secret"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.password=secret
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `addEntryPointsLabels`
|
|
||||||
|
|
||||||
_Optional, Default=true_
|
|
||||||
|
|
||||||
Enable metrics on entry points.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
addEntryPointsLabels: true
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
addEntryPointsLabels = true
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.addEntryPointsLabels=true
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `addRoutersLabels`
|
|
||||||
|
|
||||||
_Optional, Default=false_
|
|
||||||
|
|
||||||
Enable metrics on routers.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
addRoutersLabels: true
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
addRoutersLabels = true
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.addrouterslabels=true
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `addServicesLabels`
|
|
||||||
|
|
||||||
_Optional, Default=true_
|
|
||||||
|
|
||||||
Enable metrics on services.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
addServicesLabels: true
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
addServicesLabels = true
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.addServicesLabels=true
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `pushInterval`
|
|
||||||
|
|
||||||
_Optional, Default=10s_
|
|
||||||
|
|
||||||
The interval used by the exporter to push metrics to influxdb.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
pushInterval: 10s
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
pushInterval = "10s"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.pushInterval=10s
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `additionalLabels`
|
|
||||||
|
|
||||||
_Optional, Default={}_
|
|
||||||
|
|
||||||
Additional labels (influxdb tags) on all metrics.
|
|
||||||
|
|
||||||
```yaml tab="File (YAML)"
|
|
||||||
metrics:
|
|
||||||
influxDB:
|
|
||||||
additionalLabels:
|
|
||||||
host: example.com
|
|
||||||
environment: production
|
|
||||||
```
|
|
||||||
|
|
||||||
```toml tab="File (TOML)"
|
|
||||||
[metrics]
|
|
||||||
[metrics.influxDB]
|
|
||||||
[metrics.influxDB.additionalLabels]
|
|
||||||
host = "example.com"
|
|
||||||
environment = "production"
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash tab="CLI"
|
|
||||||
--metrics.influxdb.additionallabels.host=example.com --metrics.influxdb.additionallabels.environment=production
|
|
||||||
```
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: "Traefik Metrics Overview"
|
title: "Traefik Metrics Overview"
|
||||||
description: "Traefik Proxy supports these metrics backend systems: Datadog, InfluxDB, Prometheus, and StatsD. Read the full documentation to get started."
|
description: "Traefik Proxy supports these metrics backend systems: Datadog, InfluxDB 2.X, Prometheus, and StatsD. Read the full documentation to get started."
|
||||||
---
|
---
|
||||||
|
|
||||||
# Metrics
|
# Metrics
|
||||||
|
@ -8,7 +8,6 @@ description: "Traefik Proxy supports these metrics backend systems: Datadog, Inf
|
||||||
Traefik supports these metrics backends:
|
Traefik supports these metrics backends:
|
||||||
|
|
||||||
- [Datadog](./datadog.md)
|
- [Datadog](./datadog.md)
|
||||||
- [InfluxDB](./influxdb.md)
|
|
||||||
- [InfluxDB2](./influxdb2.md)
|
- [InfluxDB2](./influxdb2.md)
|
||||||
- [Prometheus](./prometheus.md)
|
- [Prometheus](./prometheus.md)
|
||||||
- [StatsD](./statsd.md)
|
- [StatsD](./statsd.md)
|
||||||
|
@ -35,7 +34,7 @@ config.reload.lastSuccessTimestamp
|
||||||
tls.certs.notAfterTimestamp
|
tls.certs.notAfterTimestamp
|
||||||
```
|
```
|
||||||
|
|
||||||
```influxdb tab="InfluxDB / InfluxDB2"
|
```influxdb tab="InfluxDB2"
|
||||||
traefik.config.reload.total
|
traefik.config.reload.total
|
||||||
traefik.config.reload.lastSuccessTimestamp
|
traefik.config.reload.lastSuccessTimestamp
|
||||||
traefik.tls.certs.notAfterTimestamp
|
traefik.tls.certs.notAfterTimestamp
|
||||||
|
@ -77,7 +76,7 @@ entrypoint.requests.bytes.total
|
||||||
entrypoint.responses.bytes.total
|
entrypoint.responses.bytes.total
|
||||||
```
|
```
|
||||||
|
|
||||||
```influxdb tab="InfluxDB / InfluxDB2"
|
```influxdb tab="InfluxDB2"
|
||||||
traefik.entrypoint.requests.total
|
traefik.entrypoint.requests.total
|
||||||
traefik.entrypoint.requests.tls.total
|
traefik.entrypoint.requests.tls.total
|
||||||
traefik.entrypoint.request.duration
|
traefik.entrypoint.request.duration
|
||||||
|
@ -125,7 +124,7 @@ router.requests.bytes.total
|
||||||
router.responses.bytes.total
|
router.responses.bytes.total
|
||||||
```
|
```
|
||||||
|
|
||||||
```influxdb tab="InfluxDB / InfluxDB2"
|
```influxdb tab="InfluxDB2"
|
||||||
traefik.router.requests.total
|
traefik.router.requests.total
|
||||||
traefik.router.requests.tls.total
|
traefik.router.requests.tls.total
|
||||||
traefik.router.request.duration
|
traefik.router.request.duration
|
||||||
|
@ -179,7 +178,7 @@ service.requests.bytes.total
|
||||||
service.responses.bytes.total
|
service.responses.bytes.total
|
||||||
```
|
```
|
||||||
|
|
||||||
```influxdb tab="InfluxDB / InfluxDB2"
|
```influxdb tab="InfluxDB2"
|
||||||
traefik.service.requests.total
|
traefik.service.requests.total
|
||||||
traefik.service.requests.tls.total
|
traefik.service.requests.tls.total
|
||||||
traefik.service.request.duration
|
traefik.service.request.duration
|
||||||
|
|
|
@ -288,42 +288,6 @@ Prefix to use for metrics collection. (Default: ```traefik```)
|
||||||
`--metrics.datadog.pushinterval`:
|
`--metrics.datadog.pushinterval`:
|
||||||
Datadog push interval. (Default: ```10```)
|
Datadog push interval. (Default: ```10```)
|
||||||
|
|
||||||
`--metrics.influxdb`:
|
|
||||||
InfluxDB metrics exporter type. (Default: ```false```)
|
|
||||||
|
|
||||||
`--metrics.influxdb.addentrypointslabels`:
|
|
||||||
Enable metrics on entry points. (Default: ```true```)
|
|
||||||
|
|
||||||
`--metrics.influxdb.additionallabels.<name>`:
|
|
||||||
Additional labels (influxdb tags) on all metrics
|
|
||||||
|
|
||||||
`--metrics.influxdb.address`:
|
|
||||||
InfluxDB address. (Default: ```localhost:8089```)
|
|
||||||
|
|
||||||
`--metrics.influxdb.addrouterslabels`:
|
|
||||||
Enable metrics on routers. (Default: ```false```)
|
|
||||||
|
|
||||||
`--metrics.influxdb.addserviceslabels`:
|
|
||||||
Enable metrics on services. (Default: ```true```)
|
|
||||||
|
|
||||||
`--metrics.influxdb.database`:
|
|
||||||
InfluxDB database used when protocol is http.
|
|
||||||
|
|
||||||
`--metrics.influxdb.password`:
|
|
||||||
InfluxDB password (only with http).
|
|
||||||
|
|
||||||
`--metrics.influxdb.protocol`:
|
|
||||||
InfluxDB address protocol (udp or http). (Default: ```udp```)
|
|
||||||
|
|
||||||
`--metrics.influxdb.pushinterval`:
|
|
||||||
InfluxDB push interval. (Default: ```10```)
|
|
||||||
|
|
||||||
`--metrics.influxdb.retentionpolicy`:
|
|
||||||
InfluxDB retention policy used when protocol is http.
|
|
||||||
|
|
||||||
`--metrics.influxdb.username`:
|
|
||||||
InfluxDB username (only with http).
|
|
||||||
|
|
||||||
`--metrics.influxdb2`:
|
`--metrics.influxdb2`:
|
||||||
InfluxDB v2 metrics exporter type. (Default: ```false```)
|
InfluxDB v2 metrics exporter type. (Default: ```false```)
|
||||||
|
|
||||||
|
|
|
@ -288,9 +288,6 @@ Prefix to use for metrics collection. (Default: ```traefik```)
|
||||||
`TRAEFIK_METRICS_DATADOG_PUSHINTERVAL`:
|
`TRAEFIK_METRICS_DATADOG_PUSHINTERVAL`:
|
||||||
Datadog push interval. (Default: ```10```)
|
Datadog push interval. (Default: ```10```)
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB`:
|
|
||||||
InfluxDB metrics exporter type. (Default: ```false```)
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB2`:
|
`TRAEFIK_METRICS_INFLUXDB2`:
|
||||||
InfluxDB v2 metrics exporter type. (Default: ```false```)
|
InfluxDB v2 metrics exporter type. (Default: ```false```)
|
||||||
|
|
||||||
|
@ -321,39 +318,6 @@ InfluxDB v2 push interval. (Default: ```10```)
|
||||||
`TRAEFIK_METRICS_INFLUXDB2_TOKEN`:
|
`TRAEFIK_METRICS_INFLUXDB2_TOKEN`:
|
||||||
InfluxDB v2 access token.
|
InfluxDB v2 access token.
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_ADDENTRYPOINTSLABELS`:
|
|
||||||
Enable metrics on entry points. (Default: ```true```)
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_ADDITIONALLABELS_<NAME>`:
|
|
||||||
Additional labels (influxdb tags) on all metrics
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_ADDRESS`:
|
|
||||||
InfluxDB address. (Default: ```localhost:8089```)
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_ADDROUTERSLABELS`:
|
|
||||||
Enable metrics on routers. (Default: ```false```)
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_ADDSERVICESLABELS`:
|
|
||||||
Enable metrics on services. (Default: ```true```)
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_DATABASE`:
|
|
||||||
InfluxDB database used when protocol is http.
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_PASSWORD`:
|
|
||||||
InfluxDB password (only with http).
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_PROTOCOL`:
|
|
||||||
InfluxDB address protocol (udp or http). (Default: ```udp```)
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_PUSHINTERVAL`:
|
|
||||||
InfluxDB push interval. (Default: ```10```)
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_RETENTIONPOLICY`:
|
|
||||||
InfluxDB retention policy used when protocol is http.
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_INFLUXDB_USERNAME`:
|
|
||||||
InfluxDB username (only with http).
|
|
||||||
|
|
||||||
`TRAEFIK_METRICS_OPENTELEMETRY`:
|
`TRAEFIK_METRICS_OPENTELEMETRY`:
|
||||||
OpenTelemetry metrics exporter type. (Default: ```false```)
|
OpenTelemetry metrics exporter type. (Default: ```false```)
|
||||||
|
|
||||||
|
|
|
@ -269,20 +269,6 @@
|
||||||
addRoutersLabels = true
|
addRoutersLabels = true
|
||||||
addServicesLabels = true
|
addServicesLabels = true
|
||||||
prefix = "foobar"
|
prefix = "foobar"
|
||||||
[metrics.influxDB]
|
|
||||||
address = "foobar"
|
|
||||||
protocol = "foobar"
|
|
||||||
pushInterval = "42s"
|
|
||||||
database = "foobar"
|
|
||||||
retentionPolicy = "foobar"
|
|
||||||
username = "foobar"
|
|
||||||
password = "foobar"
|
|
||||||
addEntryPointsLabels = true
|
|
||||||
addRoutersLabels = true
|
|
||||||
addServicesLabels = true
|
|
||||||
[metrics.influxDB.additionalLabels]
|
|
||||||
name0 = "foobar"
|
|
||||||
name1 = "foobar"
|
|
||||||
[metrics.influxDB2]
|
[metrics.influxDB2]
|
||||||
address = "foobar"
|
address = "foobar"
|
||||||
token = "foobar"
|
token = "foobar"
|
||||||
|
|
|
@ -298,20 +298,6 @@ metrics:
|
||||||
addRoutersLabels: true
|
addRoutersLabels: true
|
||||||
addServicesLabels: true
|
addServicesLabels: true
|
||||||
prefix: foobar
|
prefix: foobar
|
||||||
influxDB:
|
|
||||||
address: foobar
|
|
||||||
protocol: foobar
|
|
||||||
pushInterval: 42s
|
|
||||||
database: foobar
|
|
||||||
retentionPolicy: foobar
|
|
||||||
username: foobar
|
|
||||||
password: foobar
|
|
||||||
addEntryPointsLabels: true
|
|
||||||
addRoutersLabels: true
|
|
||||||
addServicesLabels: true
|
|
||||||
additionalLabels:
|
|
||||||
name0: foobar
|
|
||||||
name1: foobar
|
|
||||||
influxDB2:
|
influxDB2:
|
||||||
address: foobar
|
address: foobar
|
||||||
token: foobar
|
token: foobar
|
||||||
|
|
|
@ -151,7 +151,6 @@ nav:
|
||||||
- 'Metrics':
|
- 'Metrics':
|
||||||
- 'Overview': 'observability/metrics/overview.md'
|
- 'Overview': 'observability/metrics/overview.md'
|
||||||
- 'Datadog': 'observability/metrics/datadog.md'
|
- 'Datadog': 'observability/metrics/datadog.md'
|
||||||
- 'InfluxDB': 'observability/metrics/influxdb.md'
|
|
||||||
- 'InfluxDB2': 'observability/metrics/influxdb2.md'
|
- 'InfluxDB2': 'observability/metrics/influxdb2.md'
|
||||||
- 'OpenTelemetry': 'observability/metrics/opentelemetry.md'
|
- 'OpenTelemetry': 'observability/metrics/opentelemetry.md'
|
||||||
- 'Prometheus': 'observability/metrics/prometheus.md'
|
- 'Prometheus': 'observability/metrics/prometheus.md'
|
||||||
|
|
|
@ -93,14 +93,6 @@
|
||||||
[metrics.statsD]
|
[metrics.statsD]
|
||||||
address = "foobar"
|
address = "foobar"
|
||||||
pushInterval = "10s"
|
pushInterval = "10s"
|
||||||
[metrics.influxDB]
|
|
||||||
address = "foobar"
|
|
||||||
protocol = "foobar"
|
|
||||||
pushInterval = "10s"
|
|
||||||
database = "foobar"
|
|
||||||
retentionPolicy = "foobar"
|
|
||||||
username = "foobar"
|
|
||||||
password = "foobar"
|
|
||||||
|
|
||||||
[ping]
|
[ping]
|
||||||
entryPoint = "foobar"
|
entryPoint = "foobar"
|
||||||
|
|
|
@ -1,249 +0,0 @@
|
||||||
package metrics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"regexp"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/go-kit/kit/metrics/influx"
|
|
||||||
influxdb "github.com/influxdata/influxdb1-client/v2"
|
|
||||||
"github.com/rs/zerolog/log"
|
|
||||||
"github.com/traefik/traefik/v2/pkg/logs"
|
|
||||||
"github.com/traefik/traefik/v2/pkg/safe"
|
|
||||||
"github.com/traefik/traefik/v2/pkg/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
influxDBClient *influx.Influx
|
|
||||||
influxDBTicker *time.Ticker
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
influxDBConfigReloadsName = "traefik.config.reload.total"
|
|
||||||
influxDBConfigReloadsFailureName = influxDBConfigReloadsName + ".failure"
|
|
||||||
influxDBLastConfigReloadSuccessName = "traefik.config.reload.lastSuccessTimestamp"
|
|
||||||
influxDBLastConfigReloadFailureName = "traefik.config.reload.lastFailureTimestamp"
|
|
||||||
|
|
||||||
influxDBTLSCertsNotAfterTimestampName = "traefik.tls.certs.notAfterTimestamp"
|
|
||||||
|
|
||||||
influxDBEntryPointReqsName = "traefik.entrypoint.requests.total"
|
|
||||||
influxDBEntryPointReqsTLSName = "traefik.entrypoint.requests.tls.total"
|
|
||||||
influxDBEntryPointReqDurationName = "traefik.entrypoint.request.duration"
|
|
||||||
influxDBEntryPointOpenConnsName = "traefik.entrypoint.connections.open"
|
|
||||||
influxDBEntryPointReqsBytesName = "traefik.entrypoint.requests.bytes.total"
|
|
||||||
influxDBEntryPointRespsBytesName = "traefik.entrypoint.responses.bytes.total"
|
|
||||||
|
|
||||||
influxDBRouterReqsName = "traefik.router.requests.total"
|
|
||||||
influxDBRouterReqsTLSName = "traefik.router.requests.tls.total"
|
|
||||||
influxDBRouterReqsDurationName = "traefik.router.request.duration"
|
|
||||||
influxDBORouterOpenConnsName = "traefik.router.connections.open"
|
|
||||||
influxDBRouterReqsBytesName = "traefik.router.requests.bytes.total"
|
|
||||||
influxDBRouterRespsBytesName = "traefik.router.responses.bytes.total"
|
|
||||||
|
|
||||||
influxDBServiceReqsName = "traefik.service.requests.total"
|
|
||||||
influxDBServiceReqsTLSName = "traefik.service.requests.tls.total"
|
|
||||||
influxDBServiceReqsDurationName = "traefik.service.request.duration"
|
|
||||||
influxDBServiceRetriesTotalName = "traefik.service.retries.total"
|
|
||||||
influxDBServiceOpenConnsName = "traefik.service.connections.open"
|
|
||||||
influxDBServiceServerUpName = "traefik.service.server.up"
|
|
||||||
influxDBServiceReqsBytesName = "traefik.service.requests.bytes.total"
|
|
||||||
influxDBServiceRespsBytesName = "traefik.service.responses.bytes.total"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
protocolHTTP = "http"
|
|
||||||
protocolUDP = "udp"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RegisterInfluxDB registers the metrics pusher if this didn't happen yet and creates a InfluxDB Registry instance.
|
|
||||||
func RegisterInfluxDB(ctx context.Context, config *types.InfluxDB) Registry {
|
|
||||||
if influxDBClient == nil {
|
|
||||||
influxDBClient = initInfluxDBClient(ctx, config)
|
|
||||||
}
|
|
||||||
if influxDBTicker == nil {
|
|
||||||
influxDBTicker = initInfluxDBTicker(ctx, config)
|
|
||||||
}
|
|
||||||
|
|
||||||
registry := &standardRegistry{
|
|
||||||
configReloadsCounter: influxDBClient.NewCounter(influxDBConfigReloadsName),
|
|
||||||
configReloadsFailureCounter: influxDBClient.NewCounter(influxDBConfigReloadsFailureName),
|
|
||||||
lastConfigReloadSuccessGauge: influxDBClient.NewGauge(influxDBLastConfigReloadSuccessName),
|
|
||||||
lastConfigReloadFailureGauge: influxDBClient.NewGauge(influxDBLastConfigReloadFailureName),
|
|
||||||
tlsCertsNotAfterTimestampGauge: influxDBClient.NewGauge(influxDBTLSCertsNotAfterTimestampName),
|
|
||||||
}
|
|
||||||
|
|
||||||
if config.AddEntryPointsLabels {
|
|
||||||
registry.epEnabled = config.AddEntryPointsLabels
|
|
||||||
registry.entryPointReqsCounter = influxDBClient.NewCounter(influxDBEntryPointReqsName)
|
|
||||||
registry.entryPointReqsTLSCounter = influxDBClient.NewCounter(influxDBEntryPointReqsTLSName)
|
|
||||||
registry.entryPointReqDurationHistogram, _ = NewHistogramWithScale(influxDBClient.NewHistogram(influxDBEntryPointReqDurationName), time.Second)
|
|
||||||
registry.entryPointOpenConnsGauge = influxDBClient.NewGauge(influxDBEntryPointOpenConnsName)
|
|
||||||
registry.entryPointReqsBytesCounter = influxDBClient.NewCounter(influxDBEntryPointReqsBytesName)
|
|
||||||
registry.entryPointRespsBytesCounter = influxDBClient.NewCounter(influxDBEntryPointRespsBytesName)
|
|
||||||
}
|
|
||||||
|
|
||||||
if config.AddRoutersLabels {
|
|
||||||
registry.routerEnabled = config.AddRoutersLabels
|
|
||||||
registry.routerReqsCounter = influxDBClient.NewCounter(influxDBRouterReqsName)
|
|
||||||
registry.routerReqsTLSCounter = influxDBClient.NewCounter(influxDBRouterReqsTLSName)
|
|
||||||
registry.routerReqDurationHistogram, _ = NewHistogramWithScale(influxDBClient.NewHistogram(influxDBRouterReqsDurationName), time.Second)
|
|
||||||
registry.routerOpenConnsGauge = influxDBClient.NewGauge(influxDBORouterOpenConnsName)
|
|
||||||
registry.routerReqsBytesCounter = influxDBClient.NewCounter(influxDBRouterReqsBytesName)
|
|
||||||
registry.routerRespsBytesCounter = influxDBClient.NewCounter(influxDBRouterRespsBytesName)
|
|
||||||
}
|
|
||||||
|
|
||||||
if config.AddServicesLabels {
|
|
||||||
registry.svcEnabled = config.AddServicesLabels
|
|
||||||
registry.serviceReqsCounter = influxDBClient.NewCounter(influxDBServiceReqsName)
|
|
||||||
registry.serviceReqsTLSCounter = influxDBClient.NewCounter(influxDBServiceReqsTLSName)
|
|
||||||
registry.serviceReqDurationHistogram, _ = NewHistogramWithScale(influxDBClient.NewHistogram(influxDBServiceReqsDurationName), time.Second)
|
|
||||||
registry.serviceRetriesCounter = influxDBClient.NewCounter(influxDBServiceRetriesTotalName)
|
|
||||||
registry.serviceOpenConnsGauge = influxDBClient.NewGauge(influxDBServiceOpenConnsName)
|
|
||||||
registry.serviceServerUpGauge = influxDBClient.NewGauge(influxDBServiceServerUpName)
|
|
||||||
registry.serviceReqsBytesCounter = influxDBClient.NewCounter(influxDBServiceReqsBytesName)
|
|
||||||
registry.serviceRespsBytesCounter = influxDBClient.NewCounter(influxDBServiceRespsBytesName)
|
|
||||||
}
|
|
||||||
|
|
||||||
return registry
|
|
||||||
}
|
|
||||||
|
|
||||||
// initInfluxDBClient creates a influxDBClient.
|
|
||||||
func initInfluxDBClient(ctx context.Context, config *types.InfluxDB) *influx.Influx {
|
|
||||||
logger := log.Ctx(ctx)
|
|
||||||
|
|
||||||
// TODO deprecated: move this switch into configuration.SetEffectiveConfiguration when web provider will be removed.
|
|
||||||
switch config.Protocol {
|
|
||||||
case protocolUDP:
|
|
||||||
if len(config.Database) > 0 || len(config.RetentionPolicy) > 0 {
|
|
||||||
logger.Warn().Msg("Database and RetentionPolicy options have no effect with UDP.")
|
|
||||||
config.Database = ""
|
|
||||||
config.RetentionPolicy = ""
|
|
||||||
}
|
|
||||||
case protocolHTTP:
|
|
||||||
if u, err := url.Parse(config.Address); err == nil {
|
|
||||||
if u.Scheme != "http" && u.Scheme != "https" {
|
|
||||||
logger.Warn().Msgf("InfluxDB address %s should specify a scheme (http or https): falling back on HTTP.", config.Address)
|
|
||||||
config.Address = "http://" + config.Address
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.Error().Err(err).Msg("Unable to parse the InfluxDB address: falling back on UDP.")
|
|
||||||
config.Protocol = protocolUDP
|
|
||||||
config.Database = ""
|
|
||||||
config.RetentionPolicy = ""
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
logger.Warn().Msgf("Unsupported protocol %s: falling back on UDP.", config.Protocol)
|
|
||||||
config.Protocol = protocolUDP
|
|
||||||
config.Database = ""
|
|
||||||
config.RetentionPolicy = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
return influx.New(
|
|
||||||
config.AdditionalLabels,
|
|
||||||
influxdb.BatchPointsConfig{
|
|
||||||
Database: config.Database,
|
|
||||||
RetentionPolicy: config.RetentionPolicy,
|
|
||||||
},
|
|
||||||
logs.NewGoKitWrapper(*logger),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// initInfluxDBTicker initializes metrics pusher.
|
|
||||||
func initInfluxDBTicker(ctx context.Context, config *types.InfluxDB) *time.Ticker {
|
|
||||||
report := time.NewTicker(time.Duration(config.PushInterval))
|
|
||||||
|
|
||||||
safe.Go(func() {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
influxDBClient.WriteLoop(ctx, report.C, &influxDBWriter{buf: buf, config: config})
|
|
||||||
})
|
|
||||||
|
|
||||||
return report
|
|
||||||
}
|
|
||||||
|
|
||||||
// StopInfluxDB stops internal influxDBTicker which controls the pushing of metrics to InfluxDB Agent and resets it to `nil`.
|
|
||||||
func StopInfluxDB() {
|
|
||||||
if influxDBTicker != nil {
|
|
||||||
influxDBTicker.Stop()
|
|
||||||
}
|
|
||||||
influxDBTicker = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type influxDBWriter struct {
|
|
||||||
buf bytes.Buffer
|
|
||||||
config *types.InfluxDB
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write creates a http or udp client and attempts to write BatchPoints.
|
|
||||||
// If a "database not found" error is encountered, a CREATE DATABASE
|
|
||||||
// query is attempted when using protocol http.
|
|
||||||
func (w *influxDBWriter) Write(bp influxdb.BatchPoints) error {
|
|
||||||
c, err := w.initWriteClient()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer c.Close()
|
|
||||||
|
|
||||||
if writeErr := c.Write(bp); writeErr != nil {
|
|
||||||
logger := log.With().Str(logs.MetricsProviderName, "influxdb").Logger()
|
|
||||||
logger.Error().Err(writeErr).Msg("Error while writing to InfluxDB")
|
|
||||||
|
|
||||||
if handleErr := w.handleWriteError(logger.WithContext(context.Background()), c, writeErr); handleErr != nil {
|
|
||||||
return handleErr
|
|
||||||
}
|
|
||||||
// Retry write after successful handling of writeErr
|
|
||||||
return c.Write(bp)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *influxDBWriter) initWriteClient() (influxdb.Client, error) {
|
|
||||||
if w.config.Protocol == "http" {
|
|
||||||
return influxdb.NewHTTPClient(influxdb.HTTPConfig{
|
|
||||||
Addr: w.config.Address,
|
|
||||||
Username: w.config.Username,
|
|
||||||
Password: w.config.Password,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return influxdb.NewUDPClient(influxdb.UDPConfig{
|
|
||||||
Addr: w.config.Address,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *influxDBWriter) handleWriteError(ctx context.Context, c influxdb.Client, writeErr error) error {
|
|
||||||
if w.config.Protocol != protocolHTTP {
|
|
||||||
return writeErr
|
|
||||||
}
|
|
||||||
|
|
||||||
match, matchErr := regexp.MatchString("database not found", writeErr.Error())
|
|
||||||
|
|
||||||
if matchErr != nil || !match {
|
|
||||||
return writeErr
|
|
||||||
}
|
|
||||||
|
|
||||||
qStr := fmt.Sprintf("CREATE DATABASE \"%s\"", w.config.Database)
|
|
||||||
if w.config.RetentionPolicy != "" {
|
|
||||||
qStr = fmt.Sprintf("%s WITH NAME \"%s\"", qStr, w.config.RetentionPolicy)
|
|
||||||
}
|
|
||||||
|
|
||||||
logger := log.Ctx(ctx)
|
|
||||||
|
|
||||||
logger.Debug().Msgf("InfluxDB database not found: attempting to create one with %s", qStr)
|
|
||||||
|
|
||||||
q := influxdb.NewQuery(qStr, "", "")
|
|
||||||
response, queryErr := c.Query(q)
|
|
||||||
if queryErr == nil && response.Error() != nil {
|
|
||||||
queryErr = response.Error()
|
|
||||||
}
|
|
||||||
if queryErr != nil {
|
|
||||||
logger.Error().Err(queryErr).Msg("Error while creating the InfluxDB database")
|
|
||||||
return queryErr
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.Debug().Msgf("Successfully created the InfluxDB database %s", w.config.Database)
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -23,6 +23,38 @@ var (
|
||||||
influxDB2Client influxdb2.Client
|
influxDB2Client influxdb2.Client
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
influxDBConfigReloadsName = "traefik.config.reload.total"
|
||||||
|
influxDBConfigReloadsFailureName = influxDBConfigReloadsName + ".failure"
|
||||||
|
influxDBLastConfigReloadSuccessName = "traefik.config.reload.lastSuccessTimestamp"
|
||||||
|
influxDBLastConfigReloadFailureName = "traefik.config.reload.lastFailureTimestamp"
|
||||||
|
|
||||||
|
influxDBTLSCertsNotAfterTimestampName = "traefik.tls.certs.notAfterTimestamp"
|
||||||
|
|
||||||
|
influxDBEntryPointReqsName = "traefik.entrypoint.requests.total"
|
||||||
|
influxDBEntryPointReqsTLSName = "traefik.entrypoint.requests.tls.total"
|
||||||
|
influxDBEntryPointReqDurationName = "traefik.entrypoint.request.duration"
|
||||||
|
influxDBEntryPointOpenConnsName = "traefik.entrypoint.connections.open"
|
||||||
|
influxDBEntryPointReqsBytesName = "traefik.entrypoint.requests.bytes.total"
|
||||||
|
influxDBEntryPointRespsBytesName = "traefik.entrypoint.responses.bytes.total"
|
||||||
|
|
||||||
|
influxDBRouterReqsName = "traefik.router.requests.total"
|
||||||
|
influxDBRouterReqsTLSName = "traefik.router.requests.tls.total"
|
||||||
|
influxDBRouterReqsDurationName = "traefik.router.request.duration"
|
||||||
|
influxDBORouterOpenConnsName = "traefik.router.connections.open"
|
||||||
|
influxDBRouterReqsBytesName = "traefik.router.requests.bytes.total"
|
||||||
|
influxDBRouterRespsBytesName = "traefik.router.responses.bytes.total"
|
||||||
|
|
||||||
|
influxDBServiceReqsName = "traefik.service.requests.total"
|
||||||
|
influxDBServiceReqsTLSName = "traefik.service.requests.tls.total"
|
||||||
|
influxDBServiceReqsDurationName = "traefik.service.request.duration"
|
||||||
|
influxDBServiceRetriesTotalName = "traefik.service.retries.total"
|
||||||
|
influxDBServiceOpenConnsName = "traefik.service.connections.open"
|
||||||
|
influxDBServiceServerUpName = "traefik.service.server.up"
|
||||||
|
influxDBServiceReqsBytesName = "traefik.service.requests.bytes.total"
|
||||||
|
influxDBServiceRespsBytesName = "traefik.service.responses.bytes.total"
|
||||||
|
)
|
||||||
|
|
||||||
// RegisterInfluxDB2 creates metrics exporter for InfluxDB2.
|
// RegisterInfluxDB2 creates metrics exporter for InfluxDB2.
|
||||||
func RegisterInfluxDB2(ctx context.Context, config *types.InfluxDB2) Registry {
|
func RegisterInfluxDB2(ctx context.Context, config *types.InfluxDB2) Registry {
|
||||||
logger := log.Ctx(ctx)
|
logger := log.Ctx(ctx)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
@ -155,3 +156,14 @@ func TestInfluxDB2(t *testing.T) {
|
||||||
|
|
||||||
assertMessage(t, *msgServiceOpenConns, expectedServiceOpenConns)
|
assertMessage(t, *msgServiceOpenConns, expectedServiceOpenConns)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func assertMessage(t *testing.T, msg string, patterns []string) {
|
||||||
|
t.Helper()
|
||||||
|
for _, pattern := range patterns {
|
||||||
|
re := regexp.MustCompile(pattern)
|
||||||
|
match := re.FindStringSubmatch(msg)
|
||||||
|
if len(match) != 2 {
|
||||||
|
t.Errorf("Got %q %v, want %q", msg, match, pattern)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,267 +0,0 @@
|
||||||
package metrics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"net/http/httptest"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"github.com/stvp/go-udp-testing"
|
|
||||||
ptypes "github.com/traefik/paerser/types"
|
|
||||||
"github.com/traefik/traefik/v2/pkg/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestInfluxDB(t *testing.T) {
|
|
||||||
udp.SetAddr(":8089")
|
|
||||||
// This is needed to make sure that UDP Listener listens for data a bit longer, otherwise it will quit after a millisecond
|
|
||||||
udp.Timeout = 5 * time.Second
|
|
||||||
|
|
||||||
influxDBClient = nil
|
|
||||||
influxDBRegistry := RegisterInfluxDB(context.Background(),
|
|
||||||
&types.InfluxDB{
|
|
||||||
Address: ":8089",
|
|
||||||
PushInterval: ptypes.Duration(time.Second),
|
|
||||||
AddEntryPointsLabels: true,
|
|
||||||
AddRoutersLabels: true,
|
|
||||||
AddServicesLabels: true,
|
|
||||||
AdditionalLabels: map[string]string{"tag1": "val1"},
|
|
||||||
})
|
|
||||||
defer StopInfluxDB()
|
|
||||||
|
|
||||||
if !influxDBRegistry.IsEpEnabled() || !influxDBRegistry.IsRouterEnabled() || !influxDBRegistry.IsSvcEnabled() {
|
|
||||||
t.Fatalf("InfluxDBRegistry should return true for IsEnabled(), IsRouterEnabled() and IsSvcEnabled()")
|
|
||||||
}
|
|
||||||
|
|
||||||
expectedServer := []string{
|
|
||||||
`(traefik\.config\.reload\.total,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.config\.reload\.total\.failure,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.config\.reload\.lastSuccessTimestamp,tag1=val1 value=1) [\d]{19}`,
|
|
||||||
`(traefik\.config\.reload\.lastFailureTimestamp,tag1=val1 value=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
msgServer := udp.ReceiveString(t, func() {
|
|
||||||
influxDBRegistry.ConfigReloadsCounter().Add(1)
|
|
||||||
influxDBRegistry.ConfigReloadsFailureCounter().Add(1)
|
|
||||||
influxDBRegistry.LastConfigReloadSuccessGauge().Set(1)
|
|
||||||
influxDBRegistry.LastConfigReloadFailureGauge().Set(1)
|
|
||||||
})
|
|
||||||
|
|
||||||
assertMessage(t, msgServer, expectedServer)
|
|
||||||
|
|
||||||
expectedTLS := []string{
|
|
||||||
`(traefik\.tls\.certs\.notAfterTimestamp,key=value,tag1=val1 value=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
msgTLS := udp.ReceiveString(t, func() {
|
|
||||||
influxDBRegistry.TLSCertsNotAfterTimestampGauge().With("key", "value").Set(1)
|
|
||||||
})
|
|
||||||
|
|
||||||
assertMessage(t, msgTLS, expectedTLS)
|
|
||||||
|
|
||||||
expectedEntrypoint := []string{
|
|
||||||
`(traefik\.entrypoint\.requests\.total,code=200,entrypoint=test,method=GET,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.requests\.tls\.total,entrypoint=test,tag1=val1,tls_cipher=bar,tls_version=foo count=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.request\.duration(?:,code=[\d]{3})?,entrypoint=test,tag1=val1 p50=10000,p90=10000,p95=10000,p99=10000) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.connections\.open,entrypoint=test,tag1=val1 value=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.requests\.bytes\.total,code=200,entrypoint=test,method=GET,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.responses\.bytes\.total,code=200,entrypoint=test,method=GET,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
msgEntrypoint := udp.ReceiveString(t, func() {
|
|
||||||
influxDBRegistry.EntryPointReqsCounter().With("entrypoint", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.EntryPointReqsTLSCounter().With("entrypoint", "test", "tls_version", "foo", "tls_cipher", "bar").Add(1)
|
|
||||||
influxDBRegistry.EntryPointReqDurationHistogram().With("entrypoint", "test").Observe(10000)
|
|
||||||
influxDBRegistry.EntryPointOpenConnsGauge().With("entrypoint", "test").Set(1)
|
|
||||||
influxDBRegistry.EntryPointReqsBytesCounter().With("entrypoint", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.EntryPointRespsBytesCounter().With("entrypoint", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
})
|
|
||||||
|
|
||||||
assertMessage(t, msgEntrypoint, expectedEntrypoint)
|
|
||||||
|
|
||||||
expectedRouter := []string{
|
|
||||||
`(traefik\.router\.requests\.total,code=200,method=GET,router=demo,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.requests\.total,code=404,method=GET,router=demo,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.requests\.tls\.total,router=demo,service=test,tag1=val1,tls_cipher=bar,tls_version=foo count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.request\.duration,code=200,router=demo,service=test,tag1=val1 p50=10000,p90=10000,p95=10000,p99=10000) [\d]{19}`,
|
|
||||||
`(traefik\.router\.connections\.open,router=demo,service=test,tag1=val1 value=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.requests\.bytes\.total,code=200,method=GET,router=demo,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.responses\.bytes\.total,code=200,method=GET,router=demo,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
msgRouter := udp.ReceiveString(t, func() {
|
|
||||||
influxDBRegistry.RouterReqsCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusNotFound), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.RouterReqsCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.RouterReqsTLSCounter().With("router", "demo", "service", "test", "tls_version", "foo", "tls_cipher", "bar").Add(1)
|
|
||||||
influxDBRegistry.RouterReqDurationHistogram().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK)).Observe(10000)
|
|
||||||
influxDBRegistry.RouterOpenConnsGauge().With("router", "demo", "service", "test").Set(1)
|
|
||||||
influxDBRegistry.RouterReqsBytesCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.RouterRespsBytesCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
})
|
|
||||||
|
|
||||||
assertMessage(t, msgRouter, expectedRouter)
|
|
||||||
|
|
||||||
expectedService := []string{
|
|
||||||
`(traefik\.service\.requests\.total,code=200,method=GET,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.requests\.total,code=404,method=GET,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.requests\.tls\.total,service=test,tag1=val1,tls_cipher=bar,tls_version=foo count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.request\.duration,code=200,service=test,tag1=val1 p50=10000,p90=10000,p95=10000,p99=10000) [\d]{19}`,
|
|
||||||
`(traefik\.service\.retries\.total(?:,code=[\d]{3},method=GET)?,service=test,tag1=val1 count=2) [\d]{19}`,
|
|
||||||
`(traefik\.service\.server\.up,service=test,tag1=val1,url=http://127.0.0.1 value=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.connections\.open,service=test,tag1=val1 value=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.requests\.bytes\.total,code=200,method=GET,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.responses\.bytes\.total,code=200,method=GET,service=test,tag1=val1 count=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
msgService := udp.ReceiveString(t, func() {
|
|
||||||
influxDBRegistry.ServiceReqsCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.ServiceReqsCounter().With("service", "test", "code", strconv.Itoa(http.StatusNotFound), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.ServiceReqsTLSCounter().With("service", "test", "tls_version", "foo", "tls_cipher", "bar").Add(1)
|
|
||||||
influxDBRegistry.ServiceReqDurationHistogram().With("service", "test", "code", strconv.Itoa(http.StatusOK)).Observe(10000)
|
|
||||||
influxDBRegistry.ServiceOpenConnsGauge().With("service", "test").Set(1)
|
|
||||||
influxDBRegistry.ServiceRetriesCounter().With("service", "test").Add(1)
|
|
||||||
influxDBRegistry.ServiceRetriesCounter().With("service", "test").Add(1)
|
|
||||||
influxDBRegistry.ServiceServerUpGauge().With("service", "test", "url", "http://127.0.0.1").Set(1)
|
|
||||||
influxDBRegistry.ServiceReqsBytesCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.ServiceRespsBytesCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
})
|
|
||||||
|
|
||||||
assertMessage(t, msgService, expectedService)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestInfluxDBHTTP(t *testing.T) {
|
|
||||||
c := make(chan *string)
|
|
||||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
body, err := io.ReadAll(r.Body)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
bodyStr := string(body)
|
|
||||||
c <- &bodyStr
|
|
||||||
_, _ = fmt.Fprintln(w, "ok")
|
|
||||||
}))
|
|
||||||
defer ts.Close()
|
|
||||||
|
|
||||||
influxDBClient = nil
|
|
||||||
influxDBRegistry := RegisterInfluxDB(context.Background(),
|
|
||||||
&types.InfluxDB{
|
|
||||||
Address: ts.URL,
|
|
||||||
Protocol: "http",
|
|
||||||
PushInterval: ptypes.Duration(10 * time.Millisecond),
|
|
||||||
Database: "test",
|
|
||||||
RetentionPolicy: "autogen",
|
|
||||||
AddEntryPointsLabels: true,
|
|
||||||
AddServicesLabels: true,
|
|
||||||
AddRoutersLabels: true,
|
|
||||||
})
|
|
||||||
defer StopInfluxDB()
|
|
||||||
|
|
||||||
if !influxDBRegistry.IsEpEnabled() || !influxDBRegistry.IsRouterEnabled() || !influxDBRegistry.IsSvcEnabled() {
|
|
||||||
t.Fatalf("InfluxDB registry must be epEnabled")
|
|
||||||
}
|
|
||||||
|
|
||||||
expectedServer := []string{
|
|
||||||
`(traefik\.config\.reload\.total count=1) [\d]{19}`,
|
|
||||||
`(traefik\.config\.reload\.total\.failure count=1) [\d]{19}`,
|
|
||||||
`(traefik\.config\.reload\.lastSuccessTimestamp value=1) [\d]{19}`,
|
|
||||||
`(traefik\.config\.reload\.lastFailureTimestamp value=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
influxDBRegistry.ConfigReloadsCounter().Add(1)
|
|
||||||
influxDBRegistry.ConfigReloadsFailureCounter().Add(1)
|
|
||||||
influxDBRegistry.LastConfigReloadSuccessGauge().Set(1)
|
|
||||||
influxDBRegistry.LastConfigReloadFailureGauge().Set(1)
|
|
||||||
msgServer := <-c
|
|
||||||
|
|
||||||
assertMessage(t, *msgServer, expectedServer)
|
|
||||||
|
|
||||||
expectedTLS := []string{
|
|
||||||
`(traefik\.tls\.certs\.notAfterTimestamp,key=value value=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
influxDBRegistry.TLSCertsNotAfterTimestampGauge().With("key", "value").Set(1)
|
|
||||||
msgTLS := <-c
|
|
||||||
|
|
||||||
assertMessage(t, *msgTLS, expectedTLS)
|
|
||||||
|
|
||||||
expectedEntrypoint := []string{
|
|
||||||
`(traefik\.entrypoint\.requests\.total,code=200,entrypoint=test,method=GET count=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.requests\.tls\.total,entrypoint=test,tls_cipher=bar,tls_version=foo count=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.request\.duration(?:,code=[\d]{3})?,entrypoint=test p50=10000,p90=10000,p95=10000,p99=10000) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.connections\.open,entrypoint=test value=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.requests\.bytes\.total,code=200,entrypoint=test,method=GET count=1) [\d]{19}`,
|
|
||||||
`(traefik\.entrypoint\.responses\.bytes\.total,code=200,entrypoint=test,method=GET count=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
influxDBRegistry.EntryPointReqsCounter().With("entrypoint", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.EntryPointReqsTLSCounter().With("entrypoint", "test", "tls_version", "foo", "tls_cipher", "bar").Add(1)
|
|
||||||
influxDBRegistry.EntryPointReqDurationHistogram().With("entrypoint", "test").Observe(10000)
|
|
||||||
influxDBRegistry.EntryPointOpenConnsGauge().With("entrypoint", "test").Set(1)
|
|
||||||
influxDBRegistry.EntryPointReqsBytesCounter().With("entrypoint", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.EntryPointRespsBytesCounter().With("entrypoint", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
msgEntrypoint := <-c
|
|
||||||
|
|
||||||
assertMessage(t, *msgEntrypoint, expectedEntrypoint)
|
|
||||||
|
|
||||||
expectedRouter := []string{
|
|
||||||
`(traefik\.router\.requests\.total,code=200,method=GET,router=demo,service=test count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.requests\.total,code=404,method=GET,router=demo,service=test count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.requests\.tls\.total,router=demo,service=test,tls_cipher=bar,tls_version=foo count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.request\.duration,code=200,router=demo,service=test p50=10000,p90=10000,p95=10000,p99=10000) [\d]{19}`,
|
|
||||||
`(traefik\.router\.connections\.open,router=demo,service=test value=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.requests\.bytes\.total,code=200,method=GET,router=demo,service=test count=1) [\d]{19}`,
|
|
||||||
`(traefik\.router\.responses\.bytes\.total,code=200,method=GET,router=demo,service=test count=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
influxDBRegistry.RouterReqsCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusNotFound), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.RouterReqsCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.RouterReqsTLSCounter().With("router", "demo", "service", "test", "tls_version", "foo", "tls_cipher", "bar").Add(1)
|
|
||||||
influxDBRegistry.RouterReqDurationHistogram().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK)).Observe(10000)
|
|
||||||
influxDBRegistry.RouterOpenConnsGauge().With("router", "demo", "service", "test").Set(1)
|
|
||||||
influxDBRegistry.RouterReqsBytesCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.RouterRespsBytesCounter().With("router", "demo", "service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
msgRouter := <-c
|
|
||||||
|
|
||||||
assertMessage(t, *msgRouter, expectedRouter)
|
|
||||||
|
|
||||||
expectedService := []string{
|
|
||||||
`(traefik\.service\.requests\.total,code=200,method=GET,service=test count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.requests\.total,code=404,method=GET,service=test count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.requests\.tls\.total,service=test,tls_cipher=bar,tls_version=foo count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.request\.duration,code=200,service=test p50=10000,p90=10000,p95=10000,p99=10000) [\d]{19}`,
|
|
||||||
`(traefik\.service\.retries\.total(?:,code=[\d]{3},method=GET)?,service=test count=2) [\d]{19}`,
|
|
||||||
`(traefik\.service\.server\.up,service=test,url=http://127.0.0.1 value=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.connections\.open,service=test value=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.requests\.bytes\.total,code=200,method=GET,service=test count=1) [\d]{19}`,
|
|
||||||
`(traefik\.service\.responses\.bytes\.total,code=200,method=GET,service=test count=1) [\d]{19}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
influxDBRegistry.ServiceReqsCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.ServiceReqsCounter().With("service", "test", "code", strconv.Itoa(http.StatusNotFound), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.ServiceReqsTLSCounter().With("service", "test", "tls_version", "foo", "tls_cipher", "bar").Add(1)
|
|
||||||
influxDBRegistry.ServiceReqDurationHistogram().With("service", "test", "code", strconv.Itoa(http.StatusOK)).Observe(10000)
|
|
||||||
influxDBRegistry.ServiceOpenConnsGauge().With("service", "test").Set(1)
|
|
||||||
influxDBRegistry.ServiceRetriesCounter().With("service", "test").Add(1)
|
|
||||||
influxDBRegistry.ServiceRetriesCounter().With("service", "test").Add(1)
|
|
||||||
influxDBRegistry.ServiceServerUpGauge().With("service", "test", "url", "http://127.0.0.1").Set(1)
|
|
||||||
influxDBRegistry.ServiceReqsBytesCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
influxDBRegistry.ServiceRespsBytesCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
||||||
msgService := <-c
|
|
||||||
|
|
||||||
assertMessage(t, *msgService, expectedService)
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertMessage(t *testing.T, msg string, patterns []string) {
|
|
||||||
t.Helper()
|
|
||||||
for _, pattern := range patterns {
|
|
||||||
re := regexp.MustCompile(pattern)
|
|
||||||
match := re.FindStringSubmatch(msg)
|
|
||||||
if len(match) != 2 {
|
|
||||||
t.Errorf("Got %q %v, want %q", msg, match, pattern)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -784,17 +784,6 @@ func TestDo_staticConfiguration(t *testing.T) {
|
||||||
AddServicesLabels: true,
|
AddServicesLabels: true,
|
||||||
Prefix: "MyPrefix",
|
Prefix: "MyPrefix",
|
||||||
},
|
},
|
||||||
InfluxDB: &types.InfluxDB{
|
|
||||||
Address: "localhost:8183",
|
|
||||||
Protocol: "http",
|
|
||||||
PushInterval: 42,
|
|
||||||
Database: "myDB",
|
|
||||||
RetentionPolicy: "12",
|
|
||||||
Username: "a",
|
|
||||||
Password: "aaaa",
|
|
||||||
AddEntryPointsLabels: true,
|
|
||||||
AddServicesLabels: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config.Ping = &ping.Handler{
|
config.Ping = &ping.Handler{
|
||||||
|
|
|
@ -284,17 +284,6 @@
|
||||||
"addEntryPointsLabels": true,
|
"addEntryPointsLabels": true,
|
||||||
"addServicesLabels": true,
|
"addServicesLabels": true,
|
||||||
"prefix": "MyPrefix"
|
"prefix": "MyPrefix"
|
||||||
},
|
|
||||||
"influxDB": {
|
|
||||||
"address": "xxxx",
|
|
||||||
"protocol": "xxxx",
|
|
||||||
"pushInterval": "42ns",
|
|
||||||
"database": "myDB",
|
|
||||||
"retentionPolicy": "12",
|
|
||||||
"username": "xxxx",
|
|
||||||
"password": "xxxx",
|
|
||||||
"addEntryPointsLabels": true,
|
|
||||||
"addServicesLabels": true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ping": {
|
"ping": {
|
||||||
|
|
|
@ -111,7 +111,6 @@ func (s *Server) Close() {
|
||||||
func stopMetricsClients() {
|
func stopMetricsClients() {
|
||||||
metrics.StopDatadog()
|
metrics.StopDatadog()
|
||||||
metrics.StopStatsd()
|
metrics.StopStatsd()
|
||||||
metrics.StopInfluxDB()
|
|
||||||
metrics.StopInfluxDB2()
|
metrics.StopInfluxDB2()
|
||||||
metrics.StopOpenTelemetry()
|
metrics.StopOpenTelemetry()
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ type Metrics struct {
|
||||||
Prometheus *Prometheus `description:"Prometheus metrics exporter type." json:"prometheus,omitempty" toml:"prometheus,omitempty" yaml:"prometheus,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
Prometheus *Prometheus `description:"Prometheus metrics exporter type." json:"prometheus,omitempty" toml:"prometheus,omitempty" yaml:"prometheus,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||||
Datadog *Datadog `description:"Datadog metrics exporter type." json:"datadog,omitempty" toml:"datadog,omitempty" yaml:"datadog,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
Datadog *Datadog `description:"Datadog metrics exporter type." json:"datadog,omitempty" toml:"datadog,omitempty" yaml:"datadog,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||||
StatsD *Statsd `description:"StatsD metrics exporter type." json:"statsD,omitempty" toml:"statsD,omitempty" yaml:"statsD,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
StatsD *Statsd `description:"StatsD metrics exporter type." json:"statsD,omitempty" toml:"statsD,omitempty" yaml:"statsD,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||||
InfluxDB *InfluxDB `description:"InfluxDB metrics exporter type." json:"influxDB,omitempty" toml:"influxDB,omitempty" yaml:"influxDB,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
|
||||||
InfluxDB2 *InfluxDB2 `description:"InfluxDB v2 metrics exporter type." json:"influxDB2,omitempty" toml:"influxDB2,omitempty" yaml:"influxDB2,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
InfluxDB2 *InfluxDB2 `description:"InfluxDB v2 metrics exporter type." json:"influxDB2,omitempty" toml:"influxDB2,omitempty" yaml:"influxDB2,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||||
OpenTelemetry *OpenTelemetry `description:"OpenTelemetry metrics exporter type." json:"openTelemetry,omitempty" toml:"openTelemetry,omitempty" yaml:"openTelemetry,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
OpenTelemetry *OpenTelemetry `description:"OpenTelemetry metrics exporter type." json:"openTelemetry,omitempty" toml:"openTelemetry,omitempty" yaml:"openTelemetry,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"`
|
||||||
}
|
}
|
||||||
|
@ -83,30 +82,6 @@ func (s *Statsd) SetDefaults() {
|
||||||
s.Prefix = "traefik"
|
s.Prefix = "traefik"
|
||||||
}
|
}
|
||||||
|
|
||||||
// InfluxDB contains address, login and metrics pushing interval configuration.
|
|
||||||
type InfluxDB struct {
|
|
||||||
Address string `description:"InfluxDB address." json:"address,omitempty" toml:"address,omitempty" yaml:"address,omitempty"`
|
|
||||||
Protocol string `description:"InfluxDB address protocol (udp or http)." json:"protocol,omitempty" toml:"protocol,omitempty" yaml:"protocol,omitempty"`
|
|
||||||
PushInterval types.Duration `description:"InfluxDB push interval." json:"pushInterval,omitempty" toml:"pushInterval,omitempty" yaml:"pushInterval,omitempty" export:"true"`
|
|
||||||
Database string `description:"InfluxDB database used when protocol is http." json:"database,omitempty" toml:"database,omitempty" yaml:"database,omitempty" export:"true"`
|
|
||||||
RetentionPolicy string `description:"InfluxDB retention policy used when protocol is http." json:"retentionPolicy,omitempty" toml:"retentionPolicy,omitempty" yaml:"retentionPolicy,omitempty" export:"true"`
|
|
||||||
Username string `description:"InfluxDB username (only with http)." json:"username,omitempty" toml:"username,omitempty" yaml:"username,omitempty" loggable:"false"`
|
|
||||||
Password string `description:"InfluxDB password (only with http)." json:"password,omitempty" toml:"password,omitempty" yaml:"password,omitempty" loggable:"false"`
|
|
||||||
AddEntryPointsLabels bool `description:"Enable metrics on entry points." json:"addEntryPointsLabels,omitempty" toml:"addEntryPointsLabels,omitempty" yaml:"addEntryPointsLabels,omitempty" export:"true"`
|
|
||||||
AddRoutersLabels bool `description:"Enable metrics on routers." json:"addRoutersLabels,omitempty" toml:"addRoutersLabels,omitempty" yaml:"addRoutersLabels,omitempty" export:"true"`
|
|
||||||
AddServicesLabels bool `description:"Enable metrics on services." json:"addServicesLabels,omitempty" toml:"addServicesLabels,omitempty" yaml:"addServicesLabels,omitempty" export:"true"`
|
|
||||||
AdditionalLabels map[string]string `description:"Additional labels (influxdb tags) on all metrics" json:"additionalLabels,omitempty" toml:"additionalLabels,omitempty" yaml:"additionalLabels,omitempty" export:"true"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetDefaults sets the default values.
|
|
||||||
func (i *InfluxDB) SetDefaults() {
|
|
||||||
i.Address = "localhost:8089"
|
|
||||||
i.Protocol = "udp"
|
|
||||||
i.PushInterval = types.Duration(10 * time.Second)
|
|
||||||
i.AddEntryPointsLabels = true
|
|
||||||
i.AddServicesLabels = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// InfluxDB2 contains address, token and metrics pushing interval configuration.
|
// InfluxDB2 contains address, token and metrics pushing interval configuration.
|
||||||
type InfluxDB2 struct {
|
type InfluxDB2 struct {
|
||||||
Address string `description:"InfluxDB v2 address." json:"address,omitempty" toml:"address,omitempty" yaml:"address,omitempty"`
|
Address string `description:"InfluxDB v2 address." json:"address,omitempty" toml:"address,omitempty" yaml:"address,omitempty"`
|
||||||
|
|
Loading…
Reference in a new issue