diff --git a/metrics/config.go b/metrics/config.go index 3fe3c1737..ce5e7f875 100644 --- a/metrics/config.go +++ b/metrics/config.go @@ -41,19 +41,21 @@ const ( DomainEnv = "METRICS_DOMAIN" // The following keys are used to configure metrics reporting. - // See https://github.com/knative/serving/blob/main/config/config-observability.yaml + // See https://github.com/knative/serving/blob/main/config/core/configmaps/observability.yaml // for details. collectorAddressKey = "metrics.opencensus-address" collectorSecureKey = "metrics.opencensus-require-tls" reportingPeriodKey = "metrics.reporting-period-seconds" - defaultBackendEnvName = "DEFAULT_METRICS_BACKEND" - defaultPrometheusPort = 9090 - maxPrometheusPort = 65535 - minPrometheusPort = 1024 - defaultPrometheusHost = "0.0.0.0" - prometheusPortEnvName = "METRICS_PROMETHEUS_PORT" - prometheusHostEnvName = "METRICS_PROMETHEUS_HOST" + defaultBackendEnvName = "DEFAULT_METRICS_BACKEND" + defaultPrometheusPort = 9090 + defaultPrometheusReportingPeriod = 5 + defaultOpenCensusReportingPeriod = 60 + maxPrometheusPort = 65535 + minPrometheusPort = 1024 + defaultPrometheusHost = "0.0.0.0" + prometheusPortEnvName = "METRICS_PROMETHEUS_PORT" + prometheusHostEnvName = "METRICS_PROMETHEUS_HOST" ) var ( @@ -206,9 +208,9 @@ func createMetricsConfig(_ context.Context, ops ExporterOptions) (*metricsConfig } else { switch mc.backendDestination { case openCensus: - mc.reportingPeriod = time.Minute + mc.reportingPeriod = defaultOpenCensusReportingPeriod * time.Second case prometheus: - mc.reportingPeriod = 5 * time.Second + mc.reportingPeriod = defaultPrometheusReportingPeriod * time.Second } } return &mc, nil diff --git a/metrics/config_observability.go b/metrics/config_observability.go index b6affd293..e766b071b 100644 --- a/metrics/config_observability.go +++ b/metrics/config_observability.go @@ -71,6 +71,10 @@ type ObservabilityConfig struct { // OpenCensus. "None" disables all backends. RequestMetricsBackend string + // RequestMetricsReportingPeriodSeconds specifies the request metrics reporting period in sec at queue proxy, eg 1. + // If a zero or negative value is passed the default reporting period is used (10 secs). + RequestMetricsReportingPeriodSeconds int + // EnableProfiling indicates whether it is allowed to retrieve runtime profiling data from // the pods via an HTTP server in the format expected by the pprof visualization tool. EnableProfiling bool @@ -114,6 +118,12 @@ func NewObservabilityConfigFromConfigMap(configMap *corev1.ConfigMap) (*Observab return oc, nil } + defaultRequestMetricsReportingPeriod, err := getDefaultRequestMetricsReportingPeriod(configMap.Data) + if err != nil { + return nil, err + } + oc.RequestMetricsReportingPeriodSeconds = defaultRequestMetricsReportingPeriod + if err := cm.Parse(configMap.Data, cm.AsBool("logging.enable-var-log-collection", &oc.EnableVarLogCollection), cm.AsString("logging.revision-url-template", &oc.LoggingURLTemplate), @@ -121,6 +131,7 @@ func NewObservabilityConfigFromConfigMap(configMap *corev1.ConfigMap) (*Observab cm.AsBool(EnableReqLogKey, &oc.EnableRequestLog), cm.AsBool(EnableProbeReqLogKey, &oc.EnableProbeRequestLog), cm.AsString("metrics.request-metrics-backend-destination", &oc.RequestMetricsBackend), + cm.AsInt("metrics.request-metrics-reporting-period-seconds", &oc.RequestMetricsReportingPeriodSeconds), cm.AsBool("profiling.enable", &oc.EnableProfiling), cm.AsString("metrics.opencensus-address", &oc.MetricsCollectorAddress), ); err != nil { @@ -163,3 +174,27 @@ func ConfigMapName() string { } return "config-observability" } + +// Use the same as `metrics.reporting-period-seconds` for the default +// of `metrics.request-metrics-reporting-period-seconds` +func getDefaultRequestMetricsReportingPeriod(data map[string]string) (int, error) { + // Default backend is prometheus + period := defaultPrometheusReportingPeriod + if repStr := data[reportingPeriodKey]; repStr != "" { + repInt, err := strconv.Atoi(repStr) + if err != nil { + return -1, fmt.Errorf("invalid %s value %q", reportingPeriodKey, repStr) + } + period = repInt + } else { + if raw, ok := data["metrics.request-metrics-backend-destination"]; ok { + switch metricsBackend(raw) { + case prometheus: + period = defaultPrometheusReportingPeriod + case openCensus: + period = defaultOpenCensusReportingPeriod + } + } + } + return period, nil +} diff --git a/metrics/config_observability_test.go b/metrics/config_observability_test.go index 1388ffe94..0291b43d6 100644 --- a/metrics/config_observability_test.go +++ b/metrics/config_observability_test.go @@ -34,13 +34,14 @@ func TestObservabilityConfiguration(t *testing.T) { }{{ name: "observability configuration with all inputs", wantConfig: &ObservabilityConfig{ - EnableProbeRequestLog: true, - EnableProfiling: true, - EnableVarLogCollection: true, - EnableRequestLog: true, - LoggingURLTemplate: "https://logging.io", - RequestLogTemplate: `{"requestMethod": "{{.Request.Method}}"}`, - RequestMetricsBackend: "opencensus", + EnableProbeRequestLog: true, + EnableProfiling: true, + EnableVarLogCollection: true, + EnableRequestLog: true, + LoggingURLTemplate: "https://logging.io", + RequestLogTemplate: `{"requestMethod": "{{.Request.Method}}"}`, + RequestMetricsBackend: "opencensus", + RequestMetricsReportingPeriodSeconds: defaultOpenCensusReportingPeriod, }, data: map[string]string{ EnableProbeReqLogKey: "true", @@ -52,8 +53,12 @@ func TestObservabilityConfiguration(t *testing.T) { "profiling.enable": "true", }, }, { - name: "observability config with no map", - wantConfig: defaultConfig(), + name: "observability config with no map", + wantConfig: func() *ObservabilityConfig { + oc := defaultConfig() + oc.RequestMetricsReportingPeriodSeconds = defaultPrometheusReportingPeriod + return oc + }(), }, { name: "invalid request log template", wantErr: true, @@ -72,6 +77,7 @@ func TestObservabilityConfiguration(t *testing.T) { oc.EnableProbeRequestLog = true oc.EnableRequestLog = true oc.LoggingURLTemplate = "https://logging.io" + oc.RequestMetricsReportingPeriodSeconds = defaultPrometheusReportingPeriod return oc }(), }, { @@ -80,6 +86,7 @@ func TestObservabilityConfiguration(t *testing.T) { oc := defaultConfig() oc.RequestLogTemplate = "" oc.EnableProbeRequestLog = true + oc.RequestMetricsReportingPeriodSeconds = defaultPrometheusReportingPeriod return oc }(), data: map[string]string{ @@ -103,6 +110,7 @@ func TestObservabilityConfiguration(t *testing.T) { oc.EnableProbeRequestLog = true oc.EnableVarLogCollection = true oc.RequestLogTemplate = `{"requestMethod": "{{.Request.Method}}"}` + oc.RequestMetricsReportingPeriodSeconds = defaultPrometheusReportingPeriod return oc }(), data: map[string]string{ @@ -116,12 +124,27 @@ func TestObservabilityConfiguration(t *testing.T) { oc := defaultConfig() oc.RequestMetricsBackend = "opencensus" oc.MetricsCollectorAddress = "otel:55678" + oc.RequestMetricsReportingPeriodSeconds = defaultOpenCensusReportingPeriod return oc }(), data: map[string]string{ "metrics.request-metrics-backend-destination": "opencensus", "metrics.opencensus-address": "otel:55678", }, + }, { + name: "observability configuration with collector address and reporting period", + wantConfig: func() *ObservabilityConfig { + oc := defaultConfig() + oc.RequestMetricsBackend = "opencensus" + oc.MetricsCollectorAddress = "otel:55678" + oc.RequestMetricsReportingPeriodSeconds = 10 + return oc + }(), + data: map[string]string{ + "metrics.request-metrics-backend-destination": "opencensus", + "metrics.opencensus-address": "otel:55678", + "metrics.request-metrics-reporting-period-seconds": "10", + }, }} for _, tt := range observabilityConfigTests {