diff --git a/agent/agent.go b/agent/agent.go index a74eae9ce40a..511bc3a89de7 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -592,6 +592,12 @@ func (a *Agent) Start(ctx context.Context) error { go a.retryJoinWAN() } + // DEPRECATED: Warn users if they're emitting deprecated metrics. Remove this warning and the flagged metrics in a + // future release of Consul. + if !a.config.Telemetry.DisableCompatOneNine { + a.logger.Warn("DEPRECATED Backwards compatibility with pre-1.9 metrics enabled. These metrics will be removed in a future version of Consul. Set `telemetry { disable_compat_1.9 = true }` to disable them.") + } + return nil } @@ -3489,6 +3495,12 @@ func (a *Agent) ReloadConfig() error { // breaking some existing behavior. newCfg.NodeID = a.config.NodeID + // DEPRECATED: Warn users on reload if they're emitting deprecated metrics. Remove this warning and the flagged + // metrics in a future release of Consul. + if !a.config.Telemetry.DisableCompatOneNine { + a.logger.Warn("DEPRECATED Backwards compatibility with pre-1.9 metrics enabled. These metrics will be removed in a future version of Consul. Set `telemetry { disable_compat_1.9 = true }` to disable them.") + } + return a.reloadConfigInternal(newCfg) } diff --git a/agent/config/builder.go b/agent/config/builder.go index 666ff0b655da..ffba0a5a605f 100644 --- a/agent/config/builder.go +++ b/agent/config/builder.go @@ -936,6 +936,7 @@ func (b *Builder) Build() (rt RuntimeConfig, err error) { CirconusCheckTags: b.stringVal(c.Telemetry.CirconusCheckTags), CirconusSubmissionInterval: b.stringVal(c.Telemetry.CirconusSubmissionInterval), CirconusSubmissionURL: b.stringVal(c.Telemetry.CirconusSubmissionURL), + DisableCompatOneNine: b.boolVal(c.Telemetry.DisableCompatOneNine), DisableHostname: b.boolVal(c.Telemetry.DisableHostname), DogstatsdAddr: b.stringVal(c.Telemetry.DogstatsdAddr), DogstatsdTags: c.Telemetry.DogstatsdTags, diff --git a/agent/config/config.go b/agent/config/config.go index b66bcd0d819e..7aca0cdf0b70 100644 --- a/agent/config/config.go +++ b/agent/config/config.go @@ -628,6 +628,7 @@ type Telemetry struct { CirconusCheckTags *string `json:"circonus_check_tags,omitempty" hcl:"circonus_check_tags" mapstructure:"circonus_check_tags"` CirconusSubmissionInterval *string `json:"circonus_submission_interval,omitempty" hcl:"circonus_submission_interval" mapstructure:"circonus_submission_interval"` CirconusSubmissionURL *string `json:"circonus_submission_url,omitempty" hcl:"circonus_submission_url" mapstructure:"circonus_submission_url"` + DisableCompatOneNine *bool `json:"disable_compat_1.9,omitempty" hcl:"disable_compat_1.9" mapstructure:"disable_compat_1.9"` DisableHostname *bool `json:"disable_hostname,omitempty" hcl:"disable_hostname" mapstructure:"disable_hostname"` DogstatsdAddr *string `json:"dogstatsd_addr,omitempty" hcl:"dogstatsd_addr" mapstructure:"dogstatsd_addr"` DogstatsdTags []string `json:"dogstatsd_tags,omitempty" hcl:"dogstatsd_tags" mapstructure:"dogstatsd_tags"` diff --git a/agent/config/default.go b/agent/config/default.go index 994b696d8ab5..b905e6053009 100644 --- a/agent/config/default.go +++ b/agent/config/default.go @@ -122,7 +122,7 @@ func DefaultSource() Source { telemetry = { metrics_prefix = "consul" filter_default = true - prefix_filter = [ "-consul.api.http" ] + prefix_filter = [] } `, diff --git a/agent/config/runtime_test.go b/agent/config/runtime_test.go index 600fadeadac6..5977477182c1 100644 --- a/agent/config/runtime_test.go +++ b/agent/config/runtime_test.go @@ -2261,7 +2261,7 @@ func TestBuilder_BuildAndValide_ConfigFlagsAndEdgecases(t *testing.T) { patch: func(rt *RuntimeConfig) { rt.DataDir = dataDir rt.Telemetry.AllowedPrefixes = []string{"foo"} - rt.Telemetry.BlockedPrefixes = []string{"consul.api.http", "bar"} + rt.Telemetry.BlockedPrefixes = []string{"bar"} }, warns: []string{`Filter rule must begin with either '+' or '-': "nix"`}, }, @@ -5227,7 +5227,8 @@ func TestFullConfig(t *testing.T) { "metrics_prefix": "ftO6DySn", "prometheus_retention_time": "15s", "statsd_address": "drce87cy", - "statsite_address": "HpFwKB8R" + "statsite_address": "HpFwKB8R", + "disable_compat_1.9": true }, "tls_cipher_suites": "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "tls_min_version": "pAOWafkR", @@ -5911,6 +5912,7 @@ func TestFullConfig(t *testing.T) { prometheus_retention_time = "15s" statsd_address = "drce87cy" statsite_address = "HpFwKB8R" + disable_compat_1.9 = true } tls_cipher_suites = "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256" tls_min_version = "pAOWafkR" @@ -6681,12 +6683,13 @@ func TestFullConfig(t *testing.T) { CirconusCheckTags: "prvO4uBl", CirconusSubmissionInterval: "DolzaflP", CirconusSubmissionURL: "gTcbS93G", + DisableCompatOneNine: true, DisableHostname: true, DogstatsdAddr: "0wSndumK", DogstatsdTags: []string{"3N81zSUB", "Xtj8AnXZ"}, FilterDefault: true, AllowedPrefixes: []string{"oJotS8XJ"}, - BlockedPrefixes: []string{"consul.api.http", "cazlEhGn"}, + BlockedPrefixes: []string{"cazlEhGn"}, MetricsPrefix: "ftO6DySn", PrometheusRetentionTime: 15 * time.Second, StatsdAddr: "drce87cy", @@ -7379,6 +7382,7 @@ func TestSanitize(t *testing.T) { "CirconusSubmissionInterval": "", "CirconusSubmissionURL": "", "Disable": false, + "DisableCompatOneNine": false, "DisableHostname": false, "DogstatsdAddr": "", "DogstatsdTags": [], diff --git a/agent/http.go b/agent/http.go index 63cce8eb52a4..3111734c08b6 100644 --- a/agent/http.go +++ b/agent/http.go @@ -195,14 +195,15 @@ func (s *HTTPHandlers) handler(enableDebug bool) http.Handler { start := time.Now() handler(resp, req) - // This new metric is disabled by default with the prefix_filter option. - // It will be enabled by default in a future version. labels := []metrics.Label{{Name: "method", Value: req.Method}, {Name: "path", Value: path_label}} metrics.MeasureSinceWithLabels([]string{"api", "http"}, start, labels) - // Duplicated information. Kept for backward compatibility. - key := append([]string{"http", req.Method}, parts...) - metrics.MeasureSince(key, start) + // DEPRECATED Emit pre-1.9 metric as `consul.http...` to maintain backwards compatibility. Enabled by + // default. Users may set `telemetry { disable_compat_1.9 = true }` + if !s.agent.config.Telemetry.DisableCompatOneNine { + key := append([]string{"http", req.Method}, parts...) + metrics.MeasureSince(key, start) + } } var gzipHandler http.Handler diff --git a/lib/telemetry.go b/lib/telemetry.go index 595e6005e87c..9b3284ea8db1 100644 --- a/lib/telemetry.go +++ b/lib/telemetry.go @@ -132,6 +132,11 @@ type TelemetryConfig struct { // hcl: telemetry { circonus_submission_url = string } CirconusSubmissionURL string `json:"circonus_submission_url,omitempty" mapstructure:"circonus_submission_url"` + // DisableCompatOneNine is a flag to stop emitting metrics that have been deprecated in version 1.9. + // + // hcl: telemetry { disable_compat_1.9 = (true|false) } + DisableCompatOneNine bool `json:"disable_compat_1.9,omitempty" mapstructure:"disable_compat_1.9"` + // DisableHostname will disable hostname prefixing for all metrics. // // hcl: telemetry { disable_hostname = (true|false) diff --git a/website/pages/docs/agent/telemetry.mdx b/website/pages/docs/agent/telemetry.mdx index c09194bc7051..a598fd10adf2 100644 --- a/website/pages/docs/agent/telemetry.mdx +++ b/website/pages/docs/agent/telemetry.mdx @@ -141,6 +141,7 @@ This is a full list of metrics emitted by Consul. | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | ------- | | `consul.acl.blocked.service.registration` | This increments whenever a deregistration fails for a service (blocked by an ACL) | requests | counter | | `consul.acl.blocked..registration` | This increments whenever a registration fails for an entity (check, node or service) is blocked by an ACL | requests | counter | +| `consul.api.http` | Migrated from consul.http.. this samples how long it takes to service the given HTTP request for the given verb and path. Includes labels for `path` and `method`. `path` does not include details like service or key names, for these an underscore will be present as a placeholder (eg. path=`v1.kv._`) | ms | timer | | `consul.client.rpc` | This increments whenever a Consul agent in client mode makes an RPC request to a Consul server. This gives a measure of how much a given agent is loading the Consul servers. Currently, this is only generated by agents in client mode, not Consul servers. | requests | counter | | `consul.client.rpc.exceeded` | This increments whenever a Consul agent in client mode makes an RPC request to a Consul server gets rate limited by that agent's [`limits`](/docs/agent/options#limits) configuration. This gives an indication that there's an abusive application making too many requests on the agent, or that the rate limit needs to be increased. Currently, this only applies to agents in client mode, not Consul servers. | rejected requests | counter | | `consul.client.rpc.failed` | This increments whenever a Consul agent in client mode makes an RPC request to a Consul server and fails. | requests | counter | @@ -180,7 +181,7 @@ This is a full list of metrics emitted by Consul. | `consul.dns.stale_queries` | This increments when an agent serves a query within the allowed stale threshold. | queries | counter | | `consul.dns.ptr_query.` | This measures the time spent handling a reverse DNS query for the given node. | ms | timer | | `consul.dns.domain_query.` | This measures the time spent handling a domain query for the given node. | ms | timer | -| `consul.http` | This tracks how long it takes to service the given HTTP request for the given verb and path. Paths do not include details like service or key names, for these an underscore will be present as a placeholder (eg. label `path=v1_kv_`) | ms | timer | +| `consul.http...` | DEPRECATED IN 1.9: This tracks how long it takes to service the given HTTP request for the given verb and path. Paths do not include details like service or key names, for these an underscore will be present as a placeholder (eg. `consul.http.GET.v1.kv._`) | ms | timer | ## Server Health