Expose queue proxy request metrics reporting period (#2362)

* expose qp request metrics reporting period

* remove dead link

* add comments

* add default

* fix unit test

* add back the correct url

* use metrics.reporting-period as default

* don't return a pointer
This commit is contained in:
Stavros Kontopoulos 2023-03-29 23:01:00 +03:00 committed by GitHub
parent bd3cf5174f
commit 696cac83c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 79 additions and 19 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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 {