From 2086783e0486469fcba35bb3e5700efc02415b53 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 14:27:09 -0800 Subject: [PATCH 01/21] upgrade prometheus-operator --- .../prometheus-operator/.gitattributes | 1 + .../prometheus-operator/.github/CODEOWNERS | 3 - .../.github/dependabot.yml | 8 + .../prometheus-operator/.github/env | 2 +- .../workflows/automerge-dependabot.yaml | 42 + .../.github/workflows/checks.yaml | 20 +- .../.github/workflows/e2e.yaml | 19 +- .../.github/workflows/publish.yaml | 7 +- .../.github/workflows/release.yaml | 3 +- .../.github/workflows/stale.yaml | 2 +- .../workflows/test-prom-version-upgrade.yaml | 51 + .../.github/workflows/unit.yaml | 6 +- .../prometheus-operator/.golangci.yml | 36 + .../prometheus-operator/ADOPTERS.md | 13 + .../prometheus-operator/CHANGELOG.md | 50 + .../prometheus-operator/CONTRIBUTING.md | 1 + .../prometheus-operator/Dockerfile | 15 + .../prometheus-operator/Documentation/api.md | 1461 ++++- .../Documentation/compatibility.md | 12 +- .../Documentation/operator.md | 22 +- .../proposals/202309-controller-id.md | 79 + .../prometheus-operator/Documentation/rbac.md | 14 +- .../Documentation/troubleshooting.md | 31 + .../user-guides/prometheus-agent.md | 8 +- .../Documentation/user-guides/scrapeconfig.md | 145 + .../Documentation/user-guides/webhook.md | 12 +- .../prometheus-operator/MAINTAINERS.md | 23 +- .../prometheus-operator/Makefile | 7 +- .../prometheus-operator/README.md | 4 +- .../prometheus-operator/RELEASE.md | 6 +- .../prometheus-operator/VERSION | 2 +- .../prometheus-operator/bundle.yaml | 2899 +++++++-- .../cmd/admission-webhook/Dockerfile | 9 + .../cmd/admission-webhook/main.go | 39 +- .../prometheus-operator/cmd/operator/main.go | 266 +- .../cmd/prometheus-config-reloader/Dockerfile | 9 + .../cmd/prometheus-config-reloader/main.go | 19 +- .../example/admission-webhook/deployment.yaml | 6 +- .../pod-disruption-budget.yaml | 2 +- .../admission-webhook/service-account.yaml | 2 +- .../admission-webhook/service-monitor.yaml | 4 +- .../example/admission-webhook/service.yaml | 2 +- .../alertmanager-crd-conversion/patch.json | 3 +- ...toring.coreos.com_alertmanagerconfigs.yaml | 4981 +++++++++----- .../monitoring.coreos.com_alertmanagers.yaml | 195 +- .../monitoring.coreos.com_podmonitors.yaml | 6 + .../monitoring.coreos.com_probes.yaml | 6 + ...onitoring.coreos.com_prometheusagents.yaml | 251 +- .../monitoring.coreos.com_prometheuses.yaml | 324 +- .../monitoring.coreos.com_scrapeconfigs.yaml | 228 +- ...monitoring.coreos.com_servicemonitors.yaml | 6 + .../monitoring.coreos.com_thanosrulers.yaml | 194 +- ...toring.coreos.com_alertmanagerconfigs.yaml | 1942 ++++-- .../monitoring.coreos.com_alertmanagers.yaml | 196 +- .../monitoring.coreos.com_podmonitors.yaml | 7 + .../monitoring.coreos.com_probes.yaml | 7 + ...onitoring.coreos.com_prometheusagents.yaml | 252 +- .../monitoring.coreos.com_prometheuses.yaml | 325 +- ...monitoring.coreos.com_prometheusrules.yaml | 1 + .../monitoring.coreos.com_scrapeconfigs.yaml | 227 +- ...monitoring.coreos.com_servicemonitors.yaml | 7 + .../monitoring.coreos.com_thanosrulers.yaml | 195 +- ...metheus-operator-cluster-role-binding.yaml | 2 +- .../prometheus-operator-cluster-role.yaml | 8 +- .../prometheus-operator-deployment.yaml | 8 +- .../prometheus-operator-service-account.yaml | 2 +- .../prometheus-operator-service-monitor.yaml | 4 +- .../prometheus-operator-service.yaml | 2 +- .../otel-allocator/prometheus-operator/go.mod | 91 +- .../otel-allocator/prometheus-operator/go.sum | 277 +- .../prometheus-operator/internal/log/log.go | 9 + .../alertmanagerconfigs-crd.json | 1936 ++++-- .../alertmanagerconfigs-v1beta1-crd.libsonnet | 1886 ++++-- .../alertmanagers-crd.json | 40 +- .../prometheus-operator/podmonitors-crd.json | 8 +- .../prometheus-operator/probes-crd.json | 8 +- .../prometheus-operator.libsonnet | 5 + .../prometheusagents-crd.json | 91 +- .../prometheus-operator/prometheuses-crd.json | 159 +- .../prometheusrules-crd.json | 3 +- .../scrapeconfigs-crd.json | 245 +- .../servicemonitors-crd.json | 8 +- .../prometheus-operator/thanosrulers-crd.json | 40 +- .../pkg/admission/admission.go | 40 +- .../pkg/admission/admission_test.go | 839 +-- .../pkg/admission/jsonpatch.go | 4 +- .../testdata/Test_happy_path_v1alpha1.golden | 51 + .../testdata/Test_happy_path_v1beta1.golden | 51 + ...ject_on_duplicate_receiver_v1alpha1.golden | 19 + ...eject_on_duplicate_receiver_v1beta1.golden | 19 + ...nvalid_mute_time_intervals_v1alpha1.golden | 51 + ...reject_on_invalid_receiver_v1alpha1.golden | 26 + ..._reject_on_invalid_receiver_v1beta1.golden | 26 + ...t_on_invalid_time_intervals_v1beta1.golden | 51 + .../testdata/badRulesNoAnnotations.golden | 60 + .../badRulesWithBooleanInAnnotations.golden | 64 + .../testdata/goodRulesWithAnnotations.golden | 64 + ...ulesWithExternalLabelsInAnnotations.golden | 62 + .../happy_path_v1alpha1_v1beta1.golden | 51 + .../happy_path_v1beta1_v1alpha1.golden | 51 + .../nonStringsInLabelsAnnotations.golden | 71 + .../pkg/alertmanager/amcfg.go | 272 +- .../pkg/alertmanager/amcfg_test.go | 1178 ++-- .../pkg/alertmanager/operator.go | 328 +- .../pkg/alertmanager/operator_test.go | 37 +- .../pkg/alertmanager/statefulset.go | 34 +- .../pkg/alertmanager/statefulset_test.go | 42 + .../CR_with_Active_Time_Intervals.golden | 35 + .../testdata/CR_with_MSTeams_Receiver.golden | 15 + .../CR_with_Mute_Time_Intervals.golden | 35 + .../testdata/CR_with_Opsgenie_Receiver.golden | 13 + .../CR_with_Opsgenie_Team_Responder.golden | 16 + .../CR_with_Pagerduty_Receiver.golden | 20 + ...th_SNS_Receiver_with_Access_and_Key.golden | 18 + .../CR_with_SNS_Receiver_with_roleARN.golden | 17 + ...Slack_Receiver_and_global_Slack_URL.golden | 23 + ..._Receiver_and_global_Slack_URL_File.golden | 23 + .../testdata/CR_with_Telegram_Receiver.golden | 15 + .../testdata/CR_with_WeChat_Receiver.golden | 14 + ...eiver_and_custom_http_config_oauth2.golden | 23 + .../testdata/Discord_url_field.golden | 7 + .../Global_opsgenie_api_key_file_field.golden | 7 + .../OpsGenie_entity_and_actions_fields.golden | 9 + ..._with_sub_route_and_matchers_no_CRs.golden | 10 + ...precated_matching_pattern_simple_CR.golden | 12 + .../testdata/mute_time_intervals_field.golden | 13 + ...base,_CR_with_inhibition_rules_only.golden | 14 + ...y_deprecated_matchers_are_converted.golden | 14 + ...y_deprecated_matchers_not_converted.golden | 14 + ...n_base_multiple_alertmanagerconfigs.golden | 34 + .../testdata/skeleton_base_no_CRs.golden | 5 + .../testdata/skeleton_base_simple_CR.golden | 13 + ...e_CR_with_namespaceMatcher_disabled.golden | 11 + ...e_with_active_time_intervals_no_CRs.golden | 13 + ...se_with_global_send_revolved_no_CRs.golden | 7 + ...tp_require_tls_set_to_false,_no_CRs.golden | 7 + ...smtp_require_tls_set_to_true_no_CRs.golden | 7 + ...eton_base_with_inhibit_rules_no_CRs.golden | 12 + ...ase_with_mute_time_intervals_no_CRs.golden | 13 + ...leton_base_with_sns_receiver_no_CRs.golden | 17 + .../pkg/alertmanager/types.go | 18 +- .../validation/v1alpha1/validation.go | 107 +- .../validation/v1beta1/validation.go | 125 +- .../validation/v1beta1/validation_test.go | 80 +- .../pkg/apis/monitoring/go.mod | 16 +- .../pkg/apis/monitoring/go.sum | 1941 +++++- .../apis/monitoring/v1/alertmanager_types.go | 14 +- .../apis/monitoring/v1/podmonitor_types.go | 7 + .../pkg/apis/monitoring/v1/probe_types.go | 7 + .../apis/monitoring/v1/prometheus_types.go | 95 +- .../pkg/apis/monitoring/v1/register.go | 4 +- .../monitoring/v1/servicemonitor_types.go | 7 + .../v1/servicemonitor_types_test.go | 2 +- .../pkg/apis/monitoring/v1/thanos_types.go | 13 +- .../pkg/apis/monitoring/v1/types.go | 3 +- .../monitoring/v1/zz_generated.deepcopy.go | 77 +- .../v1alpha1/alertmanager_config_types.go | 94 +- .../monitoring/v1alpha1/scrapeconfig_types.go | 100 +- .../v1alpha1/zz_generated.deepcopy.go | 275 +- .../v1beta1/alertmanager_config_types.go | 92 +- .../monitoring/v1beta1/conversion_from.go | 37 + .../apis/monitoring/v1beta1/conversion_to.go | 37 + .../v1beta1/zz_generated.deepcopy.go | 110 + .../prometheus-operator/pkg/assets/store.go | 68 +- .../pkg/assets/store_test.go | 2 +- .../monitoring/v1/alertmanagerendpoints.go | 9 + .../monitoring/v1/azuread.go | 46 + .../monitoring/v1/commonprometheusfields.go | 18 + .../monitoring/v1/managedidentity.go | 37 + .../monitoring/v1/podmonitorspec.go | 9 + .../monitoring/v1/probespec.go | 9 + .../monitoring/v1/prometheusspec.go | 16 + .../monitoring/v1/remotewritespec.go | 9 + .../monitoring/v1/servicemonitorspec.go | 9 + .../monitoring/v1alpha1/dnssdconfig.go | 70 + .../monitoring/v1alpha1/ec2filter.go | 48 + .../monitoring/v1alpha1/ec2sdconfig.go | 102 + .../monitoring/v1alpha1/k8sselectorconfig.go | 59 + .../monitoring/v1alpha1/kubernetessdconfig.go | 22 +- .../monitoring/v1alpha1/msteamsconfig.go | 77 + .../v1alpha1/prometheusagentspec.go | 16 + .../monitoring/v1alpha1/pushoverconfig.go | 18 + .../monitoring/v1alpha1/receiver.go | 28 + .../monitoring/v1alpha1/scrapeconfigspec.go | 51 + .../monitoring/v1alpha1/telegramconfig.go | 9 + .../monitoring/v1alpha1/webexconfig.go | 77 + .../monitoring/v1beta1/msteamsconfig.go | 77 + .../monitoring/v1beta1/pushoverconfig.go | 18 + .../monitoring/v1beta1/receiver.go | 28 + .../monitoring/v1beta1/telegramconfig.go | 9 + .../monitoring/v1beta1/webexconfig.go | 77 + .../pkg/client/applyconfiguration/utils.go | 20 + .../prometheus-operator/pkg/client/go.mod | 40 +- .../prometheus-operator/pkg/client/go.sum | 210 +- .../pkg/informers/informers.go | 4 +- .../pkg/k8sutil/k8sutil.go | 151 +- .../prometheus-operator/pkg/k8sutil/labels.go | 4 +- .../prometheus-operator/pkg/k8sutil/merge.go | 9 +- .../pkg/k8sutil/secrets.go | 62 + .../pkg/k8sutil/secrets_test.go | 117 + .../pkg/listwatch/listwatch.go | 346 +- .../pkg/listwatch/listwatch_test.go | 142 + .../pkg/namespacelabeler/labeler.go | 7 +- .../pkg/operator/config.go | 89 +- .../pkg/operator/config_reloader.go | 35 +- .../pkg/operator/config_reloader_test.go | 16 +- .../pkg/operator/config_reloader_test_lib.go | 100 +- .../pkg/operator/defaults.go | 8 +- .../prometheus-operator/pkg/operator/image.go | 10 +- .../pkg/operator/operator.go | 2 + .../pkg/operator/resource_reconciler.go | 9 +- .../prometheus-operator/pkg/operator/rules.go | 12 +- .../pkg/operator/sharded_secret.go | 5 +- .../pkg/operator/statefulset_reporter.go | 22 +- .../pkg/operator/storageclass.go | 48 + .../pkg/prometheus/agent/operator.go | 285 +- .../pkg/prometheus/agent/statefulset.go | 7 +- .../pkg/prometheus/applyconfiguration.go | 66 + .../pkg/prometheus/operator.go | 83 +- .../pkg/prometheus/promcfg.go | 287 +- .../pkg/prometheus/promcfg_test.go | 5697 +++-------------- .../pkg/prometheus/resource_selector.go | 319 +- .../pkg/prometheus/resource_selector_test.go | 753 ++- .../pkg/prometheus/server/operator.go | 256 +- .../pkg/prometheus/server/operator_test.go | 3 +- .../pkg/prometheus/server/rules.go | 17 +- .../pkg/prometheus/server/statefulset.go | 11 +- .../pkg/prometheus/server/statefulset_test.go | 38 +- .../pkg/prometheus/statefulset.go | 27 +- .../pkg/prometheus/store.go | 45 +- .../AdditionalAlertRelabelConfigs.golden | 3 + ...itionalAlertRelabelConfigs_Expected.golden | 32 + ...lScrapeConfigs_one_prometheus_shard.golden | 22 + ...nalScrapeConfigs_sharded prometheus.golden | 41 + ...lScrapeConfigs_unsharded_prometheus.golden | 22 + .../testdata/AlertmanagerAPIVersion.golden | 29 + ...nagerBasicAuth_Invalid_Prom_Version.golden | 28 + ...managerBasicAuth_Valid_Prom_Version.golden | 31 + .../testdata/AlertmanagerBearerToken.golden | 29 + ...ttp2_false_expectedWithHTTP2Enabled.golden | 30 + ..._false_expectedWithHTTP2Unsupported.golden | 29 + ...Http2_true_expectedWithHTTP2Enabled.golden | 30 + ...2_true_expectedWithHTTP2Unsupported.golden | 29 + ...rtmanagerSigv4_Invalid_Prom_Version.golden | 28 + ...lertmanagerSigv4_Valid_Prom_Version.golden | 34 + .../testdata/AlertmanagerTimeoutConfig.golden | 30 + ...st_instead_of_the_current_namespace.golden | 2 + ...ny_takes_precedence_over_MatchNames.golden | 2 + .../BodySizeLimits_enforce0MB_v2.28.0.golden | 69 + ...odySizeLimits_enforce1000MB_v2.27.0.golden | 69 + ...odySizeLimits_enforce1000MB_v2.28.0.golden | 70 + .../testdata/ConsulScrapeConfig.golden | 33 + .../ConsulScrapeConfigAuthorization.golden | 13 + .../ConsulScrapeConfigBasicAuth.golden | 13 + .../testdata/ConsulScrapeConfigOAuth.golden | 20 + .../ConsulScrapeConfigTLSConfig.golden | 15 + .../testdata/EmptyEndpointPorts.golden | 67 + ...eLabelOnExcludedPodMonitor_Expected.golden | 70 + ...elOnExcludedServiceMonitor_Expected.golden | 84 + ...edNamespaceLabelPodMonitor_Expected.golden | 74 + ...mespaceLabelServiceMonitor_Expected.golden | 93 + .../testdata/GenerateRelabelConfig.golden | 91 + .../testdata/HonorLabelsOverriding.golden | 79 + .../testdata/HonorTimestampsOverriding.golden | 80 + ...ectors_overrides_Any_and_MatchNames.golden | 5 + .../K8SSDConfigGenerationFirst.golden | 5 + .../testdata/K8SSDConfigGenerationTwo.golden | 11 + .../testdata/KeepDroppedTargets.golden | 70 + .../KeepDroppedTargetsNotAddedInConfig.golden | 69 + ...edTargetsOverridedWithEnforcedValue.golden | 70 + ..._Limit2000_v2.26.0_enforceLimit1000.golden | 69 + ..._Limit2000_v2.27.0_enforceLimit1000.golden | 70 + ...s_Limit500_v2.26.0_enforceLimit1000.golden | 69 + ...s_Limit500_v2.27.0_enforceLimit1000.golden | 70 + .../LabelLimits_NoLimit_v2.26.0.golden | 69 + ...ts_NoLimit_v2.26.0_enforceLimit1000.golden | 69 + .../LabelLimits_NoLimit_v2.27.0.golden | 69 + ...ts_NoLimit_v2.27.0_enforceLimit1000.golden | 70 + ...thLimits_Limit-1_Enforc1000_v2.26.0.golden | 50 + ...gthLimits_Limit-1_Enforce-1_v2.26.0.golden | 50 + ...gthLimits_Limit-1_Enforce-1_v2.27.0.golden | 50 + ...hLimits_Limit-1_Enforce1000_v2.27.0.golden | 51 + ...imits_Limit2000_Enforce1000_v2.26.0.golden | 50 + ...imits_Limit2000_Enforce1000_v2.27.0.golden | 51 + ...Limits_Limit500_Enforce1000_v2.26.0.golden | 50 + ...Limits_Limit500_Enforce1000_v2.27.0.golden | 51 + ...mits_Enforce-1_LabelValue-1_v2.26.0.golden | 44 + ...mits_Enforce-1_LabelValue-1_v2.27.0.golden | 44 + ...ts_Enforce1000_LabelValue-1_v2.26.0.golden | 44 + ...ts_Enforce1000_LabelValue-1_v2.27.0.golden | 45 + ..._Enforce1000_LabelValue2000_v2.26.0.golden | 44 + ..._Enforce1000_LabelValue2000_v2.27.0.golden | 45 + ...s_Enforce1000_LabelValue500_v2.26.0.golden | 44 + ...s_Enforce1000_LabelValue500_v2.27.0.golden | 45 + .../MatchExpressionsServiceMonitor.golden | 74 + .../NamespaceSetCorrectlyForPodMonitor.golden | 7 + ...mespaceLabelServiceMonitor_Expected.golden | 87 + ...nableHttp2_EnableHTTP2False_v2.34.0.golden | 50 + ...nableHttp2_EnableHTTP2False_v2.35.0.golden | 51 + ...EnableHttp2_EnableHTTP2True_v2.34.0.golden | 50 + ...EnableHttp2_EnableHTTP2True_v2.35.0.golden | 51 + ...irects_FollowRedirectsFalse_v2.25.0.golden | 50 + ...irects_FollowRedirectsFalse_v2.28.0.golden | 51 + ...directs_FollowRedirectsTrue_v2.25.0.golden | 50 + ...directs_FollowRedirectsTrue_v2.28.0.golden | 51 + .../testdata/PodMonitorPhaseFilter.golden | 45 + .../testdata/PodTargetLabels.golden | 79 + .../PodTargetLabelsFromPodMonitor.golden | 60 + ...TargetLabelsFromPodMonitorAndGlobal.golden | 60 + .../ProbeIngressSDConfigGeneration.golden | 65 + ...sSDConfigGenerationWithLabelEnforce.golden | 69 + ...IngressSDConfigGenerationWithShards.golden | 65 + .../ProbeSpecConfig_empty_probe.golden | 24 + .../ProbeSpecConfig_module_config.golden | 27 + .../ProbeSpecConfig_prober_spec.golden | 26 + ...obeSpecConfig_targets_static_config.golden | 42 + ...cTargetsConfigGenerationWithJobName.golden | 44 + ...etsConfigGenerationWithLabelEnforce.golden | 49 + ...argetsConfigGenerationWithoutModule.golden | 41 + .../testdata/RemoteReadConfig_v2.25.0.golden | 10 + .../testdata/RemoteReadConfig_v2.26.0.golden | 10 + ...eadConfig_v2.26.0_AuthorizationSafe.golden | 13 + ...Config_v2.26.0_FilterExternalLabels.golden | 10 + ...adConfig_v2.26.0_NotFollowRedirects.golden | 11 + .../testdata/RemoteReadConfig_v2.27.1.golden | 18 + .../testdata/RemoteReadConfig_v2.34.0.golden | 10 + ...Config_v2.34.0_FilterExternalLabels.golden | 11 + ...fig_v2.34.0_NotFilterExternalLabels.golden | 11 + .../testdata/RemoteWriteConfig_3.golden | 27 + .../RemoteWriteConfig_v2.10.0_1.golden | 19 + .../RemoteWriteConfig_v2.22.0_1.golden | 18 + .../RemoteWriteConfig_v2.23.0_1.golden | 21 + .../RemoteWriteConfig_v2.23.0_2.golden | 21 + .../RemoteWriteConfig_v2.26.0_2.golden | 13 + .../RemoteWriteConfig_v2.26.0_3.golden | 10 + .../RemoteWriteConfig_v2.26.0_4.golden | 11 + .../RemoteWriteConfig_v2.27.1_1.golden | 18 + .../RemoteWriteConfig_v2.30.0_2.golden | 19 + .../RemoteWriteConfig_v2.39.0_1.golden | 19 + .../RemoteWriteConfig_v2.43.0_2.golden | 20 + .../RemoteWriteConfig_v2.45.0_1.golden | 14 + .../testdata/SampleLimits_Limit-1.golden | 70 + .../testdata/SampleLimits_Limit2000.golden | 70 + .../testdata/SampleLimits_Limit500.golden | 70 + .../testdata/SampleLimits_NoLimit.golden | 69 + ...crapeConfigSpecConfig_Authorization.golden | 16 + .../ScrapeConfigSpecConfig_BasicAuth.golden | 16 + ...crapeConfigSpecConfig_DNSSD_ARecord.golden | 13 + ...apeConfigSpecConfig_DNSSD_SRVRecord.golden | 11 + ...peConfigSpecConfig_EC2SDConfigEmpty.golden | 8 + ...ConfigSpecConfig_EC2SDConfigFilters.golden | 21 + ...gSpecConfig_EC2SDConfigValidAPIKeys.golden | 14 + ...gSpecConfig_EC2SDConfigValidRoleARN.golden | 13 + .../ScrapeConfigSpecConfig_Empty.golden | 8 + ...ConfigSpecConfig_EmptyRelabelConfig.golden | 12 + .../ScrapeConfigSpecConfig_FileSD.golden | 12 + .../ScrapeConfigSpecConfig_HTTPSD.golden | 11 + .../ScrapeConfigSpecConfig_HonorLabels.golden | 9 + ...rapeConfigSpecConfig_HonorTimeStamp.golden | 9 + .../ScrapeConfigSpecConfig_K8SSD.golden | 10 + ...nfigSpecConfig_K8SSD_with_Selectors.golden | 14 + .../ScrapeConfigSpecConfig_Limits.golden | 13 + .../ScrapeConfigSpecConfig_MetricPath.golden | 9 + ...cConfig_NonEmptyMetricRelabelConfig.golden | 11 + ...figSpecConfig_NonEmptyRelabelConfig.golden | 18 + .../ScrapeConfigSpecConfig_Params.golden | 13 + .../ScrapeConfigSpecConfig_Scheme.golden | 9 + ...rapeConfigSpecConfig_ScrapeInterval.golden | 9 + ...crapeConfigSpecConfig_ScrapeTimeout.golden | 9 + .../ScrapeConfigSpecConfig_Static.golden | 13 + .../ScrapeConfigSpecConfig_TLSConfig.golden | 18 + ...nableHttp2_EnableHTTP2False_v2.34.0.golden | 69 + ...nableHttp2_EnableHTTP2False_v2.35.0.golden | 70 + ...EnableHttp2_EnableHTTP2True_v2.34.0.golden | 69 + ...EnableHttp2_EnableHTTP2True_v2.35.0.golden | 70 + ...directs_FollowRedirectFalse_v2.25.0.golden | 69 + ...directs_FollowRedirectFalse_v2.28.0.golden | 70 + ...edirects_FollowRedirectTrue_v2.25.0.golden | 69 + ...edirects_FollowRedirectTrue_v2.28.0.golden | 70 + .../testdata/SettingHonorLabels.golden | 79 + .../SettingHonorTimestampsInPodMonitor.golden | 61 + ...tingHonorTimestampsInServiceMonitor.golden | 80 + ...eSettingMaxExemplars_MaxSize5000000.golden | 10 + ...tingMaxExemplars_MaxSizeNotSetAtAll.golden | 7 + ...gMaxExemplars_MaxSizeNotSet_v2.29.0.golden | 7 + ...ig_greater_than_or_equal_to_v2.39.0.golden | 10 + .../TSDB_config_less_than_v2.39.0.golden | 7 + .../prometheus/testdata/TargetLabels.golden | 79 + .../TargetLimits-1_Versionv2.15.0.golden | 69 + .../TargetLimits-1_Versionv2.21.0.golden | 69 + ...Limits-1_Versionv2.21.0_Enforce1000.golden | 70 + ...mits1000_Versionv2.21.0_Enforce1000.golden | 70 + ...mits2000_Versionv2.15.0_Enforce1000.golden | 69 + ...mits2000_Versionv2.21.0_Enforce1000.golden | 70 + ...imits500_Versionv2.15.0_Enforce1000.golden | 69 + ...estAdditionalAlertmanagers_Expected.golden | 31 + ...ScrapeConfigsAdditionalScrapeConfig.golden | 14 + ...torWithEndpointSliceEnable_Expected.golden | 93 + ...ingConfig_Config_only_with_endpoint.golden | 9 + .../TracingConfig_Expect_valid_config.golden | 16 + .../testdata/external_label_specified.golden | 9 + ...pecified_along_with_reserved_labels.golden | 8 + ...lobal_settings_valid_config_v2.15.2.golden | 7 + ...fied_when_scrape_interval_specified.golden | 0 ...ed_instead_of_the_current_namespace.golden | 8 + .../prometheus/testdata/no_TSDB_config.golden | 7 + .../testdata/pod_monitor_with_oauth2.golden | 59 + .../testdata/probe_monitor_with_oauth2.golden | 47 + .../prometheus/testdata/query_log_file.golden | 8 + .../service_monitor_with_oauth2.golden | 78 + ...al_config_with_keep_dropped_targets.golden | 8 + ...lid_global_config_with_label_limits.golden | 13 + .../testdata/valid_global_limits.golden | 10 + ...ith_valid_scrape_interval_specified.golden | 8 + .../pkg/thanos/operator.go | 230 +- .../prometheus-operator/pkg/thanos/rules.go | 17 +- .../pkg/thanos/statefulset.go | 20 +- .../pkg/webconfig/config_test.go | 51 +- .../HTTP_config_with_all_parameters.golden | 8 + ...ig_with_all_parameters_from secrets.golden | 14 + ...fig_with_certificate_from_configmap.golden | 3 + ...config_with_certificate_from_secret.golden | 3 + ...onfig_with_client_CA_from configmap.golden | 4 + .../testdata/tls_config_not_defined.golden | 0 .../generate/append-operator-version.sh | 8 + .../prometheus-operator/scripts/go.mod | 8 +- .../prometheus-operator/scripts/go.sum | 24 +- .../scripts/run-external.sh | 2 + .../scripts/tooling/Dockerfile | 40 + .../scripts/update-golden-files.sh | 20 + .../alertmanager_instance_namespaces_test.go | 77 +- .../test/e2e/alertmanager_test.go | 366 +- .../test/e2e/config_reloader_test.go | 94 + .../test/e2e/denylist_test.go | 6 +- .../prometheus-operator/test/e2e/main_test.go | 54 +- .../prometheus_instance_namespaces_test.go | 77 +- .../test/e2e/prometheus_test.go | 198 +- .../test/e2e/prometheusagent_test.go | 75 + .../test/e2e/scrapeconfig_test.go | 81 +- .../test/e2e/thanosruler_test.go | 141 +- .../test/framework/admission_webhooks.go | 22 +- .../test/framework/alertmanager.go | 48 +- .../prometheus-operator/test/framework/crd.go | 33 +- .../test/framework/framework.go | 247 +- .../test/framework/prometheus.go | 10 +- .../test/framework/prometheusagent.go | 39 +- .../test/framework/role_binding.go | 58 +- .../test/framework/status.go | 19 +- .../test/framework/thanosruler.go | 3 +- 449 files changed, 32977 insertions(+), 13257 deletions(-) create mode 100644 otelcollector/otel-allocator/prometheus-operator/.github/workflows/automerge-dependabot.yaml create mode 100644 otelcollector/otel-allocator/prometheus-operator/.github/workflows/test-prom-version-upgrade.yaml create mode 100644 otelcollector/otel-allocator/prometheus-operator/Dockerfile create mode 100644 otelcollector/otel-allocator/prometheus-operator/Documentation/proposals/202309-controller-id.md create mode 100644 otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/scrapeconfig.md create mode 100644 otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile create mode 100644 otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1alpha1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1beta1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1alpha1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1beta1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_mute_time_intervals_v1alpha1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1alpha1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1beta1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_time_intervals_v1beta1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesNoAnnotations.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesWithBooleanInAnnotations.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithAnnotations.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithExternalLabelsInAnnotations.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1alpha1_v1beta1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1beta1_v1alpha1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/nonStringsInLabelsAnnotations.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Active_Time_Intervals.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_MSTeams_Receiver.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Mute_Time_Intervals.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Receiver.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Team_Responder.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Pagerduty_Receiver.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_Access_and_Key.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_roleARN.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL_File.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Telegram_Receiver.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_WeChat_Receiver.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Webhook_Receiver_and_custom_http_config_oauth2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Discord_url_field.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Global_opsgenie_api_key_file_field.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/OpsGenie_entity_and_actions_fields.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_sub_route_and_matchers_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_subroute_deprecated_matching_pattern_simple_CR.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/mute_time_intervals_field.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base,_CR_with_inhibition_rules_only.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_are_converted.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_not_converted.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_multiple_alertmanagerconfigs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR_with_namespaceMatcher_disabled.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_active_time_intervals_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_send_revolved_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_false,_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_true_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_inhibit_rules_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_mute_time_intervals_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_sns_receiver_no_CRs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/azuread.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/managedidentity.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/dnssdconfig.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2filter.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2sdconfig.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/k8sselectorconfig.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/msteamsconfig.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/webexconfig.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/msteamsconfig.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/webexconfig.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets_test.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/operator/storageclass.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/applyconfiguration.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerAPIVersion.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Invalid_Prom_Version.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Valid_Prom_Version.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBearerToken.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Enabled.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Unsupported.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Enabled.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Unsupported.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Invalid_Prom_Version.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Valid_Prom_Version.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_returns_an_empty_list_instead_of_the_current_namespace.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_takes_precedence_over_MatchNames.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce0MB_v2.28.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.28.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EmptyEndpointPorts.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/GenerateRelabelConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorLabelsOverriding.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorTimestampsOverriding.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/IgnoreNamespaceSelectors_overrides_Any_and_MatchNames.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationFirst.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationTwo.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargets.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsNotAddedInConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsOverridedWithEnforcedValue.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.26.0_enforceLimit1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.27.0_enforceLimit1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.26.0_enforceLimit1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.27.0_enforceLimit1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0_enforceLimit1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0_enforceLimit1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforc1000_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce1000_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.27.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NamespaceSetCorrectlyForPodMonitor.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.25.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.28.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.25.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.28.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.25.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_AuthorizationSafe.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_FilterExternalLabels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_NotFollowRedirects.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.27.1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_FilterExternalLabels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_NotFilterExternalLabels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_3.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.10.0_1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.22.0_1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_3.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_4.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.27.1_1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.30.0_2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.39.0_1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.43.0_2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.45.0_1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit-1.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit2000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit500.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_NoLimit.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigFilters.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Selectors.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.25.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.28.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.25.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.28.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorLabels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSet_v2.29.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_less_than_v2.39.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLabels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.15.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0_Enforce1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits1000_Versionv2.21.0_Enforce1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.15.0_Enforce1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.21.0_Enforce1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits500_Versionv2.15.0_Enforce1000.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalScrapeConfigsAdditionalScrapeConfig.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified_along_with_reserved_labels.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/global_settings_valid_config_v2.15.2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/invalid_scrape_timeout_specified_when_scrape_interval_specified.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/namespaces_from_MatchNames_are_returned_instead_of_the_current_namespace.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/no_TSDB_config.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/query_log_file.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/service_monitor_with_oauth2.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_keep_dropped_targets.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_label_limits.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_limits.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_scrape_timeout_along_with_valid_scrape_interval_specified.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/HTTP_config_with_all_parameters.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/TLS_config_with_all_parameters_from secrets.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_configmap.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_secret.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_client_CA_from configmap.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/tls_config_not_defined.golden create mode 100644 otelcollector/otel-allocator/prometheus-operator/scripts/generate/append-operator-version.sh create mode 100644 otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile create mode 100644 otelcollector/otel-allocator/prometheus-operator/scripts/update-golden-files.sh create mode 100644 otelcollector/otel-allocator/prometheus-operator/test/e2e/config_reloader_test.go diff --git a/otelcollector/otel-allocator/prometheus-operator/.gitattributes b/otelcollector/otel-allocator/prometheus-operator/.gitattributes index 75781d27b..6744c68fd 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.gitattributes +++ b/otelcollector/otel-allocator/prometheus-operator/.gitattributes @@ -4,3 +4,4 @@ example/prometheus-operator-crd-full/* linguist-generated=true example/prometheus-operator-crd/* linguist-generated=true example/jsonnet/prometheus-operator/* linguist-generated=true Documentation/api.md linguist-generated=true +**/testdata/*.golden linguist-generated=true diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/CODEOWNERS b/otelcollector/otel-allocator/prometheus-operator/.github/CODEOWNERS index 4c531e80e..6b9691646 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/CODEOWNERS +++ b/otelcollector/otel-allocator/prometheus-operator/.github/CODEOWNERS @@ -1,4 +1 @@ * @prometheus-operator/prometheus-operator-reviewers - -/scripts/ @paulfantom -/.github/workflows/ @paulfantom diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/dependabot.yml b/otelcollector/otel-allocator/prometheus-operator/.github/dependabot.yml index 19a729a9c..2551a6794 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/dependabot.yml +++ b/otelcollector/otel-allocator/prometheus-operator/.github/dependabot.yml @@ -4,6 +4,14 @@ updates: directory: / schedule: interval: daily + groups: + k8s-libs: + patterns: + - "k8s.io/api" + - "k8s.io/apiextensions-apiserver" + - "k8s.io/apimachinery" + - "k8s.io/client-go" + - "k8s.io/component-base" - package-ecosystem: github-actions directory: / diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/env b/otelcollector/otel-allocator/prometheus-operator/.github/env index 61e90518e..1ef6c3ae0 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/env +++ b/otelcollector/otel-allocator/prometheus-operator/.github/env @@ -1,3 +1,3 @@ -golang-version=1.20 +golang-version=1.21 kind-version=v0.20.0 kind-image=kindest/node:v1.27.3 diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/automerge-dependabot.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/automerge-dependabot.yaml new file mode 100644 index 000000000..5b49afc9e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/automerge-dependabot.yaml @@ -0,0 +1,42 @@ +name: Dependabot auto-merge +on: pull_request + +permissions: + contents: write + pull-requests: write + +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + steps: + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v1 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + - name: Checkout + if: contains(steps.metadata.outputs.dependency-names, 'k8s.io/api') + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ref: ${{ github.event.pull_request.head.ref }} + - name: Generate Documentation/compatibility.md + if: contains(steps.metadata.outputs.dependency-names, 'k8s.io/api') + run: | + make generate --always-make + if ! git diff --exit-code; then + git config --global user.email "support@github.com" + git config --global user.name "dependabot[bot]" + git add Documentation/compatibility.md + git commit -s -m "Generate Documentation/compatibility.md" + git push + fi + - name: Enable auto-merge for Dependabot PRs + if: ${{steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch'}} + run: | + gh pr merge --auto --merge "$PR_URL" + gh pr review --approve "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} \ No newline at end of file diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/checks.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/checks.yaml index 3fce59bf2..c941be128 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/checks.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/checks.yaml @@ -18,36 +18,39 @@ jobs: - ubuntu-latest name: Generate and format steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - run: make --always-make format generate && git diff --exit-code check-docs: runs-on: ubuntu-latest name: Check Documentation formatting and links steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - run: make check-docs check-golang: runs-on: ubuntu-latest name: Golang linter steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - name: golangci-lint - uses: golangci/golangci-lint-action@v3.6.0 + uses: golangci/golangci-lint-action@v3.7.0 with: version: v1.53.1 args: --timeout 10m0s @@ -55,12 +58,13 @@ jobs: runs-on: ubuntu-latest name: Check prometheus metrics steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - run: make check-metrics build: runs-on: ${{ matrix.os }} @@ -71,22 +75,24 @@ jobs: - ubuntu-latest name: Build operator binary steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - run: make operator po-rule-migration: runs-on: ubuntu-latest name: Build Prometheus Operator rule config map to rule file CRDs CLI tool steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - run: cd cmd/po-rule-migration && go install diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/e2e.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/e2e.yaml index 2a9f8662f..e40406146 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/e2e.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/e2e.yaml @@ -52,24 +52,26 @@ jobs: operatorUpgrade: "" featureGated: "include" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - name: Install Go uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - name: Build images run: | export SHELL=/bin/bash make build image - - name: Start KinD - uses: engineerd/setup-kind@v0.5.0 + - name: Start kind cluster + uses: helm/kind-action@v1.8.0 with: version: ${{ env.kind-version }} - image: ${{ env.kind-image }} + node_image: ${{ env.kind-image }} wait: 300s - config: /test/e2e/kind-conf.yaml + config: ./test/e2e/kind-conf.yaml + cluster_name: e2e - name: Wait for cluster to finish bootstraping run: | kubectl wait --for=condition=Ready pods --all --all-namespaces --timeout=300s @@ -77,9 +79,9 @@ jobs: kubectl get pods -A - name: Load images run: | - kind load docker-image quay.io/prometheus-operator/prometheus-operator:$(git rev-parse --short HEAD) - kind load docker-image quay.io/prometheus-operator/prometheus-config-reloader:$(git rev-parse --short HEAD) - kind load docker-image quay.io/prometheus-operator/admission-webhook:$(git rev-parse --short HEAD) + kind load docker-image -n e2e quay.io/prometheus-operator/prometheus-operator:$(git rev-parse --short HEAD) + kind load docker-image -n e2e quay.io/prometheus-operator/prometheus-config-reloader:$(git rev-parse --short HEAD) + kind load docker-image -n e2e quay.io/prometheus-operator/admission-webhook:$(git rev-parse --short HEAD) kubectl apply -f scripts/kind-rbac.yaml - name: Run tests run: > @@ -89,6 +91,7 @@ jobs: EXCLUDE_THANOSRULER_TESTS=${{ matrix.thanosruler }} EXCLUDE_OPERATOR_UPGRADE_TESTS=${{ matrix.operatorUpgrade }} FEATURE_GATED_TESTS=${{ matrix.featureGated }} + EXCLUDE_PROMETHEUS_UPGRADE_TESTS=exclude make test-e2e # Added to summarize the matrix and allow easy branch protection rules setup diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/publish.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/publish.yaml index 092281c22..eb0861ed6 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/publish.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/publish.yaml @@ -22,13 +22,14 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - name: Install Go uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - name: Install cosign uses: sigstore/cosign-installer@main - name: Check the Docker version @@ -38,13 +39,13 @@ jobs: - name: Install crane uses: imjasonh/setup-crane@v0.3 - name: Login to quay.io - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: quay.io username: ${{ secrets.quay_username }} password: ${{ secrets.quay_password }} - name: Login to ghcr.io - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/release.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/release.yaml index d7406fd4d..c2a54ecaa 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/release.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/release.yaml @@ -10,13 +10,14 @@ jobs: name: Upload release assets steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - name: Install Go uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - name: Upload bundle.yaml to release uses: svenstaro/upload-release-action@v2 with: diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/stale.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/stale.yaml index 70951dc5a..255aacfa6 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/stale.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/stale.yaml @@ -14,7 +14,7 @@ jobs: days-before-stale: 60 days-before-issue-close: 120 days-before-pr-close: -1 # Prevent closing PRs - exempt-issue-labels: 'kind/feature,help wanted,kind/bug' + exempt-issue-labels: 'kind/feature,help wanted,kind/bug,kind/documentation' stale-issue-label: 'stale' stale-pr-label: 'stale' exempt-draft-pr: true diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/test-prom-version-upgrade.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/test-prom-version-upgrade.yaml new file mode 100644 index 000000000..8e6878a1c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/test-prom-version-upgrade.yaml @@ -0,0 +1,51 @@ +name: Test Prometheus upgrades +on: + schedule: + - cron: '37 15 * * *' # Every day 15:37 + +jobs: + upgrade-prometheus: + name: Upgrade Prometheus + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Import environment variables from file + run: cat ".github/env" >> $GITHUB_ENV + - name: Install Go + uses: actions/setup-go@v4 + with: + go-version: '${{ env.golang-version }}' + check-latest: true + - name: Build images + run: | + export SHELL=/bin/bash + make build image + - name: Start KinD + uses: helm/kind-action@v1.8.0 + with: + version: ${{ env.kind-version }} + node_image: ${{ env.kind-image }} + wait: 300s + config: ./test/e2e/kind-conf.yaml + cluster_name: e2e + - name: Wait for cluster to finish bootstraping + run: | + kubectl wait --for=condition=Ready pods --all --all-namespaces --timeout=300s + kubectl cluster-info + kubectl get pods -A + - name: Load images + run: | + kind load docker-image -n e2e quay.io/prometheus-operator/prometheus-operator:$(git rev-parse --short HEAD) + kind load docker-image -n e2e quay.io/prometheus-operator/prometheus-config-reloader:$(git rev-parse --short HEAD) + kind load docker-image -n e2e quay.io/prometheus-operator/admission-webhook:$(git rev-parse --short HEAD) + kubectl apply -f scripts/kind-rbac.yaml + - name: Run tests + run: > + EXCLUDE_ALL_NS_TESTS=exclude + EXCLUDE_ALERTMANAGER_TESTS=exclude + EXCLUDE_PROMETHEUS_TESTS=exclude + EXCLUDE_PROMETHEUS_ALL_NS_TESTS=exclude + EXCLUDE_THANOSRULER_TESTS=exclude + EXCLUDE_OPERATOR_UPGRADE_TESTS=exclude + FEATURE_GATED_TESTS=exclude + make test-e2e diff --git a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/unit.yaml b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/unit.yaml index 8e1da7ef5..b59d5cbc8 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.github/workflows/unit.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/.github/workflows/unit.yaml @@ -13,21 +13,23 @@ jobs: runs-on: ubuntu-latest name: Unit tests steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: '${{ env.golang-version }}' + check-latest: true - run: make test-unit extended-tests: runs-on: ubuntu-latest name: Extended tests steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Import environment variables from file run: cat ".github/env" >> $GITHUB_ENV - uses: actions/setup-go@v4 with: go-version: ${{ env.golang-version }} + check-latest: true - run: make test-long diff --git a/otelcollector/otel-allocator/prometheus-operator/.golangci.yml b/otelcollector/otel-allocator/prometheus-operator/.golangci.yml index 5825081cd..17637ff6a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/.golangci.yml +++ b/otelcollector/otel-allocator/prometheus-operator/.golangci.yml @@ -5,6 +5,7 @@ linters: enable: - revive - gci + - depguard issues: exclude-rules: @@ -24,3 +25,38 @@ linters-settings: - standard - default - prefix(github.com/prometheus-operator/prometheus-operator) + depguard: + rules: + forbid-pkg-errors: + files: + - "**/admission/*.go" + - "**/alertmanager/*.go" + - "**/alertmanager/**/*.go" + - "**/apis/*.go" + - "**/apis/**/*.go" + - "**/assets/*.go" + - "**/client/*.go" + - "**/client/**/*.go" + - "**/informers/*.go" + - "**/k8sutil/*.go" + - "**/listwatch/*.go" + - "**/namespacelabeler/*.go" + - "**/operator/*.go" + - "**/prometheus/*.go" + - "**/prometheus/**/*.go" + - "**/server/*.go" + - "**/thanos/*.go" + - "**/versionutil/*.go" + - "**/webconfig/*.go" + - "**/e2e/*.go" + - "**/framework/admission_webhooks.go" + - "**/framework/alertmanager.go" + - "**/framework/cluster_role_binding.go" + - "**/framework/cluster_role.go" + - "**/framework/configmap.go" + - "**/framework/context.go" + - "**/framework/crd.go" + - "**/framework/framework.go" + deny: + - pkg: "github.com/pkg/errors" + dsc: Should be replaced with standard lib errors or fmt.Errorf \ No newline at end of file diff --git a/otelcollector/otel-allocator/prometheus-operator/ADOPTERS.md b/otelcollector/otel-allocator/prometheus-operator/ADOPTERS.md index c04fa8fff..b628df920 100644 --- a/otelcollector/otel-allocator/prometheus-operator/ADOPTERS.md +++ b/otelcollector/otel-allocator/prometheus-operator/ADOPTERS.md @@ -81,6 +81,19 @@ Uses [kube-prometheus](https://github.com/prometheus-operator/kube-prometheus): Deckhouse is a Kubernetes Platform. Its clusters running on any infrastructure are provided with the monitoring system based on highly available Prometheus and Prometheus Operator. Essential metrics are preconfigured out-of-the-box to ensure monitoring of all levels, from hardware and Kubernetes internals to the platform’s modules functionality. The monitoring-custom module simplifies adding custom metrics for user applications. Deckhouse also hosts a dedicated Prometheus instance in each cluster to store downsampled metric series for longer periods. +## Deezer + +[deezer.com](https://www.deezer.com) + +Environments: Bare Metal + +Uses [kube-prometheus](https://github.com/prometheus-operator/kube-prometheus): Yes + +Details (optional): +- HA Pair of Prometheus +- 340000 samples/s +- 14.3M active series + ## Giant Swarm [giantswarm.io](https://www.giantswarm.io/) diff --git a/otelcollector/otel-allocator/prometheus-operator/CHANGELOG.md b/otelcollector/otel-allocator/prometheus-operator/CHANGELOG.md index 817fc8464..28fd20618 100644 --- a/otelcollector/otel-allocator/prometheus-operator/CHANGELOG.md +++ b/otelcollector/otel-allocator/prometheus-operator/CHANGELOG.md @@ -1,3 +1,53 @@ +## 0.69.1 / 2023-11-09 + +This release is built using Go 1.21.4 which addresses CVE-2023-45283 and CVE-2023-45284. + +* [BUGFIX] Rename test files to resolve Go import failures of `github.com/prometheus-operator/prometheus-operator`. #6070 + +## 0.69.0 / 2023-11-03 + +* [CHANGE] Consider secret references without `optional` value to be mandatory instead of optional for `.spec.additionalScrapeConfigs` configs. #5985 +* [CHANGE] Remove `prometheus_operator_rule_validation_triggered_total`, `prometheus_operator_rule_validation_errors_total`, `prometheus_operator_alertmanager_config_validation_triggered_total` and `prometheus_operator_alertmanager_config_validation_errors_total` metrics which have been deprecated since v0.55.0. The same information is available from the `apiserver_admission_webhook_rejection_count` metric available since Kubernetes v1.16.0. #6024 +* [CHANGE/BUGFIX] Disable HTTP2 connections by default to mitigate CVE-2023-44487. #6028 +* [FEATURE] Add support for EC2 service discovery to the ScrapeConfig CRD. #5902 #6012 +* [FEATURE] Support MSTeams receiver in the AlertmanagerConfig CRD. #6002 +* [FEATURE] Add the `sigv4` field to the Alertmanager endpoints for the Prometheus CRD. #6036 +* [FEATURE] Support AzureAD authentication for Prometheus remote write. #5852 +* [FEATURE] Add the `userKeyFile` and `tokenFile` fields for Pushover to the AlertmanagerConfig CRD. #5886 +* [FEATURE] Add `--as` to the operator's CLI arguments for user impersonation. #5906 +* [FEATURE] Add the `selectors` field for the Kubernetes service discovery to the ScrapeConfig CRD. #6053 +* [ENHANCEMENT] Support `url_file` for Webhook receiver in the Alertmanager configuration. #5876 +* [ENHANCEMENT] Support `user_key_file` and `token_file` for Pushover receiver in the Alertmanager configuration. #5876 +* [ENHANCEMENT] Use server-side apply instead of update when reconciling the resource's status. #5883 #5913 #5912 +* [ENHANCEMENT] Detect when an invalid storage class is defined. #5792 +* [ENHANCEMENT] Add OCI labels to container images. #5946 +* [ENHANCEMENT] Add the `operator.prometheus.io/version` annotation to the CRD manifests. #6050 +* [BUGFIX] Detect namespace changes without list/watch permissions on the namespace resources. #5934 #5898 +* [BUGFIX] Avoid operator panic when using ScrapeConfig with the Consul service discovery. #5937 +* [BUGFIX] Don't enable Prometheus unmanaged mode when only `.spec.scrapeConfigSelector` is defined. #5941 +* [BUGFIX] Prevent Alertmanager pods from joining random clusters. #5945 +* [BUGFIX] Fix race condition when deleting Alertmanager, Prometheus, PrometheusAgent and ThanosRuler instances. #5954 +* [BUGFIX] Enable klog verbose level only when the log level is debug.. #5981 +* [BUGFIX] Reduce memory usage by using secret metadata informer in the PrometheusAgent controller. #5982 +* [BUGFIX] Do not strip mandatory fields in the `stripped-down-crds.yaml` manifest file. #6008 +* [BUGFIX] Update the resource requests and limits of the config reloader sidecar when updated. #5971 + +## 0.68.0 / 2023-09-06 + +* [FEATURE] Add support for Webex receiver to the AlertmanagerConfig CRD. #5305 +* [FEATURE] Add support for Bot Token File for Telegram receiver in AlermanagerConfig CRD. #5882 +* [FEATURE] Add support for MetricRelabelings to the ScrapeConfig CRD. #5805 +* [FEATURE] Add support for DNS service discovery fields to the ScrapeConfig CRD. #5866 +* [FEATURE] Add support for `keep_dropped_targets` to Prometheus, PrometheusAgent, ServiceMonitor, PodMonitor, Probe and ScrapeConfig CRDs. #5897 +* [FEATURE] Don't trigger reconcile loops if statefulsets have different `revisionHistoryLimit`. #5773 +* [ENHANCEMENT] Decrease CPU usage when reconciling ThanosRuler resources. #5784 +* [BUGFIX] Fix sharding in Probe CRD. #5735 +* [BUGFIX] Fix text-only email configs in AlertmanagerConfig CRD. #5804 +* [BUGFIX] Fix rejecting PodMonitor, ServiceMonitor, Probes and ScrapeConfigs with invalid relabelings. #5841 #5856 +* [BUGFIX] Fix Kubernetes Service Discovery in ScrapeConfig CRD. #5871 +* [BUGFIX] Fix reserved labels being overriden by external labels. #5888 +* [BUGFIX] Fix updating Status of Prometheus, Alertmanager and ThanosRuler even the operator fails to update their statefulsets. #5891 + ## 0.67.1 / 2023-08-03 * [BUGFIX] Avoid skipping `AlertmanagerConfig` resources for Alertmanager versions prior v0.25.0. #5788 diff --git a/otelcollector/otel-allocator/prometheus-operator/CONTRIBUTING.md b/otelcollector/otel-allocator/prometheus-operator/CONTRIBUTING.md index ccb3193b7..64332b7f0 100644 --- a/otelcollector/otel-allocator/prometheus-operator/CONTRIBUTING.md +++ b/otelcollector/otel-allocator/prometheus-operator/CONTRIBUTING.md @@ -61,6 +61,7 @@ This is a rough outline of what a contributor's workflow looks like: - Make sure your commit messages are in the proper format (see below). - Push your changes to a topic branch in your fork of the repository. - Make sure the tests pass, and add any new tests as appropriate. +- If the tests are checking long strings such as YAML, JSON or any other complex content, ensure you're using [golden files](https://pkg.go.dev/gotest.tools/v3/golden). - Submit a pull request to the original repository. Many files (documentation, manifests, ...) in this repository are auto-generated. For instance, `bundle.yaml` is generated from the *Jsonnet* files in `/jsonnet/prometheus-operator`. Before submitting a pull request, make sure that you've executed `make generate` and committed the generated changes. diff --git a/otelcollector/otel-allocator/prometheus-operator/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/Dockerfile new file mode 100644 index 000000000..12ea770a2 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/Dockerfile @@ -0,0 +1,15 @@ +ARG ARCH="amd64" +ARG OS="linux" +FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest + +COPY operator /bin/operator + +# On busybox 'nobody' has uid `65534' +USER 65534 + +LABEL org.opencontainers.image.source="https://github.com/prometheus-operator/prometheus-operator" \ + org.opencontainers.image.url="https://prometheus-operator.dev/" \ + org.opencontainers.image.documentation="https://prometheus-operator.dev/" \ + org.opencontainers.image.licenses="Apache-2.0" + +ENTRYPOINT ["/bin/operator"] diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/api.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/api.md index ae107e979..9ad2d128b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Documentation/api.md +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/api.md @@ -106,7 +106,14 @@ EmbeddedObjectMetadata -

PodMetadata configures Labels and Annotations which are propagated to the alertmanager pods.

+

PodMetadata configures labels and annotations which are propagated to the Alertmanager pods.

+

The following items are reserved and cannot be overridden: +* “alertmanager” label, set to the name of the Alertmanager instance. +* “app.kubernetes.io/instance” label, set to the name of the Alertmanager instance. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/name” label, set to “alertmanager”. +* “app.kubernetes.io/version” label, set to the Alertmanager version. +* “kubectl.kubernetes.io/default-container” annotation, set to “alertmanager”.

@@ -938,6 +945,20 @@ Only valid in Prometheus versions 2.27.0 and newer.

+keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + + + attachMetadata
@@ -1236,6 +1257,20 @@ uint64 Only valid in Prometheus versions 2.27.0 and newer.

+ + +keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + @@ -1311,6 +1346,15 @@ EmbeddedObjectMetadata

PodMetadata configures labels and annotations which are propagated to the Prometheus pods.

+

The following items are reserved and cannot be overridden: +* “prometheus” label, set to the name of the Prometheus object. +* “app.kubernetes.io/instance” label, set to the name of the Prometheus object. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/name” label, set to “prometheus”. +* “app.kubernetes.io/version” label, set to the Prometheus version. +* “operator.prometheus.io/name” label, set to the name of the Prometheus object. +* “operator.prometheus.io/shard” label, set to the shard number of the Prometheus object. +* “kubectl.kubernetes.io/default-container” annotation, set to “prometheus”.

@@ -2108,7 +2152,7 @@ bool

When true, spec.namespaceSelector from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe -objec.

+object.

@@ -2217,6 +2261,23 @@ greater than zero and less than spec.enforcedLabelValueLengthLimit. +enforcedKeepDroppedTargets
+ +uint64 + + + +(Optional) +

When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets +dropped by relabeling that will be kept in memory. The value overrides +any spec.keepDroppedTargets set by +ServiceMonitor, PodMonitor, Probe objects unless spec.keepDroppedTargets is +greater than zero and less than spec.enforcedKeepDroppedTargets.

+

It requires Prometheus >= v2.47.0.

+ + + + enforcedBodySizeLimit
@@ -2440,6 +2501,20 @@ Only valid in Prometheus versions 2.45.0 and newer.

+keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + + + baseImage
string @@ -3068,6 +3143,20 @@ Only valid in Prometheus versions 2.27.0 and newer.

+keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + + + attachMetadata
@@ -3165,7 +3254,13 @@ EmbeddedObjectMetadata -

PodMetadata contains Labels and Annotations gets propagated to the thanos ruler pods.

+

PodMetadata configures labels and annotations which are propagated to the ThanosRuler pods.

+

The following items are reserved and cannot be overridden: +* “app.kubernetes.io/name” label, set to “thanos-ruler”. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/instance” label, set to the name of the ThanosRuler instance. +* “thanos-ruler” label, set to the name of the ThanosRuler instance. +* “kubectl.kubernetes.io/default-container” annotation, set to “thanos-ruler”.

@@ -4161,7 +4256,7 @@ BasicAuth (Optional)

BasicAuth configuration for Alertmanager.

-

Cannot be set at the same time as bearerTokenFile, or authorization.

+

Cannot be set at the same time as bearerTokenFile, authorization or sigv4.

@@ -4173,7 +4268,7 @@ string

File to read bearer token for Alertmanager.

-

Cannot be set at the same time as basicAuth, or authorization.

+

Cannot be set at the same time as basicAuth, authorization, or sigv4.

Deprecated: this will be removed in a future release. Prefer using authorization.

@@ -4189,7 +4284,23 @@ SafeAuthorization (Optional)

Authorization section for Alertmanager.

-

Cannot be set at the same time as basicAuth, or bearerTokenFile.

+

Cannot be set at the same time as basicAuth, bearerTokenFile or sigv4.

+ + + + +sigv4
+ +
+Sigv4 + + + + +(Optional) +

Sigv4 allows to configures AWS’s Signature Verification 4 for the URL.

+

It requires Prometheus >= v2.48.0.

+

Cannot be set at the same time as basicAuth, bearerTokenFile or authorization.

@@ -4370,7 +4481,14 @@ EmbeddedObjectMetadata
-

PodMetadata configures Labels and Annotations which are propagated to the alertmanager pods.

+

PodMetadata configures labels and annotations which are propagated to the Alertmanager pods.

+

The following items are reserved and cannot be overridden: +* “alertmanager” label, set to the name of the Alertmanager instance. +* “app.kubernetes.io/instance” label, set to the name of the Alertmanager instance. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/name” label, set to “alertmanager”. +* “app.kubernetes.io/version” label, set to the Alertmanager version. +* “kubectl.kubernetes.io/default-container” annotation, set to “alertmanager”.

@@ -5347,6 +5465,49 @@ string +

AzureAD +

+

+(Appears on:RemoteWriteSpec) +

+
+

AzureAD defines the configuration for remote write’s azuread parameters.

+
+ + + + + + + + + + + + + + + + + +
FieldDescription
+cloud
+ +string + +
+(Optional) +

The Azure Cloud. Options are ‘AzurePublic’, ‘AzureChina’, or ‘AzureGovernment’.

+
+managedIdentity
+ + +ManagedIdentity + + +
+

ManagedIdentity defines the Azure User-assigned Managed identity.

+

BasicAuth

@@ -5430,6 +5591,15 @@ EmbeddedObjectMetadata

PodMetadata configures labels and annotations which are propagated to the Prometheus pods.

+

The following items are reserved and cannot be overridden: +* “prometheus” label, set to the name of the Prometheus object. +* “app.kubernetes.io/instance” label, set to the name of the Prometheus object. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/name” label, set to “prometheus”. +* “app.kubernetes.io/version” label, set to the Prometheus version. +* “operator.prometheus.io/name” label, set to the name of the Prometheus object. +* “operator.prometheus.io/shard” label, set to the shard number of the Prometheus object. +* “kubectl.kubernetes.io/default-container” annotation, set to “prometheus”.

@@ -6227,7 +6397,7 @@ bool

When true, spec.namespaceSelector from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe -objec.

+object.

@@ -6336,6 +6506,23 @@ greater than zero and less than spec.enforcedLabelValueLengthLimit. +enforcedKeepDroppedTargets
+ +uint64 + + + +(Optional) +

When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets +dropped by relabeling that will be kept in memory. The value overrides +any spec.keepDroppedTargets set by +ServiceMonitor, PodMonitor, Probe objects unless spec.keepDroppedTargets is +greater than zero and less than spec.enforcedKeepDroppedTargets.

+

It requires Prometheus >= v2.47.0.

+ + + + enforcedBodySizeLimit
@@ -6557,6 +6744,20 @@ uint64 Only valid in Prometheus versions 2.45.0 and newer.

+ + +keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ +

Condition @@ -6716,7 +6917,7 @@ The possible status values for this condition type are:

Duration (string alias)

-(Appears on:AlertmanagerEndpoints, AlertmanagerGlobalConfig, CommonPrometheusFields, Endpoint, MetadataConfig, PodMetricsEndpoint, ProbeSpec, PrometheusSpec, PrometheusTracingConfig, QuerySpec, RemoteReadSpec, RemoteWriteSpec, Rule, RuleGroup, TSDBSpec, ThanosRulerSpec, ThanosSpec, ConsulSDConfig, FileSDConfig, HTTPSDConfig, ScrapeConfigSpec) +(Appears on:AlertmanagerEndpoints, AlertmanagerGlobalConfig, CommonPrometheusFields, Endpoint, MetadataConfig, PodMetricsEndpoint, ProbeSpec, PrometheusSpec, PrometheusTracingConfig, QuerySpec, RemoteReadSpec, RemoteWriteSpec, Rule, RuleGroup, TSDBSpec, ThanosRulerSpec, ThanosSpec, ConsulSDConfig, DNSSDConfig, EC2SDConfig, FileSDConfig, HTTPSDConfig, ScrapeConfigSpec)

Duration is a valid time duration that can be parsed by Prometheus model.ParseDuration() function. @@ -7651,6 +7852,35 @@ string

LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as well as underscores.

+

ManagedIdentity +

+

+(Appears on:AzureAD) +

+
+

ManagedIdentity defines the Azure User-assigned Managed identity.

+
+ + + + + + + + + + + + + +
FieldDescription
+clientId
+ +string + +
+

The client id

+

MetadataConfig

@@ -8406,6 +8636,20 @@ Only valid in Prometheus versions 2.27.0 and newer.

+keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + + + attachMetadata
@@ -8659,6 +8903,20 @@ uint64 Only valid in Prometheus versions 2.27.0 and newer.

+ + +keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ +

ProbeTLSConfig @@ -9102,6 +9360,15 @@ EmbeddedObjectMetadata

PodMetadata configures labels and annotations which are propagated to the Prometheus pods.

+

The following items are reserved and cannot be overridden: +* “prometheus” label, set to the name of the Prometheus object. +* “app.kubernetes.io/instance” label, set to the name of the Prometheus object. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/name” label, set to “prometheus”. +* “app.kubernetes.io/version” label, set to the Prometheus version. +* “operator.prometheus.io/name” label, set to the name of the Prometheus object. +* “operator.prometheus.io/shard” label, set to the shard number of the Prometheus object. +* “kubectl.kubernetes.io/default-container” annotation, set to “prometheus”.

@@ -9899,7 +10166,7 @@ bool

When true, spec.namespaceSelector from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe -objec.

+object.

@@ -10008,6 +10275,23 @@ greater than zero and less than spec.enforcedLabelValueLengthLimit. +enforcedKeepDroppedTargets
+ +uint64 + + + +(Optional) +

When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets +dropped by relabeling that will be kept in memory. The value overrides +any spec.keepDroppedTargets set by +ServiceMonitor, PodMonitor, Probe objects unless spec.keepDroppedTargets is +greater than zero and less than spec.enforcedKeepDroppedTargets.

+

It requires Prometheus >= v2.47.0.

+ + + + enforcedBodySizeLimit
@@ -10231,6 +10515,20 @@ Only valid in Prometheus versions 2.45.0 and newer.

+keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + + + baseImage
string @@ -11501,7 +11799,7 @@ OAuth2 (Optional)

OAuth2 configuration for the URL.

It requires Prometheus >= v2.27.0.

-

Cannot be set at the same time as sigv4, authorization, or basicAuth.

+

Cannot be set at the same time as sigv4, authorization, basicAuth, or azureAd.

@@ -11516,7 +11814,7 @@ BasicAuth (Optional)

BasicAuth configuration for the URL.

-

Cannot be set at the same time as sigv4, authorization, or oauth2.

+

Cannot be set at the same time as sigv4, authorization, oauth2, or azureAd.

@@ -11544,7 +11842,7 @@ Authorization (Optional)

Authorization section for the URL.

It requires Prometheus >= v2.26.0.

-

Cannot be set at the same time as sigv4, basicAuth, or oauth2.

+

Cannot be set at the same time as sigv4, basicAuth, oauth2, or azureAd.

@@ -11560,7 +11858,23 @@ Sigv4 (Optional)

Sigv4 allows to configures AWS’s Signature Verification 4 for the URL.

It requires Prometheus >= v2.26.0.

-

Cannot be set at the same time as authorization, basicAuth, or oauth2.

+

Cannot be set at the same time as authorization, basicAuth, oauth2, or azureAd.

+ + + + +azureAd
+ +
+AzureAD + + + + +(Optional) +

AzureAD for the URL.

+

It requires Prometheus >= v2.45.0.

+

Cannot be set at the same time as authorization, basicAuth, oauth2, or sigv4.

@@ -12259,6 +12573,20 @@ Only valid in Prometheus versions 2.27.0 and newer.

+keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + + + attachMetadata
@@ -12350,7 +12678,7 @@ int32

Sigv4

-(Appears on:RemoteWriteSpec, SNSConfig, SNSConfig) +(Appears on:AlertmanagerEndpoints, RemoteWriteSpec, SNSConfig, SNSConfig)

Sigv4 optionally configures AWS’s Signature Verification 4 signing process to @@ -12720,7 +13048,13 @@ EmbeddedObjectMetadata -

PodMetadata contains Labels and Annotations gets propagated to the thanos ruler pods.

+

PodMetadata configures labels and annotations which are propagated to the ThanosRuler pods.

+

The following items are reserved and cannot be overridden: +* “app.kubernetes.io/name” label, set to “thanos-ruler”. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/instance” label, set to the name of the ThanosRuler instance. +* “thanos-ruler” label, set to the name of the ThanosRuler instance. +* “kubectl.kubernetes.io/default-container” annotation, set to “thanos-ruler”.

@@ -14160,8 +14494,8 @@ Resource Types:

AlertmanagerConfig

-

AlertmanagerConfig defines a namespaced AlertmanagerConfig to be aggregated -across multiple namespaces configuring one Alertmanager cluster.

+

AlertmanagerConfig configures the Prometheus Alertmanager, +specifying how alerts should be grouped, inhibited and notified to external systems.

@@ -14349,6 +14683,15 @@ EmbeddedObjectMetadata @@ -15146,7 +15489,7 @@ bool

When true, spec.namespaceSelector from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe -objec.

+object.

@@ -15255,6 +15598,23 @@ greater than zero and less than spec.enforcedLabelValueLengthLimit. + + + + + + + +

PodMetadata configures labels and annotations which are propagated to the Prometheus pods.

+

The following items are reserved and cannot be overridden: +* “prometheus” label, set to the name of the Prometheus object. +* “app.kubernetes.io/instance” label, set to the name of the Prometheus object. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/name” label, set to “prometheus”. +* “app.kubernetes.io/version” label, set to the Prometheus version. +* “operator.prometheus.io/name” label, set to the name of the Prometheus object. +* “operator.prometheus.io/shard” label, set to the shard number of the Prometheus object. +* “kubectl.kubernetes.io/default-container” annotation, set to “prometheus”.

+enforcedKeepDroppedTargets
+ +uint64 + +
+(Optional) +

When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets +dropped by relabeling that will be kept in memory. The value overrides +any spec.keepDroppedTargets set by +ServiceMonitor, PodMonitor, Probe objects unless spec.keepDroppedTargets is +greater than zero and less than spec.enforcedKeepDroppedTargets.

+

It requires Prometheus >= v2.47.0.

+
enforcedBodySizeLimit
@@ -15476,6 +15836,20 @@ uint64 Only valid in Prometheus versions 2.45.0 and newer.

+keepDroppedTargets
+ +uint64 + +
+(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+
@@ -15626,6 +16000,34 @@ ScrapeConfigSpec +dnsSDConfigs
+ + +[]DNSSDConfig + + + + +(Optional) +

DNSSDConfigs defines a list of DNS service discovery configurations.

+ + + + +ec2SDConfigs
+ + +[]EC2SDConfig + + + + +(Optional) +

EC2SDConfigs defines a list of EC2 service discovery configurations.

+ + + + relabelings
@@ -15835,12 +16237,40 @@ uint64 Only valid in Prometheus versions 2.27.0 and newer.

- + + +keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

- - -

AlertmanagerConfigSpec + + +metricRelabelings
+ +
+[]RelabelConfig + + + + +(Optional) +

MetricRelabelConfigs to apply to samples before ingestion.

+ + + + + + + +

AlertmanagerConfigSpec

(Appears on:AlertmanagerConfig) @@ -16225,6 +16655,78 @@ SafeTLSConfig +

DNSSDConfig +

+

+(Appears on:ScrapeConfigSpec) +

+
+

DNSSDConfig allows specifying a set of DNS domain names which are periodically queried to discover a list of targets. +The DNS servers to be contacted are read from /etc/resolv.conf. +See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+names
+ +[]string + +
+

A list of DNS domain names to be queried.

+
+refreshInterval
+ + +Duration + + +
+(Optional) +

RefreshInterval configures the time after which the provided names are refreshed. +If not set, Prometheus uses its default value.

+
+type
+ +string + +
+(Optional) +

The type of DNS query to perform. One of SRV, A, AAAA or MX. +If not set, Prometheus uses its default value.

+
+port
+ +int + +
+(Optional) +

The port number used if the query type is not SRV +Ignored for SRV records

+

DayOfMonthRange

@@ -16349,6 +16851,161 @@ HTTPConfig +

EC2Filter +

+

+(Appears on:EC2SDConfig) +

+
+

EC2Filter is the configuration for filtering EC2 instances.

+
+ + + + + + + + + + + + + + + + + +
FieldDescription
+name
+ +string + +
+
+values
+ +[]string + +
+
+

EC2SDConfig +

+

+(Appears on:ScrapeConfigSpec) +

+
+

EC2SDConfig allow retrieving scrape targets from AWS EC2 instances. +The private IP address is used by default, but may be changed to the public IP address with relabeling. +The IAM credentials used must have the ec2:DescribeInstances permission to discover scrape targets +See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+region
+ +string + +
+(Optional) +

The AWS region

+
+accessKey
+ + +Kubernetes core/v1.SecretKeySelector + + +
+(Optional) +

AccessKey is the AWS API key.

+
+secretKey
+ + +Kubernetes core/v1.SecretKeySelector + + +
+(Optional) +

SecretKey is the AWS API secret.

+
+roleARN
+ +string + +
+(Optional) +

AWS Role ARN, an alternative to using AWS API keys.

+
+refreshInterval
+ + +Duration + + +
+(Optional) +

RefreshInterval configures the refresh interval at which Prometheus will re-read the instance list.

+
+port
+ +int + +
+(Optional) +

The port to scrape metrics from. If using the public IP address, this must +instead be specified in the relabeling rule.

+
+filters
+ + +[]EC2Filter + + +
+(Optional) +

Filters can be used optionally to filter the instance list by other criteria. +Available filter criteria can be found here: +https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html +Filter API documentation: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Filter.html

+

EmailConfig

@@ -16598,7 +17255,7 @@ Duration

HTTPConfig

-(Appears on:DiscordConfig, OpsGenieConfig, PagerDutyConfig, PushoverConfig, SNSConfig, SlackConfig, TelegramConfig, VictorOpsConfig, WeChatConfig, WebhookConfig) +(Appears on:DiscordConfig, MSTeamsConfig, OpsGenieConfig, PagerDutyConfig, PushoverConfig, SNSConfig, SlackConfig, TelegramConfig, VictorOpsConfig, WeChatConfig, WebexConfig, WebhookConfig)

HTTPConfig defines a client HTTP configuration. @@ -16852,23 +17509,123 @@ resource’s namespace.

equal
-[]string +[]string + + + +

Labels that must have an equal value in the source and target alert for +the inhibition to take effect.

+ + + + +

K8SRole +(string alias)

+

+(Appears on:K8SSelectorConfig, KubernetesSDConfig) +

+
+

K8SRole is role of the service in Kubernetes. +Currently the only supported role is “Node”.

+
+

K8SSelectorConfig +

+

+(Appears on:KubernetesSDConfig) +

+
+

K8SSelectorConfig is Kubernetes Selector Config

+
+ + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+role
+ + +K8SRole + + +
+
+label
+ +string + +
+
+field
+ +string + +
+
+

KeyValue +

+

+(Appears on:EmailConfig, OpsGenieConfig, PagerDutyConfig, VictorOpsConfig) +

+
+

KeyValue defines a (key, value) tuple.

+
+ + + + + + + + + + + + + +
FieldDescription
+key
+ +string + +
+

Key of the tuple.

+
+value
+ +string
-

Labels that must have an equal value in the source and target alert for -the inhibition to take effect.

+

Value of the tuple.

-

KeyValue +

KubernetesSDConfig

-(Appears on:EmailConfig, OpsGenieConfig, PagerDutyConfig, VictorOpsConfig) +(Appears on:ScrapeConfigSpec)

-

KeyValue defines a (key, value) tuple.

+

KubernetesSDConfig allows retrieving scrape targets from Kubernetes’ REST API. +See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config

@@ -16880,36 +17637,41 @@ the inhibition to take effect.

-key
+role
-string + +K8SRole +
-

Key of the tuple.

+

Role of the Kubernetes entities that should be discovered.

-value
+selectors
-string + +[]K8SSelectorConfig +
-

Value of the tuple.

+(Optional) +

Selector to select objects.

-

KubernetesSDConfig +

MSTeamsConfig

-(Appears on:ScrapeConfigSpec) +(Appears on:Receiver)

-

KubernetesSDConfig allows retrieving scrape targets from Kubernetes’ REST API. -See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config

+

MSTeamsConfig configures notifications via Microsoft Teams. +It requires Alertmanager >= 0.26.0.

@@ -16921,14 +17683,65 @@ See +Kubernetes core/v1.SecretKeySelector + + + + + + + + + + + + + + + @@ -17771,6 +18584,15 @@ EmbeddedObjectMetadata @@ -18568,7 +19390,7 @@ bool

When true, spec.namespaceSelector from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe -objec.

+object.

@@ -18677,6 +19499,23 @@ greater than zero and less than spec.enforcedLabelValueLengthLimit. + + + + + + + +
+

MSTeams webhook URL.

+
+title
string
-

Role of the Kubernetes entities that should be discovered. -Currently the only supported role is “Node”.

+(Optional) +

Message title template.

+
+text
+ +string + +
+(Optional) +

Message body template.

+
+httpConfig
+ + +HTTPConfig + + +
+(Optional) +

HTTP client configuration.

PodMetadata configures labels and annotations which are propagated to the Prometheus pods.

+

The following items are reserved and cannot be overridden: +* “prometheus” label, set to the name of the Prometheus object. +* “app.kubernetes.io/instance” label, set to the name of the Prometheus object. +* “app.kubernetes.io/managed-by” label, set to “prometheus-operator”. +* “app.kubernetes.io/name” label, set to “prometheus”. +* “app.kubernetes.io/version” label, set to the Prometheus version. +* “operator.prometheus.io/name” label, set to the name of the Prometheus object. +* “operator.prometheus.io/shard” label, set to the shard number of the Prometheus object. +* “kubectl.kubernetes.io/default-container” annotation, set to “prometheus”.

+enforcedKeepDroppedTargets
+ +uint64 + +
+(Optional) +

When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets +dropped by relabeling that will be kept in memory. The value overrides +any spec.keepDroppedTargets set by +ServiceMonitor, PodMonitor, Probe objects unless spec.keepDroppedTargets is +greater than zero and less than spec.enforcedKeepDroppedTargets.

+

It requires Prometheus >= v2.47.0.

+
enforcedBodySizeLimit
@@ -18898,6 +19737,20 @@ uint64 Only valid in Prometheus versions 2.45.0 and newer.

+keepDroppedTargets
+ +uint64 + +
+(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+

PushoverConfig @@ -18939,9 +19792,25 @@ Kubernetes core/v1.SecretKeySelector +(Optional)

The secret’s key that contains the recipient user’s user key. The secret needs to be in the same namespace as the AlertmanagerConfig -object and accessible by the Prometheus Operator.

+object and accessible by the Prometheus Operator. +Either userKey or userKeyFile is required.

+ + + + +userKeyFile
+ +string + + + +(Optional) +

The user key file that contains the recipient user’s user key. +Either userKey or userKeyFile is required. +It requires Alertmanager >= v0.26.0.

@@ -18954,9 +19823,25 @@ Kubernetes core/v1.SecretKeySelector
+(Optional)

The secret’s key that contains the registered application’s API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig -object and accessible by the Prometheus Operator.

+object and accessible by the Prometheus Operator. +Either token or tokenFile is required.

+ + + + +tokenFile
+ +string + + + +(Optional) +

The token file that contains the registered application’s API token, see https://pushover.net/apps. +Either token or tokenFile is required. +It requires Alertmanager >= v0.26.0.

@@ -19256,6 +20141,33 @@ string

List of Telegram configurations.

+ + +webexConfigs
+ + +[]WebexConfig + + + + +

List of Webex configurations.

+ + + + +msteamsConfigs
+ + +[]MSTeamsConfig + + + + +

List of MSTeams configurations. +It requires Alertmanager >= 0.26.0.

+ +

Route @@ -19663,6 +20575,34 @@ HTTPConfig +dnsSDConfigs
+ + +[]DNSSDConfig + + + + +(Optional) +

DNSSDConfigs defines a list of DNS service discovery configurations.

+ + + + +ec2SDConfigs
+ + +[]EC2SDConfig + + + + +(Optional) +

EC2SDConfigs defines a list of EC2 service discovery configurations.

+ + + + relabelings
@@ -19872,6 +20812,34 @@ uint64 Only valid in Prometheus versions 2.27.0 and newer.

+ + +keepDroppedTargets
+ +uint64 + + + +(Optional) +

Per-scrape limit on the number of targets dropped by relabeling +that will be kept in memory. 0 means no limit.

+

It requires Prometheus >= v2.47.0.

+ + + + +metricRelabelings
+ +
+[]RelabelConfig + + + + +(Optional) +

MetricRelabelConfigs to apply to samples before ingestion.

+ +

SlackAction @@ -20471,9 +21439,25 @@ Kubernetes core/v1.SecretKeySelector -

Telegram bot token +(Optional) +

Telegram bot token. It is mutually exclusive with botTokenFile. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.

+

Either botToken or botTokenFile is required.

+ + + + +botTokenFile
+ +string + + + +(Optional) +

File to read the Telegram bot token from. It is mutually exclusive with botToken. +Either botToken or botTokenFile is required.

+

It requires Alertmanager >= v0.26.0.

@@ -20679,6 +21663,14 @@ Time +

URL +(string alias)

+

+(Appears on:WebexConfig) +

+
+

URL represents a valid URL

+

VictorOpsConfig

@@ -20908,71 +21900,155 @@ string -toUser
+toUser
+ +string + + + +(Optional) + + + + +toParty
+ +string + + + +(Optional) + + + + +toTag
+ +string + + + +(Optional) + + + + +message
+ +string + + + +

API request data as defined by the WeChat API.

+ + + + +messageType
+ +string + + + +(Optional) + + + + +httpConfig
-string + +HTTPConfig + (Optional) +

HTTP client configuration.

+ + +

WebexConfig +

+

+(Appears on:Receiver) +

+
+

WebexConfig configures notification via Cisco Webex +See https://prometheus.io/docs/alerting/latest/configuration/#webex_config

+
+ + + + + + + + @@ -21119,8 +22195,8 @@ Resource Types:

AlertmanagerConfig

-

AlertmanagerConfig defines a namespaced AlertmanagerConfig to be aggregated -across multiple namespaces configuring one Alertmanager cluster.

+

AlertmanagerConfig configures the Prometheus Alertmanager, +specifying how alerts should be grouped, inhibited and notified to external systems.

FieldDescription
-toParty
+sendResolved
-string +bool
(Optional) +

Whether to notify about resolved alerts.

-toTag
+apiURL
-string + +URL +
(Optional) +

The Webex Teams API URL i.e. https://webexapis.com/v1/messages +Provide if different from the default API URL.

-message
+httpConfig
-string + +HTTPConfig +
-

API request data as defined by the WeChat API.

+(Optional) +

The HTTP client’s configuration. +You must supply the bot token via the httpConfig.authorization field.

-messageType
+message
string
(Optional) +

Message template

-httpConfig
+roomID
- -HTTPConfig - +string
-(Optional) -

HTTP client configuration.

+

ID of the Webex Teams room where to send the messages.

@@ -21641,7 +22717,7 @@ SafeTLSConfig

HTTPConfig

-(Appears on:DiscordConfig, OpsGenieConfig, PagerDutyConfig, PushoverConfig, SNSConfig, SlackConfig, TelegramConfig, VictorOpsConfig, WeChatConfig, WebhookConfig) +(Appears on:DiscordConfig, MSTeamsConfig, OpsGenieConfig, PagerDutyConfig, PushoverConfig, SNSConfig, SlackConfig, TelegramConfig, VictorOpsConfig, WeChatConfig, WebexConfig, WebhookConfig)

HTTPConfig defines a client HTTP configuration. @@ -21857,6 +22933,88 @@ string

+

MSTeamsConfig +

+

+(Appears on:Receiver) +

+
+

MSTeamsConfig configures notifications via Microsoft Teams. +It requires Alertmanager >= 0.26.0.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+sendResolved
+ +bool + +
+(Optional) +

Whether to notify about resolved alerts.

+
+webhookUrl
+ + +Kubernetes core/v1.SecretKeySelector + + +
+

MSTeams webhook URL.

+
+title
+ +string + +
+(Optional) +

Message title template.

+
+text
+ +string + +
+(Optional) +

Message body template.

+
+httpConfig
+ + +HTTPConfig + + +
+(Optional) +

HTTP client configuration.

+

MatchType (string alias)

@@ -22638,9 +23796,25 @@ SecretKeySelector +(Optional)

The secret’s key that contains the recipient user’s user key. The secret needs to be in the same namespace as the AlertmanagerConfig -object and accessible by the Prometheus Operator.

+object and accessible by the Prometheus Operator. +Either userKey or userKeyFile is required.

+ + + + +userKeyFile
+ +string + + + +(Optional) +

The user key file that contains the recipient user’s user key. +Either userKey or userKeyFile is required. +It requires Alertmanager >= v0.26.0.

@@ -22653,9 +23827,25 @@ SecretKeySelector +(Optional)

The secret’s key that contains the registered application’s API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig -object and accessible by the Prometheus Operator.

+object and accessible by the Prometheus Operator. +Either token or tokenFile is required.

+ + + + +tokenFile
+ +string + + + +(Optional) +

The token file that contains the registered application’s API token, see https://pushover.net/apps. +Either token or tokenFile is required. +It requires Alertmanager >= v0.26.0.

@@ -22954,6 +24144,33 @@ string

List of Telegram configurations.

+ + +webexConfigs
+ + +[]WebexConfig + + + + +

List of Webex configurations.

+ + + + +msteamsConfigs
+ + +[]MSTeamsConfig + + + + +

List of MSTeams configurations. +It requires Alertmanager >= 0.26.0.

+ +

Route @@ -23849,9 +25066,25 @@ SecretKeySelector -

Telegram bot token +(Optional) +

Telegram bot token. It is mutually exclusive with botTokenFile. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.

+

Either botToken or botTokenFile is required.

+ + + + +botTokenFile
+ +string + + + +(Optional) +

File to read the Telegram bot token from. It is mutually exclusive with botToken. +Either botToken or botTokenFile is required.

+

It requires Alertmanager >= v0.26.0.

@@ -24099,6 +25332,14 @@ Time +

URL +(string alias)

+

+(Appears on:WebexConfig) +

+
+

URL represents a valid URL

+

VictorOpsConfig

@@ -24397,6 +25638,88 @@ HTTPConfig +

WebexConfig +

+

+(Appears on:Receiver) +

+
+

WebexConfig configures notification via Cisco Webex +See https://prometheus.io/docs/alerting/latest/configuration/#webex_config

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+sendResolved
+ +bool + +
+(Optional) +

Whether to notify about resolved alerts.

+
+apiURL
+ + +URL + + +
+(Optional) +

The Webex Teams API URL i.e. https://webexapis.com/v1/messages

+
+httpConfig
+ + +HTTPConfig + + +
+

The HTTP client’s configuration. +You must use this configuration to supply the bot token as part of the HTTP Authorization header.

+
+message
+ +string + +
+(Optional) +

Message template

+
+roomID
+ +string + +
+

ID of the Webex Teams room where to send the messages.

+

WebhookConfig

diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/compatibility.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/compatibility.md index 79c130efe..9079fc4d8 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Documentation/compatibility.md +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/compatibility.md @@ -22,7 +22,7 @@ The Prometheus Operator uses the official [Go client](https://github.com/kuberne The current version of the Prometheus operator uses the following Go client version: ```$ mdox-exec="go list -m -f '{{ .Version }}' k8s.io/client-go" -v0.27.4 +v0.28.3 ``` ## Prometheus @@ -57,12 +57,16 @@ Prometheus Operator supports all Prometheus versions >= v2.0.0. The operator's e * v2.43.1 * v2.44.0 * v2.45.0 +* v2.46.0 +* v2.47.0 +* v2.47.1 +* v2.47.2 ``` The end-to-end tests are mostly tested against ```$ mdox-exec="go run ./cmd/po-docgen/. compatibility defaultPrometheusVersion" -* v2.45.0 +* v2.47.2 ``` ## Alertmanager @@ -72,7 +76,7 @@ The Prometheus Operator is compatible with Alertmanager v0.15 and above. The end-to-end tests are mostly tested against ```$ mdox-exec="go run ./cmd/po-docgen/. compatibility defaultAlertmanagerVersion" -* v0.25.0 +* v0.26.0 ``` ## Thanos @@ -82,5 +86,5 @@ The Prometheus Operator is compatible with Thanos v0.10 and above. The end-to-end tests are mostly tested against ```$ mdox-exec="go run ./cmd/po-docgen/. compatibility defaultThanosVersion" -* v0.31.0 +* v0.32.4 ``` diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/operator.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/operator.md index ad7496bb6..bb2271d19 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Documentation/operator.md +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/operator.md @@ -27,20 +27,22 @@ Usage of ./operator: Annotations to be add to all resources created by the operator -apiserver string API Server addr, e.g. ' - NOT RECOMMENDED FOR PRODUCTION - http://127.0.0.1:8080'. Omit parameter to run in on-cluster mode and utilize the service account token. + -as string + Username to impersonate. User could be a regular user or a service account in a namespace. -ca-file string - NOT RECOMMENDED FOR PRODUCTION - Path to TLS CA file. -cert-file string - NOT RECOMMENDED FOR PRODUCTION - Path to public TLS certificate file. -cluster-domain string The domain of the cluster. This is used to generate service FQDNs. If this is not specified, DNS search domain expansion is used instead. - -config-reloader-cpu-limit --config-reloader-cpu - Config Reloader CPU limit. Value "0" disables it and causes no limit to be configured. Flag overrides --config-reloader-cpu for the CPU limit (default "10m") - -config-reloader-cpu-request --config-reloader-cpu - Config Reloader CPU request. Value "0" disables it and causes no request to be configured. Flag overrides --config-reloader-cpu value for the CPU request (default "10m") - -config-reloader-memory-limit --config-reloader-memory - Config Reloader Memory limit. Value "0" disables it and causes no limit to be configured. Flag overrides --config-reloader-memory for the memory limit (default "50Mi") - -config-reloader-memory-request --config-reloader-memory - Config Reloader Memory request. Value "0" disables it and causes no request to be configured. Flag overrides --config-reloader-memory for the memory request (default "50Mi") + -config-reloader-cpu-limit value + Config Reloader CPU limits. Value "0" disables it and causes no limit to be configured. (default 10m) + -config-reloader-cpu-request value + Config Reloader CPU requests. Value "0" disables it and causes no request to be configured. (default 10m) + -config-reloader-memory-limit value + Config Reloader memory limits. Value "0" disables it and causes no limit to be configured. (default 50Mi) + -config-reloader-memory-request value + Config Reloader memory requests. Value "0" disables it and causes no request to be configured. (default 50Mi) -deny-namespaces value Namespaces not to scope the interaction of the Prometheus Operator (deny list). This is mutually exclusive with --namespaces. -enable-config-reloader-probes @@ -62,7 +64,7 @@ Usage of ./operator: -namespaces value Namespaces to scope the interaction of the Prometheus Operator and the apiserver (allow list). This is mutually exclusive with --deny-namespaces. -prometheus-config-reloader string - Prometheus config reloader image (default "quay.io/prometheus-operator/prometheus-config-reloader:v0.67.1") + Prometheus config reloader image (default "quay.io/prometheus-operator/prometheus-config-reloader:v0.69.1") -prometheus-default-base-image string Prometheus default base image (path without tag/version) (default "quay.io/prometheus/prometheus") -prometheus-instance-namespaces value @@ -87,6 +89,8 @@ Usage of ./operator: Cert file to be used for operator web server endpoints. (default "/etc/tls/private/tls.crt") -web.client-ca-file string Client CA certificate file to be used for operator web server endpoints. (default "/etc/tls/private/tls-ca.crt") + -web.enable-http2 + Enable HTTP2 connections. -web.enable-tls Activate prometheus operator web server TLS. This is useful for example when using the rule validation webhook. -web.key-file string diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/proposals/202309-controller-id.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/proposals/202309-controller-id.md new file mode 100644 index 000000000..df5c8807b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/proposals/202309-controller-id.md @@ -0,0 +1,79 @@ +# Controller-ID Proposal + +* Owners: + * [danielmellado](https://github.com/danielmellado) +* Related Tickets: + * [#4281](https://github.com/prometheus-operator/prometheus-operator/issues/4281) + * [#4498](https://github.com/prometheus-operator/prometheus-operator/pull/4498) +* Other Docs: + * n/a + +# Introduction + +This proposal aims to implement a solution to support multiple cluster-level +Prometheus instances running concurrently without conflicting over the same +custom resources. This solution isn't limited to the Prometheus resources as +it'll also be available for `AlertManager`and `ThanosRuler` ones, as well as for +any pod-based resource that could be added in the future. + +This issue can significantly impact use cases where multiple Prometheus operator +instances run at the same time in the Kubernetes cluster. + +# Why + +Currently, we encounter issues when different users deploy different instances +of the Prometheus operator, that will try to reconcile the same resources. + +In the worst-case scenario, these operators may not only compete for ownership +of the CRD resources but also attempt to rewrite or redeploy different versions +of the CRD, causing disruptions to all pods. + +The remediation for this scenario, where users deploy their Prometheus operator +instances in parallel, involves using one of the many CLI arguments such as +`--deny-namespaces`, `--namespaces`, `--prometheus-instance-selector` or +`prometheus-instance-namespaces`. But this requires cooperation between the +different parties and there's no way to ensure that a specific monitoring +resource is managed only by a specific operator instance. + +# How + +After some research from @machine424, we have identified a potential solution +already implemented by the +[zalando/postgres-operator](https://github.com/zalando/postgres-operator). When +an operator is configured with a specific "controller ID" value, it will only +reconcile resources that have a matching "controller ID" annotation. + +Conversely, if the operator is not configured with a "controller ID," it will +skip all resources that have a "controller ID" annotation. More details can be +found in the +[zalando/postgres-operator documentation](https://github.com/zalando/postgres-operator/blob/master/docs/administrator.md#operators-with-defined-ownership-of-certain-postgres-clusters). + +# Goals + +* Guarantee that a custom resource will be managed by a specific Prometheus + operator instance. + +## Audience + +This proposal is relevant to the following audience: + +* Users who provide Prometheus as a service and want to run multiple Prometheus + operator instances in different namespaces. +* Users seeking to mitigate the impact of rogue Prometheus instances. + +# Non-Goals + +* Provide a solution that works with user intervantion. It'll require work from + the user deploying the operator and resources. (e.g. if the operator is + started without any specific argument, it'll attempt to reconcile all + resources in all namespaces). + +# Alternatives + +Although the initial discussion for this proposal considered adding an owner +reference within the scope, the +[ControllerRef](https://github.com/kubernetes/design-proposals-archive/blob/acc25e14ca83dfda4f66d8cb1f1b491f26e78ffe/api-machinery/controller-ref.md) +model does not directly address this problem because the `ControllerRef`model +solves the problem of controllers that fight over controlled objects due to +overlapping selectors (e.g. a ReplicaSet fighting with a ReplicationController +over Pods because both controllers have label selectors that match those Pods) diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/rbac.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/rbac.md index 0b9313b6f..01cff188e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Documentation/rbac.md +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/rbac.md @@ -26,7 +26,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator rules: - apiGroups: @@ -106,6 +106,12 @@ rules: - get - list - watch +- apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get ``` > Note: A cluster admin is required to create this `ClusterRole` and create a `ClusterRoleBinding` or `RoleBinding` to the `ServiceAccount` used by the Prometheus Operator `Pod`. The `ServiceAccount` used by the Prometheus Operator `Pod` can be specified in the `Deployment` object used to deploy it. @@ -120,7 +126,7 @@ As the Prometheus Operator works extensively with its `customresourcedefinitions * `servicemonitors` * `thanosrulers` -Alertmanager and Prometheus clusters are created using `statefulsets` therefore all changes to an Alertmanager or Prometheus object result in a change to the `statefulsets`, which means all actions must be permitted. +The operator materializes Alertmanager, Prometheus and ThanosRuler objects as `statefulsets` therefore all changes to an Alertmanager or Prometheus object result in a change to the matching `statefulsets`, which means all actions must be permitted. Additionally as the Prometheus Operator generates configurations, it requires all actions on `configmaps` and `secrets`. @@ -181,7 +187,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default ``` @@ -197,7 +203,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator roleRef: apiGroup: rbac.authorization.k8s.io diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/troubleshooting.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/troubleshooting.md index a1981ff09..a146791d7 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Documentation/troubleshooting.md +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/troubleshooting.md @@ -11,6 +11,25 @@ draft: false description: Guide on troubleshooting the Prometheus Operator. --- +### `CustomResourceDefinition "..." is invalid: metadata.annotations: Too long` issue + +When applying updated CRDs on a cluster, you may face the following error message: + +```bash +$ kubectl apply -f $MANIFESTS +The CustomResourceDefinition "prometheuses.monitoring.coreos.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes +``` + +The reason is that apply runs in the client by default and saves information into the object annotations but there's a hard limit on the size of annotations. + +The workaround is to use server-side apply which requires Kubernetes v1.22 at least. + +```bash +kubectl apply --server-side --force-conflicts -f $MANIFESTS +``` + +If using ArgoCD, please refer to their [documentation](https://argo-cd.readthedocs.io/en/latest/user-guide/sync-options/#server-side-apply). + ### RBAC on Google Container Engine (GKE) When you try to create `ClusterRole` (`kube-state-metrics`, `prometheus` `prometheus-operator`, etc.) on GKE Kubernetes cluster running 1.6 version, you will probably run into permission errors: @@ -63,6 +82,18 @@ Note: The `ServiceMonitor` references a `Service` (not a `Deployment`, or a `Pod kubectl -n monitoring get secret prometheus-k8s -ojson | jq -r '.data["prometheus.yaml.gz"]' | base64 -d | gunzip | grep "my-service-monitor" ``` +#### It is in the configuration but not on the Service Discovery page + +ServiceMonitors pointing to Services that do not exist (e.g. nothing matching `.spec.selector`) will lead to this ServiceMonitor not being added to the Service Discovery page. Check if you can find any Service with the selector you configured. + +If you use `.spec.selector.matchLabels` (instead of e.g. `.spec.selector.matchExpressions`), you can use this command to check for services matching the given label: + +``` +kubectl get services -l "$(kubectl get servicemonitors -n "" "" -o template='{{ $first := 1 }}{{ range $key, $value := .spec.selector.matchLabels }}{{ if eq $first 0 }},{{end}}{{ $key }}={{ $value }}{{ $first = 0 }}{{end}}')" +``` + +Note: this command does not take namespaces into account. If your ServiceMonitor selects a single namespace or all namespaces, you can just add that to the `kubectl get services` command (using `-n $namespace` or `-A` for all namespaces). + ### Prometheus kubelet metrics server returned HTTP status 403 Forbidden Prometheus is installed, all looks good, however the `Targets` are all showing as down. All permissions seem to be good, yet no joy. Prometheus pulling metrics from all namespaces expect kube-system, and Prometheus has access to all namespaces including kube-system. diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/prometheus-agent.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/prometheus-agent.md index 1e729f226..36172a187 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/prometheus-agent.md +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/prometheus-agent.md @@ -26,7 +26,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator rules: - apiGroups: @@ -106,6 +106,12 @@ rules: - get - list - watch +- apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get ``` Similarly to Prometheus, Prometheus Agent will also require permission to scrape targets. Because of this, we will create a new service account for the Agent with the necessary permissions to scrape targets. diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/scrapeconfig.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/scrapeconfig.md new file mode 100644 index 000000000..b76eb168c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/scrapeconfig.md @@ -0,0 +1,145 @@ +--- +weight: 154 +toc: true +title: ScrapeConfig CRD +menu: + docs: + parent: user-guides +lead: "" +images: [] +draft: false +description: Guide to use ScrapeConfig to scrape targets external to the Kubernetes cluster +--- + +Starting with prometheus-operator v0.65.x, one can use the `ScrapeConfig` CRD to scrape targets external to the +Kubernetes cluster or create scrape configurations that are not possible with the higher level +`ServiceMonitor`/`Probe`/`PodMonitor` resources. + +# Prerequisites +* `prometheus-operator` `>v0.65.1` +* `ScrapeConfig` CRD installed in the cluster. Make sure to (re)start the operator after the CRD has been created/updated. + +# Configure Prometheus or PrometheusAgent to select ScrapeConfigs + +Both the Prometheus and PrometheusAgent CRD have a `scrapeConfigSelector` field. This field needs to be set to a list of +labels to match `ScrapeConfigs`: + +```yaml +spec: + scrapeConfigSelector: + prometheus: system-monitoring-prometheus +``` + +With this example, all `ScrapeConfig` having the `prometheus` label set to `system-monitoring-prometheus` will be used +to generate scrape configurations. + +# Use ScrapeConfig to scrape an external target + +`ScrapeConfig` currently supports a limited set of service discoveries: +* `static_config` +* `file_sd` +* `http_sd` +* `kubernetes_sd` +* `consul_sd` + +The following examples are basic and don't cover all the supported service discovery mechanisms. The CRD is constantly evolving, adding new features. Check the API documentation to see all the available fields. + +If you have an interest in another service discovery mechanism or you see something missing in the implementation, please +[open an issue](https://github.com/prometheus-operator/prometheus-operator/issues). + +## `static_config` + +For example, to scrape the target located at `http://prometheus.demo.do.prometheus.io:9090`, use the following: + +```yaml +apiVersion: monitoring.coreos.com/v1alpha1 +kind: ScrapeConfig +metadata: + name: static-config + namespace: my-namespace + labels: + prometheus: system-monitoring-prometheus +spec: + staticConfigs: + - labels: + job: prometheus + targets: + - prometheus.demo.do.prometheus.io:9090 +``` + +## `file_sd` + +To use `file_sd`, a file has to be mounted in the Prometheus or PrometheusAgent pods. The following configmap is a service discovery file: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: scrape-file-sd-targets + namespace: monitoring + labels: + prometheus: system-monitoring-prometheus +data: + targets.yaml: | + - labels: + job: node-demo + targets: + - node.demo.do.prometheus.io:9100 + - labels: + job: prometheus + targets: + - prometheus.demo.do.prometheus.io:9090 +``` + +This `ConfigMap` will then need to be mounted in the `Prometheus` spec: + +```yaml +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + name: your-prometheus + namespace: my-namespace + labels: + prometheus: system-monitoring-prometheus +spec: + scrapeConfigSelector: + prometheus: system-monitoring-prometheus + configMaps: + - scrape-file-sd-targets +``` + +You can then use ScrapeConfig to reference that file and scrape the associated targets: + +```yaml +apiVersion: monitoring.coreos.com/v1alpha1 +kind: ScrapeConfig +metadata: + name: file-sd + namespace: my-namespace + labels: + prometheus: system-monitoring-prometheus + app.kubernetes.io/name: scrape-config-example +spec: + fileSDConfigs: + - files: + - /etc/prometheus/configmaps/scrape-file-sd-targets/targets.yaml +``` + +## `http_sd` + +`http_sd` works the same way as the `file_sd` but requires an endpoint providing that data rather than a file. For instance: + +```yaml +apiVersion: monitoring.coreos.com/v1alpha1 +kind: ScrapeConfig +metadata: + name: http-sd + namespace: my-namespace + labels: + prometheus: system-monitoring-prometheus + app.kubernetes.io/name: scrape-config-example +spec: + httpSDConfigs: + - url: http://my-external-api/discovery + refreshInterval: 15s +``` diff --git a/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/webhook.md b/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/webhook.md index e0b8f97a4..562e401d4 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/webhook.md +++ b/otelcollector/otel-allocator/prometheus-operator/Documentation/user-guides/webhook.md @@ -1,5 +1,5 @@ --- -weight: 154 +weight: 155 toc: true title: Admission webhook menu: @@ -86,7 +86,7 @@ kind: ServiceAccount metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default ``` @@ -97,7 +97,7 @@ kind: Deployment metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default spec: @@ -114,7 +114,7 @@ spec: kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 spec: affinity: podAntiAffinity: @@ -131,7 +131,7 @@ spec: - --web.enable-tls=true - --web.cert-file=/etc/tls/private/tls.crt - --web.key-file=/etc/tls/private/tls.key - image: quay.io/prometheus-operator/admission-webhook:v0.67.1 + image: quay.io/prometheus-operator/admission-webhook:v0.69.1 name: prometheus-operator-admission-webhook ports: - containerPort: 8443 @@ -179,7 +179,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default spec: diff --git a/otelcollector/otel-allocator/prometheus-operator/MAINTAINERS.md b/otelcollector/otel-allocator/prometheus-operator/MAINTAINERS.md index cd1af3f07..954ff42ef 100644 --- a/otelcollector/otel-allocator/prometheus-operator/MAINTAINERS.md +++ b/otelcollector/otel-allocator/prometheus-operator/MAINTAINERS.md @@ -1,16 +1,16 @@ ## Maintainers of Prometheus Operator organization -| Name | Email | Kubernetes Slack | GitHub | Company | -|-------------------|---------------------------|----------------------|----------------------------------------------------|---------------| -| Frederic Branczyk | fbranczyk@gmail.com | `@brancz` | [@brancz](https://github.com/brancz) | Polar Signals | -| Matthias Loibl | mail@matthiasloibl.com | `@metalmatze` | [@metalmatze](https://github.com/metalmatze) | Polar Signals | -| Paweł Krupa | paulfantom@gmail.com | `@paulfantom` | [@paulfantom](https://github.com/paulfantom) | Timescale | -| Simon Pasquier | pasquier.simon@gmail.com | `@SimonPasquier` | [@simonpasquier](https://github.com/simonpasquier) | Red Hat | -| Kemal Akkoyun | kakkoyun@gmail.com | `@kakkoyun` | [@kakkoyun](https://github.com/kakkoyun) | Polar Signals | -| Arthur Silva Sens | arthursens2005@gmail.com | `@Arthur Silva Sens` | [@ArthurSens](https://github.com/ArthurSens) | Coralogix | -| Filip Petkovski | filip.petkovsky@gmail.com | `@fpetkovski` | [@fpetkovski](https://github.com/fpetkovski) | Red Hat | -| Philip Gough | philip.p.gough@gmail.com | `@pgough` | [@PhilipGough](https://github.com/PhilipGough) | Red Hat | -| Guillaume Hérail | github@xiu.io | `@xiu` | [@xiu](https://github.com/xiu) | Independent | +| Name | Email | Kubernetes Slack | GitHub | Company | +|-------------------|---------------------------|----------------------|----------------------------------------------------|--------------------------------| +| Frederic Branczyk | fbranczyk@gmail.com | `@brancz` | [@brancz](https://github.com/brancz) | Polar Signals | +| Matthias Loibl | mail@matthiasloibl.com | `@metalmatze` | [@metalmatze](https://github.com/metalmatze) | Polar Signals | +| Paweł Krupa | paulfantom@gmail.com | `@paulfantom` | [@paulfantom](https://github.com/paulfantom) | AVSystem | +| Simon Pasquier | pasquier.simon@gmail.com | `@SimonPasquier` | [@simonpasquier](https://github.com/simonpasquier) | Red Hat | +| Kemal Akkoyun | kakkoyun@gmail.com | `@kakkoyun` | [@kakkoyun](https://github.com/kakkoyun) | Polar Signals | +| Arthur Silva Sens | arthursens2005@gmail.com | `@Arthur Silva Sens` | [@ArthurSens](https://github.com/ArthurSens) | Coralogix | +| Filip Petkovski | filip.petkovsky@gmail.com | `@fpetkovski` | [@fpetkovski](https://github.com/fpetkovski) | Red Hat | +| Philip Gough | philip.p.gough@gmail.com | `@pgough` | [@PhilipGough](https://github.com/PhilipGough) | Red Hat | +| Guillaume Hérail | github@xiu.io | `@xiu` | [@xiu](https://github.com/xiu) | Sony Interactive Entertainment | Please reach any of the maintainers on slack (#prometheus-operator on https://slack.k8s.io/) or email if you want to help. @@ -25,6 +25,7 @@ Full list of triage people is displayed below: | Noah Kantrowitz | `@coderanger` | [@coderanger](https://github.com/coderanger) | Geomagical/IKEA | | Jayapriya Pai | `@slashpai` | [@slashpai](https://github.com/slashpai) | Red Hat | | João Marçal | `@JoaoBraveCoding` | [@JoaoBraveCoding](https://github.com/JoaoBraveCoding) | Red Hat | +| Nicolas Takashi | `@nicolastakashi` | [@nicolastakashi](https://github.com/nicolastakashi) | Coralogix | ## Emeritus maintainers diff --git a/otelcollector/otel-allocator/prometheus-operator/Makefile b/otelcollector/otel-allocator/prometheus-operator/Makefile index 52126a0e6..c2693572f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/Makefile +++ b/otelcollector/otel-allocator/prometheus-operator/Makefile @@ -224,6 +224,7 @@ generate: k8s-gen generate-crds bundle.yaml example/mixin/alerts.yaml example/th .PHONY: generate-crds generate-crds: $(CONTROLLER_GEN_BINARY) $(GOJSONTOYAML_BINARY) $(TYPES_V1_TARGET) $(TYPES_V1ALPHA1_TARGET) $(TYPES_V1BETA1_TARGET) cd pkg/apis/monitoring && $(CONTROLLER_GEN_BINARY) crd:crdVersions=v1 paths=./v1/. paths=./v1alpha1/. output:crd:dir=$(PWD)/example/prometheus-operator-crd/ + VERSION=$(VERSION) ./scripts/generate/append-operator-version.sh find example/prometheus-operator-crd/ -name '*.yaml' -print0 | xargs -0 -I{} sh -c '$(GOJSONTOYAML_BINARY) -yamltojson < "$$1" | jq > "$(PWD)/jsonnet/prometheus-operator/$$(basename $$1 | cut -d'_' -f2 | cut -d. -f1)-crd.json"' -- {} cd pkg/apis/monitoring && $(CONTROLLER_GEN_BINARY) crd:crdVersions=v1 paths=./... output:crd:dir=$(PWD)/example/prometheus-operator-crd-full echo "// Code generated using 'make generate-crds'. DO NOT EDIT." > $(PWD)/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet @@ -247,7 +248,7 @@ bundle.yaml: generate-crds $(shell find example/rbac/prometheus-operator/*.yaml # See https://github.com/prometheus-operator/prometheus-operator/issues/4355 stripped-down-crds.yaml: $(shell find example/prometheus-operator-crd/*.yaml -type f) $(GOJSONTOYAML_BINARY) : > $@ - for f in example/prometheus-operator-crd/*.yaml; do echo '---' >> $@; $(GOJSONTOYAML_BINARY) -yamltojson < $$f | jq 'walk(if type == "object" then with_entries(select(.key | test("description") | not)) else . end)' | $(GOJSONTOYAML_BINARY) >> $@; done + for f in example/prometheus-operator-crd/*.yaml; do echo '---' >> $@; $(GOJSONTOYAML_BINARY) -yamltojson < $$f | jq 'walk(if type == "object" then with_entries(if .value|type=="object" then . else select(.key | test("description") | not) end) else . end)' | $(GOJSONTOYAML_BINARY) >> $@; done scripts/generate/vendor: $(JB_BINARY) $(shell find jsonnet/prometheus-operator -type f) cd scripts/generate; $(JB_BINARY) install; @@ -346,6 +347,10 @@ test-unit: test-long: go test $(TEST_RUN_ARGS) $(pkgs) -count=1 -v +.PHONY: test-unit-update-golden +test-unit-update-golden: + ./scripts/update-golden-files.sh + test/instrumented-sample-app/certs/cert.pem test/instrumented-sample-app/certs/key.pem: cd test/instrumented-sample-app && make generate-certs diff --git a/otelcollector/otel-allocator/prometheus-operator/README.md b/otelcollector/otel-allocator/prometheus-operator/README.md index 2b3da6025..825b0838c 100644 --- a/otelcollector/otel-allocator/prometheus-operator/README.md +++ b/otelcollector/otel-allocator/prometheus-operator/README.md @@ -25,7 +25,7 @@ For an introduction to the Prometheus Operator, see the [getting started](https: ## Project Status -The operator in itself is considered to be production ready. Please refer to the Custom Resource Defintion (CRD) versions for the status of each CRD: +The operator in itself is considered to be production ready. Please refer to the Custom Resource Definition (CRD) versions for the status of each CRD: * `monitoring.coreos.com/v1`: **stable** CRDs and API, changes are made in a backward-compatible way. * `monitoring.coreos.com/v1beta1`: **unstable** CRDs and API, changes can happen but the team is focused on avoiding them. We encourage usage in production for users that accept the risk of breaking changes. @@ -210,7 +210,7 @@ kubectl delete --ignore-not-found customresourcedefinitions \ #### Running *end-to-end* tests on local minikube cluster: -1. `minikube start --kubernetes-version=stable --memory=4096 --extra-config=apiserver.authorization-mode=RBAC` +1. `minikube start --kubernetes-version=stable --memory=4096 --extra-config=apiserver.authorization-mode=NODE,RBAC` 2. `eval $(minikube docker-env) && make image` - build Prometheus Operator docker image on minikube's docker 3. `make test-e2e` diff --git a/otelcollector/otel-allocator/prometheus-operator/RELEASE.md b/otelcollector/otel-allocator/prometheus-operator/RELEASE.md index 696ed02bf..f0a65316e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/RELEASE.md +++ b/otelcollector/otel-allocator/prometheus-operator/RELEASE.md @@ -35,7 +35,11 @@ Release cadence of first pre-releases being cut is 6 weeks. | v0.65 | 2023-05-03 | Philip Gough (GitHub: @PhilipGough) | | v0.66 | 2023-06-14 | Arthur Sens (Github: @ArthurSens) | | v0.67 | 2023-07-26 | Simon Pasquier (GitHub: @simonpasquier) | -| v0.68 | 2023-09-06 | **searching for volunteer** | +| v0.68 | 2023-09-06 | Arthur Sens (Github: @ArthurSens) | +| v0.69 | 2023-10-18 | Simon Pasquier (GitHub: @simonpasquier) | +| v0.70 | 2023-11-29 | Pawel Krupa (GitHub: @paulfantom) | +| v0.71 | 2024-01-10 | **searching for volunteer** | +| v0.72 | 2024-02-21 | **searching for volunteer** | # How to cut a new release diff --git a/otelcollector/otel-allocator/prometheus-operator/VERSION b/otelcollector/otel-allocator/prometheus-operator/VERSION index 5caa138cb..a868f07b1 100644 --- a/otelcollector/otel-allocator/prometheus-operator/VERSION +++ b/otelcollector/otel-allocator/prometheus-operator/VERSION @@ -1 +1 @@ -0.67.1 +0.69.1 diff --git a/otelcollector/otel-allocator/prometheus-operator/bundle.yaml b/otelcollector/otel-allocator/prometheus-operator/bundle.yaml index ce48647ab..c5038807e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/bundle.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/bundle.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: alertmanagerconfigs.monitoring.coreos.com spec: @@ -22,8 +23,8 @@ spec: - name: v1alpha1 schema: openAPIV3Schema: - description: AlertmanagerConfig defines a namespaced AlertmanagerConfig to - be aggregated across multiple namespaces configuring one Alertmanager cluster. + description: AlertmanagerConfig configures the Prometheus Alertmanager, specifying + how alerts should be grouped, inhibited and notified to external systems. properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation @@ -829,71 +830,13 @@ spec: type: string type: object type: array - name: - description: Name of the receiver. Must be unique across all - items from the list. - minLength: 1 - type: string - opsgenieConfigs: - description: List of OpsGenie configurations. + msteamsConfigs: + description: List of MSTeams configurations. It requires Alertmanager + >= 0.26.0. items: - description: OpsGenieConfig configures notifications via OpsGenie. - See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config + description: MSTeamsConfig configures notifications via Microsoft + Teams. It requires Alertmanager >= 0.26.0. properties: - actions: - description: Comma separated list of actions that will - be available for the alert. - type: string - apiKey: - description: The secret's key that contains the OpsGenie - API key. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - apiURL: - description: The URL to send OpsGenie API requests to. - type: string - description: - description: Description of the incident. - type: string - details: - description: A set of arbitrary key/value pairs that provide - further detail about the incident. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entity: - description: Optional field that can be used to specify - which domain alert is related to. - type: string httpConfig: description: HTTP client configuration. properties: @@ -1241,89 +1184,84 @@ spec: type: string type: object type: object - message: - description: Alert text limited to 130 characters. - type: string - note: - description: Additional alert note. - type: string - priority: - description: Priority level of alert. Possible values - are P1, P2, P3, P4, and P5. - type: string - responders: - description: List of responders responsible for notifications. - items: - description: OpsGenieConfigResponder defines a responder - to an incident. One of `id`, `name` or `username` - has to be defined. - properties: - id: - description: ID of the responder. - type: string - name: - description: Name of the responder. - type: string - type: - description: Type of responder. - enum: - - team - - teams - - user - - escalation - - schedule - minLength: 1 - type: string - username: - description: Username of the responder. - type: string - required: - - type - type: object - type: array sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - source: - description: Backlink to the sender of the notification. + text: + description: Message body template. type: string - tags: - description: Comma separated list of tags attached to - the notifications. + title: + description: Message title template. type: string - updateAlerts: - description: Whether to update message and description - of the alert in OpsGenie if it already exists By default, - the alert is never updated in OpsGenie, the new message - only appears in activity log. - type: boolean + webhookUrl: + description: MSTeams webhook URL. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + required: + - webhookUrl type: object type: array - pagerdutyConfigs: - description: List of PagerDuty configurations. + name: + description: Name of the receiver. Must be unique across all + items from the list. + minLength: 1 + type: string + opsgenieConfigs: + description: List of OpsGenie configurations. items: - description: PagerDutyConfig configures notifications via - PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config + description: OpsGenieConfig configures notifications via OpsGenie. + See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config properties: - class: - description: The class/type of the event. - type: string - client: - description: Client identification. - type: string - clientURL: - description: Backlink to the sender of notification. + actions: + description: Comma separated list of actions that will + be available for the alert. type: string - component: - description: The part or component of the affected system - that is broken. + apiKey: + description: The secret's key that contains the OpsGenie + API key. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + apiURL: + description: The URL to send OpsGenie API requests to. type: string description: description: Description of the incident. type: string details: - description: Arbitrary key/value pairs that provide further - detail about the incident. + description: A set of arbitrary key/value pairs that provide + further detail about the incident. items: description: KeyValue defines a (key, value) tuple. properties: @@ -1339,8 +1277,9 @@ spec: - value type: object type: array - group: - description: A cluster or grouping of sources. + entity: + description: Optional field that can be used to specify + which domain alert is related to. type: string httpConfig: description: HTTP client configuration. @@ -1689,117 +1628,565 @@ spec: type: string type: object type: object - pagerDutyImageConfigs: - description: A list of image details to attach that provide - further detail about an incident. + message: + description: Alert text limited to 130 characters. + type: string + note: + description: Additional alert note. + type: string + priority: + description: Priority level of alert. Possible values + are P1, P2, P3, P4, and P5. + type: string + responders: + description: List of responders responsible for notifications. items: - description: PagerDutyImageConfig attaches images to - an incident + description: OpsGenieConfigResponder defines a responder + to an incident. One of `id`, `name` or `username` + has to be defined. properties: - alt: - description: Alt is the optional alternative text - for the image. - type: string - href: - description: Optional URL; makes the image a clickable - link. + id: + description: ID of the responder. type: string - src: - description: Src of the image being attached to - the incident + name: + description: Name of the responder. type: string - type: object - type: array - pagerDutyLinkConfigs: - description: A list of link details to attach that provide - further detail about an incident. - items: - description: PagerDutyLinkConfig attaches text links - to an incident - properties: - alt: - description: Text that describes the purpose of - the link, and can be used as the link's text. + type: + description: Type of responder. + enum: + - team + - teams + - user + - escalation + - schedule + minLength: 1 type: string - href: - description: Href is the URL of the link to be attached + username: + description: Username of the responder. type: string + required: + - type type: object type: array - routingKey: - description: The secret's key that contains the PagerDuty - integration key (when using Events API v2). Either this - field or `serviceKey` needs to be defined. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - serviceKey: - description: The secret's key that contains the PagerDuty - service key (when using integration type "Prometheus"). - Either this field or `routingKey` needs to be defined. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - severity: - description: Severity of the incident. + source: + description: Backlink to the sender of the notification. type: string - url: - description: The URL to send requests to. + tags: + description: Comma separated list of tags attached to + the notifications. type: string + updateAlerts: + description: Whether to update message and description + of the alert in OpsGenie if it already exists By default, + the alert is never updated in OpsGenie, the new message + only appears in activity log. + type: boolean type: object type: array - pushoverConfigs: - description: List of Pushover configurations. + pagerdutyConfigs: + description: List of PagerDuty configurations. items: - description: PushoverConfig configures notifications via Pushover. - See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config + description: PagerDutyConfig configures notifications via + PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config properties: - expire: - description: How long your notification will continue - to be retried for, unless the user acknowledges the - notification. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + class: + description: The class/type of the event. + type: string + client: + description: Client identification. + type: string + clientURL: + description: Backlink to the sender of notification. + type: string + component: + description: The part or component of the affected system + that is broken. + type: string + description: + description: Description of the incident. + type: string + details: + description: Arbitrary key/value pairs that provide further + detail about the incident. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + group: + description: A cluster or grouping of sources. type: string - html: - description: Whether notification message is HTML or plain - text. - type: boolean + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + pagerDutyImageConfigs: + description: A list of image details to attach that provide + further detail about an incident. + items: + description: PagerDutyImageConfig attaches images to + an incident + properties: + alt: + description: Alt is the optional alternative text + for the image. + type: string + href: + description: Optional URL; makes the image a clickable + link. + type: string + src: + description: Src of the image being attached to + the incident + type: string + type: object + type: array + pagerDutyLinkConfigs: + description: A list of link details to attach that provide + further detail about an incident. + items: + description: PagerDutyLinkConfig attaches text links + to an incident + properties: + alt: + description: Text that describes the purpose of + the link, and can be used as the link's text. + type: string + href: + description: Href is the URL of the link to be attached + type: string + type: object + type: array + routingKey: + description: The secret's key that contains the PagerDuty + integration key (when using Events API v2). Either this + field or `serviceKey` needs to be defined. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + serviceKey: + description: The secret's key that contains the PagerDuty + service key (when using integration type "Prometheus"). + Either this field or `routingKey` needs to be defined. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + severity: + description: Severity of the incident. + type: string + url: + description: The URL to send requests to. + type: string + type: object + type: array + pushoverConfigs: + description: List of Pushover configurations. + items: + description: PushoverConfig configures notifications via Pushover. + See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config + properties: + expire: + description: How long your notification will continue + to be retried for, unless the user acknowledges the + notification. + pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + type: string + html: + description: Whether notification message is HTML or plain + text. + type: boolean httpConfig: description: HTTP client configuration. properties: @@ -2175,7 +2562,7 @@ spec: application's API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus - Operator. + Operator. Either `token` or `tokenFile` is required. properties: key: description: The key of the secret to select from. Must @@ -2193,6 +2580,12 @@ spec: required: - key type: object + tokenFile: + description: The token file that contains the registered + application's API token, see https://pushover.net/apps. + Either `token` or `tokenFile` is required. It requires + Alertmanager >= v0.26.0. + type: string url: description: A supplementary URL shown alongside the message. type: string @@ -2204,7 +2597,8 @@ spec: description: The secret's key that contains the recipient user's user key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible - by the Prometheus Operator. + by the Prometheus Operator. Either `userKey` or `userKeyFile` + is required. properties: key: description: The key of the secret to select from. Must @@ -2222,6 +2616,11 @@ spec: required: - key type: object + userKeyFile: + description: The user key file that contains the recipient + user's user key. Either `userKey` or `userKeyFile` is + required. It requires Alertmanager >= v0.26.0. + type: string type: object type: array slackConfigs: @@ -2683,53 +3082,537 @@ spec: type: string type: object type: object - iconEmoji: - type: string - iconURL: - type: string - imageURL: + iconEmoji: + type: string + iconURL: + type: string + imageURL: + type: string + linkNames: + type: boolean + mrkdwnIn: + items: + type: string + type: array + pretext: + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + shortFields: + type: boolean + text: + type: string + thumbURL: + type: string + title: + type: string + titleLink: + type: string + username: + type: string + type: object + type: array + snsConfigs: + description: List of SNS configurations + items: + description: SNSConfig configures notifications via AWS SNS. + See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs + properties: + apiURL: + description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. + If not specified, the SNS API URL from the SNS SDK will + be used. + type: string + attributes: + additionalProperties: + type: string + description: SNS message attributes. + type: object + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + message: + description: The message content of the SNS notification. type: string - linkNames: - type: boolean - mrkdwnIn: - items: - type: string - type: array - pretext: + phoneNumber: + description: Phone number if message is delivered via + SMS in E.164 format. If you don't specify this value, + you must specify a value for the TopicARN or TargetARN. type: string sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - shortFields: - type: boolean - text: - type: string - thumbURL: - type: string - title: + sigv4: + description: Configures AWS's Signature Verification 4 + signing process to sign requests. + properties: + accessKey: + description: AccessKey is the AWS API key. If not + specified, the environment variable `AWS_ACCESS_KEY_ID` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used + to authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used + to authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + subject: + description: Subject line when the message is delivered + to email endpoints. type: string - titleLink: + targetARN: + description: The mobile platform endpoint ARN if message + is delivered via mobile notifications. If you don't + specify this value, you must specify a value for the + topic_arn or PhoneNumber. type: string - username: + topicARN: + description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic + If you don't specify this value, you must specify a + value for the PhoneNumber or TargetARN. type: string type: object type: array - snsConfigs: - description: List of SNS configurations + telegramConfigs: + description: List of Telegram configurations. items: - description: SNSConfig configures notifications via AWS SNS. - See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs + description: TelegramConfig configures notifications via Telegram. + See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config properties: apiURL: - description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. - If not specified, the SNS API URL from the SNS SDK will - be used. + description: The Telegram API URL i.e. https://api.telegram.org. + If not specified, default API URL will be used. type: string - attributes: - additionalProperties: - type: string - description: SNS message attributes. + botToken: + description: "Telegram bot token. It is mutually exclusive + with `botTokenFile`. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. \n Either `botToken` or + `botTokenFile` is required." + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key type: object + botTokenFile: + description: "File to read the Telegram bot token from. + It is mutually exclusive with `botToken`. Either `botToken` + or `botTokenFile` is required. \n It requires Alertmanager + >= v0.26.0." + type: string + chatID: + description: The Telegram chat ID. + format: int64 + type: integer + disableNotifications: + description: Disable telegram notifications + type: boolean httpConfig: description: HTTP client configuration. properties: @@ -3078,110 +3961,31 @@ spec: type: object type: object message: - description: The message content of the SNS notification. + description: Message template type: string - phoneNumber: - description: Phone number if message is delivered via - SMS in E.164 format. If you don't specify this value, - you must specify a value for the TopicARN or TargetARN. + parseMode: + description: Parse mode for telegram message + enum: + - MarkdownV2 + - Markdown + - HTML type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - sigv4: - description: Configures AWS's Signature Verification 4 - signing process to sign requests. - properties: - accessKey: - description: AccessKey is the AWS API key. If not - specified, the environment variable `AWS_ACCESS_KEY_ID` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - profile: - description: Profile is the named AWS profile used - to authenticate. - type: string - region: - description: Region is the AWS region. If blank, the - region from the default credentials chain used. - type: string - roleArn: - description: RoleArn is the named AWS profile used - to authenticate. - type: string - secretKey: - description: SecretKey is the AWS API secret. If not - specified, the environment variable `AWS_SECRET_ACCESS_KEY` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - subject: - description: Subject line when the message is delivered - to email endpoints. - type: string - targetARN: - description: The mobile platform endpoint ARN if message - is delivered via mobile notifications. If you don't - specify this value, you must specify a value for the - topic_arn or PhoneNumber. - type: string - topicARN: - description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic - If you don't specify this value, you must specify a - value for the PhoneNumber or TargetARN. - type: string type: object type: array - telegramConfigs: - description: List of Telegram configurations. + victoropsConfigs: + description: List of VictorOps configurations. items: - description: TelegramConfig configures notifications via Telegram. - See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config + description: VictorOpsConfig configures notifications via + VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config properties: - apiURL: - description: The Telegram API URL i.e. https://api.telegram.org. - If not specified, default API URL will be used. - type: string - botToken: - description: Telegram bot token The secret needs to be - in the same namespace as the AlertmanagerConfig object - and accessible by the Prometheus Operator. + apiKey: + description: The secret's key that contains the API key + to use when talking to the VictorOps API. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. properties: key: description: The key of the secret to select from. Must @@ -3199,15 +4003,31 @@ spec: required: - key type: object - chatID: - description: The Telegram chat ID. - format: int64 - type: integer - disableNotifications: - description: Disable telegram notifications - type: boolean + apiUrl: + description: The VictorOps API URL. + type: string + customFields: + description: Additional custom fields for notification. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + entityDisplayName: + description: Contains summary of the alerted problem. + type: string httpConfig: - description: HTTP client configuration. + description: The HTTP client's configuration. properties: authorization: description: Authorization header configuration for @@ -3553,74 +4373,41 @@ spec: type: string type: object type: object - message: - description: Message template + messageType: + description: Describes the behavior of the alert (CRITICAL, + WARNING, INFO). type: string - parseMode: - description: Parse mode for telegram message - enum: - - MarkdownV2 - - Markdown - - HTML + monitoringTool: + description: The monitoring tool the state message is + from. + type: string + routingKey: + description: A key used to map the alert to a team. type: string sendResolved: - description: Whether to notify about resolved alerts. + description: Whether or not to notify about resolved alerts. type: boolean + stateMessage: + description: Contains long explanation of the alerted + problem. + type: string type: object type: array - victoropsConfigs: - description: List of VictorOps configurations. + webexConfigs: + description: List of Webex configurations. items: - description: VictorOpsConfig configures notifications via - VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config + description: WebexConfig configures notification via Cisco + Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config properties: - apiKey: - description: The secret's key that contains the API key - to use when talking to the VictorOps API. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - apiUrl: - description: The VictorOps API URL. - type: string - customFields: - description: Additional custom fields for notification. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entityDisplayName: - description: Contains summary of the alerted problem. + apiURL: + description: The Webex Teams API URL i.e. https://webexapis.com/v1/messages + Provide if different from the default API URL. + pattern: ^https?://.+$ type: string httpConfig: - description: The HTTP client's configuration. + description: The HTTP client's configuration. You must + supply the bot token via the `httpConfig.authorization` + field. properties: authorization: description: Authorization header configuration for @@ -3966,24 +4753,19 @@ spec: type: string type: object type: object - messageType: - description: Describes the behavior of the alert (CRITICAL, - WARNING, INFO). - type: string - monitoringTool: - description: The monitoring tool the state message is - from. + message: + description: Message template type: string - routingKey: - description: A key used to map the alert to a team. + roomID: + description: ID of the Webex Teams room where to send + the messages. + minLength: 1 type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - stateMessage: - description: Contains long explanation of the alerted - problem. - type: string + required: + - roomID type: object type: array webhookConfigs: @@ -4891,6 +5673,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: alertmanagers.monitoring.coreos.com spec: @@ -7330,6 +8113,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -7451,8 +8253,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -7485,16 +8287,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -8673,6 +9471,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -8794,8 +9611,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -8828,16 +9645,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -9156,8 +9969,15 @@ spec: objects are not goint to be performed, except for delete actions. type: boolean podMetadata: - description: PodMetadata configures Labels and Annotations which are - propagated to the alertmanager pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Alertmanager pods. \n The following items + are reserved and cannot be overridden: * \"alertmanager\" label, + set to the name of the Alertmanager instance. * \"app.kubernetes.io/instance\" + label, set to the name of the Alertmanager instance. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"alertmanager\". * \"app.kubernetes.io/version\" + label, set to the Alertmanager version. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"alertmanager\"." properties: annotations: additionalProperties: @@ -9355,7 +10175,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -9419,14 +10240,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -10014,6 +10832,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -10021,19 +10884,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -10088,13 +10963,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object @@ -12224,6 +13092,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: podmonitors.monitoring.coreos.com spec: @@ -12272,6 +13141,12 @@ spec: jobLabel: description: The label to use to retrieve the job name from. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. @@ -12909,6 +13784,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: probes.monitoring.coreos.com spec: @@ -13046,6 +13922,12 @@ spec: jobName: description: The job name assigned to scraped metrics by default. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. @@ -13636,6 +14518,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: prometheusagents.monitoring.coreos.com spec: @@ -15678,6 +16561,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -15799,8 +16701,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -15833,16 +16735,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -16147,6 +17045,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -16289,7 +17196,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -17161,6 +18068,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -17282,8 +18208,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -17316,16 +18242,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -17604,6 +18526,12 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer. @@ -17672,8 +18600,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -17932,7 +18869,7 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -17964,9 +18901,36 @@ spec: \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -18050,7 +19014,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -18197,8 +19161,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -18746,7 +19710,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -18810,14 +19775,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -19512,6 +20474,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -19519,19 +20526,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -19586,13 +20605,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object @@ -21948,6 +22960,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: prometheuses.monitoring.coreos.com spec: @@ -22963,7 +23976,8 @@ spec: type: string authorization: description: "Authorization section for Alertmanager. \n - Cannot be set at the same time as `basicAuth`, or `bearerTokenFile`." + Cannot be set at the same time as `basicAuth`, `bearerTokenFile` + or `sigv4`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -22995,7 +24009,7 @@ spec: basicAuth: description: "BasicAuth configuration for Alertmanager. \n Cannot be set at the same time as `bearerTokenFile`, - or `authorization`." + `authorization` or `sigv4`." properties: password: description: The secret in the service monitor namespace @@ -23042,9 +24056,9 @@ spec: type: object bearerTokenFile: description: "File to read bearer token for Alertmanager. - \n Cannot be set at the same time as `basicAuth`, or `authorization`. - \n *Deprecated: this will be removed in a future release. - Prefer using `authorization`.*" + \n Cannot be set at the same time as `basicAuth`, `authorization`, + or `sigv4`. \n *Deprecated: this will be removed in a + future release. Prefer using `authorization`.*" type: string enableHttp2: description: Whether to enable HTTP2. @@ -23068,6 +24082,68 @@ spec: scheme: description: Scheme to use when firing alerts. type: string + sigv4: + description: "Sigv4 allows to configures AWS's Signature + Verification 4 for the URL. \n It requires Prometheus + >= v2.48.0. \n Cannot be set at the same time as `basicAuth`, + `bearerTokenFile` or `authorization`." + properties: + accessKey: + description: AccessKey is the AWS API key. If not specified, + the environment variable `AWS_ACCESS_KEY_ID` is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used to + authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used to + authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object timeout: description: Timeout is a per-target Alertmanager timeout when pushing alerts. @@ -24328,6 +25404,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -24449,8 +25544,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -24483,16 +25578,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -24808,6 +25899,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -24969,7 +26069,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -25841,6 +26941,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -25962,8 +27081,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -25996,16 +27115,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -26284,6 +27399,12 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer. @@ -26352,8 +27473,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -27031,7 +28161,7 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -27063,9 +28193,36 @@ spec: \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -27149,7 +28306,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -27296,8 +28453,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -27971,7 +29128,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -28035,14 +29193,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -28741,6 +29896,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -28748,19 +29948,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -28815,13 +30027,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object @@ -31596,6 +32801,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: prometheusrules.monitoring.coreos.com spec: @@ -31727,6 +32933,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: scrapeconfigs.monitoring.coreos.com spec: @@ -32248,6 +33455,128 @@ spec: - server type: object type: array + dnsSDConfigs: + description: DNSSDConfigs defines a list of DNS service discovery + configurations. + items: + description: DNSSDConfig allows specifying a set of DNS domain names + which are periodically queried to discover a list of targets. + The DNS servers to be contacted are read from /etc/resolv.conf. + See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config + properties: + names: + description: A list of DNS domain names to be queried. + items: + type: string + minItems: 1 + type: array + port: + description: The port number used if the query type is not SRV + Ignored for SRV records + type: integer + refreshInterval: + description: RefreshInterval configures the time after which + the provided names are refreshed. If not set, Prometheus uses + its default value. + pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ + type: string + type: + description: The type of DNS query to perform. One of SRV, A, + AAAA or MX. If not set, Prometheus uses its default value. + enum: + - SRV + - A + - AAAA + - MX + type: string + required: + - names + type: object + type: array + ec2SDConfigs: + description: EC2SDConfigs defines a list of EC2 service discovery + configurations. + items: + description: EC2SDConfig allow retrieving scrape targets from AWS + EC2 instances. The private IP address is used by default, but + may be changed to the public IP address with relabeling. The IAM + credentials used must have the ec2:DescribeInstances permission + to discover scrape targets See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config + properties: + accessKey: + description: AccessKey is the AWS API key. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + filters: + description: 'Filters can be used optionally to filter the instance + list by other criteria. Available filter criteria can be found + here: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html + Filter API documentation: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Filter.html' + items: + description: EC2Filter is the configuration for filtering + EC2 instances. + properties: + name: + type: string + values: + items: + type: string + type: array + required: + - name + - values + type: object + type: array + port: + description: The port to scrape metrics from. If using the public + IP address, this must instead be specified in the relabeling + rule. + type: integer + refreshInterval: + description: RefreshInterval configures the refresh interval + at which Prometheus will re-read the instance list. + pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ + type: string + region: + description: The AWS region + type: string + roleARN: + description: AWS Role ARN, an alternative to using AWS API keys. + type: string + secretKey: + description: SecretKey is the AWS API secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + type: object + type: array fileSDConfigs: description: FileSDConfigs defines a list of file service discovery configurations. @@ -32500,6 +33829,12 @@ spec: - url type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer kubernetesSDConfigs: description: KubernetesSDConfigs defines a list of Kubernetes service discovery configurations. @@ -32509,10 +33844,34 @@ spec: properties: role: description: Role of the Kubernetes entities that should be - discovered. Currently the only supported role is "Node". + discovered. enum: - Node + - node type: string + selectors: + description: Selector to select objects. + items: + description: K8SSelectorConfig is Kubernetes Selector Config + properties: + field: + type: string + label: + type: string + role: + description: K8SRole is role of the service in Kubernetes. + Currently the only supported role is "Node". + enum: + - Node + - node + type: string + required: + - role + type: object + type: array + x-kubernetes-list-map-keys: + - role + x-kubernetes-list-type: map required: - role type: object @@ -32534,6 +33893,78 @@ spec: and newer. format: int64 type: integer + metricRelabelings: + description: MetricRelabelConfigs to apply to samples before ingestion. + items: + description: "RelabelConfig allows dynamic rewriting of the label + set for targets, alerts, scraped samples and remote write samples. + \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" + properties: + action: + default: replace + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus + >= v2.41.0. \n Default: \"Replace\"" + enum: + - replace + - Replace + - keep + - Keep + - drop + - Drop + - hashmod + - HashMod + - labelmap + - LabelMap + - labeldrop + - LabelDrop + - labelkeep + - LabelKeep + - lowercase + - Lowercase + - uppercase + - Uppercase + - keepequal + - KeepEqual + - dropequal + - DropEqual + type: string + modulus: + description: "Modulus to take of the hash of the source label + values. \n Only applicable when the action is `HashMod`." + format: int64 + type: integer + regex: + description: Regular expression against which the extracted + value is matched. + type: string + replacement: + description: "Replacement value against which a Replace action + is performed if the regular expression matches. \n Regex capture + groups are available." + type: string + separator: + description: Separator is the string between concatenated SourceLabels. + type: string + sourceLabels: + description: The source labels select values from existing labels. + Their content is concatenated using the configured Separator + and matched against the configured regular expression. + items: + description: LabelName is a valid Prometheus label name which + may only contain ASCII letters, numbers, as well as underscores. + pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ + type: string + type: array + targetLabel: + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, `HashMod`, + `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. + \n Regex capture groups are available." + type: string + type: object + type: array metricsPath: description: MetricsPath HTTP path to scrape for metrics. If empty, Prometheus uses the default value (e.g. /metrics). @@ -32796,6 +34227,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: servicemonitors.monitoring.coreos.com spec: @@ -33397,6 +34829,12 @@ spec: the given Service, the `job` label of the metrics defaults to the name of the Kubernetes Service." type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. @@ -33511,6 +34949,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: thanosrulers.monitoring.coreos.com spec: @@ -35328,6 +36767,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -35449,8 +36907,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -35483,16 +36941,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -36833,6 +38287,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -36954,8 +38427,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -36988,16 +38461,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -37347,8 +38816,14 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata contains Labels and Annotations gets propagated - to the thanos ruler pods. + description: "PodMetadata configures labels and annotations which + are propagated to the ThanosRuler pods. \n The following items are + reserved and cannot be overridden: * \"app.kubernetes.io/name\" + label, set to \"thanos-ruler\". * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/instance\" + label, set to the name of the ThanosRuler instance. * \"thanos-ruler\" + label, set to the name of the ThanosRuler instance. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"thanos-ruler\"." properties: annotations: additionalProperties: @@ -37674,7 +39149,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -37738,14 +39214,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -38325,6 +39798,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -38332,19 +39850,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -38399,13 +39929,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object @@ -40343,7 +41866,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator roleRef: apiGroup: rbac.authorization.k8s.io @@ -40360,7 +41883,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator rules: - apiGroups: @@ -40440,6 +41963,12 @@ rules: - get - list - watch +- apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get --- apiVersion: apps/v1 kind: Deployment @@ -40447,7 +41976,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default spec: @@ -40463,14 +41992,14 @@ spec: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 spec: automountServiceAccountToken: true containers: - args: - --kubelet-service=kube-system/kubelet - - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.67.1 - image: quay.io/prometheus-operator/prometheus-operator:v0.67.1 + - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.69.1 + image: quay.io/prometheus-operator/prometheus-operator:v0.69.1 name: prometheus-operator ports: - containerPort: 8080 @@ -40504,7 +42033,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default --- @@ -40514,7 +42043,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default spec: diff --git a/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile new file mode 100644 index 000000000..613dc084e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile @@ -0,0 +1,9 @@ +ARG ARCH="amd64" +ARG OS="linux" +FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest + +COPY admission-webhook /bin/admission-webhook + +USER nobody + +ENTRYPOINT ["/bin/admission-webhook"] diff --git a/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/main.go b/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/main.go index 3a5ff2b7c..d8e222105 100644 --- a/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/main.go +++ b/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/main.go @@ -53,12 +53,22 @@ var ( cfg = config{} flagset = flag.CommandLine + enableHTTP2 bool serverTLS bool rawTLSCipherSuites string ) func main() { flagset.StringVar(&cfg.ListenAddress, "web.listen-address", ":8443", "Address on which the admission webhook service listens") + // Mitigate CVE-2023-44487 by disabling HTTP2 by default until the Go + // standard library and golang.org/x/net are fully fixed. + // Right now, it is possible for authenticated and unauthenticated users to + // hold open HTTP2 connections and consume huge amounts of memory. + // See: + // * https://github.com/kubernetes/kubernetes/pull/121120 + // * https://github.com/kubernetes/kubernetes/issues/121197 + // * https://github.com/golang/go/issues/63417#issuecomment-1758858612 + flagset.BoolVar(&enableHTTP2, "web.enable-http2", false, "Enable HTTP2 connections.") flagset.BoolVar(&serverTLS, "web.enable-tls", true, "Enable TLS web server") flagset.StringVar(&cfg.ServerTLSConfig.CertFile, "web.cert-file", defaultCrtFile, "Certificate file to be used for the web server.") @@ -127,7 +137,7 @@ func (s *srv) run(listener net.Listener) error { log := log.With(s.logger, "address", listener.Addr().String()) if s.s.TLSConfig != nil { - level.Info(log).Log("msg", "Starting TLS enabled server") + level.Info(log).Log("msg", "Starting TLS enabled server", "http2", enableHTTP2) if err := s.s.ServeTLS(listener, "", ""); err != http.ErrServerClosed { return err } @@ -159,22 +169,27 @@ func newSrv(logger log.Logger, tlsConf *tls.Config) *srv { mux.Handle("/metrics", promhttp.HandlerFor(r, promhttp.HandlerOpts{})) mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte(`{"status":"up"}`)) w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"status":"up"}`)) }) + httpServer := http.Server{ + Handler: mux, + TLSConfig: tlsConf, + ReadHeaderTimeout: 30 * time.Second, + ReadTimeout: 30 * time.Second, + // use flags on standard logger to align with base logger and get consistent parsed fields form adapter: + // use shortfile flag to get proper 'caller' field (avoid being wrongly parsed/extracted from message) + // and no datetime related flag to keep 'ts' field from base logger (with controlled format) + ErrorLog: stdlog.New(log.NewStdlibAdapter(logger), "", stdlog.Lshortfile), + } + if !enableHTTP2 { + httpServer.TLSNextProto = make(map[string]func(*http.Server, *tls.Conn, http.Handler)) + } + return &srv{ logger: logger, - s: &http.Server{ - Handler: mux, - TLSConfig: tlsConf, - ReadHeaderTimeout: 30 * time.Second, - ReadTimeout: 30 * time.Second, - // use flags on standard logger to align with base logger and get consistent parsed fields form adapter: - // use shortfile flag to get proper 'caller' field (avoid being wrongly parsed/extracted from message) - // and no datetime related flag to keep 'ts' field from base logger (with controlled format) - ErrorLog: stdlog.New(log.NewStdlibAdapter(logger), "", stdlog.Lshortfile), - }, + s: &httpServer, } } diff --git a/otelcollector/otel-allocator/prometheus-operator/cmd/operator/main.go b/otelcollector/otel-allocator/prometheus-operator/cmd/operator/main.go index 561a53d6c..b23e065f9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/cmd/operator/main.go +++ b/otelcollector/otel-allocator/prometheus-operator/cmd/operator/main.go @@ -39,12 +39,14 @@ import ( "github.com/prometheus/common/version" "golang.org/x/sync/errgroup" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - klog "k8s.io/klog/v2" + storagev1 "k8s.io/api/storage/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/kubernetes" logging "github.com/prometheus-operator/prometheus-operator/internal/log" "github.com/prometheus-operator/prometheus-operator/pkg/admission" alertmanagercontroller "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager" + "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" "github.com/prometheus-operator/prometheus-operator/pkg/k8sutil" "github.com/prometheus-operator/prometheus-operator/pkg/operator" @@ -59,11 +61,6 @@ const ( defaultOperatorTLSDir = "/etc/tls/private" ) -const ( - defaultReloaderCPU = "10m" - defaultReloaderMemory = "50Mi" -) - var ( ns = namespaces{} deniedNs = namespaces{} @@ -75,7 +72,7 @@ var ( type namespaces map[string]struct{} -// Set implements the flagset.Value interface. +// Set implements the flag.Value interface. func (n namespaces) Set(value string) error { if n == nil { return errors.New("expected n of type namespaces to be initialized") @@ -86,7 +83,7 @@ func (n namespaces) Set(value string) error { return nil } -// String implements the flagset.Value interface. +// String implements the flag.Value interface. func (n namespaces) String() string { return strings.Join(n.asSlice(), ",") } @@ -99,19 +96,40 @@ func (n namespaces) asSlice() []string { return ns } -// Helper function for checking CRD prerequisites -func checkPrerequisites(ctx context.Context, logger log.Logger, cc *k8sutil.CRDChecker, allowedNamespaces []string, verbs map[string][]string, groupVersion, resourceName string) (bool, error) { - err := cc.CheckPrerequisites(ctx, allowedNamespaces, verbs, groupVersion, resourceName) - switch { - case errors.Is(err, k8sutil.ErrPrerequiresitesFailed): - level.Warn(logger).Log("msg", fmt.Sprintf("%s CRD not supported", resourceName), "reason", err) +// checkPrerequisites verifies that the CRD is installed in the cluster and +// that the operator has enough permissions to manage the resource. +func checkPrerequisites( + ctx context.Context, + logger log.Logger, + kclient kubernetes.Interface, + allowedNamespaces []string, + groupVersion schema.GroupVersion, + resource string, + attributes ...k8sutil.ResourceAttribute, +) (bool, error) { + installed, err := k8sutil.IsAPIGroupVersionResourceSupported(kclient.Discovery(), groupVersion, resource) + if err != nil { + return false, fmt.Errorf("failed to check presence of resource %q (group %q): %w", resource, groupVersion, err) + } + + if !installed { + level.Warn(logger).Log("msg", fmt.Sprintf("resource %q (group: %q) not installed in the cluster", resource, groupVersion)) + return false, nil + } + + allowed, errs, err := k8sutil.IsAllowed(ctx, kclient.AuthorizationV1().SelfSubjectAccessReviews(), allowedNamespaces, attributes...) + if err != nil { + return false, fmt.Errorf("failed to check permissions on resource %q (group %q): %w", resource, groupVersion, err) + } + + if !allowed { + for _, reason := range errs { + level.Warn(logger).Log("msg", fmt.Sprintf("missing permission on resource %q (group: %q)", resource, groupVersion), "reason", reason) + } return false, nil - case err != nil: - level.Error(logger).Log("msg", fmt.Sprintf("failed to check prerequisites for the %s CRD ", resourceName), "err", err) - return false, err - default: - return true, nil } + + return true, nil } func serve(srv *http.Server, listener net.Listener, logger log.Logger) func() error { @@ -126,7 +144,7 @@ func serve(srv *http.Server, listener net.Listener, logger log.Logger) func() er func serveTLS(srv *http.Server, listener net.Listener, logger log.Logger) func() error { return func() error { - level.Info(logger).Log("msg", "Starting secure server on "+listener.Addr().String()) + level.Info(logger).Log("msg", "Starting secure server on "+listener.Addr().String(), "http2", enableHTTP2) if err := srv.ServeTLS(listener, "", ""); err != http.ErrServerClosed { return err } @@ -134,18 +152,32 @@ func serveTLS(srv *http.Server, listener net.Listener, logger log.Logger) func() } } +const ( + defaultReloaderCPU = "10m" + defaultReloaderMemory = "50Mi" +) + var ( - cfg = operator.Config{} + cfg = operator.DefaultConfig(defaultReloaderCPU, defaultReloaderMemory) rawTLSCipherSuites string + enableHTTP2 bool serverTLS bool flagset = flag.CommandLine ) func init() { - // With migration to klog-gokit, calling klogv2.InitFlags(flagset) is not applicable. flagset.StringVar(&cfg.ListenAddress, "web.listen-address", ":8080", "Address on which to expose metrics and web interface.") + // Mitigate CVE-2023-44487 by disabling HTTP2 by default until the Go + // standard library and golang.org/x/net are fully fixed. + // Right now, it is possible for authenticated and unauthenticated users to + // hold open HTTP2 connections and consume huge amounts of memory. + // See: + // * https://github.com/kubernetes/kubernetes/pull/121120 + // * https://github.com/kubernetes/kubernetes/issues/121197 + // * https://github.com/golang/go/issues/63417#issuecomment-1758858612 + flagset.BoolVar(&enableHTTP2, "web.enable-http2", false, "Enable HTTP2 connections.") flagset.BoolVar(&serverTLS, "web.enable-tls", false, "Activate prometheus operator web server TLS. "+ " This is useful for example when using the rule validation webhook.") flagset.StringVar(&cfg.ServerTLSConfig.CertFile, "web.cert-file", defaultOperatorTLSDir+"/tls.crt", "Cert file to be used for operator web server endpoints.") @@ -158,45 +190,55 @@ func init() { " Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants)."+ "If omitted, the default Go cipher suites will be used."+ "Note that TLS 1.3 ciphersuites are not configurable.") + + flagset.StringVar(&cfg.ImpersonateUser, "as", "", "Username to impersonate. User could be a regular user or a service account in a namespace.") flagset.StringVar(&cfg.Host, "apiserver", "", "API Server addr, e.g. ' - NOT RECOMMENDED FOR PRODUCTION - http://127.0.0.1:8080'. Omit parameter to run in on-cluster mode and utilize the service account token.") flagset.StringVar(&cfg.TLSConfig.CertFile, "cert-file", "", " - NOT RECOMMENDED FOR PRODUCTION - Path to public TLS certificate file.") flagset.StringVar(&cfg.TLSConfig.KeyFile, "key-file", "", "- NOT RECOMMENDED FOR PRODUCTION - Path to private TLS certificate file.") flagset.StringVar(&cfg.TLSConfig.CAFile, "ca-file", "", "- NOT RECOMMENDED FOR PRODUCTION - Path to TLS CA file.") + flagset.StringVar(&cfg.KubeletObject, "kubelet-service", "", "Service/Endpoints object to write kubelets into in format \"namespace/name\"") flagset.StringVar(&cfg.KubeletSelector, "kubelet-selector", "", "Label selector to filter nodes.") flagset.BoolVar(&cfg.TLSInsecure, "tls-insecure", false, "- NOT RECOMMENDED FOR PRODUCTION - Don't verify API server's CA certificate.") + // The Prometheus config reloader image is released along with the // Prometheus Operator image, tagged with the same semver version. Default to // the Prometheus Operator version if no Prometheus config reloader image is // specified. flagset.StringVar(&cfg.ReloaderConfig.Image, "prometheus-config-reloader", operator.DefaultPrometheusConfigReloaderImage, "Prometheus config reloader image") - flagset.StringVar(&cfg.ReloaderConfig.CPURequest, "config-reloader-cpu-request", defaultReloaderCPU, "Config Reloader CPU request. Value \"0\" disables it and causes no request to be configured. Flag overrides `--config-reloader-cpu` value for the CPU request") - flagset.StringVar(&cfg.ReloaderConfig.CPULimit, "config-reloader-cpu-limit", defaultReloaderCPU, "Config Reloader CPU limit. Value \"0\" disables it and causes no limit to be configured. Flag overrides `--config-reloader-cpu` for the CPU limit") - flagset.StringVar(&cfg.ReloaderConfig.MemoryRequest, "config-reloader-memory-request", defaultReloaderMemory, "Config Reloader Memory request. Value \"0\" disables it and causes no request to be configured. Flag overrides `--config-reloader-memory` for the memory request") - flagset.StringVar(&cfg.ReloaderConfig.MemoryLimit, "config-reloader-memory-limit", defaultReloaderMemory, "Config Reloader Memory limit. Value \"0\" disables it and causes no limit to be configured. Flag overrides `--config-reloader-memory` for the memory limit") + flagset.Var(&cfg.ReloaderConfig.CPURequests, "config-reloader-cpu-request", "Config Reloader CPU requests. Value \"0\" disables it and causes no request to be configured.") + flagset.Var(&cfg.ReloaderConfig.CPULimits, "config-reloader-cpu-limit", "Config Reloader CPU limits. Value \"0\" disables it and causes no limit to be configured.") + flagset.Var(&cfg.ReloaderConfig.MemoryRequests, "config-reloader-memory-request", "Config Reloader memory requests. Value \"0\" disables it and causes no request to be configured.") + flagset.Var(&cfg.ReloaderConfig.MemoryLimits, "config-reloader-memory-limit", "Config Reloader memory limits. Value \"0\" disables it and causes no limit to be configured.") flagset.BoolVar(&cfg.ReloaderConfig.EnableProbes, "enable-config-reloader-probes", false, "Enable liveness and readiness for the config-reloader container. Default: false") + flagset.StringVar(&cfg.AlertmanagerDefaultBaseImage, "alertmanager-default-base-image", operator.DefaultAlertmanagerBaseImage, "Alertmanager default base image (path without tag/version)") flagset.StringVar(&cfg.PrometheusDefaultBaseImage, "prometheus-default-base-image", operator.DefaultPrometheusBaseImage, "Prometheus default base image (path without tag/version)") flagset.StringVar(&cfg.ThanosDefaultBaseImage, "thanos-default-base-image", operator.DefaultThanosBaseImage, "Thanos default base image (path without tag/version)") + flagset.Var(ns, "namespaces", "Namespaces to scope the interaction of the Prometheus Operator and the apiserver (allow list). This is mutually exclusive with --deny-namespaces.") flagset.Var(deniedNs, "deny-namespaces", "Namespaces not to scope the interaction of the Prometheus Operator (deny list). This is mutually exclusive with --namespaces.") flagset.Var(prometheusNs, "prometheus-instance-namespaces", "Namespaces where Prometheus and PrometheusAgent custom resources and corresponding Secrets, Configmaps and StatefulSets are watched/created. If set this takes precedence over --namespaces or --deny-namespaces for Prometheus custom resources.") flagset.Var(alertmanagerNs, "alertmanager-instance-namespaces", "Namespaces where Alertmanager custom resources and corresponding StatefulSets are watched/created. If set this takes precedence over --namespaces or --deny-namespaces for Alertmanager custom resources.") flagset.Var(alertmanagerConfigNs, "alertmanager-config-namespaces", "Namespaces where AlertmanagerConfig custom resources and corresponding Secrets are watched/created. If set this takes precedence over --namespaces or --deny-namespaces for AlertmanagerConfig custom resources.") flagset.Var(thanosRulerNs, "thanos-ruler-instance-namespaces", "Namespaces where ThanosRuler custom resources and corresponding StatefulSets are watched/created. If set this takes precedence over --namespaces or --deny-namespaces for ThanosRuler custom resources.") + flagset.Var(&cfg.Annotations, "annotations", "Annotations to be add to all resources created by the operator") flagset.Var(&cfg.Labels, "labels", "Labels to be add to all resources created by the operator") + flagset.StringVar(&cfg.LocalHost, "localhost", "localhost", "EXPERIMENTAL (could be removed in future releases) - Host used to communicate between local services on a pod. Fixes issues where localhost resolves incorrectly.") flagset.StringVar(&cfg.ClusterDomain, "cluster-domain", "", "The domain of the cluster. This is used to generate service FQDNs. If this is not specified, DNS search domain expansion is used instead.") + flagset.StringVar(&cfg.LogLevel, "log-level", "info", fmt.Sprintf("Log level to use. Possible values: %s", strings.Join(logging.AvailableLogLevels, ", "))) flagset.StringVar(&cfg.LogFormat, "log-format", "logfmt", fmt.Sprintf("Log format to use. Possible values: %s", strings.Join(logging.AvailableLogFormats, ", "))) + flagset.StringVar(&cfg.PromSelector, "prometheus-instance-selector", "", "Label selector to filter Prometheus and PrometheusAgent Custom Resources to watch.") flagset.StringVar(&cfg.AlertManagerSelector, "alertmanager-instance-selector", "", "Label selector to filter AlertManager Custom Resources to watch.") flagset.StringVar(&cfg.ThanosRulerSelector, "thanos-ruler-instance-selector", "", "Label selector to filter ThanosRuler Custom Resources to watch.") flagset.StringVar(&cfg.SecretListWatchSelector, "secret-field-selector", "", "Field selector to filter Secrets to watch") } -func Main() int { +func run() int { versionutil.RegisterFlags() // No need to check for errors because Parse would exit on error. _ = flagset.Parse(os.Args[1:]) @@ -211,36 +253,15 @@ func Main() int { stdlog.Fatal(err) } - // Check validity of reloader resource values given to flags - _, err1 := resource.ParseQuantity(cfg.ReloaderConfig.CPULimit) - if err1 != nil { - fmt.Fprintf(os.Stderr, "The CPU limit specified for reloader \"%v\" is not a valid quantity! %v\n", cfg.ReloaderConfig.CPULimit, err1) - } - _, err2 := resource.ParseQuantity(cfg.ReloaderConfig.CPURequest) - if err2 != nil { - fmt.Fprintf(os.Stderr, "The CPU request specified for reloader \"%v\" is not a valid quantity! %v\n", cfg.ReloaderConfig.CPURequest, err2) - } - _, err3 := resource.ParseQuantity(cfg.ReloaderConfig.MemoryLimit) - if err3 != nil { - fmt.Fprintf(os.Stderr, "The Memory limit specified for reloader \"%v\" is not a valid quantity! %v\n", cfg.ReloaderConfig.MemoryLimit, err3) - } - _, err4 := resource.ParseQuantity(cfg.ReloaderConfig.MemoryRequest) - if err4 != nil { - fmt.Fprintf(os.Stderr, "The Memory request specified for reloader \"%v\" is not a valid quantity! %v\n", cfg.ReloaderConfig.MemoryRequest, err4) - } - if err1 != nil || err2 != nil || err3 != nil || err4 != nil { - return 1 - } - - // Above level 6, the k8s client would log bearer tokens in clear-text. - klog.ClampLevel(6) - klog.SetLogger(log.With(logger, "component", "k8s_client_runtime")) - level.Info(logger).Log("msg", "Starting Prometheus Operator", "version", version.Info()) level.Info(logger).Log("build_context", version.BuildContext()) if len(ns) > 0 && len(deniedNs) > 0 { - fmt.Fprint(os.Stderr, "--namespaces and --deny-namespaces are mutually exclusive. Please provide only one of them.\n") + level.Error(logger).Log( + "msg", "--namespaces and --deny-namespaces are mutually exclusive, only one should be provided", + "namespaces", ns, + "deny_namespaces", deniedNs, + ) return 1 } @@ -277,35 +298,73 @@ func Main() int { k8sutil.MustRegisterClientGoMetrics(r) - allowedNamespaces := namespaces(cfg.Namespaces.AllowList).asSlice() + restConfig, err := k8sutil.NewClusterConfig(cfg.Host, cfg.TLSInsecure, &cfg.TLSConfig, cfg.ImpersonateUser) + if err != nil { + level.Error(logger).Log("msg", "failed to create Kubernetes client configuration", "err", err) + cancel() + return 1 + } - cc, err := k8sutil.NewCRDChecker(cfg.Host, cfg.TLSInsecure, &cfg.TLSConfig) + kclient, err := kubernetes.NewForConfig(restConfig) if err != nil { - level.Error(logger).Log("msg", "failed to create new CRDChecker object ", "err", err) + level.Error(logger).Log("msg", "failed to create Kubernetes client", "err", err) cancel() return 1 } - scrapeConfigSupported, err := checkPrerequisites( + kubernetesVersion, err := kclient.Discovery().ServerVersion() + if err != nil { + level.Error(logger).Log("msg", "failed to request Kubernetes server version", "err", err) + cancel() + return 1 + } + cfg.KubernetesVersion = *kubernetesVersion + level.Info(logger).Log("msg", "connection established", "cluster-version", cfg.KubernetesVersion) + // Check if we can read the storage classs + canReadStorageClass, err := checkPrerequisites( ctx, logger, - cc, - allowedNamespaces, - map[string][]string{ - monitoringv1alpha1.ScrapeConfigName: {"get", "list", "watch"}, + kclient, + nil, + storagev1.SchemeGroupVersion, + storagev1.SchemeGroupVersion.WithResource("storageclasses").Resource, + k8sutil.ResourceAttribute{ + Group: storagev1.GroupName, + Version: storagev1.SchemeGroupVersion.Version, + Resource: storagev1.SchemeGroupVersion.WithResource("storageclasses").Resource, + Verbs: []string{"get"}, }, - monitoringv1alpha1.SchemeGroupVersion.String(), - monitoringv1alpha1.ScrapeConfigName, ) if err != nil { + level.Error(logger).Log("msg", "failed to check StorageClass support", "err", err) cancel() return 1 } - po, err := prometheuscontroller.New(ctx, cfg, log.With(logger, "component", "prometheusoperator"), r, scrapeConfigSupported) + scrapeConfigSupported, err := checkPrerequisites( + ctx, + logger, + kclient, + namespaces(cfg.Namespaces.AllowList).asSlice(), + monitoringv1alpha1.SchemeGroupVersion, + monitoringv1alpha1.ScrapeConfigName, + k8sutil.ResourceAttribute{ + Group: monitoring.GroupName, + Version: monitoringv1alpha1.Version, + Resource: monitoringv1alpha1.ScrapeConfigName, + Verbs: []string{"get", "list", "watch"}, + }, + ) if err != nil { - fmt.Fprintln(os.Stderr, "instantiating prometheus controller failed: ", err) + level.Error(logger).Log("msg", "failed to check ScrapeConfig support", "err", err) + cancel() + return 1 + } + + po, err := prometheuscontroller.New(ctx, restConfig, cfg, log.With(logger, "component", "prometheusoperator"), r, scrapeConfigSupported, canReadStorageClass) + if err != nil { + level.Error(logger).Log("msg", "instantiating prometheus controller failed", "err", err) cancel() return 1 } @@ -313,23 +372,32 @@ func Main() int { prometheusAgentSupported, err := checkPrerequisites( ctx, logger, - cc, - allowedNamespaces, - map[string][]string{ - monitoringv1alpha1.PrometheusAgentName: {"get", "list", "watch"}, - fmt.Sprintf("%s/status", monitoringv1alpha1.PrometheusAgentName): {"update"}, - }, - monitoringv1alpha1.SchemeGroupVersion.String(), + kclient, + namespaces(cfg.Namespaces.PrometheusAllowList).asSlice(), + monitoringv1alpha1.SchemeGroupVersion, monitoringv1alpha1.PrometheusAgentName, + k8sutil.ResourceAttribute{ + Group: monitoring.GroupName, + Version: monitoringv1alpha1.Version, + Resource: monitoringv1alpha1.PrometheusAgentName, + Verbs: []string{"get", "list", "watch"}, + }, + k8sutil.ResourceAttribute{ + Group: monitoring.GroupName, + Version: monitoringv1alpha1.Version, + Resource: fmt.Sprintf("%s/status", monitoringv1alpha1.PrometheusAgentName), + Verbs: []string{"update"}, + }, ) if err != nil { + level.Error(logger).Log("msg", "failed to check PrometheusAgent support", "err", err) cancel() return 1 } var pao *prometheusagentcontroller.Operator if prometheusAgentSupported { - pao, err = prometheusagentcontroller.New(ctx, cfg, log.With(logger, "component", "prometheusagentoperator"), r, scrapeConfigSupported) + pao, err = prometheusagentcontroller.New(ctx, restConfig, cfg, log.With(logger, "component", "prometheusagentoperator"), r, scrapeConfigSupported, canReadStorageClass) if err != nil { level.Error(logger).Log("msg", "instantiating prometheus-agent controller failed", "err", err) cancel() @@ -337,16 +405,16 @@ func Main() int { } } - ao, err := alertmanagercontroller.New(ctx, cfg, log.With(logger, "component", "alertmanageroperator"), r) + ao, err := alertmanagercontroller.New(ctx, restConfig, cfg, log.With(logger, "component", "alertmanageroperator"), r, canReadStorageClass) if err != nil { - fmt.Fprintln(os.Stderr, "instantiating alertmanager controller failed: ", err) + level.Error(logger).Log("msg", "instantiating alertmanager controller failed", "err", err) cancel() return 1 } - to, err := thanoscontroller.New(ctx, cfg, log.With(logger, "component", "thanosoperator"), r) + to, err := thanoscontroller.New(ctx, restConfig, cfg, log.With(logger, "component", "thanosoperator"), r, canReadStorageClass) if err != nil { - fmt.Fprintln(os.Stderr, "instantiating thanos controller failed: ", err) + level.Error(logger).Log("msg", "instantiating thanos controller failed", "err", err) cancel() return 1 } @@ -357,7 +425,7 @@ func Main() int { admit.Register(mux) l, err := net.Listen("tcp", cfg.ListenAddress) if err != nil { - fmt.Fprintln(os.Stderr, "listening failed", cfg.ListenAddress, err) + level.Error(logger).Log("msg", "listening failed", "address", cfg.ListenAddress, "err", err) cancel() return 1 } @@ -370,49 +438,18 @@ func Main() int { tlsConfig, err = server.NewTLSConfig(logger, cfg.ServerTLSConfig.CertFile, cfg.ServerTLSConfig.KeyFile, cfg.ServerTLSConfig.ClientCAFile, cfg.ServerTLSConfig.MinVersion, cfg.ServerTLSConfig.CipherSuites) if tlsConfig == nil || err != nil { - fmt.Fprintln(os.Stderr, "invalid TLS config", err) + level.Error(logger).Log("msg", "invalid TLS config", "err", err) cancel() return 1 } } - validationTriggeredCounter := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_rule_validation_triggered_total", - Help: "DEPRECATED, removed in v0.57.0: Number of times a prometheusRule object triggered validation", - }) - - validationErrorsCounter := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_rule_validation_errors_total", - Help: "DEPRECATED, removed in v0.57.0: Number of errors that occurred while validating a prometheusRules object", - }) - - alertManagerConfigValidationTriggered := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_alertmanager_config_validation_triggered_total", - Help: "DEPRECATED, removed in v0.57.0: Number of times an alertmanagerconfig object triggered validation", - }) - - alertManagerConfigValidationError := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_alertmanager_config_validation_errors_total", - Help: "DEPRECATED, removed in v0.57.0: Number of errors that occurred while validating a alertmanagerconfig object", - }) - r.MustRegister( collectors.NewGoCollector(), collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), - validationTriggeredCounter, - validationErrorsCounter, - alertManagerConfigValidationTriggered, - alertManagerConfigValidationError, version.NewCollector("prometheus_operator"), ) - admit.RegisterMetrics( - validationTriggeredCounter, - validationErrorsCounter, - alertManagerConfigValidationTriggered, - alertManagerConfigValidationError, - ) - mux.Handle("/metrics", promhttp.HandlerFor(r, promhttp.HandlerOpts{})) mux.Handle("/debug/pprof/", http.HandlerFunc(pprof.Index)) mux.Handle("/debug/pprof/cmdline", http.HandlerFunc(pprof.Cmdline)) @@ -437,7 +474,7 @@ func Main() int { cfg.ServerTLSConfig.ReloadInterval, ) if err != nil { - fmt.Fprintln(os.Stderr, "failed to initialize certificate reloader", err) + level.Error(logger).Log("msg", "failed to initialize certificate reloader", "err", err) cancel() return 1 } @@ -467,6 +504,9 @@ func Main() int { // and no datetime related flag to keep 'ts' field from base logger (with controlled format) ErrorLog: stdlog.New(log.NewStdlibAdapter(logger), "", stdlog.Lshortfile), } + if !enableHTTP2 { + srv.TLSNextProto = make(map[string]func(*http.Server, *tls.Conn, http.Handler)) + } if srv.TLSConfig == nil { wg.Go(serve(srv, l, logger)) } else { @@ -496,5 +536,5 @@ func Main() int { } func main() { - os.Exit(Main()) + os.Exit(run()) } diff --git a/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile new file mode 100644 index 000000000..0e5e367d2 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile @@ -0,0 +1,9 @@ +ARG ARCH="amd64" +ARG OS="linux" +FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest + +COPY prometheus-config-reloader /bin/prometheus-config-reloader + +USER nobody + +ENTRYPOINT ["/bin/prometheus-config-reloader"] diff --git a/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/main.go b/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/main.go index 7fb106211..b98873827 100644 --- a/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/main.go +++ b/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/main.go @@ -35,6 +35,7 @@ import ( "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/version" + "github.com/prometheus/exporter-toolkit/web" "github.com/thanos-io/thanos/pkg/reloader" logging "github.com/prometheus-operator/prometheus-operator/internal/log" @@ -76,6 +77,11 @@ func main() { "address on which to expose metrics (disabled when empty)"). String() + webConfig := app.Flag( + "web-config-file", + "[EXPERIMENTAL] Path to configuration file that can enable TLS or authentication. See: https://prometheus.io/docs/prometheus/latest/configuration/https/", + ).Default("").String() + logFormat := app.Flag( "log-format", fmt.Sprintf("log format to use. Possible values: %s", strings.Join(logging.AvailableLogFormats, ", "))). @@ -106,6 +112,12 @@ func main() { stdlog.Fatal(err) } + err = web.Validate(*webConfig) + if err != nil { + level.Error(logger).Log("msg", "Unable to validate web configuration file", "err", err) + os.Exit(2) + } + if createStatefulsetOrdinalFrom != nil { if err := createOrdinalEnvvar(*createStatefulsetOrdinalFrom); err != nil { level.Warn(logger).Log("msg", fmt.Sprintf("Failed setting %s", statefulsetOrdinalEnvvar)) @@ -158,11 +170,14 @@ func main() { w.Write([]byte(`{"status":"up"}`)) }) - srv := http.Server{Addr: *listenAddress} + srv := &http.Server{} g.Add(func() error { level.Info(logger).Log("msg", "Starting web server for metrics", "listen", *listenAddress) - return srv.ListenAndServe() + return web.ListenAndServe(srv, &web.FlagConfig{ + WebListenAddresses: &[]string{*listenAddress}, + WebConfigFile: webConfig, + }, logger) }, func(error) { srv.Close() }) diff --git a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/deployment.yaml b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/deployment.yaml index 70361b29e..892a4f642 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/deployment.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/deployment.yaml @@ -3,7 +3,7 @@ kind: Deployment metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default spec: @@ -20,7 +20,7 @@ spec: kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 spec: affinity: podAntiAffinity: @@ -37,7 +37,7 @@ spec: - --web.enable-tls=true - --web.cert-file=/etc/tls/private/tls.crt - --web.key-file=/etc/tls/private/tls.key - image: quay.io/prometheus-operator/admission-webhook:v0.67.1 + image: quay.io/prometheus-operator/admission-webhook:v0.69.1 name: prometheus-operator-admission-webhook ports: - containerPort: 8443 diff --git a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/pod-disruption-budget.yaml b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/pod-disruption-budget.yaml index 4f796c3ed..50146daa2 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/pod-disruption-budget.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/pod-disruption-budget.yaml @@ -3,7 +3,7 @@ kind: PodDisruptionBudget metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default spec: diff --git a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-account.yaml b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-account.yaml index 085d53c8b..db92cf852 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-account.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-account.yaml @@ -4,6 +4,6 @@ kind: ServiceAccount metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default diff --git a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-monitor.yaml b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-monitor.yaml index db815e401..9a681cacc 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-monitor.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service-monitor.yaml @@ -3,7 +3,7 @@ kind: ServiceMonitor metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default spec: @@ -13,4 +13,4 @@ spec: selector: matchLabels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 diff --git a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service.yaml b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service.yaml index 739f9074f..abf215074 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/service.yaml @@ -3,7 +3,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator-admission-webhook namespace: default spec: diff --git a/otelcollector/otel-allocator/prometheus-operator/example/alertmanager-crd-conversion/patch.json b/otelcollector/otel-allocator/prometheus-operator/example/alertmanager-crd-conversion/patch.json index b00f899a3..e6cdbd0ac 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/alertmanager-crd-conversion/patch.json +++ b/otelcollector/otel-allocator/prometheus-operator/example/alertmanager-crd-conversion/patch.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "alertmanagerconfigs.monitoring.coreos.com" diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml index dfe8a408a..27a50b9f6 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml @@ -22,8 +22,8 @@ spec: - name: v1alpha1 schema: openAPIV3Schema: - description: AlertmanagerConfig defines a namespaced AlertmanagerConfig to - be aggregated across multiple namespaces configuring one Alertmanager cluster. + description: AlertmanagerConfig configures the Prometheus Alertmanager, specifying + how alerts should be grouped, inhibited and notified to external systems. properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation @@ -833,72 +833,13 @@ spec: type: string type: object type: array - name: - description: Name of the receiver. Must be unique across all - items from the list. - minLength: 1 - type: string - opsgenieConfigs: - description: List of OpsGenie configurations. + msteamsConfigs: + description: List of MSTeams configurations. It requires Alertmanager + >= 0.26.0. items: - description: OpsGenieConfig configures notifications via OpsGenie. - See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config + description: MSTeamsConfig configures notifications via Microsoft + Teams. It requires Alertmanager >= 0.26.0. properties: - actions: - description: Comma separated list of actions that will - be available for the alert. - type: string - apiKey: - description: The secret's key that contains the OpsGenie - API key. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - apiURL: - description: The URL to send OpsGenie API requests to. - type: string - description: - description: Description of the incident. - type: string - details: - description: A set of arbitrary key/value pairs that provide - further detail about the incident. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entity: - description: Optional field that can be used to specify - which domain alert is related to. - type: string httpConfig: description: HTTP client configuration. properties: @@ -1247,89 +1188,86 @@ spec: type: string type: object type: object - message: - description: Alert text limited to 130 characters. - type: string - note: - description: Additional alert note. - type: string - priority: - description: Priority level of alert. Possible values - are P1, P2, P3, P4, and P5. - type: string - responders: - description: List of responders responsible for notifications. - items: - description: OpsGenieConfigResponder defines a responder - to an incident. One of `id`, `name` or `username` - has to be defined. - properties: - id: - description: ID of the responder. - type: string - name: - description: Name of the responder. - type: string - type: - description: Type of responder. - enum: - - team - - teams - - user - - escalation - - schedule - minLength: 1 - type: string - username: - description: Username of the responder. - type: string - required: - - type - type: object - type: array sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - source: - description: Backlink to the sender of the notification. + text: + description: Message body template. type: string - tags: - description: Comma separated list of tags attached to - the notifications. + title: + description: Message title template. type: string - updateAlerts: - description: Whether to update message and description - of the alert in OpsGenie if it already exists By default, - the alert is never updated in OpsGenie, the new message - only appears in activity log. - type: boolean + webhookUrl: + description: MSTeams webhook URL. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + required: + - webhookUrl type: object type: array - pagerdutyConfigs: - description: List of PagerDuty configurations. + name: + description: Name of the receiver. Must be unique across all + items from the list. + minLength: 1 + type: string + opsgenieConfigs: + description: List of OpsGenie configurations. items: - description: PagerDutyConfig configures notifications via - PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config + description: OpsGenieConfig configures notifications via OpsGenie. + See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config properties: - class: - description: The class/type of the event. - type: string - client: - description: Client identification. - type: string - clientURL: - description: Backlink to the sender of notification. + actions: + description: Comma separated list of actions that will + be available for the alert. type: string - component: - description: The part or component of the affected system - that is broken. + apiKey: + description: The secret's key that contains the OpsGenie + API key. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + apiURL: + description: The URL to send OpsGenie API requests to. type: string description: description: Description of the incident. type: string details: - description: Arbitrary key/value pairs that provide further - detail about the incident. + description: A set of arbitrary key/value pairs that provide + further detail about the incident. items: description: KeyValue defines a (key, value) tuple. properties: @@ -1345,8 +1283,9 @@ spec: - value type: object type: array - group: - description: A cluster or grouping of sources. + entity: + description: Optional field that can be used to specify + which domain alert is related to. type: string httpConfig: description: HTTP client configuration. @@ -1696,119 +1635,107 @@ spec: type: string type: object type: object - pagerDutyImageConfigs: - description: A list of image details to attach that provide - further detail about an incident. + message: + description: Alert text limited to 130 characters. + type: string + note: + description: Additional alert note. + type: string + priority: + description: Priority level of alert. Possible values + are P1, P2, P3, P4, and P5. + type: string + responders: + description: List of responders responsible for notifications. items: - description: PagerDutyImageConfig attaches images to - an incident + description: OpsGenieConfigResponder defines a responder + to an incident. One of `id`, `name` or `username` + has to be defined. properties: - alt: - description: Alt is the optional alternative text - for the image. + id: + description: ID of the responder. type: string - href: - description: Optional URL; makes the image a clickable - link. + name: + description: Name of the responder. type: string - src: - description: Src of the image being attached to - the incident + type: + description: Type of responder. + enum: + - team + - teams + - user + - escalation + - schedule + minLength: 1 + type: string + username: + description: Username of the responder. type: string + required: + - type type: object type: array - pagerDutyLinkConfigs: - description: A list of link details to attach that provide - further detail about an incident. - items: - description: PagerDutyLinkConfig attaches text links - to an incident - properties: - alt: - description: Text that describes the purpose of - the link, and can be used as the link's text. - type: string - href: - description: Href is the URL of the link to be attached - type: string - type: object - type: array - routingKey: - description: The secret's key that contains the PagerDuty - integration key (when using Events API v2). Either this - field or `serviceKey` needs to be defined. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - serviceKey: - description: The secret's key that contains the PagerDuty - service key (when using integration type "Prometheus"). - Either this field or `routingKey` needs to be defined. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - severity: - description: Severity of the incident. + source: + description: Backlink to the sender of the notification. type: string - url: - description: The URL to send requests to. + tags: + description: Comma separated list of tags attached to + the notifications. type: string + updateAlerts: + description: Whether to update message and description + of the alert in OpsGenie if it already exists By default, + the alert is never updated in OpsGenie, the new message + only appears in activity log. + type: boolean type: object type: array - pushoverConfigs: - description: List of Pushover configurations. + pagerdutyConfigs: + description: List of PagerDuty configurations. items: - description: PushoverConfig configures notifications via Pushover. - See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config + description: PagerDutyConfig configures notifications via + PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config properties: - expire: - description: How long your notification will continue - to be retried for, unless the user acknowledges the - notification. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + class: + description: The class/type of the event. + type: string + client: + description: Client identification. + type: string + clientURL: + description: Backlink to the sender of notification. + type: string + component: + description: The part or component of the affected system + that is broken. + type: string + description: + description: Description of the incident. + type: string + details: + description: Arbitrary key/value pairs that provide further + detail about the incident. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + group: + description: A cluster or grouping of sources. type: string - html: - description: Whether notification message is HTML or plain - text. - type: boolean httpConfig: description: HTTP client configuration. properties: @@ -2157,35 +2084,49 @@ spec: type: string type: object type: object - message: - description: Notification message. - type: string - priority: - description: Priority, see https://pushover.net/api#priority - type: string - retry: - description: How often the Pushover servers will send - the same notification to the user. Must be at least - 30 seconds. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - sound: - description: The name of one of the sounds supported by - device clients to override the user's default sound - choice - type: string - title: - description: Notification title. - type: string - token: - description: The secret's key that contains the registered - application's API token, see https://pushover.net/apps. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. + pagerDutyImageConfigs: + description: A list of image details to attach that provide + further detail about an incident. + items: + description: PagerDutyImageConfig attaches images to + an incident + properties: + alt: + description: Alt is the optional alternative text + for the image. + type: string + href: + description: Optional URL; makes the image a clickable + link. + type: string + src: + description: Src of the image being attached to + the incident + type: string + type: object + type: array + pagerDutyLinkConfigs: + description: A list of link details to attach that provide + further detail about an incident. + items: + description: PagerDutyLinkConfig attaches text links + to an incident + properties: + alt: + description: Text that describes the purpose of + the link, and can be used as the link's text. + type: string + href: + description: Href is the URL of the link to be attached + type: string + type: object + type: array + routingKey: + description: The secret's key that contains the PagerDuty + integration key (when using Events API v2). Either this + field or `serviceKey` needs to be defined. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. properties: key: description: The key of the secret to select from. Must @@ -2204,18 +2145,16 @@ spec: - key type: object x-kubernetes-map-type: atomic - url: - description: A supplementary URL shown alongside the message. - type: string - urlTitle: - description: A title for supplementary URL, otherwise - just the URL is shown - type: string - userKey: - description: The secret's key that contains the recipient - user's user key. The secret needs to be in the same - namespace as the AlertmanagerConfig object and accessible - by the Prometheus Operator. + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + serviceKey: + description: The secret's key that contains the PagerDuty + service key (when using integration type "Prometheus"). + Either this field or `routingKey` needs to be defined. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. properties: key: description: The key of the secret to select from. Must @@ -2234,121 +2173,30 @@ spec: - key type: object x-kubernetes-map-type: atomic + severity: + description: Severity of the incident. + type: string + url: + description: The URL to send requests to. + type: string type: object type: array - slackConfigs: - description: List of Slack configurations. + pushoverConfigs: + description: List of Pushover configurations. items: - description: SlackConfig configures notifications via Slack. - See https://prometheus.io/docs/alerting/latest/configuration/#slack_config + description: PushoverConfig configures notifications via Pushover. + See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config properties: - actions: - description: A list of Slack actions that are sent with - each notification. - items: - description: SlackAction configures a single Slack action - that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields - and https://api.slack.com/docs/message-buttons for - more information. - properties: - confirm: - description: SlackConfirmationField protect users - from destructive actions or particularly distinguished - decisions by asking them to confirm their button - click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields - for more information. - properties: - dismissText: - type: string - okText: - type: string - text: - minLength: 1 - type: string - title: - type: string - required: - - text - type: object - name: - type: string - style: - type: string - text: - minLength: 1 - type: string - type: - minLength: 1 - type: string - url: - type: string - value: - type: string - required: - - text - - type - type: object - type: array - apiURL: - description: The secret's key that contains the Slack - webhook URL. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - callbackId: - type: string - channel: - description: The channel or user to send notifications - to. - type: string - color: - type: string - fallback: - type: string - fields: - description: A list of Slack fields that are sent with - each notification. - items: - description: SlackField configures a single Slack field - that is sent with each notification. Each field must - contain a title, value, and optionally, a boolean - value to indicate if the field is short enough to - be displayed next to other fields designated as short. - See https://api.slack.com/docs/message-attachments#fields - for more information. - properties: - short: - type: boolean - title: - minLength: 1 - type: string - value: - minLength: 1 - type: string - required: - - title - - value - type: object - type: array - footer: + expire: + description: How long your notification will continue + to be retried for, unless the user acknowledges the + notification. + pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ type: string + html: + description: Whether notification message is HTML or plain + text. + type: boolean httpConfig: description: HTTP client configuration. properties: @@ -2697,68 +2545,225 @@ spec: type: string type: object type: object - iconEmoji: - type: string - iconURL: + message: + description: Notification message. type: string - imageURL: + priority: + description: Priority, see https://pushover.net/api#priority type: string - linkNames: - type: boolean - mrkdwnIn: - items: - type: string - type: array - pretext: + retry: + description: How often the Pushover servers will send + the same notification to the user. Must be at least + 30 seconds. + pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ type: string sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - shortFields: - type: boolean - text: - type: string - thumbURL: + sound: + description: The name of one of the sounds supported by + device clients to override the user's default sound + choice type: string title: + description: Notification title. type: string - titleLink: + token: + description: The secret's key that contains the registered + application's API token, see https://pushover.net/apps. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. Either `token` or `tokenFile` is required. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + tokenFile: + description: The token file that contains the registered + application's API token, see https://pushover.net/apps. + Either `token` or `tokenFile` is required. It requires + Alertmanager >= v0.26.0. type: string - username: + url: + description: A supplementary URL shown alongside the message. + type: string + urlTitle: + description: A title for supplementary URL, otherwise + just the URL is shown + type: string + userKey: + description: The secret's key that contains the recipient + user's user key. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. Either `userKey` or `userKeyFile` + is required. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + userKeyFile: + description: The user key file that contains the recipient + user's user key. Either `userKey` or `userKeyFile` is + required. It requires Alertmanager >= v0.26.0. type: string type: object type: array - snsConfigs: - description: List of SNS configurations + slackConfigs: + description: List of Slack configurations. items: - description: SNSConfig configures notifications via AWS SNS. - See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs + description: SlackConfig configures notifications via Slack. + See https://prometheus.io/docs/alerting/latest/configuration/#slack_config properties: + actions: + description: A list of Slack actions that are sent with + each notification. + items: + description: SlackAction configures a single Slack action + that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields + and https://api.slack.com/docs/message-buttons for + more information. + properties: + confirm: + description: SlackConfirmationField protect users + from destructive actions or particularly distinguished + decisions by asking them to confirm their button + click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields + for more information. + properties: + dismissText: + type: string + okText: + type: string + text: + minLength: 1 + type: string + title: + type: string + required: + - text + type: object + name: + type: string + style: + type: string + text: + minLength: 1 + type: string + type: + minLength: 1 + type: string + url: + type: string + value: + type: string + required: + - text + - type + type: object + type: array apiURL: - description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. - If not specified, the SNS API URL from the SNS SDK will - be used. - type: string - attributes: - additionalProperties: - type: string - description: SNS message attributes. - type: object - httpConfig: - description: HTTP client configuration. + description: The secret's key that contains the Slack + webhook URL. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + callbackId: + type: string + channel: + description: The channel or user to send notifications + to. + type: string + color: + type: string + fallback: + type: string + fields: + description: A list of Slack fields that are sent with + each notification. + items: + description: SlackField configures a single Slack field + that is sent with each notification. Each field must + contain a title, value, and optionally, a boolean + value to indicate if the field is short enough to + be displayed next to other fields designated as short. + See https://api.slack.com/docs/message-attachments#fields + for more information. + properties: + short: + type: boolean + title: + minLength: 1 + type: string + value: + minLength: 1 + type: string + required: + - title + - value + type: object + type: array + footer: + type: string + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: description: The key of the secret to select from. Must be a valid secret key. type: string @@ -3092,136 +3097,53 @@ spec: type: string type: object type: object - message: - description: The message content of the SNS notification. + iconEmoji: type: string - phoneNumber: - description: Phone number if message is delivered via - SMS in E.164 format. If you don't specify this value, - you must specify a value for the TopicARN or TargetARN. + iconURL: + type: string + imageURL: + type: string + linkNames: + type: boolean + mrkdwnIn: + items: + type: string + type: array + pretext: type: string sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - sigv4: - description: Configures AWS's Signature Verification 4 - signing process to sign requests. - properties: - accessKey: - description: AccessKey is the AWS API key. If not - specified, the environment variable `AWS_ACCESS_KEY_ID` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - profile: - description: Profile is the named AWS profile used - to authenticate. - type: string - region: - description: Region is the AWS region. If blank, the - region from the default credentials chain used. - type: string - roleArn: - description: RoleArn is the named AWS profile used - to authenticate. - type: string - secretKey: - description: SecretKey is the AWS API secret. If not - specified, the environment variable `AWS_SECRET_ACCESS_KEY` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - subject: - description: Subject line when the message is delivered - to email endpoints. + shortFields: + type: boolean + text: type: string - targetARN: - description: The mobile platform endpoint ARN if message - is delivered via mobile notifications. If you don't - specify this value, you must specify a value for the - topic_arn or PhoneNumber. + thumbURL: type: string - topicARN: - description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic - If you don't specify this value, you must specify a - value for the PhoneNumber or TargetARN. + title: + type: string + titleLink: + type: string + username: type: string type: object type: array - telegramConfigs: - description: List of Telegram configurations. + snsConfigs: + description: List of SNS configurations items: - description: TelegramConfig configures notifications via Telegram. - See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config + description: SNSConfig configures notifications via AWS SNS. + See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs properties: apiURL: - description: The Telegram API URL i.e. https://api.telegram.org. - If not specified, default API URL will be used. + description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. + If not specified, the SNS API URL from the SNS SDK will + be used. type: string - botToken: - description: Telegram bot token The secret needs to be - in the same namespace as the AlertmanagerConfig object - and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key + attributes: + additionalProperties: + type: string + description: SNS message attributes. type: object - x-kubernetes-map-type: atomic - chatID: - description: The Telegram chat ID. - format: int64 - type: integer - disableNotifications: - description: Disable telegram notifications - type: boolean httpConfig: description: HTTP client configuration. properties: @@ -3571,74 +3493,145 @@ spec: type: object type: object message: - description: Message template + description: The message content of the SNS notification. type: string - parseMode: - description: Parse mode for telegram message - enum: - - MarkdownV2 - - Markdown - - HTML + phoneNumber: + description: Phone number if message is delivered via + SMS in E.164 format. If you don't specify this value, + you must specify a value for the TopicARN or TargetARN. type: string sendResolved: - description: Whether to notify about resolved alerts. + description: Whether or not to notify about resolved alerts. type: boolean - type: object - type: array - victoropsConfigs: - description: List of VictorOps configurations. - items: - description: VictorOpsConfig configures notifications via - VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config - properties: - apiKey: - description: The secret's key that contains the API key - to use when talking to the VictorOps API. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. + sigv4: + description: Configures AWS's Signature Verification 4 + signing process to sign requests. properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined + accessKey: + description: AccessKey is the AWS API key. If not + specified, the environment variable `AWS_ACCESS_KEY_ID` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used + to authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used + to authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + subject: + description: Subject line when the message is delivered + to email endpoints. + type: string + targetARN: + description: The mobile platform endpoint ARN if message + is delivered via mobile notifications. If you don't + specify this value, you must specify a value for the + topic_arn or PhoneNumber. + type: string + topicARN: + description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic + If you don't specify this value, you must specify a + value for the PhoneNumber or TargetARN. + type: string + type: object + type: array + telegramConfigs: + description: List of Telegram configurations. + items: + description: TelegramConfig configures notifications via Telegram. + See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config + properties: + apiURL: + description: The Telegram API URL i.e. https://api.telegram.org. + If not specified, default API URL will be used. + type: string + botToken: + description: "Telegram bot token. It is mutually exclusive + with `botTokenFile`. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. \n Either `botToken` or + `botTokenFile` is required." + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined type: boolean required: - key type: object x-kubernetes-map-type: atomic - apiUrl: - description: The VictorOps API URL. - type: string - customFields: - description: Additional custom fields for notification. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entityDisplayName: - description: Contains summary of the alerted problem. + botTokenFile: + description: "File to read the Telegram bot token from. + It is mutually exclusive with `botToken`. Either `botToken` + or `botTokenFile` is required. \n It requires Alertmanager + >= v0.26.0." type: string + chatID: + description: The Telegram chat ID. + format: int64 + type: integer + disableNotifications: + description: Disable telegram notifications + type: boolean httpConfig: - description: The HTTP client's configuration. + description: HTTP client configuration. properties: authorization: description: Authorization header configuration for @@ -3985,34 +3978,75 @@ spec: type: string type: object type: object - messageType: - description: Describes the behavior of the alert (CRITICAL, - WARNING, INFO). - type: string - monitoringTool: - description: The monitoring tool the state message is - from. + message: + description: Message template type: string - routingKey: - description: A key used to map the alert to a team. + parseMode: + description: Parse mode for telegram message + enum: + - MarkdownV2 + - Markdown + - HTML type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - stateMessage: - description: Contains long explanation of the alerted - problem. - type: string type: object type: array - webhookConfigs: - description: List of webhook configurations. + victoropsConfigs: + description: List of VictorOps configurations. items: - description: WebhookConfig configures notifications via a - generic receiver supporting the webhook payload. See https://prometheus.io/docs/alerting/latest/configuration/#webhook_config + description: VictorOpsConfig configures notifications via + VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config properties: + apiKey: + description: The secret's key that contains the API key + to use when talking to the VictorOps API. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + apiUrl: + description: The VictorOps API URL. + type: string + customFields: + description: Additional custom fields for notification. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + entityDisplayName: + description: Contains summary of the alerted problem. + type: string httpConfig: - description: HTTP client configuration. + description: The HTTP client's configuration. properties: authorization: description: Authorization header configuration for @@ -4359,86 +4393,41 @@ spec: type: string type: object type: object - maxAlerts: - description: Maximum number of alerts to be sent per webhook - message. When 0, all alerts are included. - format: int32 - minimum: 0 - type: integer + messageType: + description: Describes the behavior of the alert (CRITICAL, + WARNING, INFO). + type: string + monitoringTool: + description: The monitoring tool the state message is + from. + type: string + routingKey: + description: A key used to map the alert to a team. + type: string sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - url: - description: The URL to send HTTP POST requests to. `urlSecret` - takes precedence over `url`. One of `urlSecret` and - `url` should be defined. + stateMessage: + description: Contains long explanation of the alerted + problem. type: string - urlSecret: - description: The secret's key that contains the webhook - URL to send HTTP requests to. `urlSecret` takes precedence - over `url`. One of `urlSecret` and `url` should be defined. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - type: array - wechatConfigs: - description: List of WeChat configurations. - items: - description: WeChatConfig configures notifications via WeChat. - See https://prometheus.io/docs/alerting/latest/configuration/#wechat_config - properties: - agentID: - type: string - apiSecret: - description: The secret's key that contains the WeChat - API key. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - apiURL: - description: The WeChat API URL. - type: string - corpID: - description: The corp id for authentication. - type: string - httpConfig: - description: HTTP client configuration. + type: object + type: array + webexConfigs: + description: List of Webex configurations. + items: + description: WebexConfig configures notification via Cisco + Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config + properties: + apiURL: + description: The Webex Teams API URL i.e. https://webexapis.com/v1/messages + Provide if different from the default API URL. + pattern: ^https?://.+$ + type: string + httpConfig: + description: The HTTP client's configuration. You must + supply the bot token via the `httpConfig.authorization` + field. properties: authorization: description: Authorization header configuration for @@ -4786,258 +4775,26 @@ spec: type: object type: object message: - description: API request data as defined by the WeChat - API. + description: Message template type: string - messageType: + roomID: + description: ID of the Webex Teams room where to send + the messages. + minLength: 1 type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - toParty: - type: string - toTag: - type: string - toUser: - type: string - type: object - type: array - required: - - name - type: object - type: array - route: - description: The Alertmanager route definition for alerts matching - the resource's namespace. If present, it will be added to the generated - Alertmanager configuration as a first-level route. - properties: - activeTimeIntervals: - description: ActiveTimeIntervals is a list of MuteTimeInterval - names when this route should be active. - items: - type: string - type: array - continue: - description: Boolean indicating whether an alert should continue - matching subsequent sibling nodes. It will always be overridden - to true for the first-level route by the Prometheus operator. - type: boolean - groupBy: - description: List of labels to group by. Labels must not be repeated - (unique list). Special label "..." (aggregate by all possible - labels), if provided, must be the only element in the list. - items: - type: string - type: array - groupInterval: - description: 'How long to wait before sending an updated notification. - Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` - Example: "5m"' - type: string - groupWait: - description: 'How long to wait before sending the initial notification. - Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` - Example: "30s"' - type: string - matchers: - description: 'List of matchers that the alert''s labels should - match. For the first level route, the operator removes any existing - equality and regexp matcher on the `namespace` label and adds - a `namespace: ` matcher.' - items: - description: Matcher defines how to match on alert's labels. - properties: - matchType: - description: Match operation available with AlertManager - >= v0.22.0 and takes precedence over Regex (deprecated) - if non-empty. - enum: - - '!=' - - = - - =~ - - '!~' - type: string - name: - description: Label to match. - minLength: 1 - type: string - regex: - description: Whether to match on equality (false) or regular-expression - (true). Deprecated as of AlertManager >= v0.22.0 where - a user should use MatchType instead. - type: boolean - value: - description: Label value to match. - type: string - required: - - name - type: object - type: array - muteTimeIntervals: - description: 'Note: this comment applies to the field definition - above but appears below otherwise it gets included in the generated - manifest. CRD schema doesn''t support self-referential types - for now (see https://github.com/kubernetes/kubernetes/issues/62872). - We have to use an alternative type to circumvent the limitation. - The downside is that the Kube API can''t validate the data beyond - the fact that it is a valid JSON representation. MuteTimeIntervals - is a list of MuteTimeInterval names that will mute this route - when matched,' - items: - type: string - type: array - receiver: - description: Name of the receiver for this route. If not empty, - it should be listed in the `receivers` field. - type: string - repeatInterval: - description: 'How long to wait before repeating the last notification. - Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` - Example: "4h"' - type: string - routes: - description: Child routes. - items: - x-kubernetes-preserve-unknown-fields: true - type: array - type: object - type: object - required: - - spec - type: object - served: true - storage: true - - name: v1beta1 - schema: - openAPIV3Schema: - description: AlertmanagerConfig defines a namespaced AlertmanagerConfig to - be aggregated across multiple namespaces configuring one Alertmanager cluster. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AlertmanagerConfigSpec is a specification of the desired - behavior of the Alertmanager configuration. By definition, the Alertmanager - configuration only applies to alerts for which the `namespace` label - is equal to the namespace of the AlertmanagerConfig resource. - properties: - inhibitRules: - description: List of inhibition rules. The rules will only apply to - alerts matching the resource's namespace. - items: - description: InhibitRule defines an inhibition rule that allows - to mute alerts when other alerts are already firing. See https://prometheus.io/docs/alerting/latest/configuration/#inhibit_rule - properties: - equal: - description: Labels that must have an equal value in the source - and target alert for the inhibition to take effect. - items: - type: string - type: array - sourceMatch: - description: Matchers for which one or more alerts have to exist - for the inhibition to take effect. The operator enforces that - the alert matches the resource's namespace. - items: - description: Matcher defines how to match on alert's labels. - properties: - matchType: - description: Match operator, one of `=` (equal to), `!=` - (not equal to), `=~` (regex match) or `!~` (not regex - match). Negative operators (`!=` and `!~`) require Alertmanager - >= v0.22.0. - enum: - - '!=' - - = - - =~ - - '!~' - type: string - name: - description: Label to match. - minLength: 1 - type: string - value: - description: Label value to match. - type: string required: - - name + - roomID type: object type: array - targetMatch: - description: Matchers that have to be fulfilled in the alerts - to be muted. The operator enforces that the alert matches - the resource's namespace. + webhookConfigs: + description: List of webhook configurations. items: - description: Matcher defines how to match on alert's labels. + description: WebhookConfig configures notifications via a + generic receiver supporting the webhook payload. See https://prometheus.io/docs/alerting/latest/configuration/#webhook_config properties: - matchType: - description: Match operator, one of `=` (equal to), `!=` - (not equal to), `=~` (regex match) or `!~` (not regex - match). Negative operators (`!=` and `!~`) require Alertmanager - >= v0.22.0. - enum: - - '!=' - - = - - =~ - - '!~' - type: string - name: - description: Label to match. - minLength: 1 - type: string - value: - description: Label value to match. - type: string - required: - - name - type: object - type: array - type: object - type: array - receivers: - description: List of receivers. - items: - description: Receiver defines one or more notification integrations. - properties: - discordConfigs: - description: List of Slack configurations. - items: - description: DiscordConfig configures notifications via Discord. - See https://prometheus.io/docs/alerting/latest/configuration/#discord_config - properties: - apiURL: - description: The secret's key that contains the Discord - webhook URL. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic httpConfig: description: HTTP client configuration. properties: @@ -5136,17 +4893,21 @@ spec: key: description: The key of the secret to select from. Must be a valid secret key. - minLength: 1 type: string name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean required: - key - - name type: object + x-kubernetes-map-type: atomic followRedirects: description: FollowRedirects specifies whether the client should follow HTTP 3xx redirects. @@ -5382,141 +5143,97 @@ spec: type: string type: object type: object - message: - description: The template of the message's body. - type: string + maxAlerts: + description: Maximum number of alerts to be sent per webhook + message. When 0, all alerts are included. + format: int32 + minimum: 0 + type: integer sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - title: - description: The template of the message's title. - type: string - type: object - type: array - emailConfigs: - description: List of Email configurations. - items: - description: EmailConfig configures notifications via Email. - properties: - authIdentity: - description: The identity to use for authentication. + url: + description: The URL to send HTTP POST requests to. `urlSecret` + takes precedence over `url`. One of `urlSecret` and + `url` should be defined. type: string - authPassword: - description: The secret's key that contains the password - to use for authentication. The secret needs to be in - the same namespace as the AlertmanagerConfig object - and accessible by the Prometheus Operator. + urlSecret: + description: The secret's key that contains the webhook + URL to send HTTP requests to. `urlSecret` takes precedence + over `url`. One of `urlSecret` and `url` should be defined. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. properties: key: description: The key of the secret to select from. Must be a valid secret key. - minLength: 1 type: string name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean required: - key - - name type: object - authSecret: - description: The secret's key that contains the CRAM-MD5 - secret. The secret needs to be in the same namespace + x-kubernetes-map-type: atomic + type: object + type: array + wechatConfigs: + description: List of WeChat configurations. + items: + description: WeChatConfig configures notifications via WeChat. + See https://prometheus.io/docs/alerting/latest/configuration/#wechat_config + properties: + agentID: + type: string + apiSecret: + description: The secret's key that contains the WeChat + API key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator. properties: key: description: The key of the secret to select from. Must be a valid secret key. - minLength: 1 type: string name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean required: - key - - name type: object - authUsername: - description: The username to use for authentication. - type: string - from: - description: The sender address. - type: string - headers: - description: Further headers email header key/value pairs. - Overrides any headers previously set by the notification - implementation. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - hello: - description: The hostname to identify to the SMTP server. - type: string - html: - description: The HTML body of the email notification. - type: string - requireTLS: - description: The SMTP TLS requirement. Note that Go does - not support unencrypted connections to remote SMTP endpoints. - type: boolean - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - smarthost: - description: The SMTP host and port through which emails - are sent. E.g. example.com:25 + x-kubernetes-map-type: atomic + apiURL: + description: The WeChat API URL. type: string - text: - description: The text body of the email notification. + corpID: + description: The corp id for authentication. type: string - tlsConfig: - description: TLS configuration + httpConfig: + description: HTTP client configuration. properties: - ca: - description: Certificate authority used when verifying - server certificates. + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. properties: - configMap: - description: ConfigMap containing data to use - for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for - the targets. + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. properties: key: description: The key of the secret to select @@ -5536,17 +5253,24 @@ spec: - key type: object x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string type: object - cert: - description: Client certificate to present when doing - client-authentication. + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. properties: - configMap: - description: ConfigMap containing data to use - for the targets. + password: + description: The secret in the service monitor + namespace that contains the password for authentication. properties: key: - description: The key to select. + description: The key of the secret to select + from. Must be a valid secret key. type: string name: description: 'Name of the referent. More info: @@ -5555,16 +5279,16 @@ spec: kind, uid?' type: string optional: - description: Specify whether the ConfigMap - or its key must be defined + description: Specify whether the Secret or + its key must be defined type: boolean required: - key type: object x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for - the targets. + username: + description: The secret in the service monitor + namespace that contains the username for authentication. properties: key: description: The key of the secret to select @@ -5585,12 +5309,12 @@ spec: type: object x-kubernetes-map-type: atomic type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key file - for the targets. + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. properties: key: description: The key of the secret to select from. Must @@ -5606,63 +5330,1947 @@ spec: description: Specify whether the Secret or its key must be defined type: boolean - required: - - key + required: + - key + type: object + x-kubernetes-map-type: atomic + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + message: + description: API request data as defined by the WeChat + API. + type: string + messageType: + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + toParty: + type: string + toTag: + type: string + toUser: + type: string + type: object + type: array + required: + - name + type: object + type: array + route: + description: The Alertmanager route definition for alerts matching + the resource's namespace. If present, it will be added to the generated + Alertmanager configuration as a first-level route. + properties: + activeTimeIntervals: + description: ActiveTimeIntervals is a list of MuteTimeInterval + names when this route should be active. + items: + type: string + type: array + continue: + description: Boolean indicating whether an alert should continue + matching subsequent sibling nodes. It will always be overridden + to true for the first-level route by the Prometheus operator. + type: boolean + groupBy: + description: List of labels to group by. Labels must not be repeated + (unique list). Special label "..." (aggregate by all possible + labels), if provided, must be the only element in the list. + items: + type: string + type: array + groupInterval: + description: 'How long to wait before sending an updated notification. + Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` + Example: "5m"' + type: string + groupWait: + description: 'How long to wait before sending the initial notification. + Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` + Example: "30s"' + type: string + matchers: + description: 'List of matchers that the alert''s labels should + match. For the first level route, the operator removes any existing + equality and regexp matcher on the `namespace` label and adds + a `namespace: ` matcher.' + items: + description: Matcher defines how to match on alert's labels. + properties: + matchType: + description: Match operation available with AlertManager + >= v0.22.0 and takes precedence over Regex (deprecated) + if non-empty. + enum: + - '!=' + - = + - =~ + - '!~' + type: string + name: + description: Label to match. + minLength: 1 + type: string + regex: + description: Whether to match on equality (false) or regular-expression + (true). Deprecated as of AlertManager >= v0.22.0 where + a user should use MatchType instead. + type: boolean + value: + description: Label value to match. + type: string + required: + - name + type: object + type: array + muteTimeIntervals: + description: 'Note: this comment applies to the field definition + above but appears below otherwise it gets included in the generated + manifest. CRD schema doesn''t support self-referential types + for now (see https://github.com/kubernetes/kubernetes/issues/62872). + We have to use an alternative type to circumvent the limitation. + The downside is that the Kube API can''t validate the data beyond + the fact that it is a valid JSON representation. MuteTimeIntervals + is a list of MuteTimeInterval names that will mute this route + when matched,' + items: + type: string + type: array + receiver: + description: Name of the receiver for this route. If not empty, + it should be listed in the `receivers` field. + type: string + repeatInterval: + description: 'How long to wait before repeating the last notification. + Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` + Example: "4h"' + type: string + routes: + description: Child routes. + items: + x-kubernetes-preserve-unknown-fields: true + type: array + type: object + type: object + required: + - spec + type: object + served: true + storage: true + - name: v1beta1 + schema: + openAPIV3Schema: + description: AlertmanagerConfig configures the Prometheus Alertmanager, specifying + how alerts should be grouped, inhibited and notified to external systems. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: AlertmanagerConfigSpec is a specification of the desired + behavior of the Alertmanager configuration. By definition, the Alertmanager + configuration only applies to alerts for which the `namespace` label + is equal to the namespace of the AlertmanagerConfig resource. + properties: + inhibitRules: + description: List of inhibition rules. The rules will only apply to + alerts matching the resource's namespace. + items: + description: InhibitRule defines an inhibition rule that allows + to mute alerts when other alerts are already firing. See https://prometheus.io/docs/alerting/latest/configuration/#inhibit_rule + properties: + equal: + description: Labels that must have an equal value in the source + and target alert for the inhibition to take effect. + items: + type: string + type: array + sourceMatch: + description: Matchers for which one or more alerts have to exist + for the inhibition to take effect. The operator enforces that + the alert matches the resource's namespace. + items: + description: Matcher defines how to match on alert's labels. + properties: + matchType: + description: Match operator, one of `=` (equal to), `!=` + (not equal to), `=~` (regex match) or `!~` (not regex + match). Negative operators (`!=` and `!~`) require Alertmanager + >= v0.22.0. + enum: + - '!=' + - = + - =~ + - '!~' + type: string + name: + description: Label to match. + minLength: 1 + type: string + value: + description: Label value to match. + type: string + required: + - name + type: object + type: array + targetMatch: + description: Matchers that have to be fulfilled in the alerts + to be muted. The operator enforces that the alert matches + the resource's namespace. + items: + description: Matcher defines how to match on alert's labels. + properties: + matchType: + description: Match operator, one of `=` (equal to), `!=` + (not equal to), `=~` (regex match) or `!~` (not regex + match). Negative operators (`!=` and `!~`) require Alertmanager + >= v0.22.0. + enum: + - '!=' + - = + - =~ + - '!~' + type: string + name: + description: Label to match. + minLength: 1 + type: string + value: + description: Label value to match. + type: string + required: + - name + type: object + type: array + type: object + type: array + receivers: + description: List of receivers. + items: + description: Receiver defines one or more notification integrations. + properties: + discordConfigs: + description: List of Slack configurations. + items: + description: DiscordConfig configures notifications via Discord. + See https://prometheus.io/docs/alerting/latest/configuration/#discord_config + properties: + apiURL: + description: The secret's key that contains the Discord + webhook URL. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + message: + description: The template of the message's body. + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + title: + description: The template of the message's title. + type: string + type: object + type: array + emailConfigs: + description: List of Email configurations. + items: + description: EmailConfig configures notifications via Email. + properties: + authIdentity: + description: The identity to use for authentication. + type: string + authPassword: + description: The secret's key that contains the password + to use for authentication. The secret needs to be in + the same namespace as the AlertmanagerConfig object + and accessible by the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + authSecret: + description: The secret's key that contains the CRAM-MD5 + secret. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + authUsername: + description: The username to use for authentication. + type: string + from: + description: The sender address. + type: string + headers: + description: Further headers email header key/value pairs. + Overrides any headers previously set by the notification + implementation. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + hello: + description: The hostname to identify to the SMTP server. + type: string + html: + description: The HTML body of the email notification. + type: string + requireTLS: + description: The SMTP TLS requirement. Note that Go does + not support unencrypted connections to remote SMTP endpoints. + type: boolean + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + smarthost: + description: The SMTP host and port through which emails + are sent. E.g. example.com:25 + type: string + text: + description: The text body of the email notification. + type: string + tlsConfig: + description: TLS configuration + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to use + for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for + the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when doing + client-authentication. + properties: + configMap: + description: ConfigMap containing data to use + for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use for + the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key file + for the targets. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the targets. + type: string + type: object + to: + description: The email address to send notifications to. + type: string + type: object + type: array + msteamsConfigs: + description: List of MSTeams configurations. It requires Alertmanager + >= 0.26.0. + items: + description: MSTeamsConfig configures notifications via Microsoft + Teams. It requires Alertmanager >= 0.26.0. + properties: + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + sendResolved: + description: Whether to notify about resolved alerts. + type: boolean + text: + description: Message body template. + type: string + title: + description: Message title template. + type: string + webhookUrl: + description: MSTeams webhook URL. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + required: + - webhookUrl + type: object + type: array + name: + description: Name of the receiver. Must be unique across all + items from the list. + minLength: 1 + type: string + opsgenieConfigs: + description: List of OpsGenie configurations. + items: + description: OpsGenieConfig configures notifications via OpsGenie. + See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config + properties: + actions: + description: Comma separated list of actions that will + be available for the alert. + type: string + apiKey: + description: The secret's key that contains the OpsGenie + API key. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + apiURL: + description: The URL to send OpsGenie API requests to. + type: string + description: + description: Description of the incident. + type: string + details: + description: A set of arbitrary key/value pairs that provide + further detail about the incident. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + entity: + description: Optional field that can be used to specify + which domain alert is related to. + type: string + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the targets. - type: string type: object - to: - description: The email address to send notifications to. + message: + description: Alert text limited to 130 characters. + type: string + note: + description: Additional alert note. + type: string + priority: + description: Priority level of alert. Possible values + are P1, P2, P3, P4, and P5. + type: string + responders: + description: List of responders responsible for notifications. + items: + description: OpsGenieConfigResponder defines a responder + to an incident. One of `id`, `name` or `username` + has to be defined. + properties: + id: + description: ID of the responder. + type: string + name: + description: Name of the responder. + type: string + type: + description: Type of responder. + enum: + - team + - teams + - user + - escalation + - schedule + minLength: 1 + type: string + username: + description: Username of the responder. + type: string + required: + - type + type: object + type: array + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + source: + description: Backlink to the sender of the notification. + type: string + tags: + description: Comma separated list of tags attached to + the notifications. type: string type: object type: array - name: - description: Name of the receiver. Must be unique across all - items from the list. - minLength: 1 - type: string - opsgenieConfigs: - description: List of OpsGenie configurations. + pagerdutyConfigs: + description: List of PagerDuty configurations. items: - description: OpsGenieConfig configures notifications via OpsGenie. - See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config + description: PagerDutyConfig configures notifications via + PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config properties: - actions: - description: Comma separated list of actions that will - be available for the alert. + class: + description: The class/type of the event. type: string - apiKey: - description: The secret's key that contains the OpsGenie - API key. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - minLength: 1 - type: string - name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 - type: string - required: - - key - - name - type: object - apiURL: - description: The URL to send OpsGenie API requests to. + client: + description: Client identification. + type: string + clientURL: + description: Backlink to the sender of notification. + type: string + component: + description: The part or component of the affected system + that is broken. type: string description: description: Description of the incident. type: string details: - description: A set of arbitrary key/value pairs that provide - further detail about the incident. + description: Arbitrary key/value pairs that provide further + detail about the incident. items: description: KeyValue defines a (key, value) tuple. properties: @@ -5678,9 +7286,8 @@ spec: - value type: object type: array - entity: - description: Optional field that can be used to specify - which domain alert is related to. + group: + description: A cluster or grouping of sources. type: string httpConfig: description: HTTP client configuration. @@ -6026,101 +7633,113 @@ spec: type: string type: object type: object - message: - description: Alert text limited to 130 characters. - type: string - note: - description: Additional alert note. - type: string - priority: - description: Priority level of alert. Possible values - are P1, P2, P3, P4, and P5. - type: string - responders: - description: List of responders responsible for notifications. + pagerDutyImageConfigs: + description: A list of image details to attach that provide + further detail about an incident. items: - description: OpsGenieConfigResponder defines a responder - to an incident. One of `id`, `name` or `username` - has to be defined. + description: PagerDutyImageConfig attaches images to + an incident properties: - id: - description: ID of the responder. + alt: + description: Alt is the optional alternative text + for the image. type: string - name: - description: Name of the responder. + href: + description: Optional URL; makes the image a clickable + link. type: string - type: - description: Type of responder. - enum: - - team - - teams - - user - - escalation - - schedule - minLength: 1 + src: + description: Src of the image being attached to + the incident type: string - username: - description: Username of the responder. + type: object + type: array + pagerDutyLinkConfigs: + description: A list of link details to attach that provide + further detail about an incident. + items: + description: PagerDutyLinkConfig attaches text links + to an incident + properties: + alt: + description: Text that describes the purpose of + the link, and can be used as the link's text. + type: string + href: + description: Href is the URL of the link to be attached type: string - required: - - type type: object type: array + routingKey: + description: The secret's key that contains the PagerDuty + integration key (when using Events API v2). Either this + field or `serviceKey` needs to be defined. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - source: - description: Backlink to the sender of the notification. + serviceKey: + description: The secret's key that contains the PagerDuty + service key (when using integration type "Prometheus"). + Either this field or `routingKey` needs to be defined. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + severity: + description: Severity of the incident. type: string - tags: - description: Comma separated list of tags attached to - the notifications. + url: + description: The URL to send requests to. type: string type: object type: array - pagerdutyConfigs: - description: List of PagerDuty configurations. + pushoverConfigs: + description: List of Pushover configurations. items: - description: PagerDutyConfig configures notifications via - PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config + description: PushoverConfig configures notifications via Pushover. + See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config properties: - class: - description: The class/type of the event. - type: string - client: - description: Client identification. - type: string - clientURL: - description: Backlink to the sender of notification. - type: string - component: - description: The part or component of the affected system - that is broken. - type: string - description: - description: Description of the incident. - type: string - details: - description: Arbitrary key/value pairs that provide further - detail about the incident. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - group: - description: A cluster or grouping of sources. + expire: + description: How long your notification will continue + to be retried for, unless the user acknowledges the + notification. + pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ type: string + html: + description: Whether notification message is HTML or plain + text. + type: boolean httpConfig: description: HTTP client configuration. properties: @@ -6465,49 +8084,35 @@ spec: type: string type: object type: object - pagerDutyImageConfigs: - description: A list of image details to attach that provide - further detail about an incident. - items: - description: PagerDutyImageConfig attaches images to - an incident - properties: - alt: - description: Alt is the optional alternative text - for the image. - type: string - href: - description: Optional URL; makes the image a clickable - link. - type: string - src: - description: Src of the image being attached to - the incident - type: string - type: object - type: array - pagerDutyLinkConfigs: - description: A list of link details to attach that provide - further detail about an incident. - items: - description: PagerDutyLinkConfig attaches text links - to an incident - properties: - alt: - description: Text that describes the purpose of - the link, and can be used as the link's text. - type: string - href: - description: Href is the URL of the link to be attached - type: string - type: object - type: array - routingKey: - description: The secret's key that contains the PagerDuty - integration key (when using Events API v2). Either this - field or `serviceKey` needs to be defined. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. + message: + description: Notification message. + type: string + priority: + description: Priority, see https://pushover.net/api#priority + type: string + retry: + description: How often the Pushover servers will send + the same notification to the user. Must be at least + 30 seconds. + pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + sound: + description: The name of one of the sounds supported by + device clients to override the user's default sound + choice + type: string + title: + description: Notification title. + type: string + token: + description: The secret's key that contains the registered + application's API token, see https://pushover.net/apps. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. Either `token` or `tokenFile` is required. properties: key: description: The key of the secret to select from. Must @@ -6523,16 +8128,25 @@ spec: - key - name type: object - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - serviceKey: - description: The secret's key that contains the PagerDuty - service key (when using integration type "Prometheus"). - Either this field or `routingKey` needs to be defined. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. + tokenFile: + description: The token file that contains the registered + application's API token, see https://pushover.net/apps. + Either `token` or `tokenFile` is required. It requires + Alertmanager >= v0.26.0. + type: string + url: + description: A supplementary URL shown alongside the message. + type: string + urlTitle: + description: A title for supplementary URL, otherwise + just the URL is shown + type: string + userKey: + description: The secret's key that contains the recipient + user's user key. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. Either `userKey` or `userKeyFile` + is required. properties: key: description: The key of the secret to select from. Must @@ -6548,30 +8162,123 @@ spec: - key - name type: object - severity: - description: Severity of the incident. + userKeyFile: + description: The user key file that contains the recipient + user's user key. Either `userKey` or `userKeyFile` is + required. It requires Alertmanager >= v0.26.0. + type: string + type: object + type: array + slackConfigs: + description: List of Slack configurations. + items: + description: SlackConfig configures notifications via Slack. + See https://prometheus.io/docs/alerting/latest/configuration/#slack_config + properties: + actions: + description: A list of Slack actions that are sent with + each notification. + items: + description: SlackAction configures a single Slack action + that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields + and https://api.slack.com/docs/message-buttons for + more information. + properties: + confirm: + description: SlackConfirmationField protect users + from destructive actions or particularly distinguished + decisions by asking them to confirm their button + click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields + for more information. + properties: + dismissText: + type: string + okText: + type: string + text: + minLength: 1 + type: string + title: + type: string + required: + - text + type: object + name: + type: string + style: + type: string + text: + minLength: 1 + type: string + type: + minLength: 1 + type: string + url: + type: string + value: + type: string + required: + - text + - type + type: object + type: array + apiURL: + description: The secret's key that contains the Slack + webhook URL. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name + type: object + callbackId: + type: string + channel: + description: The channel or user to send notifications + to. + type: string + color: type: string - url: - description: The URL to send requests to. + fallback: type: string - type: object - type: array - pushoverConfigs: - description: List of Pushover configurations. - items: - description: PushoverConfig configures notifications via Pushover. - See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config - properties: - expire: - description: How long your notification will continue - to be retried for, unless the user acknowledges the - notification. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + fields: + description: A list of Slack fields that are sent with + each notification. + items: + description: SlackField configures a single Slack field + that is sent with each notification. Each field must + contain a title, value, and optionally, a boolean + value to indicate if the field is short enough to + be displayed next to other fields designated as short. + See https://api.slack.com/docs/message-attachments#fields + for more information. + properties: + short: + type: boolean + title: + minLength: 1 + type: string + value: + minLength: 1 + type: string + required: + - title + - value + type: object + type: array + footer: type: string - html: - description: Whether notification message is HTML or plain - text. - type: boolean httpConfig: description: HTTP client configuration. properties: @@ -6851,254 +8558,118 @@ spec: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: Notification message. - type: string - priority: - description: Priority, see https://pushover.net/api#priority - type: string - retry: - description: How often the Pushover servers will send - the same notification to the user. Must be at least - 30 seconds. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - sound: - description: The name of one of the sounds supported by - device clients to override the user's default sound - choice - type: string - title: - description: Notification title. - type: string - token: - description: The secret's key that contains the registered - application's API token, see https://pushover.net/apps. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - minLength: 1 - type: string - name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 - type: string - required: - - key - - name - type: object - url: - description: A supplementary URL shown alongside the message. - type: string - urlTitle: - description: A title for supplementary URL, otherwise - just the URL is shown - type: string - userKey: - description: The secret's key that contains the recipient - user's user key. The secret needs to be in the same - namespace as the AlertmanagerConfig object and accessible - by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - minLength: 1 - type: string - name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 - type: string - required: - - key - - name - type: object - type: object - type: array - slackConfigs: - description: List of Slack configurations. - items: - description: SlackConfig configures notifications via Slack. - See https://prometheus.io/docs/alerting/latest/configuration/#slack_config - properties: - actions: - description: A list of Slack actions that are sent with - each notification. - items: - description: SlackAction configures a single Slack action - that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields - and https://api.slack.com/docs/message-buttons for - more information. - properties: - confirm: - description: SlackConfirmationField protect users - from destructive actions or particularly distinguished - decisions by asking them to confirm their button - click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields - for more information. - properties: - dismissText: - type: string - okText: - type: string - text: - minLength: 1 - type: string - title: - type: string - required: - - text - type: object - name: - type: string - style: - type: string - text: - minLength: 1 - type: string - type: - minLength: 1 - type: string - url: - type: string - value: - type: string - required: - - text - - type - type: object - type: array - apiURL: - description: The secret's key that contains the Slack - webhook URL. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - minLength: 1 - type: string - name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 - type: string - required: - - key - - name + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object type: object - callbackId: - type: string - channel: - description: The channel or user to send notifications - to. + iconEmoji: type: string - color: + iconURL: type: string - fallback: + imageURL: type: string - fields: - description: A list of Slack fields that are sent with - each notification. + linkNames: + type: boolean + mrkdwnIn: items: - description: SlackField configures a single Slack field - that is sent with each notification. Each field must - contain a title, value, and optionally, a boolean - value to indicate if the field is short enough to - be displayed next to other fields designated as short. - See https://api.slack.com/docs/message-attachments#fields - for more information. - properties: - short: - type: boolean - title: - minLength: 1 - type: string - value: - minLength: 1 - type: string - required: - - title - - value - type: object + type: string type: array - footer: + pretext: + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + shortFields: + type: boolean + text: + type: string + thumbURL: + type: string + title: + type: string + titleLink: + type: string + username: + type: string + type: object + type: array + snsConfigs: + description: List of SNS configurations + items: + description: SNSConfig configures notifications via AWS SNS. + See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs + properties: + apiURL: + description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. + If not specified, the SNS API URL from the SNS SDK will + be used. type: string + attributes: + additionalProperties: + type: string + description: SNS message attributes. + type: object httpConfig: description: HTTP client configuration. properties: @@ -7443,53 +9014,141 @@ spec: type: string type: object type: object - iconEmoji: - type: string - iconURL: - type: string - imageURL: + message: + description: The message content of the SNS notification. type: string - linkNames: - type: boolean - mrkdwnIn: - items: - type: string - type: array - pretext: + phoneNumber: + description: Phone number if message is delivered via + SMS in E.164 format. If you don't specify this value, + you must specify a value for the TopicARN or TargetARN. type: string sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - shortFields: - type: boolean - text: - type: string - thumbURL: - type: string - title: + sigv4: + description: Configures AWS's Signature Verification 4 + signing process to sign requests. + properties: + accessKey: + description: AccessKey is the AWS API key. If not + specified, the environment variable `AWS_ACCESS_KEY_ID` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used + to authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used + to authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + subject: + description: Subject line when the message is delivered + to email endpoints. type: string - titleLink: + targetARN: + description: The mobile platform endpoint ARN if message + is delivered via mobile notifications. If you don't + specify this value, you must specify a value for the + topic_arn or PhoneNumber. type: string - username: + topicARN: + description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic + If you don't specify this value, you must specify a + value for the PhoneNumber or TargetARN. type: string type: object type: array - snsConfigs: - description: List of SNS configurations + telegramConfigs: + description: List of Telegram configurations. items: - description: SNSConfig configures notifications via AWS SNS. - See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs + description: TelegramConfig configures notifications via Telegram. + See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config properties: apiURL: - description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. - If not specified, the SNS API URL from the SNS SDK will - be used. + description: The Telegram API URL i.e. https://api.telegram.org. + If not specified, default API URL will be used. type: string - attributes: - additionalProperties: - type: string - description: SNS message attributes. + botToken: + description: "Telegram bot token. It is mutually exclusive + with `botTokenFile`. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. \n Either `botToken` or + `botTokenFile` is required." + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + minLength: 1 + type: string + name: + description: The name of the secret in the object's + namespace to select from. + minLength: 1 + type: string + required: + - key + - name type: object + botTokenFile: + description: "File to read the Telegram bot token from. + It is mutually exclusive with `botToken`. Either `botToken` + or `botTokenFile` is required. \n It requires Alertmanager + >= v0.26.0." + type: string + chatID: + description: The Telegram chat ID. + format: int64 + type: integer + disableNotifications: + description: Disable telegram notifications + type: boolean httpConfig: description: HTTP client configuration. properties: @@ -7835,110 +9494,31 @@ spec: type: object type: object message: - description: The message content of the SNS notification. + description: Message template type: string - phoneNumber: - description: Phone number if message is delivered via - SMS in E.164 format. If you don't specify this value, - you must specify a value for the TopicARN or TargetARN. + parseMode: + description: Parse mode for telegram message + enum: + - MarkdownV2 + - Markdown + - HTML type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - sigv4: - description: Configures AWS's Signature Verification 4 - signing process to sign requests. - properties: - accessKey: - description: AccessKey is the AWS API key. If not - specified, the environment variable `AWS_ACCESS_KEY_ID` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - profile: - description: Profile is the named AWS profile used - to authenticate. - type: string - region: - description: Region is the AWS region. If blank, the - region from the default credentials chain used. - type: string - roleArn: - description: RoleArn is the named AWS profile used - to authenticate. - type: string - secretKey: - description: SecretKey is the AWS API secret. If not - specified, the environment variable `AWS_SECRET_ACCESS_KEY` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - subject: - description: Subject line when the message is delivered - to email endpoints. - type: string - targetARN: - description: The mobile platform endpoint ARN if message - is delivered via mobile notifications. If you don't - specify this value, you must specify a value for the - topic_arn or PhoneNumber. - type: string - topicARN: - description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic - If you don't specify this value, you must specify a - value for the PhoneNumber or TargetARN. - type: string type: object type: array - telegramConfigs: - description: List of Telegram configurations. + victoropsConfigs: + description: List of VictorOps configurations. items: - description: TelegramConfig configures notifications via Telegram. - See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config + description: VictorOpsConfig configures notifications via + VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config properties: - apiURL: - description: The Telegram API URL i.e. https://api.telegram.org. - If not specified, default API URL will be used. - type: string - botToken: - description: Telegram bot token The secret needs to be - in the same namespace as the AlertmanagerConfig object - and accessible by the Prometheus Operator. + apiKey: + description: The secret's key that contains the API key + to use when talking to the VictorOps API. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. properties: key: description: The key of the secret to select from. Must @@ -7954,15 +9534,31 @@ spec: - key - name type: object - chatID: - description: The Telegram chat ID. - format: int64 - type: integer - disableNotifications: - description: Disable telegram notifications - type: boolean + apiUrl: + description: The VictorOps API URL. + type: string + customFields: + description: Additional custom fields for notification. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + entityDisplayName: + description: Contains summary of the alerted problem. + type: string httpConfig: - description: HTTP client configuration. + description: The HTTP client's configuration. properties: authorization: description: Authorization header configuration for @@ -8305,72 +9901,40 @@ spec: type: string type: object type: object - message: - description: Message template + messageType: + description: Describes the behavior of the alert (CRITICAL, + WARNING, INFO). type: string - parseMode: - description: Parse mode for telegram message - enum: - - MarkdownV2 - - Markdown - - HTML + monitoringTool: + description: The monitoring tool the state message is + from. + type: string + routingKey: + description: A key used to map the alert to a team. type: string sendResolved: - description: Whether to notify about resolved alerts. + description: Whether or not to notify about resolved alerts. type: boolean + stateMessage: + description: Contains long explanation of the alerted + problem. + type: string type: object type: array - victoropsConfigs: - description: List of VictorOps configurations. + webexConfigs: + description: List of Webex configurations. items: - description: VictorOpsConfig configures notifications via - VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config + description: WebexConfig configures notification via Cisco + Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config properties: - apiKey: - description: The secret's key that contains the API key - to use when talking to the VictorOps API. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - minLength: 1 - type: string - name: - description: The name of the secret in the object's - namespace to select from. - minLength: 1 - type: string - required: - - key - - name - type: object - apiUrl: - description: The VictorOps API URL. - type: string - customFields: - description: Additional custom fields for notification. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entityDisplayName: - description: Contains summary of the alerted problem. + apiURL: + description: The Webex Teams API URL i.e. https://webexapis.com/v1/messages + pattern: ^https?://.+$ type: string httpConfig: - description: The HTTP client's configuration. + description: The HTTP client's configuration. You must + use this configuration to supply the bot token as part + of the HTTP `Authorization` header. properties: authorization: description: Authorization header configuration for @@ -8713,24 +10277,19 @@ spec: type: string type: object type: object - messageType: - description: Describes the behavior of the alert (CRITICAL, - WARNING, INFO). - type: string - monitoringTool: - description: The monitoring tool the state message is - from. + message: + description: Message template type: string - routingKey: - description: A key used to map the alert to a team. + roomID: + description: ID of the Webex Teams room where to send + the messages. + minLength: 1 type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - stateMessage: - description: Contains long explanation of the alerted - problem. - type: string + required: + - roomID type: object type: array webhookConfigs: diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml index 6c5238fc8..0944e404d 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml @@ -2443,6 +2443,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2564,8 +2583,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2598,16 +2617,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3786,6 +3801,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3907,8 +3941,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3941,16 +3975,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4269,8 +4299,15 @@ spec: objects are not goint to be performed, except for delete actions. type: boolean podMetadata: - description: PodMetadata configures Labels and Annotations which are - propagated to the alertmanager pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Alertmanager pods. \n The following items + are reserved and cannot be overridden: * \"alertmanager\" label, + set to the name of the Alertmanager instance. * \"app.kubernetes.io/instance\" + label, set to the name of the Alertmanager instance. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"alertmanager\". * \"app.kubernetes.io/version\" + label, set to the Alertmanager version. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"alertmanager\"." properties: annotations: additionalProperties: @@ -4468,7 +4505,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4532,14 +4570,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -5127,6 +5162,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -5134,19 +5214,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -5201,13 +5293,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml index 4cab879ed..2d8416b94 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml @@ -52,6 +52,12 @@ spec: jobLabel: description: The label to use to retrieve the job name from. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml index 7a4985137..2b55f2135 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml @@ -141,6 +141,12 @@ spec: jobName: description: The job name assigned to scraped metrics by default. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml index 50f7e0885..2df522bf4 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml @@ -2046,6 +2046,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2167,8 +2186,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2201,16 +2220,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2515,6 +2530,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -2657,7 +2681,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -3529,6 +3553,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3650,8 +3693,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3684,16 +3727,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3972,6 +4011,12 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer. @@ -4040,8 +4085,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -4300,7 +4354,7 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -4332,9 +4386,36 @@ spec: \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -4418,7 +4499,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -4565,8 +4646,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -5114,7 +5195,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -5178,14 +5260,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -5880,6 +5959,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -5887,19 +6011,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -5954,13 +6090,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml index cc6b420ec..35c4286c9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml @@ -1019,7 +1019,8 @@ spec: type: string authorization: description: "Authorization section for Alertmanager. \n - Cannot be set at the same time as `basicAuth`, or `bearerTokenFile`." + Cannot be set at the same time as `basicAuth`, `bearerTokenFile` + or `sigv4`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -1051,7 +1052,7 @@ spec: basicAuth: description: "BasicAuth configuration for Alertmanager. \n Cannot be set at the same time as `bearerTokenFile`, - or `authorization`." + `authorization` or `sigv4`." properties: password: description: The secret in the service monitor namespace @@ -1098,9 +1099,9 @@ spec: type: object bearerTokenFile: description: "File to read bearer token for Alertmanager. - \n Cannot be set at the same time as `basicAuth`, or `authorization`. - \n *Deprecated: this will be removed in a future release. - Prefer using `authorization`.*" + \n Cannot be set at the same time as `basicAuth`, `authorization`, + or `sigv4`. \n *Deprecated: this will be removed in a + future release. Prefer using `authorization`.*" type: string enableHttp2: description: Whether to enable HTTP2. @@ -1124,6 +1125,68 @@ spec: scheme: description: Scheme to use when firing alerts. type: string + sigv4: + description: "Sigv4 allows to configures AWS's Signature + Verification 4 for the URL. \n It requires Prometheus + >= v2.48.0. \n Cannot be set at the same time as `basicAuth`, + `bearerTokenFile` or `authorization`." + properties: + accessKey: + description: AccessKey is the AWS API key. If not specified, + the environment variable `AWS_ACCESS_KEY_ID` is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used to + authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used to + authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object timeout: description: Timeout is a per-target Alertmanager timeout when pushing alerts. @@ -2384,6 +2447,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2505,8 +2587,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2539,16 +2621,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2864,6 +2942,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -3025,7 +3112,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -3897,6 +3984,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -4018,8 +4124,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4052,16 +4158,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4340,6 +4442,12 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer. @@ -4408,8 +4516,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -5087,7 +5204,7 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -5119,9 +5236,36 @@ spec: \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -5205,7 +5349,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -5352,8 +5496,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -6027,7 +6171,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -6091,14 +6236,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -6797,6 +6939,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -6804,19 +6991,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -6871,13 +7070,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml index 9a11a826d..b30e17e13 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml @@ -527,6 +527,130 @@ spec: - server type: object type: array + dnsSDConfigs: + description: DNSSDConfigs defines a list of DNS service discovery + configurations. + items: + description: DNSSDConfig allows specifying a set of DNS domain names + which are periodically queried to discover a list of targets. + The DNS servers to be contacted are read from /etc/resolv.conf. + See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config + properties: + names: + description: A list of DNS domain names to be queried. + items: + type: string + minItems: 1 + type: array + port: + description: The port number used if the query type is not SRV + Ignored for SRV records + type: integer + refreshInterval: + description: RefreshInterval configures the time after which + the provided names are refreshed. If not set, Prometheus uses + its default value. + pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ + type: string + type: + description: The type of DNS query to perform. One of SRV, A, + AAAA or MX. If not set, Prometheus uses its default value. + enum: + - SRV + - A + - AAAA + - MX + type: string + required: + - names + type: object + type: array + ec2SDConfigs: + description: EC2SDConfigs defines a list of EC2 service discovery + configurations. + items: + description: EC2SDConfig allow retrieving scrape targets from AWS + EC2 instances. The private IP address is used by default, but + may be changed to the public IP address with relabeling. The IAM + credentials used must have the ec2:DescribeInstances permission + to discover scrape targets See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config + properties: + accessKey: + description: AccessKey is the AWS API key. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + filters: + description: 'Filters can be used optionally to filter the instance + list by other criteria. Available filter criteria can be found + here: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html + Filter API documentation: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Filter.html' + items: + description: EC2Filter is the configuration for filtering + EC2 instances. + properties: + name: + type: string + values: + items: + type: string + type: array + required: + - name + - values + type: object + type: array + port: + description: The port to scrape metrics from. If using the public + IP address, this must instead be specified in the relabeling + rule. + type: integer + refreshInterval: + description: RefreshInterval configures the refresh interval + at which Prometheus will re-read the instance list. + pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ + type: string + region: + description: The AWS region + type: string + roleARN: + description: AWS Role ARN, an alternative to using AWS API keys. + type: string + secretKey: + description: SecretKey is the AWS API secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + type: array fileSDConfigs: description: FileSDConfigs defines a list of file service discovery configurations. @@ -779,6 +903,12 @@ spec: - url type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer kubernetesSDConfigs: description: KubernetesSDConfigs defines a list of Kubernetes service discovery configurations. @@ -788,10 +918,34 @@ spec: properties: role: description: Role of the Kubernetes entities that should be - discovered. Currently the only supported role is "Node". + discovered. enum: - Node + - node type: string + selectors: + description: Selector to select objects. + items: + description: K8SSelectorConfig is Kubernetes Selector Config + properties: + field: + type: string + label: + type: string + role: + description: K8SRole is role of the service in Kubernetes. + Currently the only supported role is "Node". + enum: + - Node + - node + type: string + required: + - role + type: object + type: array + x-kubernetes-list-map-keys: + - role + x-kubernetes-list-type: map required: - role type: object @@ -813,6 +967,78 @@ spec: and newer. format: int64 type: integer + metricRelabelings: + description: MetricRelabelConfigs to apply to samples before ingestion. + items: + description: "RelabelConfig allows dynamic rewriting of the label + set for targets, alerts, scraped samples and remote write samples. + \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" + properties: + action: + default: replace + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus + >= v2.41.0. \n Default: \"Replace\"" + enum: + - replace + - Replace + - keep + - Keep + - drop + - Drop + - hashmod + - HashMod + - labelmap + - LabelMap + - labeldrop + - LabelDrop + - labelkeep + - LabelKeep + - lowercase + - Lowercase + - uppercase + - Uppercase + - keepequal + - KeepEqual + - dropequal + - DropEqual + type: string + modulus: + description: "Modulus to take of the hash of the source label + values. \n Only applicable when the action is `HashMod`." + format: int64 + type: integer + regex: + description: Regular expression against which the extracted + value is matched. + type: string + replacement: + description: "Replacement value against which a Replace action + is performed if the regular expression matches. \n Regex capture + groups are available." + type: string + separator: + description: Separator is the string between concatenated SourceLabels. + type: string + sourceLabels: + description: The source labels select values from existing labels. + Their content is concatenated using the configured Separator + and matched against the configured regular expression. + items: + description: LabelName is a valid Prometheus label name which + may only contain ASCII letters, numbers, as well as underscores. + pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ + type: string + type: array + targetLabel: + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, `HashMod`, + `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. + \n Regex capture groups are available." + type: string + type: object + type: array metricsPath: description: MetricsPath HTTP path to scrape for metrics. If empty, Prometheus uses the default value (e.g. /metrics). diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml index fbcbdb7de..61018071b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml @@ -605,6 +605,12 @@ spec: the given Service, the `job` label of the metrics defaults to the name of the Kubernetes Service." type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml index 6f483eb09..e60953b94 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml @@ -1821,6 +1821,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -1942,8 +1961,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -1976,16 +1995,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3326,6 +3341,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3447,8 +3481,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3481,16 +3515,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3840,8 +3870,14 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata contains Labels and Annotations gets propagated - to the thanos ruler pods. + description: "PodMetadata configures labels and annotations which + are propagated to the ThanosRuler pods. \n The following items are + reserved and cannot be overridden: * \"app.kubernetes.io/name\" + label, set to \"thanos-ruler\". * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/instance\" + label, set to the name of the ThanosRuler instance. * \"thanos-ruler\" + label, set to the name of the ThanosRuler instance. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"thanos-ruler\"." properties: annotations: additionalProperties: @@ -4167,7 +4203,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4231,14 +4268,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4818,6 +4852,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -4825,19 +4904,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -4892,13 +4983,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml index 080e33b87..546d503db 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: alertmanagerconfigs.monitoring.coreos.com spec: @@ -22,8 +23,8 @@ spec: - name: v1alpha1 schema: openAPIV3Schema: - description: AlertmanagerConfig defines a namespaced AlertmanagerConfig to - be aggregated across multiple namespaces configuring one Alertmanager cluster. + description: AlertmanagerConfig configures the Prometheus Alertmanager, specifying + how alerts should be grouped, inhibited and notified to external systems. properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation @@ -829,71 +830,13 @@ spec: type: string type: object type: array - name: - description: Name of the receiver. Must be unique across all - items from the list. - minLength: 1 - type: string - opsgenieConfigs: - description: List of OpsGenie configurations. + msteamsConfigs: + description: List of MSTeams configurations. It requires Alertmanager + >= 0.26.0. items: - description: OpsGenieConfig configures notifications via OpsGenie. - See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config + description: MSTeamsConfig configures notifications via Microsoft + Teams. It requires Alertmanager >= 0.26.0. properties: - actions: - description: Comma separated list of actions that will - be available for the alert. - type: string - apiKey: - description: The secret's key that contains the OpsGenie - API key. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - apiURL: - description: The URL to send OpsGenie API requests to. - type: string - description: - description: Description of the incident. - type: string - details: - description: A set of arbitrary key/value pairs that provide - further detail about the incident. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entity: - description: Optional field that can be used to specify - which domain alert is related to. - type: string httpConfig: description: HTTP client configuration. properties: @@ -1241,89 +1184,84 @@ spec: type: string type: object type: object - message: - description: Alert text limited to 130 characters. - type: string - note: - description: Additional alert note. - type: string - priority: - description: Priority level of alert. Possible values - are P1, P2, P3, P4, and P5. - type: string - responders: - description: List of responders responsible for notifications. - items: - description: OpsGenieConfigResponder defines a responder - to an incident. One of `id`, `name` or `username` - has to be defined. - properties: - id: - description: ID of the responder. - type: string - name: - description: Name of the responder. - type: string - type: - description: Type of responder. - enum: - - team - - teams - - user - - escalation - - schedule - minLength: 1 - type: string - username: - description: Username of the responder. - type: string - required: - - type - type: object - type: array sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - source: - description: Backlink to the sender of the notification. + text: + description: Message body template. type: string - tags: - description: Comma separated list of tags attached to - the notifications. + title: + description: Message title template. type: string - updateAlerts: - description: Whether to update message and description - of the alert in OpsGenie if it already exists By default, - the alert is never updated in OpsGenie, the new message - only appears in activity log. - type: boolean + webhookUrl: + description: MSTeams webhook URL. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + required: + - webhookUrl type: object type: array - pagerdutyConfigs: - description: List of PagerDuty configurations. + name: + description: Name of the receiver. Must be unique across all + items from the list. + minLength: 1 + type: string + opsgenieConfigs: + description: List of OpsGenie configurations. items: - description: PagerDutyConfig configures notifications via - PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config + description: OpsGenieConfig configures notifications via OpsGenie. + See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config properties: - class: - description: The class/type of the event. - type: string - client: - description: Client identification. - type: string - clientURL: - description: Backlink to the sender of notification. + actions: + description: Comma separated list of actions that will + be available for the alert. type: string - component: - description: The part or component of the affected system - that is broken. + apiKey: + description: The secret's key that contains the OpsGenie + API key. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + apiURL: + description: The URL to send OpsGenie API requests to. type: string description: description: Description of the incident. type: string details: - description: Arbitrary key/value pairs that provide further - detail about the incident. + description: A set of arbitrary key/value pairs that provide + further detail about the incident. items: description: KeyValue defines a (key, value) tuple. properties: @@ -1339,8 +1277,9 @@ spec: - value type: object type: array - group: - description: A cluster or grouping of sources. + entity: + description: Optional field that can be used to specify + which domain alert is related to. type: string httpConfig: description: HTTP client configuration. @@ -1689,117 +1628,107 @@ spec: type: string type: object type: object - pagerDutyImageConfigs: - description: A list of image details to attach that provide - further detail about an incident. + message: + description: Alert text limited to 130 characters. + type: string + note: + description: Additional alert note. + type: string + priority: + description: Priority level of alert. Possible values + are P1, P2, P3, P4, and P5. + type: string + responders: + description: List of responders responsible for notifications. items: - description: PagerDutyImageConfig attaches images to - an incident + description: OpsGenieConfigResponder defines a responder + to an incident. One of `id`, `name` or `username` + has to be defined. properties: - alt: - description: Alt is the optional alternative text - for the image. + id: + description: ID of the responder. type: string - href: - description: Optional URL; makes the image a clickable - link. + name: + description: Name of the responder. type: string - src: - description: Src of the image being attached to - the incident + type: + description: Type of responder. + enum: + - team + - teams + - user + - escalation + - schedule + minLength: 1 + type: string + username: + description: Username of the responder. type: string + required: + - type type: object type: array - pagerDutyLinkConfigs: - description: A list of link details to attach that provide - further detail about an incident. - items: - description: PagerDutyLinkConfig attaches text links - to an incident - properties: - alt: - description: Text that describes the purpose of - the link, and can be used as the link's text. - type: string - href: - description: Href is the URL of the link to be attached - type: string - type: object - type: array - routingKey: - description: The secret's key that contains the PagerDuty - integration key (when using Events API v2). Either this - field or `serviceKey` needs to be defined. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - serviceKey: - description: The secret's key that contains the PagerDuty - service key (when using integration type "Prometheus"). - Either this field or `routingKey` needs to be defined. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - severity: - description: Severity of the incident. + source: + description: Backlink to the sender of the notification. type: string - url: - description: The URL to send requests to. + tags: + description: Comma separated list of tags attached to + the notifications. type: string + updateAlerts: + description: Whether to update message and description + of the alert in OpsGenie if it already exists By default, + the alert is never updated in OpsGenie, the new message + only appears in activity log. + type: boolean type: object type: array - pushoverConfigs: - description: List of Pushover configurations. + pagerdutyConfigs: + description: List of PagerDuty configurations. items: - description: PushoverConfig configures notifications via Pushover. - See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config + description: PagerDutyConfig configures notifications via + PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config properties: - expire: - description: How long your notification will continue - to be retried for, unless the user acknowledges the - notification. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + class: + description: The class/type of the event. + type: string + client: + description: Client identification. + type: string + clientURL: + description: Backlink to the sender of notification. + type: string + component: + description: The part or component of the affected system + that is broken. + type: string + description: + description: Description of the incident. + type: string + details: + description: Arbitrary key/value pairs that provide further + detail about the incident. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + group: + description: A cluster or grouping of sources. type: string - html: - description: Whether notification message is HTML or plain - text. - type: boolean httpConfig: description: HTTP client configuration. properties: @@ -2147,35 +2076,49 @@ spec: type: string type: object type: object - message: - description: Notification message. - type: string - priority: - description: Priority, see https://pushover.net/api#priority - type: string - retry: - description: How often the Pushover servers will send - the same notification to the user. Must be at least - 30 seconds. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - sound: - description: The name of one of the sounds supported by - device clients to override the user's default sound - choice - type: string - title: - description: Notification title. - type: string - token: - description: The secret's key that contains the registered - application's API token, see https://pushover.net/apps. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. + pagerDutyImageConfigs: + description: A list of image details to attach that provide + further detail about an incident. + items: + description: PagerDutyImageConfig attaches images to + an incident + properties: + alt: + description: Alt is the optional alternative text + for the image. + type: string + href: + description: Optional URL; makes the image a clickable + link. + type: string + src: + description: Src of the image being attached to + the incident + type: string + type: object + type: array + pagerDutyLinkConfigs: + description: A list of link details to attach that provide + further detail about an incident. + items: + description: PagerDutyLinkConfig attaches text links + to an incident + properties: + alt: + description: Text that describes the purpose of + the link, and can be used as the link's text. + type: string + href: + description: Href is the URL of the link to be attached + type: string + type: object + type: array + routingKey: + description: The secret's key that contains the PagerDuty + integration key (when using Events API v2). Either this + field or `serviceKey` needs to be defined. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. properties: key: description: The key of the secret to select from. Must @@ -2193,18 +2136,16 @@ spec: required: - key type: object - url: - description: A supplementary URL shown alongside the message. - type: string - urlTitle: - description: A title for supplementary URL, otherwise - just the URL is shown - type: string - userKey: - description: The secret's key that contains the recipient - user's user key. The secret needs to be in the same - namespace as the AlertmanagerConfig object and accessible - by the Prometheus Operator. + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + serviceKey: + description: The secret's key that contains the PagerDuty + service key (when using integration type "Prometheus"). + Either this field or `routingKey` needs to be defined. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. properties: key: description: The key of the secret to select from. Must @@ -2222,120 +2163,972 @@ spec: required: - key type: object + severity: + description: Severity of the incident. + type: string + url: + description: The URL to send requests to. + type: string type: object type: array - slackConfigs: - description: List of Slack configurations. + pushoverConfigs: + description: List of Pushover configurations. items: - description: SlackConfig configures notifications via Slack. - See https://prometheus.io/docs/alerting/latest/configuration/#slack_config + description: PushoverConfig configures notifications via Pushover. + See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config properties: - actions: - description: A list of Slack actions that are sent with - each notification. - items: - description: SlackAction configures a single Slack action - that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields - and https://api.slack.com/docs/message-buttons for - more information. - properties: - confirm: - description: SlackConfirmationField protect users - from destructive actions or particularly distinguished - decisions by asking them to confirm their button - click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields - for more information. - properties: - dismissText: - type: string - okText: - type: string - text: - minLength: 1 - type: string - title: - type: string - required: - - text - type: object - name: - type: string - style: - type: string - text: - minLength: 1 - type: string - type: - minLength: 1 - type: string - url: - type: string - value: - type: string - required: - - text - - type - type: object - type: array - apiURL: - description: The secret's key that contains the Slack - webhook URL. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. + expire: + description: How long your notification will continue + to be retried for, unless the user acknowledges the + notification. + pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + type: string + html: + description: Whether notification message is HTML or plain + text. + type: boolean + httpConfig: + description: HTTP client configuration. properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. type: boolean - required: - - key + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object + type: object + message: + description: Notification message. + type: string + priority: + description: Priority, see https://pushover.net/api#priority + type: string + retry: + description: How often the Pushover servers will send + the same notification to the user. Must be at least + 30 seconds. + pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + sound: + description: The name of one of the sounds supported by + device clients to override the user's default sound + choice + type: string + title: + description: Notification title. + type: string + token: + description: The secret's key that contains the registered + application's API token, see https://pushover.net/apps. + The secret needs to be in the same namespace as the + AlertmanagerConfig object and accessible by the Prometheus + Operator. Either `token` or `tokenFile` is required. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + tokenFile: + description: The token file that contains the registered + application's API token, see https://pushover.net/apps. + Either `token` or `tokenFile` is required. It requires + Alertmanager >= v0.26.0. + type: string + url: + description: A supplementary URL shown alongside the message. + type: string + urlTitle: + description: A title for supplementary URL, otherwise + just the URL is shown + type: string + userKey: + description: The secret's key that contains the recipient + user's user key. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. Either `userKey` or `userKeyFile` + is required. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + userKeyFile: + description: The user key file that contains the recipient + user's user key. Either `userKey` or `userKeyFile` is + required. It requires Alertmanager >= v0.26.0. + type: string + type: object + type: array + slackConfigs: + description: List of Slack configurations. + items: + description: SlackConfig configures notifications via Slack. + See https://prometheus.io/docs/alerting/latest/configuration/#slack_config + properties: + actions: + description: A list of Slack actions that are sent with + each notification. + items: + description: SlackAction configures a single Slack action + that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields + and https://api.slack.com/docs/message-buttons for + more information. + properties: + confirm: + description: SlackConfirmationField protect users + from destructive actions or particularly distinguished + decisions by asking them to confirm their button + click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields + for more information. + properties: + dismissText: + type: string + okText: + type: string + text: + minLength: 1 + type: string + title: + type: string + required: + - text + type: object + name: + type: string + style: + type: string + text: + minLength: 1 + type: string + type: + minLength: 1 + type: string + url: + type: string + value: + type: string + required: + - text + - type + type: object + type: array + apiURL: + description: The secret's key that contains the Slack + webhook URL. The secret needs to be in the same namespace + as the AlertmanagerConfig object and accessible by the + Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + callbackId: + type: string + channel: + description: The channel or user to send notifications + to. + type: string + color: + type: string + fallback: + type: string + fields: + description: A list of Slack fields that are sent with + each notification. + items: + description: SlackField configures a single Slack field + that is sent with each notification. Each field must + contain a title, value, and optionally, a boolean + value to indicate if the field is short enough to + be displayed next to other fields designated as short. + See https://api.slack.com/docs/message-attachments#fields + for more information. + properties: + short: + type: boolean + title: + minLength: 1 + type: string + value: + minLength: 1 + type: string + required: + - title + - value + type: object + type: array + footer: + type: string + httpConfig: + description: HTTP client configuration. + properties: + authorization: + description: Authorization header configuration for + the client. This is mutually exclusive with BasicAuth + and is only available starting from Alertmanager + v0.22+. + properties: + credentials: + description: Selects a key of a Secret in the + namespace that contains the credentials for + authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: + description: "Defines the authentication type. + The value is case-insensitive. \n \"Basic\" + is not a supported value. \n Default: \"Bearer\"" + type: string + type: object + basicAuth: + description: BasicAuth for the client. This is mutually + exclusive with Authorization. If both are defined, + BasicAuth takes precedence. + properties: + password: + description: The secret in the service monitor + namespace that contains the password for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + username: + description: The secret in the service monitor + namespace that contains the username for authentication. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + bearerTokenSecret: + description: The secret's key that contains the bearer + token to be used by the client for authentication. + The secret needs to be in the same namespace as + the AlertmanagerConfig object and accessible by + the Prometheus Operator. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + followRedirects: + description: FollowRedirects specifies whether the + client should follow HTTP 3xx redirects. + type: boolean + oauth2: + description: OAuth2 client credentials used to fetch + a token for the targets. + properties: + clientId: + description: The secret or configmap containing + the OAuth2 client id + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + clientSecret: + description: The secret containing the OAuth2 + client secret + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + endpointParams: + additionalProperties: + type: string + description: Parameters to append to the token + URL + type: object + scopes: + description: OAuth2 scopes used for the token + request + items: + type: string + type: array + tokenUrl: + description: The URL to fetch the token from + minLength: 1 + type: string + required: + - clientId + - clientSecret + - tokenUrl + type: object + proxyURL: + description: Optional proxy URL. + type: string + tlsConfig: + description: TLS configuration for the client. + properties: + ca: + description: Certificate authority used when verifying + server certificates. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + cert: + description: Client certificate to present when + doing client-authentication. + properties: + configMap: + description: ConfigMap containing data to + use for the targets. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + secret: + description: Secret containing data to use + for the targets. + properties: + key: + description: The key of the secret to + select from. Must be a valid secret + key. + type: string + name: + description: 'Name of the referent. More + info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret + or its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + insecureSkipVerify: + description: Disable target certificate validation. + type: boolean + keySecret: + description: Secret containing the client key + file for the targets. + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + serverName: + description: Used to verify the hostname for the + targets. + type: string + type: object type: object - callbackId: - type: string - channel: - description: The channel or user to send notifications - to. + iconEmoji: type: string - color: + iconURL: type: string - fallback: + imageURL: type: string - fields: - description: A list of Slack fields that are sent with - each notification. + linkNames: + type: boolean + mrkdwnIn: items: - description: SlackField configures a single Slack field - that is sent with each notification. Each field must - contain a title, value, and optionally, a boolean - value to indicate if the field is short enough to - be displayed next to other fields designated as short. - See https://api.slack.com/docs/message-attachments#fields - for more information. - properties: - short: - type: boolean - title: - minLength: 1 - type: string - value: - minLength: 1 - type: string - required: - - title - - value - type: object + type: string type: array - footer: + pretext: + type: string + sendResolved: + description: Whether or not to notify about resolved alerts. + type: boolean + shortFields: + type: boolean + text: + type: string + thumbURL: + type: string + title: + type: string + titleLink: type: string + username: + type: string + type: object + type: array + snsConfigs: + description: List of SNS configurations + items: + description: SNSConfig configures notifications via AWS SNS. + See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs + properties: + apiURL: + description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. + If not specified, the SNS API URL from the SNS SDK will + be used. + type: string + attributes: + additionalProperties: + type: string + description: SNS message attributes. + type: object httpConfig: description: HTTP client configuration. properties: @@ -2683,53 +3476,143 @@ spec: type: string type: object type: object - iconEmoji: - type: string - iconURL: - type: string - imageURL: + message: + description: The message content of the SNS notification. type: string - linkNames: - type: boolean - mrkdwnIn: - items: - type: string - type: array - pretext: + phoneNumber: + description: Phone number if message is delivered via + SMS in E.164 format. If you don't specify this value, + you must specify a value for the TopicARN or TargetARN. type: string sendResolved: description: Whether or not to notify about resolved alerts. type: boolean - shortFields: - type: boolean - text: - type: string - thumbURL: - type: string - title: + sigv4: + description: Configures AWS's Signature Verification 4 + signing process to sign requests. + properties: + accessKey: + description: AccessKey is the AWS API key. If not + specified, the environment variable `AWS_ACCESS_KEY_ID` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used + to authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used + to authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + subject: + description: Subject line when the message is delivered + to email endpoints. type: string - titleLink: + targetARN: + description: The mobile platform endpoint ARN if message + is delivered via mobile notifications. If you don't + specify this value, you must specify a value for the + topic_arn or PhoneNumber. type: string - username: + topicARN: + description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic + If you don't specify this value, you must specify a + value for the PhoneNumber or TargetARN. type: string type: object type: array - snsConfigs: - description: List of SNS configurations + telegramConfigs: + description: List of Telegram configurations. items: - description: SNSConfig configures notifications via AWS SNS. - See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs + description: TelegramConfig configures notifications via Telegram. + See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config properties: apiURL: - description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. - If not specified, the SNS API URL from the SNS SDK will - be used. + description: The Telegram API URL i.e. https://api.telegram.org. + If not specified, default API URL will be used. type: string - attributes: - additionalProperties: - type: string - description: SNS message attributes. + botToken: + description: "Telegram bot token. It is mutually exclusive + with `botTokenFile`. The secret needs to be in the same + namespace as the AlertmanagerConfig object and accessible + by the Prometheus Operator. \n Either `botToken` or + `botTokenFile` is required." + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key type: object + botTokenFile: + description: "File to read the Telegram bot token from. + It is mutually exclusive with `botToken`. Either `botToken` + or `botTokenFile` is required. \n It requires Alertmanager + >= v0.26.0." + type: string + chatID: + description: The Telegram chat ID. + format: int64 + type: integer + disableNotifications: + description: Disable telegram notifications + type: boolean httpConfig: description: HTTP client configuration. properties: @@ -3078,110 +3961,31 @@ spec: type: object type: object message: - description: The message content of the SNS notification. + description: Message template type: string - phoneNumber: - description: Phone number if message is delivered via - SMS in E.164 format. If you don't specify this value, - you must specify a value for the TopicARN or TargetARN. + parseMode: + description: Parse mode for telegram message + enum: + - MarkdownV2 + - Markdown + - HTML type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - sigv4: - description: Configures AWS's Signature Verification 4 - signing process to sign requests. - properties: - accessKey: - description: AccessKey is the AWS API key. If not - specified, the environment variable `AWS_ACCESS_KEY_ID` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - profile: - description: Profile is the named AWS profile used - to authenticate. - type: string - region: - description: Region is the AWS region. If blank, the - region from the default credentials chain used. - type: string - roleArn: - description: RoleArn is the named AWS profile used - to authenticate. - type: string - secretKey: - description: SecretKey is the AWS API secret. If not - specified, the environment variable `AWS_SECRET_ACCESS_KEY` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - subject: - description: Subject line when the message is delivered - to email endpoints. - type: string - targetARN: - description: The mobile platform endpoint ARN if message - is delivered via mobile notifications. If you don't - specify this value, you must specify a value for the - topic_arn or PhoneNumber. - type: string - topicARN: - description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic - If you don't specify this value, you must specify a - value for the PhoneNumber or TargetARN. - type: string type: object type: array - telegramConfigs: - description: List of Telegram configurations. + victoropsConfigs: + description: List of VictorOps configurations. items: - description: TelegramConfig configures notifications via Telegram. - See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config + description: VictorOpsConfig configures notifications via + VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config properties: - apiURL: - description: The Telegram API URL i.e. https://api.telegram.org. - If not specified, default API URL will be used. - type: string - botToken: - description: Telegram bot token The secret needs to be - in the same namespace as the AlertmanagerConfig object - and accessible by the Prometheus Operator. + apiKey: + description: The secret's key that contains the API key + to use when talking to the VictorOps API. The secret + needs to be in the same namespace as the AlertmanagerConfig + object and accessible by the Prometheus Operator. properties: key: description: The key of the secret to select from. Must @@ -3199,15 +4003,31 @@ spec: required: - key type: object - chatID: - description: The Telegram chat ID. - format: int64 - type: integer - disableNotifications: - description: Disable telegram notifications - type: boolean + apiUrl: + description: The VictorOps API URL. + type: string + customFields: + description: Additional custom fields for notification. + items: + description: KeyValue defines a (key, value) tuple. + properties: + key: + description: Key of the tuple. + minLength: 1 + type: string + value: + description: Value of the tuple. + type: string + required: + - key + - value + type: object + type: array + entityDisplayName: + description: Contains summary of the alerted problem. + type: string httpConfig: - description: HTTP client configuration. + description: The HTTP client's configuration. properties: authorization: description: Authorization header configuration for @@ -3553,74 +4373,41 @@ spec: type: string type: object type: object - message: - description: Message template + messageType: + description: Describes the behavior of the alert (CRITICAL, + WARNING, INFO). type: string - parseMode: - description: Parse mode for telegram message - enum: - - MarkdownV2 - - Markdown - - HTML + monitoringTool: + description: The monitoring tool the state message is + from. + type: string + routingKey: + description: A key used to map the alert to a team. type: string sendResolved: - description: Whether to notify about resolved alerts. + description: Whether or not to notify about resolved alerts. type: boolean + stateMessage: + description: Contains long explanation of the alerted + problem. + type: string type: object type: array - victoropsConfigs: - description: List of VictorOps configurations. + webexConfigs: + description: List of Webex configurations. items: - description: VictorOpsConfig configures notifications via - VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config + description: WebexConfig configures notification via Cisco + Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config properties: - apiKey: - description: The secret's key that contains the API key - to use when talking to the VictorOps API. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - apiUrl: - description: The VictorOps API URL. - type: string - customFields: - description: Additional custom fields for notification. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entityDisplayName: - description: Contains summary of the alerted problem. + apiURL: + description: The Webex Teams API URL i.e. https://webexapis.com/v1/messages + Provide if different from the default API URL. + pattern: ^https?://.+$ type: string httpConfig: - description: The HTTP client's configuration. + description: The HTTP client's configuration. You must + supply the bot token via the `httpConfig.authorization` + field. properties: authorization: description: Authorization header configuration for @@ -3966,24 +4753,19 @@ spec: type: string type: object type: object - messageType: - description: Describes the behavior of the alert (CRITICAL, - WARNING, INFO). - type: string - monitoringTool: - description: The monitoring tool the state message is - from. + message: + description: Message template type: string - routingKey: - description: A key used to map the alert to a team. + roomID: + description: ID of the Webex Teams room where to send + the messages. + minLength: 1 type: string sendResolved: - description: Whether or not to notify about resolved alerts. + description: Whether to notify about resolved alerts. type: boolean - stateMessage: - description: Contains long explanation of the alerted - problem. - type: string + required: + - roomID type: object type: array webhookConfigs: diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml index 6c5238fc8..3e69d7d1a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: alertmanagers.monitoring.coreos.com spec: @@ -2443,6 +2444,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2564,8 +2584,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2598,16 +2618,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3786,6 +3802,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3907,8 +3942,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3941,16 +3976,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4269,8 +4300,15 @@ spec: objects are not goint to be performed, except for delete actions. type: boolean podMetadata: - description: PodMetadata configures Labels and Annotations which are - propagated to the alertmanager pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Alertmanager pods. \n The following items + are reserved and cannot be overridden: * \"alertmanager\" label, + set to the name of the Alertmanager instance. * \"app.kubernetes.io/instance\" + label, set to the name of the Alertmanager instance. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"alertmanager\". * \"app.kubernetes.io/version\" + label, set to the Alertmanager version. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"alertmanager\"." properties: annotations: additionalProperties: @@ -4468,7 +4506,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4532,14 +4571,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -5127,6 +5163,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -5134,19 +5215,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -5201,13 +5294,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml index 4cab879ed..42478db0e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: podmonitors.monitoring.coreos.com spec: @@ -52,6 +53,12 @@ spec: jobLabel: description: The label to use to retrieve the job name from. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml index 7a4985137..74d0185b4 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: probes.monitoring.coreos.com spec: @@ -141,6 +142,12 @@ spec: jobName: description: The job name assigned to scraped metrics by default. type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml index 50f7e0885..7d96e4122 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: prometheusagents.monitoring.coreos.com spec: @@ -2046,6 +2047,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2167,8 +2187,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2201,16 +2221,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2515,6 +2531,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -2657,7 +2682,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -3529,6 +3554,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3650,8 +3694,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3684,16 +3728,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3972,6 +4012,12 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer. @@ -4040,8 +4086,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -4300,7 +4355,7 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -4332,9 +4387,36 @@ spec: \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -4418,7 +4500,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -4565,8 +4647,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -5114,7 +5196,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -5178,14 +5261,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -5880,6 +5960,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -5887,19 +6012,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -5954,13 +6091,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml index cc6b420ec..463207209 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: prometheuses.monitoring.coreos.com spec: @@ -1019,7 +1020,8 @@ spec: type: string authorization: description: "Authorization section for Alertmanager. \n - Cannot be set at the same time as `basicAuth`, or `bearerTokenFile`." + Cannot be set at the same time as `basicAuth`, `bearerTokenFile` + or `sigv4`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -1051,7 +1053,7 @@ spec: basicAuth: description: "BasicAuth configuration for Alertmanager. \n Cannot be set at the same time as `bearerTokenFile`, - or `authorization`." + `authorization` or `sigv4`." properties: password: description: The secret in the service monitor namespace @@ -1098,9 +1100,9 @@ spec: type: object bearerTokenFile: description: "File to read bearer token for Alertmanager. - \n Cannot be set at the same time as `basicAuth`, or `authorization`. - \n *Deprecated: this will be removed in a future release. - Prefer using `authorization`.*" + \n Cannot be set at the same time as `basicAuth`, `authorization`, + or `sigv4`. \n *Deprecated: this will be removed in a + future release. Prefer using `authorization`.*" type: string enableHttp2: description: Whether to enable HTTP2. @@ -1124,6 +1126,68 @@ spec: scheme: description: Scheme to use when firing alerts. type: string + sigv4: + description: "Sigv4 allows to configures AWS's Signature + Verification 4 for the URL. \n It requires Prometheus + >= v2.48.0. \n Cannot be set at the same time as `basicAuth`, + `bearerTokenFile` or `authorization`." + properties: + accessKey: + description: AccessKey is the AWS API key. If not specified, + the environment variable `AWS_ACCESS_KEY_ID` is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + profile: + description: Profile is the named AWS profile used to + authenticate. + type: string + region: + description: Region is the AWS region. If blank, the + region from the default credentials chain used. + type: string + roleArn: + description: RoleArn is the named AWS profile used to + authenticate. + type: string + secretKey: + description: SecretKey is the AWS API secret. If not + specified, the environment variable `AWS_SECRET_ACCESS_KEY` + is used. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object timeout: description: Timeout is a per-target Alertmanager timeout when pushing alerts. @@ -2384,6 +2448,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -2505,8 +2588,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -2539,16 +2622,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2864,6 +2943,15 @@ spec: v2.28.0." pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ type: string + enforcedKeepDroppedTargets: + description: "When defined, enforcedKeepDroppedTargets specifies a + global limit on the number of targets dropped by relabeling that + will be kept in memory. The value overrides any `spec.keepDroppedTargets` + set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` + is greater than zero and less than `spec.enforcedKeepDroppedTargets`. + \n It requires Prometheus >= v2.47.0." + format: int64 + type: integer enforcedLabelLimit: description: "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any @@ -3025,7 +3113,7 @@ spec: description: When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe objec. + and Probe object. type: boolean image: description: "Container image name for Prometheus. If specified, it @@ -3897,6 +3985,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -4018,8 +4125,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4052,16 +4159,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4340,6 +4443,12 @@ spec: - name type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer. @@ -4408,8 +4517,17 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata configures labels and annotations which are - propagated to the Prometheus pods. + description: "PodMetadata configures labels and annotations which + are propagated to the Prometheus pods. \n The following items are + reserved and cannot be overridden: * \"prometheus\" label, set to + the name of the Prometheus object. * \"app.kubernetes.io/instance\" + label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" + label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, + set to the Prometheus version. * \"operator.prometheus.io/name\" + label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" + label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"prometheus\"." properties: annotations: additionalProperties: @@ -5087,7 +5205,7 @@ spec: authorization: description: "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as - `sigv4`, `basicAuth`, or `oauth2`." + `sigv4`, `basicAuth`, `oauth2`, or `azureAd`." properties: credentials: description: Selects a key of a Secret in the namespace @@ -5119,9 +5237,36 @@ spec: \n Default: \"Bearer\"" type: string type: object + azureAd: + description: "AzureAD for the URL. \n It requires Prometheus + >= v2.45.0. \n Cannot be set at the same time as `authorization`, + `basicAuth`, `oauth2`, or `sigv4`." + properties: + cloud: + description: The Azure Cloud. Options are 'AzurePublic', + 'AzureChina', or 'AzureGovernment'. + enum: + - AzureChina + - AzureGovernment + - AzurePublic + type: string + managedIdentity: + description: ManagedIdentity defines the Azure User-assigned + Managed identity. + properties: + clientId: + description: The client id + type: string + required: + - clientId + type: object + required: + - managedIdentity + type: object basicAuth: description: "BasicAuth configuration for the URL. \n Cannot - be set at the same time as `sigv4`, `authorization`, or `oauth2`." + be set at the same time as `sigv4`, `authorization`, `oauth2`, + or `azureAd`." properties: password: description: The secret in the service monitor namespace @@ -5205,7 +5350,7 @@ spec: oauth2: description: "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as - `sigv4`, `authorization`, or `basicAuth`." + `sigv4`, `authorization`, `basicAuth`, or `azureAd`." properties: clientId: description: The secret or configmap containing the OAuth2 @@ -5352,8 +5497,8 @@ spec: sigv4: description: "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot - be set at the same time as `authorization`, `basicAuth`, or - `oauth2`." + be set at the same time as `authorization`, `basicAuth`, `oauth2`, + or `azureAd`." properties: accessKey: description: AccessKey is the AWS API key. If not specified, @@ -6027,7 +6172,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -6091,14 +6237,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -6797,6 +6940,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -6804,19 +6992,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -6871,13 +7071,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml index d06a55769..0bd8b643f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: prometheusrules.monitoring.coreos.com spec: diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml index 5143a4a99..36e332074 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: scrapeconfigs.monitoring.coreos.com spec: @@ -525,6 +526,128 @@ spec: - server type: object type: array + dnsSDConfigs: + description: DNSSDConfigs defines a list of DNS service discovery + configurations. + items: + description: DNSSDConfig allows specifying a set of DNS domain names + which are periodically queried to discover a list of targets. + The DNS servers to be contacted are read from /etc/resolv.conf. + See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config + properties: + names: + description: A list of DNS domain names to be queried. + items: + type: string + minItems: 1 + type: array + port: + description: The port number used if the query type is not SRV + Ignored for SRV records + type: integer + refreshInterval: + description: RefreshInterval configures the time after which + the provided names are refreshed. If not set, Prometheus uses + its default value. + pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ + type: string + type: + description: The type of DNS query to perform. One of SRV, A, + AAAA or MX. If not set, Prometheus uses its default value. + enum: + - SRV + - A + - AAAA + - MX + type: string + required: + - names + type: object + type: array + ec2SDConfigs: + description: EC2SDConfigs defines a list of EC2 service discovery + configurations. + items: + description: EC2SDConfig allow retrieving scrape targets from AWS + EC2 instances. The private IP address is used by default, but + may be changed to the public IP address with relabeling. The IAM + credentials used must have the ec2:DescribeInstances permission + to discover scrape targets See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config + properties: + accessKey: + description: AccessKey is the AWS API key. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + filters: + description: 'Filters can be used optionally to filter the instance + list by other criteria. Available filter criteria can be found + here: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html + Filter API documentation: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Filter.html' + items: + description: EC2Filter is the configuration for filtering + EC2 instances. + properties: + name: + type: string + values: + items: + type: string + type: array + required: + - name + - values + type: object + type: array + port: + description: The port to scrape metrics from. If using the public + IP address, this must instead be specified in the relabeling + rule. + type: integer + refreshInterval: + description: RefreshInterval configures the refresh interval + at which Prometheus will re-read the instance list. + pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ + type: string + region: + description: The AWS region + type: string + roleARN: + description: AWS Role ARN, an alternative to using AWS API keys. + type: string + secretKey: + description: SecretKey is the AWS API secret. + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + type: object + type: array fileSDConfigs: description: FileSDConfigs defines a list of file service discovery configurations. @@ -777,6 +900,12 @@ spec: - url type: object type: array + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer kubernetesSDConfigs: description: KubernetesSDConfigs defines a list of Kubernetes service discovery configurations. @@ -786,10 +915,34 @@ spec: properties: role: description: Role of the Kubernetes entities that should be - discovered. Currently the only supported role is "Node". + discovered. enum: - Node + - node type: string + selectors: + description: Selector to select objects. + items: + description: K8SSelectorConfig is Kubernetes Selector Config + properties: + field: + type: string + label: + type: string + role: + description: K8SRole is role of the service in Kubernetes. + Currently the only supported role is "Node". + enum: + - Node + - node + type: string + required: + - role + type: object + type: array + x-kubernetes-list-map-keys: + - role + x-kubernetes-list-type: map required: - role type: object @@ -811,6 +964,78 @@ spec: and newer. format: int64 type: integer + metricRelabelings: + description: MetricRelabelConfigs to apply to samples before ingestion. + items: + description: "RelabelConfig allows dynamic rewriting of the label + set for targets, alerts, scraped samples and remote write samples. + \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" + properties: + action: + default: replace + description: "Action to perform based on the regex matching. + \n `Uppercase` and `Lowercase` actions require Prometheus + >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus + >= v2.41.0. \n Default: \"Replace\"" + enum: + - replace + - Replace + - keep + - Keep + - drop + - Drop + - hashmod + - HashMod + - labelmap + - LabelMap + - labeldrop + - LabelDrop + - labelkeep + - LabelKeep + - lowercase + - Lowercase + - uppercase + - Uppercase + - keepequal + - KeepEqual + - dropequal + - DropEqual + type: string + modulus: + description: "Modulus to take of the hash of the source label + values. \n Only applicable when the action is `HashMod`." + format: int64 + type: integer + regex: + description: Regular expression against which the extracted + value is matched. + type: string + replacement: + description: "Replacement value against which a Replace action + is performed if the regular expression matches. \n Regex capture + groups are available." + type: string + separator: + description: Separator is the string between concatenated SourceLabels. + type: string + sourceLabels: + description: The source labels select values from existing labels. + Their content is concatenated using the configured Separator + and matched against the configured regular expression. + items: + description: LabelName is a valid Prometheus label name which + may only contain ASCII letters, numbers, as well as underscores. + pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ + type: string + type: array + targetLabel: + description: "Label to which the resulting string is written + in a replacement. \n It is mandatory for `Replace`, `HashMod`, + `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. + \n Regex capture groups are available." + type: string + type: object + type: array metricsPath: description: MetricsPath HTTP path to scrape for metrics. If empty, Prometheus uses the default value (e.g. /metrics). diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml index fbcbdb7de..e27b2f15f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: servicemonitors.monitoring.coreos.com spec: @@ -605,6 +606,12 @@ spec: the given Service, the `job` label of the metrics defaults to the name of the Kubernetes Service." type: string + keepDroppedTargets: + description: "Per-scrape limit on the number of targets dropped by + relabeling that will be kept in memory. 0 means no limit. \n It + requires Prometheus >= v2.47.0." + format: int64 + type: integer labelLimit: description: Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer. diff --git a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml index 6f483eb09..af09401a9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.1 + operator.prometheus.io/version: 0.69.1 creationTimestamp: null name: thanosrulers.monitoring.coreos.com spec: @@ -1821,6 +1822,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -1942,8 +1962,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -1976,16 +1996,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3326,6 +3342,25 @@ spec: cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object type: object + restartPolicy: + description: 'RestartPolicy defines the restart behavior of + individual containers in a pod. This field may only be set + for init containers, and the only allowed value is "Always". + For non-init containers or when this field is not specified, + the restart behavior is defined by the Pod''s restart policy + and the container type. Setting the RestartPolicy as "Always" + for the init container will have the following effect: this + init container will be continually restarted on exit until + all regular containers have terminated. Once all regular containers + have completed, all init containers with restartPolicy "Always" + will be shut down. This lifecycle differs from normal init + containers and is often referred to as a "sidecar" container. + Although this init container still starts in the init container + sequence, it does not wait for the container to complete before + proceeding to the next init container. Instead, the next init + container starts immediately after this init container is + started, or after any startupProbe has successfully completed.' + type: string securityContext: description: 'SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext @@ -3447,8 +3482,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured - seccomp profile location. Must only be set if type - is "Localhost". + seccomp profile location. Must be set if type is "Localhost". + Must NOT be set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -3481,16 +3516,12 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is - alpha-level and will only be honored by components - that enable the WindowsHostProcessContainers feature - flag. Setting this field without the feature flag - will result in errors when validating the Pod. All - of a Pod's containers must have the same effective - HostProcess value (it is not allowed to have a mix - of HostProcess containers and non-HostProcess containers). In - addition, if HostProcess is true then HostNetwork - must also be set to true. + be run as a 'Host Process' container. All of a Pod's + containers must have the same effective HostProcess + value (it is not allowed to have a mix of HostProcess + containers and non-HostProcess containers). In addition, + if HostProcess is true then HostNetwork must also + be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -3840,8 +3871,14 @@ spec: for deletion will be performed on the underlying objects. type: boolean podMetadata: - description: PodMetadata contains Labels and Annotations gets propagated - to the thanos ruler pods. + description: "PodMetadata configures labels and annotations which + are propagated to the ThanosRuler pods. \n The following items are + reserved and cannot be overridden: * \"app.kubernetes.io/name\" + label, set to \"thanos-ruler\". * \"app.kubernetes.io/managed-by\" + label, set to \"prometheus-operator\". * \"app.kubernetes.io/instance\" + label, set to the name of the ThanosRuler instance. * \"thanos-ruler\" + label, set to the name of the ThanosRuler instance. * \"kubectl.kubernetes.io/default-container\" + annotation, set to \"thanos-ruler\"." properties: annotations: additionalProperties: @@ -4167,7 +4204,8 @@ spec: in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile - location. Must only be set if type is "Localhost". + location. Must be set if type is "Localhost". Must NOT be + set for any other type. type: string type: description: "type indicates which kind of seccomp profile @@ -4231,14 +4269,11 @@ spec: type: string hostProcess: description: HostProcess determines if a container should - be run as a 'Host Process' container. This field is alpha-level - and will only be honored by components that enable the WindowsHostProcessContainers - feature flag. Setting this field without the feature flag - will result in errors when validating the Pod. All of a - Pod's containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess containers - and non-HostProcess containers). In addition, if HostProcess - is true then HostNetwork must also be set to true. + be run as a 'Host Process' container. All of a Pod's containers + must have the same effective HostProcess value (it is not + allowed to have a mix of HostProcess containers and non-HostProcess + containers). In addition, if HostProcess is true then HostNetwork + must also be set to true. type: boolean runAsUserName: description: The UserName in Windows to run the entrypoint @@ -4818,6 +4853,51 @@ spec: items: type: string type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore + that update and let other controllers handle it. + type: string + description: "allocatedResourceStatuses stores status + of resource being resized for the given PVC. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n ClaimResourceStatus can be + in any of following states: - ControllerResizeInProgress: + State set when resize controller starts resizing the + volume in control-plane. - ControllerResizeFailed: State + set when resize has failed in resize controller with + a terminal error. - NodeResizePending: State set when + resize controller has finished resizing the volume but + further resizing of volume is needed on the node. - + NodeResizeInProgress: State set when kubelet starts + resizing the volume. - NodeResizeFailed: State set when + resizing has failed in kubelet with a terminal error. + Transient errors don't set NodeResizeFailed. For example: + if expanding a PVC for more capacity - this field can + be one of the following states: - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] + = \"NodeResizeFailed\" When this field is not set, it + means that no resize operation is in progress for the + given PVC. \n A controller that receives PVC update + with previously unknown resourceName or ClaimResourceStatus + should ignore the update for the purpose it was designed. + For example - a controller that only is responsible + for resizing capacity of the volume, should ignore PVC + updates that change other valid resources associated + with PVC. \n This is an alpha field and requires enabling + RecoverVolumeExpansionFailure feature." + type: object + x-kubernetes-map-type: granular allocatedResources: additionalProperties: anyOf: @@ -4825,19 +4905,31 @@ spec: - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - description: allocatedResources is the storage resource - within AllocatedResources tracks the capacity allocated - to a PVC. It may be larger than the actual capacity - when a volume expansion operation is requested. For - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used. If allocatedResources - is not set, PVC.spec.resources alone is used for quota - calculation. If a volume expansion capacity request - is lowered, allocatedResources is only lowered if there - are no expansion operations in progress and if the actual - volume capacity is equal or lower than the requested - capacity. This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature. + description: "allocatedResources tracks the resources + allocated to a PVC including its capacity. Key names + follow standard Kubernetes label syntax. Valid values + are either: * Un-prefixed keys: - storage - the capacity + of the volume. * Custom resources must use implementation-defined + prefixed names such as \"example.com/my-custom-resource\" + Apart from above values - keys that are unprefixed or + have kubernetes.io prefix are considered reserved and + hence may not be used. \n Capacity reported here may + be larger than the actual capacity when a volume expansion + operation is requested. For storage quota, the larger + value from allocatedResources and PVC.spec.resources + is used. If allocatedResources is not set, PVC.spec.resources + alone is used for quota calculation. If a volume expansion + capacity request is lowered, allocatedResources is only + lowered if there are no expansion operations in progress + and if the actual volume capacity is equal or lower + than the requested capacity. \n A controller that receives + PVC update with previously unknown resourceName should + ignore the update for the purpose it was designed. For + example - a controller that only is responsible for + resizing capacity of the volume, should ignore PVC updates + that change other valid resources associated with PVC. + \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure + feature." type: object capacity: additionalProperties: @@ -4892,13 +4984,6 @@ spec: phase: description: phase represents the current phase of PersistentVolumeClaim. type: string - resizeStatus: - description: resizeStatus stores status of resize operation. - ResizeStatus is not set by default but when expansion - is complete resizeStatus is set to empty string by resize - controller or kubelet. This is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature. - type: string type: object type: object type: object diff --git a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml index cc77d9073..0be4ebc5e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator roleRef: apiGroup: rbac.authorization.k8s.io diff --git a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml index ac348a33e..552325a63 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator rules: - apiGroups: @@ -84,3 +84,9 @@ rules: - get - list - watch +- apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get diff --git a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml index e56ada418..8bd90b8d6 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default spec: @@ -20,14 +20,14 @@ spec: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 spec: automountServiceAccountToken: true containers: - args: - --kubelet-service=kube-system/kubelet - - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.67.1 - image: quay.io/prometheus-operator/prometheus-operator:v0.67.1 + - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.69.1 + image: quay.io/prometheus-operator/prometheus-operator:v0.69.1 name: prometheus-operator ports: - containerPort: 8080 diff --git a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml index 40547b562..eba6f47e9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml @@ -5,6 +5,6 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default diff --git a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml index 0ffe0063f..7ed19a89b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default spec: @@ -15,4 +15,4 @@ spec: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 diff --git a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service.yaml b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service.yaml index ae2f43eef..d1f3e5297 100644 --- a/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service.yaml +++ b/otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-service.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.67.1 + app.kubernetes.io/version: 0.69.1 name: prometheus-operator namespace: default spec: diff --git a/otelcollector/otel-allocator/prometheus-operator/go.mod b/otelcollector/otel-allocator/prometheus-operator/go.mod index 1c1e61e10..0b61e593c 100644 --- a/otelcollector/otel-allocator/prometheus-operator/go.mod +++ b/otelcollector/otel-allocator/prometheus-operator/go.mod @@ -1,6 +1,6 @@ module github.com/prometheus-operator/prometheus-operator -go 1.20 +go 1.21 replace github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring => ./pkg/apis/monitoring @@ -11,56 +11,65 @@ require ( github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/blang/semver/v4 v4.0.0 - github.com/brancz/kube-rbac-proxy v0.14.2 + github.com/brancz/kube-rbac-proxy v0.15.0 github.com/cespare/xxhash/v2 v2.2.0 - github.com/docker/distribution v2.8.2+incompatible - github.com/evanphx/json-patch/v5 v5.6.0 + github.com/distribution/reference v0.5.0 + github.com/evanphx/json-patch/v5 v5.7.0 github.com/go-kit/log v0.2.1 github.com/go-openapi/swag v0.22.4 github.com/go-test/deep v1.1.0 github.com/gogo/protobuf v1.3.2 - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.6.0 github.com/kylelemons/godebug v1.1.0 github.com/mitchellh/hashstructure v1.1.0 github.com/oklog/run v1.1.0 github.com/pkg/errors v0.9.1 github.com/prometheus-community/prom-label-proxy v0.7.0 - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.67.1 - github.com/prometheus-operator/prometheus-operator/pkg/client v0.67.1 - github.com/prometheus/alertmanager v0.25.0 - github.com/prometheus/client_golang v1.16.0 - github.com/prometheus/common v0.44.0 - github.com/prometheus/prometheus v0.46.0 + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1 + github.com/prometheus-operator/prometheus-operator/pkg/client v0.69.1 + github.com/prometheus/alertmanager v0.26.0 + github.com/prometheus/client_golang v1.17.0 + github.com/prometheus/common v0.45.0 + github.com/prometheus/exporter-toolkit v0.10.0 + github.com/prometheus/prometheus v0.47.2 github.com/stretchr/testify v1.8.4 - github.com/thanos-io/thanos v0.31.1-0.20230712125051-cb2ab1b02800 + github.com/thanos-io/thanos v0.32.5 golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 - golang.org/x/net v0.12.0 - golang.org/x/sync v0.3.0 + golang.org/x/net v0.17.0 + golang.org/x/sync v0.4.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.27.4 - k8s.io/apiextensions-apiserver v0.27.4 - k8s.io/apimachinery v0.27.4 - k8s.io/client-go v0.27.4 - k8s.io/component-base v0.27.4 + k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery v0.28.3 + k8s.io/client-go v0.28.3 + k8s.io/component-base v0.28.3 k8s.io/klog/v2 v2.100.1 - k8s.io/utils v0.0.0-20230711102312-30195339c3c7 - sigs.k8s.io/controller-runtime v0.15.0 - sigs.k8s.io/yaml v1.3.0 + k8s.io/utils v0.0.0-20230726121419-3b25d923346b + sigs.k8s.io/controller-runtime v0.16.3 + sigs.k8s.io/yaml v1.4.0 ) require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect +) + +require ( + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect - github.com/aws/aws-sdk-go v1.44.302 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect + github.com/aws/aws-sdk-go v1.44.327 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/efficientgo/core v1.0.0-rc.2 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -75,12 +84,10 @@ require ( github.com/go-openapi/spec v0.20.9 // indirect github.com/go-openapi/strfmt v0.21.7 // indirect github.com/go-openapi/validate v0.22.1 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.6.9 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -89,11 +96,10 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.16.7 // indirect - github.com/klauspost/cpuid/v2 v2.1.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/spdystream v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -105,9 +111,9 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect @@ -117,16 +123,17 @@ require ( go.opentelemetry.io/otel/trace v1.16.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.2.1 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect + google.golang.org/appengine v1.6.8 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 // indirect + gotest.tools/v3 v3.5.1 + k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect ) diff --git a/otelcollector/otel-allocator/prometheus-operator/go.sum b/otelcollector/otel-allocator/prometheus-operator/go.sum index f7b68259f..7d9220014 100644 --- a/otelcollector/otel-allocator/prometheus-operator/go.sum +++ b/otelcollector/otel-allocator/prometheus-operator/go.sum @@ -32,27 +32,36 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1 h1:LNHhpdK7hzUcx/k1LIcuh5k7k1LGIWLQfCjaneSj7Fc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= +github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= +github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= @@ -64,26 +73,25 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.302 h1:ST3ko6GrJKn3Xi+nAvxjG3uk/V1pW8KC52WLeIxqqNk= -github.com/aws/aws-sdk-go v1.44.302/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.327 h1:ZS8oO4+7MOBLhkdwIhgtVeDzCeWOlTfKJS7EgggbIEY= +github.com/aws/aws-sdk-go v1.44.327/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/brancz/kube-rbac-proxy v0.14.2 h1:10/nS9mUAEH9MH69xnFjrgagtsfOUJf2tYJNT1G6djk= -github.com/brancz/kube-rbac-proxy v0.14.2/go.mod h1:9ZG6W1mCcG1WGwEV+Gww3tY8mpjbj8uxlMQ0qsfxYV4= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/brancz/kube-rbac-proxy v0.15.0 h1:ZBNVyiiV1vmyp0/A1jxkqz0U3FHJLdLL93eLk/o2EPI= +github.com/brancz/kube-rbac-proxy v0.15.0/go.mod h1:ne9y1bsoAwZP4welF93ZcI3j2m/qX7gZRCYkh3fd0VY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -92,9 +100,10 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -104,36 +113,41 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8Yc github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= +github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= +github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/efficientgo/core v1.0.0-rc.2 h1:7j62qHLnrZqO3V3UA0AqOGd5d5aXV3AX6m/NZBHp78I= github.com/efficientgo/core v1.0.0-rc.2/go.mod h1:FfGdkzWarkuzOlY04VY+bGfb1lWrjaL6x/GLcQ4vJps= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc= +github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -153,6 +167,7 @@ github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= @@ -193,11 +208,14 @@ github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU= github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= +github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -222,11 +240,14 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -261,8 +282,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -273,9 +294,11 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -289,34 +312,48 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= +github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.22.0 h1:ydEvDooB/A0c/xpsBd8GSt7P2/zYPBui4KrNip0xGjE= +github.com/hashicorp/consul/api v1.22.0/go.mod h1:zHpYgZ7TeYqS6zaszjwSt128OwESRpnhU9aGa6ue3Eg= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= +github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= +github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= +github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= @@ -324,7 +361,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -351,18 +388,18 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -370,6 +407,7 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= +github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -378,16 +416,20 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a h1:0usWxe5SGXKQovz3p+BiQ81Jy845xSMu2CWKuXsXuUM= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a/go.mod h1:3OETvrxfELvGsU2RoGGWercfeZ4bCL3+SOwzIWtJH/Q= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -415,14 +457,18 @@ github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DV github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= -github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= +github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= @@ -435,46 +481,49 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus-community/prom-label-proxy v0.7.0 h1:1iNHXF7V8z2iOCinEyxKDUHu2jppPAAd6PmBCi3naok= github.com/prometheus-community/prom-label-proxy v0.7.0/go.mod h1:wR9C/Mwp5aBbiqM6gQ+FZdFRwL8pCzzhsje8lTAx/aA= -github.com/prometheus/alertmanager v0.25.0 h1:vbXKUR6PYRiZPRIKfmXaG+dmCKG52RtPL4Btl8hQGvg= -github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= +github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= +github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= +github.com/prometheus/exporter-toolkit v0.10.0 h1:yOAzZTi4M22ZzVxD+fhy1URTuNRj/36uQJJ5S8IPza8= +github.com/prometheus/exporter-toolkit v0.10.0/go.mod h1:+sVFzuvV5JDyw+Ih6p3zFxZNVnKQa3x5qPmDSiPu4ZY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/prometheus v0.46.0 h1:9JSdXnsuT6YsbODEhSQMwxNkGwPExfmzqG73vCMk/Kw= -github.com/prometheus/prometheus v0.46.0/go.mod h1:10L5IJE5CEsjee1FnOcVswYXlPIscDWWt3IJ2UDYrz4= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/prometheus v0.47.2 h1:jWcnuQHz1o1Wu3MZ6nMJDuTI0kU5yJp9pkxh8XEkNvI= +github.com/prometheus/prometheus v0.47.2/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.19 h1:+1H+N9QFl2Sfvia0FBYfMrHYHYhmpZxhSE0wpPL2lYs= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/simonpasquier/klog-gokit/v3 v3.3.0 h1:HMzH999kO5gEgJTaWWO+xjncW5oycspcsBnjn9b853Q= github.com/simonpasquier/klog-gokit/v3 v3.3.0/go.mod h1:uSbnWC3T7kt1dQyY9sjv0Ao1SehMAJdVnUNSKhjaDsg= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -482,14 +531,12 @@ github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -506,10 +553,11 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/thanos-io/thanos v0.31.1-0.20230712125051-cb2ab1b02800 h1:1xuhUBDC5EMPObyNmPDGdaPnfWJZLpTGzY6FKZHL8cE= -github.com/thanos-io/thanos v0.31.1-0.20230712125051-cb2ab1b02800/go.mod h1:C0Cdk0kFFEDS3qkTgScF9ONSjrPxqnScGPoIgah3NJY= +github.com/thanos-io/thanos v0.32.5 h1:khHvuEAbUKox9DQI9cSmLes4F9G3MqWPxcdrf2tYY0w= +github.com/thanos-io/thanos v0.32.5/go.mod h1:POOrd2N/0wRQKkg1MJTvU29X+IVs7iMjSoN08q8V1Mo= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= @@ -517,9 +565,6 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= @@ -543,15 +588,17 @@ go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeH go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= @@ -562,8 +609,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -598,6 +645,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -629,23 +677,21 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -659,8 +705,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -698,25 +744,23 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -728,8 +772,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -783,6 +827,7 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -809,8 +854,8 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -834,17 +879,18 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 h1:+VoAg+OKmWaommL56xmZSE2sUK8A7m6SUO7X89F2tbw= +google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753/go.mod h1:iqkVr8IRpZ53gx1dEnWlCUIEwDWqWARWrbzpasaTNYM= google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 h1:lCbbUxUDD+DiXx9Q6F/ttL0aAu7N2pz8XnmMm8ZW4NE= +google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 h1:XUODHrpzJEUeWmVo/jfNTLj0YyVveOo28oE6vkFbkO4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -857,10 +903,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -873,7 +917,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -887,9 +930,9 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -902,6 +945,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -909,28 +954,28 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.27.4 h1:0pCo/AN9hONazBKlNUdhQymmnfLRbSZjd5H5H3f0bSs= -k8s.io/api v0.27.4/go.mod h1:O3smaaX15NfxjzILfiln1D8Z3+gEYpjEpiNA/1EVK1Y= -k8s.io/apiextensions-apiserver v0.27.4 h1:ie1yZG4nY/wvFMIR2hXBeSVq+HfNzib60FjnBYtPGSs= -k8s.io/apiextensions-apiserver v0.27.4/go.mod h1:KHZaDr5H9IbGEnSskEUp/DsdXe1hMQ7uzpQcYUFt2bM= -k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= -k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v0.27.4 h1:vj2YTtSJ6J4KxaC88P4pMPEQECWMY8gqPqsTgUKzvjk= -k8s.io/client-go v0.27.4/go.mod h1:ragcly7lUlN0SRPk5/ZkGnDjPknzb37TICq07WhI6Xc= -k8s.io/component-base v0.27.4 h1:Wqc0jMKEDGjKXdae8hBXeskRP//vu1m6ypC+gwErj4c= -k8s.io/component-base v0.27.4/go.mod h1:hoiEETnLc0ioLv6WPeDt8vD34DDeB35MfQnxCARq3kY= -k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 h1:OmK1d0WrkD3IPfkskvroRykOulHVHf0s0ZIFRjyt+UI= -k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515/go.mod h1:kzo02I3kQ4BTtEfVLaPbjvCkX97YqGve33wzlb3fofQ= -k8s.io/utils v0.0.0-20230711102312-30195339c3c7 h1:ZgnF1KZsYxWIifwSNZFZgNtWE89WI5yiP5WwlfDoIyc= -k8s.io/utils v0.0.0-20230711102312-30195339c3c7/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f h1:eeEUOoGYWhOz7EyXqhlR2zHKNw2mNJ9vzJmub6YN6kk= +k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU= -sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk= +sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= +sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/otelcollector/otel-allocator/prometheus-operator/internal/log/log.go b/otelcollector/otel-allocator/prometheus-operator/internal/log/log.go index 176a207bd..75595e4f7 100644 --- a/otelcollector/otel-allocator/prometheus-operator/internal/log/log.go +++ b/otelcollector/otel-allocator/prometheus-operator/internal/log/log.go @@ -22,6 +22,7 @@ import ( "github.com/go-kit/log" loglevel "github.com/go-kit/log/level" + klogv2 "k8s.io/klog/v2" ) const ( @@ -46,10 +47,15 @@ func NewLogger(level string, format string) (log.Logger, error) { lvlOption loglevel.Option ) + // For log levels other than debug, the klog verbosity level is 0. + klogv2.ClampLevel(0) switch strings.ToLower(level) { case LevelAll: lvlOption = loglevel.AllowAll() case LevelDebug: + // When the log level is set to debug, we set the klog verbosity level to 6. + // Above level 6, the k8s client would log bearer tokens in clear-text. + klogv2.ClampLevel(6) lvlOption = loglevel.AllowDebug() case LevelInfo: lvlOption = loglevel.AllowInfo() @@ -75,6 +81,9 @@ func NewLogger(level string, format string) (log.Logger, error) { logger = loglevel.NewFilter(logger, lvlOption) logger = log.With(logger, "ts", log.DefaultTimestampUTC) logger = log.With(logger, "caller", log.DefaultCaller) + + klogv2.SetLogger(log.With(logger, "component", "k8s_client_runtime")) + return logger, nil } diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json index 10f2ea55e..7ffbd9b48 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "alertmanagerconfigs.monitoring.coreos.com" @@ -28,7 +29,7 @@ "name": "v1alpha1", "schema": { "openAPIV3Schema": { - "description": "AlertmanagerConfig defines a namespaced AlertmanagerConfig to be aggregated across multiple namespaces configuring one Alertmanager cluster.", + "description": "AlertmanagerConfig configures the Prometheus Alertmanager, specifying how alerts should be grouped, inhibited and notified to external systems.", "properties": { "apiVersion": { "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", @@ -883,76 +884,11 @@ }, "type": "array" }, - "name": { - "description": "Name of the receiver. Must be unique across all items from the list.", - "minLength": 1, - "type": "string" - }, - "opsgenieConfigs": { - "description": "List of OpsGenie configurations.", + "msteamsConfigs": { + "description": "List of MSTeams configurations. It requires Alertmanager >= 0.26.0.", "items": { - "description": "OpsGenieConfig configures notifications via OpsGenie. See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config", + "description": "MSTeamsConfig configures notifications via Microsoft Teams. It requires Alertmanager >= 0.26.0.", "properties": { - "actions": { - "description": "Comma separated list of actions that will be available for the alert.", - "type": "string" - }, - "apiKey": { - "description": "The secret's key that contains the OpsGenie API key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - "properties": { - "key": { - "description": "The key of the secret to select from. Must be a valid secret key.", - "type": "string" - }, - "name": { - "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", - "type": "string" - }, - "optional": { - "description": "Specify whether the Secret or its key must be defined", - "type": "boolean" - } - }, - "required": [ - "key" - ], - "type": "object" - }, - "apiURL": { - "description": "The URL to send OpsGenie API requests to.", - "type": "string" - }, - "description": { - "description": "Description of the incident.", - "type": "string" - }, - "details": { - "description": "A set of arbitrary key/value pairs that provide further detail about the incident.", - "items": { - "description": "KeyValue defines a (key, value) tuple.", - "properties": { - "key": { - "description": "Key of the tuple.", - "minLength": 1, - "type": "string" - }, - "value": { - "description": "Value of the tuple.", - "type": "string" - } - }, - "required": [ - "key", - "value" - ], - "type": "object" - }, - "type": "array" - }, - "entity": { - "description": "Optional field that can be used to specify which domain alert is related to.", - "type": "string" - }, "httpConfig": { "description": "HTTP client configuration.", "properties": { @@ -1308,95 +1244,84 @@ }, "type": "object" }, - "message": { - "description": "Alert text limited to 130 characters.", - "type": "string" - }, - "note": { - "description": "Additional alert note.", - "type": "string" - }, - "priority": { - "description": "Priority level of alert. Possible values are P1, P2, P3, P4, and P5.", - "type": "string" - }, - "responders": { - "description": "List of responders responsible for notifications.", - "items": { - "description": "OpsGenieConfigResponder defines a responder to an incident. One of `id`, `name` or `username` has to be defined.", - "properties": { - "id": { - "description": "ID of the responder.", - "type": "string" - }, - "name": { - "description": "Name of the responder.", - "type": "string" - }, - "type": { - "description": "Type of responder.", - "enum": [ - "team", - "teams", - "user", - "escalation", - "schedule" - ], - "minLength": 1, - "type": "string" - }, - "username": { - "description": "Username of the responder.", - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "type": "array" - }, "sendResolved": { - "description": "Whether or not to notify about resolved alerts.", + "description": "Whether to notify about resolved alerts.", "type": "boolean" }, - "source": { - "description": "Backlink to the sender of the notification.", + "text": { + "description": "Message body template.", "type": "string" }, - "tags": { - "description": "Comma separated list of tags attached to the notifications.", + "title": { + "description": "Message title template.", "type": "string" }, - "updateAlerts": { - "description": "Whether to update message and description of the alert in OpsGenie if it already exists By default, the alert is never updated in OpsGenie, the new message only appears in activity log.", - "type": "boolean" + "webhookUrl": { + "description": "MSTeams webhook URL.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" } }, + "required": [ + "webhookUrl" + ], "type": "object" }, "type": "array" }, - "pagerdutyConfigs": { - "description": "List of PagerDuty configurations.", + "name": { + "description": "Name of the receiver. Must be unique across all items from the list.", + "minLength": 1, + "type": "string" + }, + "opsgenieConfigs": { + "description": "List of OpsGenie configurations.", "items": { - "description": "PagerDutyConfig configures notifications via PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config", + "description": "OpsGenieConfig configures notifications via OpsGenie. See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config", "properties": { - "class": { - "description": "The class/type of the event.", - "type": "string" - }, - "client": { - "description": "Client identification.", + "actions": { + "description": "Comma separated list of actions that will be available for the alert.", "type": "string" }, - "clientURL": { - "description": "Backlink to the sender of notification.", - "type": "string" + "apiKey": { + "description": "The secret's key that contains the OpsGenie API key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" }, - "component": { - "description": "The part or component of the affected system that is broken.", + "apiURL": { + "description": "The URL to send OpsGenie API requests to.", "type": "string" }, "description": { @@ -1404,7 +1329,7 @@ "type": "string" }, "details": { - "description": "Arbitrary key/value pairs that provide further detail about the incident.", + "description": "A set of arbitrary key/value pairs that provide further detail about the incident.", "items": { "description": "KeyValue defines a (key, value) tuple.", "properties": { @@ -1426,8 +1351,8 @@ }, "type": "array" }, - "group": { - "description": "A cluster or grouping of sources.", + "entity": { + "description": "Optional field that can be used to specify which domain alert is related to.", "type": "string" }, "httpConfig": { @@ -1785,118 +1710,127 @@ }, "type": "object" }, - "pagerDutyImageConfigs": { - "description": "A list of image details to attach that provide further detail about an incident.", + "message": { + "description": "Alert text limited to 130 characters.", + "type": "string" + }, + "note": { + "description": "Additional alert note.", + "type": "string" + }, + "priority": { + "description": "Priority level of alert. Possible values are P1, P2, P3, P4, and P5.", + "type": "string" + }, + "responders": { + "description": "List of responders responsible for notifications.", "items": { - "description": "PagerDutyImageConfig attaches images to an incident", + "description": "OpsGenieConfigResponder defines a responder to an incident. One of `id`, `name` or `username` has to be defined.", "properties": { - "alt": { - "description": "Alt is the optional alternative text for the image.", + "id": { + "description": "ID of the responder.", "type": "string" }, - "href": { - "description": "Optional URL; makes the image a clickable link.", + "name": { + "description": "Name of the responder.", "type": "string" }, - "src": { - "description": "Src of the image being attached to the incident", + "type": { + "description": "Type of responder.", + "enum": [ + "team", + "teams", + "user", + "escalation", + "schedule" + ], + "minLength": 1, + "type": "string" + }, + "username": { + "description": "Username of the responder.", "type": "string" } }, + "required": [ + "type" + ], "type": "object" }, "type": "array" }, - "pagerDutyLinkConfigs": { - "description": "A list of link details to attach that provide further detail about an incident.", - "items": { - "description": "PagerDutyLinkConfig attaches text links to an incident", - "properties": { - "alt": { - "description": "Text that describes the purpose of the link, and can be used as the link's text.", - "type": "string" - }, - "href": { - "description": "Href is the URL of the link to be attached", - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "routingKey": { - "description": "The secret's key that contains the PagerDuty integration key (when using Events API v2). Either this field or `serviceKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - "properties": { - "key": { - "description": "The key of the secret to select from. Must be a valid secret key.", - "type": "string" - }, - "name": { - "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", - "type": "string" - }, - "optional": { - "description": "Specify whether the Secret or its key must be defined", - "type": "boolean" - } - }, - "required": [ - "key" - ], - "type": "object" - }, "sendResolved": { "description": "Whether or not to notify about resolved alerts.", "type": "boolean" }, - "serviceKey": { - "description": "The secret's key that contains the PagerDuty service key (when using integration type \"Prometheus\"). Either this field or `routingKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - "properties": { - "key": { - "description": "The key of the secret to select from. Must be a valid secret key.", - "type": "string" - }, - "name": { - "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", - "type": "string" - }, - "optional": { - "description": "Specify whether the Secret or its key must be defined", - "type": "boolean" - } - }, - "required": [ - "key" - ], - "type": "object" - }, - "severity": { - "description": "Severity of the incident.", + "source": { + "description": "Backlink to the sender of the notification.", "type": "string" }, - "url": { - "description": "The URL to send requests to.", + "tags": { + "description": "Comma separated list of tags attached to the notifications.", "type": "string" + }, + "updateAlerts": { + "description": "Whether to update message and description of the alert in OpsGenie if it already exists By default, the alert is never updated in OpsGenie, the new message only appears in activity log.", + "type": "boolean" } }, "type": "object" }, "type": "array" }, - "pushoverConfigs": { - "description": "List of Pushover configurations.", + "pagerdutyConfigs": { + "description": "List of PagerDuty configurations.", "items": { - "description": "PushoverConfig configures notifications via Pushover. See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config", + "description": "PagerDutyConfig configures notifications via PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config", "properties": { - "expire": { - "description": "How long your notification will continue to be retried for, unless the user acknowledges the notification.", - "pattern": "^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$", + "class": { + "description": "The class/type of the event.", "type": "string" }, - "html": { - "description": "Whether notification message is HTML or plain text.", - "type": "boolean" + "client": { + "description": "Client identification.", + "type": "string" + }, + "clientURL": { + "description": "Backlink to the sender of notification.", + "type": "string" + }, + "component": { + "description": "The part or component of the affected system that is broken.", + "type": "string" + }, + "description": { + "description": "Description of the incident.", + "type": "string" + }, + "details": { + "description": "Arbitrary key/value pairs that provide further detail about the incident.", + "items": { + "description": "KeyValue defines a (key, value) tuple.", + "properties": { + "key": { + "description": "Key of the tuple.", + "minLength": 1, + "type": "string" + }, + "value": { + "description": "Value of the tuple.", + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "group": { + "description": "A cluster or grouping of sources.", + "type": "string" }, "httpConfig": { "description": "HTTP client configuration.", @@ -2253,33 +2187,48 @@ }, "type": "object" }, - "message": { - "description": "Notification message.", - "type": "string" - }, - "priority": { - "description": "Priority, see https://pushover.net/api#priority", - "type": "string" - }, - "retry": { - "description": "How often the Pushover servers will send the same notification to the user. Must be at least 30 seconds.", - "pattern": "^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$", - "type": "string" - }, - "sendResolved": { - "description": "Whether or not to notify about resolved alerts.", - "type": "boolean" - }, - "sound": { - "description": "The name of one of the sounds supported by device clients to override the user's default sound choice", - "type": "string" + "pagerDutyImageConfigs": { + "description": "A list of image details to attach that provide further detail about an incident.", + "items": { + "description": "PagerDutyImageConfig attaches images to an incident", + "properties": { + "alt": { + "description": "Alt is the optional alternative text for the image.", + "type": "string" + }, + "href": { + "description": "Optional URL; makes the image a clickable link.", + "type": "string" + }, + "src": { + "description": "Src of the image being attached to the incident", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" }, - "title": { - "description": "Notification title.", - "type": "string" + "pagerDutyLinkConfigs": { + "description": "A list of link details to attach that provide further detail about an incident.", + "items": { + "description": "PagerDutyLinkConfig attaches text links to an incident", + "properties": { + "alt": { + "description": "Text that describes the purpose of the link, and can be used as the link's text.", + "type": "string" + }, + "href": { + "description": "Href is the URL of the link to be attached", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" }, - "token": { - "description": "The secret's key that contains the registered application's API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + "routingKey": { + "description": "The secret's key that contains the PagerDuty integration key (when using Events API v2). Either this field or `serviceKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", "properties": { "key": { "description": "The key of the secret to select from. Must be a valid secret key.", @@ -2299,16 +2248,12 @@ ], "type": "object" }, - "url": { - "description": "A supplementary URL shown alongside the message.", - "type": "string" - }, - "urlTitle": { - "description": "A title for supplementary URL, otherwise just the URL is shown", - "type": "string" + "sendResolved": { + "description": "Whether or not to notify about resolved alerts.", + "type": "boolean" }, - "userKey": { - "description": "The secret's key that contains the recipient user's user key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + "serviceKey": { + "description": "The secret's key that contains the PagerDuty service key (when using integration type \"Prometheus\"). Either this field or `routingKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", "properties": { "key": { "description": "The key of the secret to select from. Must be a valid secret key.", @@ -2327,135 +2272,1019 @@ "key" ], "type": "object" + }, + "severity": { + "description": "Severity of the incident.", + "type": "string" + }, + "url": { + "description": "The URL to send requests to.", + "type": "string" } }, "type": "object" }, "type": "array" }, - "slackConfigs": { - "description": "List of Slack configurations.", + "pushoverConfigs": { + "description": "List of Pushover configurations.", "items": { - "description": "SlackConfig configures notifications via Slack. See https://prometheus.io/docs/alerting/latest/configuration/#slack_config", + "description": "PushoverConfig configures notifications via Pushover. See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config", "properties": { - "actions": { - "description": "A list of Slack actions that are sent with each notification.", - "items": { - "description": "SlackAction configures a single Slack action that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields and https://api.slack.com/docs/message-buttons for more information.", - "properties": { - "confirm": { - "description": "SlackConfirmationField protect users from destructive actions or particularly distinguished decisions by asking them to confirm their button click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields for more information.", - "properties": { - "dismissText": { - "type": "string" - }, - "okText": { - "type": "string" - }, - "text": { - "minLength": 1, - "type": "string" + "expire": { + "description": "How long your notification will continue to be retried for, unless the user acknowledges the notification.", + "pattern": "^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$", + "type": "string" + }, + "html": { + "description": "Whether notification message is HTML or plain text.", + "type": "boolean" + }, + "httpConfig": { + "description": "HTTP client configuration.", + "properties": { + "authorization": { + "description": "Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.", + "properties": { + "credentials": { + "description": "Selects a key of a Secret in the namespace that contains the credentials for authentication.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } }, - "title": { + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "type": { + "description": "Defines the authentication type. The value is case-insensitive. \n \"Basic\" is not a supported value. \n Default: \"Bearer\"", + "type": "string" + } + }, + "type": "object" + }, + "basicAuth": { + "description": "BasicAuth for the client. This is mutually exclusive with Authorization. If both are defined, BasicAuth takes precedence.", + "properties": { + "password": { + "description": "The secret in the service monitor namespace that contains the password for authentication.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "username": { + "description": "The secret in the service monitor namespace that contains the username for authentication.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "bearerTokenSecret": { + "description": "The secret's key that contains the bearer token to be used by the client for authentication. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "followRedirects": { + "description": "FollowRedirects specifies whether the client should follow HTTP 3xx redirects.", + "type": "boolean" + }, + "oauth2": { + "description": "OAuth2 client credentials used to fetch a token for the targets.", + "properties": { + "clientId": { + "description": "The secret or configmap containing the OAuth2 client id", + "properties": { + "configMap": { + "description": "ConfigMap containing data to use for the targets.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "secret": { + "description": "Secret containing data to use for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "clientSecret": { + "description": "The secret containing the OAuth2 client secret", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "endpointParams": { + "additionalProperties": { + "type": "string" + }, + "description": "Parameters to append to the token URL", + "type": "object" + }, + "scopes": { + "description": "OAuth2 scopes used for the token request", + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "description": "The URL to fetch the token from", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "clientId", + "clientSecret", + "tokenUrl" + ], + "type": "object" + }, + "proxyURL": { + "description": "Optional proxy URL.", + "type": "string" + }, + "tlsConfig": { + "description": "TLS configuration for the client.", + "properties": { + "ca": { + "description": "Certificate authority used when verifying server certificates.", + "properties": { + "configMap": { + "description": "ConfigMap containing data to use for the targets.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "secret": { + "description": "Secret containing data to use for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "cert": { + "description": "Client certificate to present when doing client-authentication.", + "properties": { + "configMap": { + "description": "ConfigMap containing data to use for the targets.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "secret": { + "description": "Secret containing data to use for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "insecureSkipVerify": { + "description": "Disable target certificate validation.", + "type": "boolean" + }, + "keySecret": { + "description": "Secret containing the client key file for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "serverName": { + "description": "Used to verify the hostname for the targets.", + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "message": { + "description": "Notification message.", + "type": "string" + }, + "priority": { + "description": "Priority, see https://pushover.net/api#priority", + "type": "string" + }, + "retry": { + "description": "How often the Pushover servers will send the same notification to the user. Must be at least 30 seconds.", + "pattern": "^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$", + "type": "string" + }, + "sendResolved": { + "description": "Whether or not to notify about resolved alerts.", + "type": "boolean" + }, + "sound": { + "description": "The name of one of the sounds supported by device clients to override the user's default sound choice", + "type": "string" + }, + "title": { + "description": "Notification title.", + "type": "string" + }, + "token": { + "description": "The secret's key that contains the registered application's API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator. Either `token` or `tokenFile` is required.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "tokenFile": { + "description": "The token file that contains the registered application's API token, see https://pushover.net/apps. Either `token` or `tokenFile` is required. It requires Alertmanager >= v0.26.0.", + "type": "string" + }, + "url": { + "description": "A supplementary URL shown alongside the message.", + "type": "string" + }, + "urlTitle": { + "description": "A title for supplementary URL, otherwise just the URL is shown", + "type": "string" + }, + "userKey": { + "description": "The secret's key that contains the recipient user's user key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator. Either `userKey` or `userKeyFile` is required.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "userKeyFile": { + "description": "The user key file that contains the recipient user's user key. Either `userKey` or `userKeyFile` is required. It requires Alertmanager >= v0.26.0.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "slackConfigs": { + "description": "List of Slack configurations.", + "items": { + "description": "SlackConfig configures notifications via Slack. See https://prometheus.io/docs/alerting/latest/configuration/#slack_config", + "properties": { + "actions": { + "description": "A list of Slack actions that are sent with each notification.", + "items": { + "description": "SlackAction configures a single Slack action that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields and https://api.slack.com/docs/message-buttons for more information.", + "properties": { + "confirm": { + "description": "SlackConfirmationField protect users from destructive actions or particularly distinguished decisions by asking them to confirm their button click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields for more information.", + "properties": { + "dismissText": { + "type": "string" + }, + "okText": { + "type": "string" + }, + "text": { + "minLength": 1, + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "style": { + "type": "string" + }, + "text": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + }, + "url": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "apiURL": { + "description": "The secret's key that contains the Slack webhook URL. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "callbackId": { + "type": "string" + }, + "channel": { + "description": "The channel or user to send notifications to.", + "type": "string" + }, + "color": { + "type": "string" + }, + "fallback": { + "type": "string" + }, + "fields": { + "description": "A list of Slack fields that are sent with each notification.", + "items": { + "description": "SlackField configures a single Slack field that is sent with each notification. Each field must contain a title, value, and optionally, a boolean value to indicate if the field is short enough to be displayed next to other fields designated as short. See https://api.slack.com/docs/message-attachments#fields for more information.", + "properties": { + "short": { + "type": "boolean" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "value": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "title", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "footer": { + "type": "string" + }, + "httpConfig": { + "description": "HTTP client configuration.", + "properties": { + "authorization": { + "description": "Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.", + "properties": { + "credentials": { + "description": "Selects a key of a Secret in the namespace that contains the credentials for authentication.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "type": { + "description": "Defines the authentication type. The value is case-insensitive. \n \"Basic\" is not a supported value. \n Default: \"Bearer\"", + "type": "string" + } + }, + "type": "object" + }, + "basicAuth": { + "description": "BasicAuth for the client. This is mutually exclusive with Authorization. If both are defined, BasicAuth takes precedence.", + "properties": { + "password": { + "description": "The secret in the service monitor namespace that contains the password for authentication.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "username": { + "description": "The secret in the service monitor namespace that contains the username for authentication.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "bearerTokenSecret": { + "description": "The secret's key that contains the bearer token to be used by the client for authentication. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "followRedirects": { + "description": "FollowRedirects specifies whether the client should follow HTTP 3xx redirects.", + "type": "boolean" + }, + "oauth2": { + "description": "OAuth2 client credentials used to fetch a token for the targets.", + "properties": { + "clientId": { + "description": "The secret or configmap containing the OAuth2 client id", + "properties": { + "configMap": { + "description": "ConfigMap containing data to use for the targets.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "secret": { + "description": "Secret containing data to use for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "clientSecret": { + "description": "The secret containing the OAuth2 client secret", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "endpointParams": { + "additionalProperties": { "type": "string" - } + }, + "description": "Parameters to append to the token URL", + "type": "object" + }, + "scopes": { + "description": "OAuth2 scopes used for the token request", + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "description": "The URL to fetch the token from", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "clientId", + "clientSecret", + "tokenUrl" + ], + "type": "object" + }, + "proxyURL": { + "description": "Optional proxy URL.", + "type": "string" + }, + "tlsConfig": { + "description": "TLS configuration for the client.", + "properties": { + "ca": { + "description": "Certificate authority used when verifying server certificates.", + "properties": { + "configMap": { + "description": "ConfigMap containing data to use for the targets.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "secret": { + "description": "Secret containing data to use for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "cert": { + "description": "Client certificate to present when doing client-authentication.", + "properties": { + "configMap": { + "description": "ConfigMap containing data to use for the targets.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the ConfigMap or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "secret": { + "description": "Secret containing data to use for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, + "insecureSkipVerify": { + "description": "Disable target certificate validation.", + "type": "boolean" + }, + "keySecret": { + "description": "Secret containing the client key file for the targets.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" }, - "required": [ - "text" - ], - "type": "object" - }, - "name": { - "type": "string" - }, - "style": { - "type": "string" - }, - "text": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - }, - "url": { - "type": "string" + "serverName": { + "description": "Used to verify the hostname for the targets.", + "type": "string" + } }, - "value": { - "type": "string" - } - }, - "required": [ - "text", - "type" - ], - "type": "object" - }, - "type": "array" - }, - "apiURL": { - "description": "The secret's key that contains the Slack webhook URL. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - "properties": { - "key": { - "description": "The key of the secret to select from. Must be a valid secret key.", - "type": "string" - }, - "name": { - "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", - "type": "string" - }, - "optional": { - "description": "Specify whether the Secret or its key must be defined", - "type": "boolean" + "type": "object" } }, - "required": [ - "key" - ], "type": "object" }, - "callbackId": { + "iconEmoji": { "type": "string" }, - "channel": { - "description": "The channel or user to send notifications to.", + "iconURL": { "type": "string" }, - "color": { + "imageURL": { "type": "string" }, - "fallback": { - "type": "string" + "linkNames": { + "type": "boolean" }, - "fields": { - "description": "A list of Slack fields that are sent with each notification.", + "mrkdwnIn": { "items": { - "description": "SlackField configures a single Slack field that is sent with each notification. Each field must contain a title, value, and optionally, a boolean value to indicate if the field is short enough to be displayed next to other fields designated as short. See https://api.slack.com/docs/message-attachments#fields for more information.", - "properties": { - "short": { - "type": "boolean" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "value": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "title", - "value" - ], - "type": "object" + "type": "string" }, "type": "array" }, - "footer": { + "pretext": { + "type": "string" + }, + "sendResolved": { + "description": "Whether or not to notify about resolved alerts.", + "type": "boolean" + }, + "shortFields": { + "type": "boolean" + }, + "text": { + "type": "string" + }, + "thumbURL": { + "type": "string" + }, + "title": { + "type": "string" + }, + "titleLink": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "snsConfigs": { + "description": "List of SNS configurations", + "items": { + "description": "SNSConfig configures notifications via AWS SNS. See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs", + "properties": { + "apiURL": { + "description": "The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. If not specified, the SNS API URL from the SNS SDK will be used.", "type": "string" }, + "attributes": { + "additionalProperties": { + "type": "string" + }, + "description": "SNS message attributes.", + "type": "object" + }, "httpConfig": { "description": "HTTP client configuration.", "properties": { @@ -2811,47 +3640,90 @@ }, "type": "object" }, - "iconEmoji": { - "type": "string" - }, - "iconURL": { - "type": "string" - }, - "imageURL": { + "message": { + "description": "The message content of the SNS notification.", "type": "string" }, - "linkNames": { - "type": "boolean" - }, - "mrkdwnIn": { - "items": { - "type": "string" - }, - "type": "array" - }, - "pretext": { + "phoneNumber": { + "description": "Phone number if message is delivered via SMS in E.164 format. If you don't specify this value, you must specify a value for the TopicARN or TargetARN.", "type": "string" }, "sendResolved": { "description": "Whether or not to notify about resolved alerts.", "type": "boolean" }, - "shortFields": { - "type": "boolean" - }, - "text": { - "type": "string" - }, - "thumbURL": { - "type": "string" + "sigv4": { + "description": "Configures AWS's Signature Verification 4 signing process to sign requests.", + "properties": { + "accessKey": { + "description": "AccessKey is the AWS API key. If not specified, the environment variable `AWS_ACCESS_KEY_ID` is used.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "profile": { + "description": "Profile is the named AWS profile used to authenticate.", + "type": "string" + }, + "region": { + "description": "Region is the AWS region. If blank, the region from the default credentials chain used.", + "type": "string" + }, + "roleArn": { + "description": "RoleArn is the named AWS profile used to authenticate.", + "type": "string" + }, + "secretKey": { + "description": "SecretKey is the AWS API secret. If not specified, the environment variable `AWS_SECRET_ACCESS_KEY` is used.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" }, - "title": { + "subject": { + "description": "Subject line when the message is delivered to email endpoints.", "type": "string" }, - "titleLink": { + "targetARN": { + "description": "The mobile platform endpoint ARN if message is delivered via mobile notifications. If you don't specify this value, you must specify a value for the topic_arn or PhoneNumber.", "type": "string" }, - "username": { + "topicARN": { + "description": "SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic If you don't specify this value, you must specify a value for the PhoneNumber or TargetARN.", "type": "string" } }, @@ -2859,22 +3731,49 @@ }, "type": "array" }, - "snsConfigs": { - "description": "List of SNS configurations", + "telegramConfigs": { + "description": "List of Telegram configurations.", "items": { - "description": "SNSConfig configures notifications via AWS SNS. See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs", + "description": "TelegramConfig configures notifications via Telegram. See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config", "properties": { "apiURL": { - "description": "The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. If not specified, the SNS API URL from the SNS SDK will be used.", + "description": "The Telegram API URL i.e. https://api.telegram.org. If not specified, default API URL will be used.", "type": "string" }, - "attributes": { - "additionalProperties": { - "type": "string" + "botToken": { + "description": "Telegram bot token. It is mutually exclusive with `botTokenFile`. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator. \n Either `botToken` or `botTokenFile` is required.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } }, - "description": "SNS message attributes.", + "required": [ + "key" + ], "type": "object" }, + "botTokenFile": { + "description": "File to read the Telegram bot token from. It is mutually exclusive with `botToken`. Either `botToken` or `botTokenFile` is required. \n It requires Alertmanager >= v0.26.0.", + "type": "string" + }, + "chatID": { + "description": "The Telegram chat ID.", + "format": "int64", + "type": "integer" + }, + "disableNotifications": { + "description": "Disable telegram notifications", + "type": "boolean" + }, "httpConfig": { "description": "HTTP client configuration.", "properties": { @@ -3231,107 +4130,34 @@ "type": "object" }, "message": { - "description": "The message content of the SNS notification.", + "description": "Message template", "type": "string" }, - "phoneNumber": { - "description": "Phone number if message is delivered via SMS in E.164 format. If you don't specify this value, you must specify a value for the TopicARN or TargetARN.", + "parseMode": { + "description": "Parse mode for telegram message", + "enum": [ + "MarkdownV2", + "Markdown", + "HTML" + ], "type": "string" }, "sendResolved": { - "description": "Whether or not to notify about resolved alerts.", + "description": "Whether to notify about resolved alerts.", "type": "boolean" - }, - "sigv4": { - "description": "Configures AWS's Signature Verification 4 signing process to sign requests.", - "properties": { - "accessKey": { - "description": "AccessKey is the AWS API key. If not specified, the environment variable `AWS_ACCESS_KEY_ID` is used.", - "properties": { - "key": { - "description": "The key of the secret to select from. Must be a valid secret key.", - "type": "string" - }, - "name": { - "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", - "type": "string" - }, - "optional": { - "description": "Specify whether the Secret or its key must be defined", - "type": "boolean" - } - }, - "required": [ - "key" - ], - "type": "object", - "x-kubernetes-map-type": "atomic" - }, - "profile": { - "description": "Profile is the named AWS profile used to authenticate.", - "type": "string" - }, - "region": { - "description": "Region is the AWS region. If blank, the region from the default credentials chain used.", - "type": "string" - }, - "roleArn": { - "description": "RoleArn is the named AWS profile used to authenticate.", - "type": "string" - }, - "secretKey": { - "description": "SecretKey is the AWS API secret. If not specified, the environment variable `AWS_SECRET_ACCESS_KEY` is used.", - "properties": { - "key": { - "description": "The key of the secret to select from. Must be a valid secret key.", - "type": "string" - }, - "name": { - "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", - "type": "string" - }, - "optional": { - "description": "Specify whether the Secret or its key must be defined", - "type": "boolean" - } - }, - "required": [ - "key" - ], - "type": "object", - "x-kubernetes-map-type": "atomic" - } - }, - "type": "object" - }, - "subject": { - "description": "Subject line when the message is delivered to email endpoints.", - "type": "string" - }, - "targetARN": { - "description": "The mobile platform endpoint ARN if message is delivered via mobile notifications. If you don't specify this value, you must specify a value for the topic_arn or PhoneNumber.", - "type": "string" - }, - "topicARN": { - "description": "SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic If you don't specify this value, you must specify a value for the PhoneNumber or TargetARN.", - "type": "string" } }, "type": "object" }, "type": "array" }, - "telegramConfigs": { - "description": "List of Telegram configurations.", + "victoropsConfigs": { + "description": "List of VictorOps configurations.", "items": { - "description": "TelegramConfig configures notifications via Telegram. See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config", + "description": "VictorOpsConfig configures notifications via VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config", "properties": { - "apiURL": { - "description": "The Telegram API URL i.e. https://api.telegram.org. If not specified, default API URL will be used.", - "type": "string" - }, - "botToken": { - "description": "Telegram bot token The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + "apiKey": { + "description": "The secret's key that contains the API key to use when talking to the VictorOps API. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", "properties": { "key": { "description": "The key of the secret to select from. Must be a valid secret key.", @@ -3351,17 +4177,39 @@ ], "type": "object" }, - "chatID": { - "description": "The Telegram chat ID.", - "format": "int64", - "type": "integer" + "apiUrl": { + "description": "The VictorOps API URL.", + "type": "string" }, - "disableNotifications": { - "description": "Disable telegram notifications", - "type": "boolean" + "customFields": { + "description": "Additional custom fields for notification.", + "items": { + "description": "KeyValue defines a (key, value) tuple.", + "properties": { + "key": { + "description": "Key of the tuple.", + "minLength": 1, + "type": "string" + }, + "value": { + "description": "Value of the tuple.", + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "entityDisplayName": { + "description": "Contains summary of the alerted problem.", + "type": "string" }, "httpConfig": { - "description": "HTTP client configuration.", + "description": "The HTTP client's configuration.", "properties": { "authorization": { "description": "Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.", @@ -3715,87 +4563,43 @@ }, "type": "object" }, - "message": { - "description": "Message template", + "messageType": { + "description": "Describes the behavior of the alert (CRITICAL, WARNING, INFO).", "type": "string" }, - "parseMode": { - "description": "Parse mode for telegram message", - "enum": [ - "MarkdownV2", - "Markdown", - "HTML" - ], + "monitoringTool": { + "description": "The monitoring tool the state message is from.", + "type": "string" + }, + "routingKey": { + "description": "A key used to map the alert to a team.", "type": "string" }, "sendResolved": { - "description": "Whether to notify about resolved alerts.", + "description": "Whether or not to notify about resolved alerts.", "type": "boolean" + }, + "stateMessage": { + "description": "Contains long explanation of the alerted problem.", + "type": "string" } }, "type": "object" }, "type": "array" }, - "victoropsConfigs": { - "description": "List of VictorOps configurations.", + "webexConfigs": { + "description": "List of Webex configurations.", "items": { - "description": "VictorOpsConfig configures notifications via VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config", + "description": "WebexConfig configures notification via Cisco Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config", "properties": { - "apiKey": { - "description": "The secret's key that contains the API key to use when talking to the VictorOps API. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - "properties": { - "key": { - "description": "The key of the secret to select from. Must be a valid secret key.", - "type": "string" - }, - "name": { - "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", - "type": "string" - }, - "optional": { - "description": "Specify whether the Secret or its key must be defined", - "type": "boolean" - } - }, - "required": [ - "key" - ], - "type": "object" - }, - "apiUrl": { - "description": "The VictorOps API URL.", - "type": "string" - }, - "customFields": { - "description": "Additional custom fields for notification.", - "items": { - "description": "KeyValue defines a (key, value) tuple.", - "properties": { - "key": { - "description": "Key of the tuple.", - "minLength": 1, - "type": "string" - }, - "value": { - "description": "Value of the tuple.", - "type": "string" - } - }, - "required": [ - "key", - "value" - ], - "type": "object" - }, - "type": "array" - }, - "entityDisplayName": { - "description": "Contains summary of the alerted problem.", + "apiURL": { + "description": "The Webex Teams API URL i.e. https://webexapis.com/v1/messages Provide if different from the default API URL.", + "pattern": "^https?://.+$", "type": "string" }, "httpConfig": { - "description": "The HTTP client's configuration.", + "description": "The HTTP client's configuration. You must supply the bot token via the `httpConfig.authorization` field.", "properties": { "authorization": { "description": "Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.", @@ -4149,27 +4953,23 @@ }, "type": "object" }, - "messageType": { - "description": "Describes the behavior of the alert (CRITICAL, WARNING, INFO).", - "type": "string" - }, - "monitoringTool": { - "description": "The monitoring tool the state message is from.", + "message": { + "description": "Message template", "type": "string" }, - "routingKey": { - "description": "A key used to map the alert to a team.", + "roomID": { + "description": "ID of the Webex Teams room where to send the messages.", + "minLength": 1, "type": "string" }, "sendResolved": { - "description": "Whether or not to notify about resolved alerts.", + "description": "Whether to notify about resolved alerts.", "type": "boolean" - }, - "stateMessage": { - "description": "Contains long explanation of the alerted problem.", - "type": "string" } }, + "required": [ + "roomID" + ], "type": "object" }, "type": "array" diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet index be49831bb..8dffd04cc 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagerconfigs-v1beta1-crd.libsonnet @@ -4,7 +4,7 @@ name: 'v1beta1', schema: { openAPIV3Schema: { - description: 'AlertmanagerConfig defines a namespaced AlertmanagerConfig to be aggregated across multiple namespaces configuring one Alertmanager cluster.', + description: 'AlertmanagerConfig configures the Prometheus Alertmanager, specifying how alerts should be grouped, inhibited and notified to external systems.', properties: { apiVersion: { description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources', @@ -753,75 +753,11 @@ }, type: 'array', }, - name: { - description: 'Name of the receiver. Must be unique across all items from the list.', - minLength: 1, - type: 'string', - }, - opsgenieConfigs: { - description: 'List of OpsGenie configurations.', + msteamsConfigs: { + description: 'List of MSTeams configurations. It requires Alertmanager >= 0.26.0.', items: { - description: 'OpsGenieConfig configures notifications via OpsGenie. See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config', + description: 'MSTeamsConfig configures notifications via Microsoft Teams. It requires Alertmanager >= 0.26.0.', properties: { - actions: { - description: 'Comma separated list of actions that will be available for the alert.', - type: 'string', - }, - apiKey: { - description: "The secret's key that contains the OpsGenie API key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - properties: { - key: { - description: 'The key of the secret to select from. Must be a valid secret key.', - minLength: 1, - type: 'string', - }, - name: { - description: "The name of the secret in the object's namespace to select from.", - minLength: 1, - type: 'string', - }, - }, - required: [ - 'key', - 'name', - ], - type: 'object', - }, - apiURL: { - description: 'The URL to send OpsGenie API requests to.', - type: 'string', - }, - description: { - description: 'Description of the incident.', - type: 'string', - }, - details: { - description: 'A set of arbitrary key/value pairs that provide further detail about the incident.', - items: { - description: 'KeyValue defines a (key, value) tuple.', - properties: { - key: { - description: 'Key of the tuple.', - minLength: 1, - type: 'string', - }, - value: { - description: 'Value of the tuple.', - type: 'string', - }, - }, - required: [ - 'key', - 'value', - ], - type: 'object', - }, - type: 'array', - }, - entity: { - description: 'Optional field that can be used to specify which domain alert is related to.', - type: 'string', - }, httpConfig: { description: 'HTTP client configuration.', properties: { @@ -1176,91 +1112,84 @@ }, type: 'object', }, - message: { - description: 'Alert text limited to 130 characters.', - type: 'string', + sendResolved: { + description: 'Whether to notify about resolved alerts.', + type: 'boolean', }, - note: { - description: 'Additional alert note.', + text: { + description: 'Message body template.', type: 'string', }, - priority: { - description: 'Priority level of alert. Possible values are P1, P2, P3, P4, and P5.', + title: { + description: 'Message title template.', type: 'string', }, - responders: { - description: 'List of responders responsible for notifications.', - items: { - description: 'OpsGenieConfigResponder defines a responder to an incident. One of `id`, `name` or `username` has to be defined.', - properties: { - id: { - description: 'ID of the responder.', - type: 'string', - }, - name: { - description: 'Name of the responder.', - type: 'string', - }, - type: { - description: 'Type of responder.', - enum: [ - 'team', - 'teams', - 'user', - 'escalation', - 'schedule', - ], - minLength: 1, - type: 'string', - }, - username: { - description: 'Username of the responder.', - type: 'string', - }, + webhookUrl: { + description: 'MSTeams webhook URL.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', }, - required: [ - 'type', - ], - type: 'object', }, - type: 'array', - }, - sendResolved: { - description: 'Whether or not to notify about resolved alerts.', - type: 'boolean', - }, - source: { - description: 'Backlink to the sender of the notification.', - type: 'string', - }, - tags: { - description: 'Comma separated list of tags attached to the notifications.', - type: 'string', + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', }, }, + required: [ + 'webhookUrl', + ], type: 'object', }, type: 'array', }, - pagerdutyConfigs: { - description: 'List of PagerDuty configurations.', + name: { + description: 'Name of the receiver. Must be unique across all items from the list.', + minLength: 1, + type: 'string', + }, + opsgenieConfigs: { + description: 'List of OpsGenie configurations.', items: { - description: 'PagerDutyConfig configures notifications via PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config', + description: 'OpsGenieConfig configures notifications via OpsGenie. See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config', properties: { - class: { - description: 'The class/type of the event.', - type: 'string', - }, - client: { - description: 'Client identification.', + actions: { + description: 'Comma separated list of actions that will be available for the alert.', type: 'string', }, - clientURL: { - description: 'Backlink to the sender of notification.', - type: 'string', + apiKey: { + description: "The secret's key that contains the OpsGenie API key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + minLength: 1, + type: 'string', + }, + name: { + description: "The name of the secret in the object's namespace to select from.", + minLength: 1, + type: 'string', + }, + }, + required: [ + 'key', + 'name', + ], + type: 'object', }, - component: { - description: 'The part or component of the affected system that is broken.', + apiURL: { + description: 'The URL to send OpsGenie API requests to.', type: 'string', }, description: { @@ -1268,7 +1197,7 @@ type: 'string', }, details: { - description: 'Arbitrary key/value pairs that provide further detail about the incident.', + description: 'A set of arbitrary key/value pairs that provide further detail about the incident.', items: { description: 'KeyValue defines a (key, value) tuple.', properties: { @@ -1290,8 +1219,8 @@ }, type: 'array', }, - group: { - description: 'A cluster or grouping of sources.', + entity: { + description: 'Optional field that can be used to specify which domain alert is related to.', type: 'string', }, httpConfig: { @@ -1648,96 +1577,65 @@ }, type: 'object', }, - pagerDutyImageConfigs: { - description: 'A list of image details to attach that provide further detail about an incident.', + message: { + description: 'Alert text limited to 130 characters.', + type: 'string', + }, + note: { + description: 'Additional alert note.', + type: 'string', + }, + priority: { + description: 'Priority level of alert. Possible values are P1, P2, P3, P4, and P5.', + type: 'string', + }, + responders: { + description: 'List of responders responsible for notifications.', items: { - description: 'PagerDutyImageConfig attaches images to an incident', + description: 'OpsGenieConfigResponder defines a responder to an incident. One of `id`, `name` or `username` has to be defined.', properties: { - alt: { - description: 'Alt is the optional alternative text for the image.', - type: 'string', - }, - href: { - description: 'Optional URL; makes the image a clickable link.', + id: { + description: 'ID of the responder.', type: 'string', }, - src: { - description: 'Src of the image being attached to the incident', + name: { + description: 'Name of the responder.', type: 'string', }, - }, - type: 'object', - }, - type: 'array', - }, - pagerDutyLinkConfigs: { - description: 'A list of link details to attach that provide further detail about an incident.', - items: { - description: 'PagerDutyLinkConfig attaches text links to an incident', - properties: { - alt: { - description: "Text that describes the purpose of the link, and can be used as the link's text.", + type: { + description: 'Type of responder.', + enum: [ + 'team', + 'teams', + 'user', + 'escalation', + 'schedule', + ], + minLength: 1, type: 'string', }, - href: { - description: 'Href is the URL of the link to be attached', + username: { + description: 'Username of the responder.', type: 'string', }, }, + required: [ + 'type', + ], type: 'object', }, type: 'array', }, - routingKey: { - description: "The secret's key that contains the PagerDuty integration key (when using Events API v2). Either this field or `serviceKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - properties: { - key: { - description: 'The key of the secret to select from. Must be a valid secret key.', - minLength: 1, - type: 'string', - }, - name: { - description: "The name of the secret in the object's namespace to select from.", - minLength: 1, - type: 'string', - }, - }, - required: [ - 'key', - 'name', - ], - type: 'object', - }, sendResolved: { description: 'Whether or not to notify about resolved alerts.', type: 'boolean', }, - serviceKey: { - description: "The secret's key that contains the PagerDuty service key (when using integration type \"Prometheus\"). Either this field or `routingKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - properties: { - key: { - description: 'The key of the secret to select from. Must be a valid secret key.', - minLength: 1, - type: 'string', - }, - name: { - description: "The name of the secret in the object's namespace to select from.", - minLength: 1, - type: 'string', - }, - }, - required: [ - 'key', - 'name', - ], - type: 'object', - }, - severity: { - description: 'Severity of the incident.', + source: { + description: 'Backlink to the sender of the notification.', type: 'string', }, - url: { - description: 'The URL to send requests to.', + tags: { + description: 'Comma separated list of tags attached to the notifications.', type: 'string', }, }, @@ -1745,19 +1643,57 @@ }, type: 'array', }, - pushoverConfigs: { - description: 'List of Pushover configurations.', + pagerdutyConfigs: { + description: 'List of PagerDuty configurations.', items: { - description: 'PushoverConfig configures notifications via Pushover. See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config', + description: 'PagerDutyConfig configures notifications via PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config', properties: { - expire: { - description: 'How long your notification will continue to be retried for, unless the user acknowledges the notification.', - pattern: '^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$', + class: { + description: 'The class/type of the event.', type: 'string', }, - html: { - description: 'Whether notification message is HTML or plain text.', - type: 'boolean', + client: { + description: 'Client identification.', + type: 'string', + }, + clientURL: { + description: 'Backlink to the sender of notification.', + type: 'string', + }, + component: { + description: 'The part or component of the affected system that is broken.', + type: 'string', + }, + description: { + description: 'Description of the incident.', + type: 'string', + }, + details: { + description: 'Arbitrary key/value pairs that provide further detail about the incident.', + items: { + description: 'KeyValue defines a (key, value) tuple.', + properties: { + key: { + description: 'Key of the tuple.', + minLength: 1, + type: 'string', + }, + value: { + description: 'Value of the tuple.', + type: 'string', + }, + }, + required: [ + 'key', + 'value', + ], + type: 'object', + }, + type: 'array', + }, + group: { + description: 'A cluster or grouping of sources.', + type: 'string', }, httpConfig: { description: 'HTTP client configuration.', @@ -2113,33 +2049,48 @@ }, type: 'object', }, - message: { - description: 'Notification message.', - type: 'string', - }, - priority: { - description: 'Priority, see https://pushover.net/api#priority', - type: 'string', - }, - retry: { - description: 'How often the Pushover servers will send the same notification to the user. Must be at least 30 seconds.', - pattern: '^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$', - type: 'string', - }, - sendResolved: { - description: 'Whether or not to notify about resolved alerts.', - type: 'boolean', - }, - sound: { - description: "The name of one of the sounds supported by device clients to override the user's default sound choice", - type: 'string', + pagerDutyImageConfigs: { + description: 'A list of image details to attach that provide further detail about an incident.', + items: { + description: 'PagerDutyImageConfig attaches images to an incident', + properties: { + alt: { + description: 'Alt is the optional alternative text for the image.', + type: 'string', + }, + href: { + description: 'Optional URL; makes the image a clickable link.', + type: 'string', + }, + src: { + description: 'Src of the image being attached to the incident', + type: 'string', + }, + }, + type: 'object', + }, + type: 'array', }, - title: { - description: 'Notification title.', - type: 'string', + pagerDutyLinkConfigs: { + description: 'A list of link details to attach that provide further detail about an incident.', + items: { + description: 'PagerDutyLinkConfig attaches text links to an incident', + properties: { + alt: { + description: "Text that describes the purpose of the link, and can be used as the link's text.", + type: 'string', + }, + href: { + description: 'Href is the URL of the link to be attached', + type: 'string', + }, + }, + type: 'object', + }, + type: 'array', }, - token: { - description: "The secret's key that contains the registered application's API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + routingKey: { + description: "The secret's key that contains the PagerDuty integration key (when using Events API v2). Either this field or `serviceKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", properties: { key: { description: 'The key of the secret to select from. Must be a valid secret key.', @@ -2158,16 +2109,12 @@ ], type: 'object', }, - url: { - description: 'A supplementary URL shown alongside the message.', - type: 'string', - }, - urlTitle: { - description: 'A title for supplementary URL, otherwise just the URL is shown', - type: 'string', + sendResolved: { + description: 'Whether or not to notify about resolved alerts.', + type: 'boolean', }, - userKey: { - description: "The secret's key that contains the recipient user's user key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + serviceKey: { + description: "The secret's key that contains the PagerDuty service key (when using integration type \"Prometheus\"). Either this field or `routingKey` needs to be defined. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", properties: { key: { description: 'The key of the secret to select from. Must be a valid secret key.', @@ -2186,42 +2133,504 @@ ], type: 'object', }, + severity: { + description: 'Severity of the incident.', + type: 'string', + }, + url: { + description: 'The URL to send requests to.', + type: 'string', + }, }, type: 'object', }, type: 'array', }, - slackConfigs: { - description: 'List of Slack configurations.', + pushoverConfigs: { + description: 'List of Pushover configurations.', items: { - description: 'SlackConfig configures notifications via Slack. See https://prometheus.io/docs/alerting/latest/configuration/#slack_config', + description: 'PushoverConfig configures notifications via Pushover. See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config', properties: { - actions: { - description: 'A list of Slack actions that are sent with each notification.', - items: { - description: 'SlackAction configures a single Slack action that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields and https://api.slack.com/docs/message-buttons for more information.', - properties: { - confirm: { - description: 'SlackConfirmationField protect users from destructive actions or particularly distinguished decisions by asking them to confirm their button click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields for more information.', - properties: { - dismissText: { - type: 'string', - }, - okText: { - type: 'string', - }, - text: { - minLength: 1, - type: 'string', - }, - title: { - type: 'string', + expire: { + description: 'How long your notification will continue to be retried for, unless the user acknowledges the notification.', + pattern: '^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$', + type: 'string', + }, + html: { + description: 'Whether notification message is HTML or plain text.', + type: 'boolean', + }, + httpConfig: { + description: 'HTTP client configuration.', + properties: { + authorization: { + description: 'Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.', + properties: { + credentials: { + description: 'Selects a key of a Secret in the namespace that contains the credentials for authentication.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + type: { + description: 'Defines the authentication type. The value is case-insensitive. \n "Basic" is not a supported value. \n Default: "Bearer"', + type: 'string', }, - required: [ - 'text', - ], - type: 'object', + }, + type: 'object', + }, + basicAuth: { + description: 'BasicAuth for the client. This is mutually exclusive with Authorization. If both are defined, BasicAuth takes precedence.', + properties: { + password: { + description: 'The secret in the service monitor namespace that contains the password for authentication.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + username: { + description: 'The secret in the service monitor namespace that contains the username for authentication.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + bearerTokenSecret: { + description: "The secret's key that contains the bearer token to be used by the client for authentication. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + minLength: 1, + type: 'string', + }, + name: { + description: "The name of the secret in the object's namespace to select from.", + minLength: 1, + type: 'string', + }, + }, + required: [ + 'key', + 'name', + ], + type: 'object', + }, + followRedirects: { + description: 'FollowRedirects specifies whether the client should follow HTTP 3xx redirects.', + type: 'boolean', + }, + oauth2: { + description: 'OAuth2 client credentials used to fetch a token for the targets.', + properties: { + clientId: { + description: 'The secret or configmap containing the OAuth2 client id', + properties: { + configMap: { + description: 'ConfigMap containing data to use for the targets.', + properties: { + key: { + description: 'The key to select.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the ConfigMap or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + secret: { + description: 'Secret containing data to use for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + clientSecret: { + description: 'The secret containing the OAuth2 client secret', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + endpointParams: { + additionalProperties: { + type: 'string', + }, + description: 'Parameters to append to the token URL', + type: 'object', + }, + scopes: { + description: 'OAuth2 scopes used for the token request', + items: { + type: 'string', + }, + type: 'array', + }, + tokenUrl: { + description: 'The URL to fetch the token from', + minLength: 1, + type: 'string', + }, + }, + required: [ + 'clientId', + 'clientSecret', + 'tokenUrl', + ], + type: 'object', + }, + proxyURL: { + description: 'Optional proxy URL.', + type: 'string', + }, + tlsConfig: { + description: 'TLS configuration for the client.', + properties: { + ca: { + description: 'Certificate authority used when verifying server certificates.', + properties: { + configMap: { + description: 'ConfigMap containing data to use for the targets.', + properties: { + key: { + description: 'The key to select.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the ConfigMap or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + secret: { + description: 'Secret containing data to use for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + cert: { + description: 'Client certificate to present when doing client-authentication.', + properties: { + configMap: { + description: 'ConfigMap containing data to use for the targets.', + properties: { + key: { + description: 'The key to select.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the ConfigMap or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + secret: { + description: 'Secret containing data to use for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + insecureSkipVerify: { + description: 'Disable target certificate validation.', + type: 'boolean', + }, + keySecret: { + description: 'Secret containing the client key file for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + serverName: { + description: 'Used to verify the hostname for the targets.', + type: 'string', + }, + }, + type: 'object', + }, + }, + type: 'object', + }, + message: { + description: 'Notification message.', + type: 'string', + }, + priority: { + description: 'Priority, see https://pushover.net/api#priority', + type: 'string', + }, + retry: { + description: 'How often the Pushover servers will send the same notification to the user. Must be at least 30 seconds.', + pattern: '^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$', + type: 'string', + }, + sendResolved: { + description: 'Whether or not to notify about resolved alerts.', + type: 'boolean', + }, + sound: { + description: "The name of one of the sounds supported by device clients to override the user's default sound choice", + type: 'string', + }, + title: { + description: 'Notification title.', + type: 'string', + }, + token: { + description: "The secret's key that contains the registered application's API token, see https://pushover.net/apps. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator. Either `token` or `tokenFile` is required.", + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + minLength: 1, + type: 'string', + }, + name: { + description: "The name of the secret in the object's namespace to select from.", + minLength: 1, + type: 'string', + }, + }, + required: [ + 'key', + 'name', + ], + type: 'object', + }, + tokenFile: { + description: "The token file that contains the registered application's API token, see https://pushover.net/apps. Either `token` or `tokenFile` is required. It requires Alertmanager >= v0.26.0.", + type: 'string', + }, + url: { + description: 'A supplementary URL shown alongside the message.', + type: 'string', + }, + urlTitle: { + description: 'A title for supplementary URL, otherwise just the URL is shown', + type: 'string', + }, + userKey: { + description: "The secret's key that contains the recipient user's user key. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator. Either `userKey` or `userKeyFile` is required.", + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + minLength: 1, + type: 'string', + }, + name: { + description: "The name of the secret in the object's namespace to select from.", + minLength: 1, + type: 'string', + }, + }, + required: [ + 'key', + 'name', + ], + type: 'object', + }, + userKeyFile: { + description: "The user key file that contains the recipient user's user key. Either `userKey` or `userKeyFile` is required. It requires Alertmanager >= v0.26.0.", + type: 'string', + }, + }, + type: 'object', + }, + type: 'array', + }, + slackConfigs: { + description: 'List of Slack configurations.', + items: { + description: 'SlackConfig configures notifications via Slack. See https://prometheus.io/docs/alerting/latest/configuration/#slack_config', + properties: { + actions: { + description: 'A list of Slack actions that are sent with each notification.', + items: { + description: 'SlackAction configures a single Slack action that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields and https://api.slack.com/docs/message-buttons for more information.', + properties: { + confirm: { + description: 'SlackConfirmationField protect users from destructive actions or particularly distinguished decisions by asking them to confirm their button click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields for more information.', + properties: { + dismissText: { + type: 'string', + }, + okText: { + type: 'string', + }, + text: { + minLength: 1, + type: 'string', + }, + title: { + type: 'string', + }, + }, + required: [ + 'text', + ], + type: 'object', }, name: { type: 'string', @@ -2233,86 +2642,504 @@ minLength: 1, type: 'string', }, - type: { - minLength: 1, - type: 'string', + type: { + minLength: 1, + type: 'string', + }, + url: { + type: 'string', + }, + value: { + type: 'string', + }, + }, + required: [ + 'text', + 'type', + ], + type: 'object', + }, + type: 'array', + }, + apiURL: { + description: "The secret's key that contains the Slack webhook URL. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + minLength: 1, + type: 'string', + }, + name: { + description: "The name of the secret in the object's namespace to select from.", + minLength: 1, + type: 'string', + }, + }, + required: [ + 'key', + 'name', + ], + type: 'object', + }, + callbackId: { + type: 'string', + }, + channel: { + description: 'The channel or user to send notifications to.', + type: 'string', + }, + color: { + type: 'string', + }, + fallback: { + type: 'string', + }, + fields: { + description: 'A list of Slack fields that are sent with each notification.', + items: { + description: 'SlackField configures a single Slack field that is sent with each notification. Each field must contain a title, value, and optionally, a boolean value to indicate if the field is short enough to be displayed next to other fields designated as short. See https://api.slack.com/docs/message-attachments#fields for more information.', + properties: { + short: { + type: 'boolean', + }, + title: { + minLength: 1, + type: 'string', + }, + value: { + minLength: 1, + type: 'string', + }, + }, + required: [ + 'title', + 'value', + ], + type: 'object', + }, + type: 'array', + }, + footer: { + type: 'string', + }, + httpConfig: { + description: 'HTTP client configuration.', + properties: { + authorization: { + description: 'Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.', + properties: { + credentials: { + description: 'Selects a key of a Secret in the namespace that contains the credentials for authentication.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + type: { + description: 'Defines the authentication type. The value is case-insensitive. \n "Basic" is not a supported value. \n Default: "Bearer"', + type: 'string', + }, + }, + type: 'object', + }, + basicAuth: { + description: 'BasicAuth for the client. This is mutually exclusive with Authorization. If both are defined, BasicAuth takes precedence.', + properties: { + password: { + description: 'The secret in the service monitor namespace that contains the password for authentication.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + username: { + description: 'The secret in the service monitor namespace that contains the username for authentication.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + bearerTokenSecret: { + description: "The secret's key that contains the bearer token to be used by the client for authentication. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + minLength: 1, + type: 'string', + }, + name: { + description: "The name of the secret in the object's namespace to select from.", + minLength: 1, + type: 'string', + }, }, - url: { - type: 'string', + required: [ + 'key', + 'name', + ], + type: 'object', + }, + followRedirects: { + description: 'FollowRedirects specifies whether the client should follow HTTP 3xx redirects.', + type: 'boolean', + }, + oauth2: { + description: 'OAuth2 client credentials used to fetch a token for the targets.', + properties: { + clientId: { + description: 'The secret or configmap containing the OAuth2 client id', + properties: { + configMap: { + description: 'ConfigMap containing data to use for the targets.', + properties: { + key: { + description: 'The key to select.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the ConfigMap or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + secret: { + description: 'Secret containing data to use for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + clientSecret: { + description: 'The secret containing the OAuth2 client secret', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + endpointParams: { + additionalProperties: { + type: 'string', + }, + description: 'Parameters to append to the token URL', + type: 'object', + }, + scopes: { + description: 'OAuth2 scopes used for the token request', + items: { + type: 'string', + }, + type: 'array', + }, + tokenUrl: { + description: 'The URL to fetch the token from', + minLength: 1, + type: 'string', + }, }, - value: { - type: 'string', + required: [ + 'clientId', + 'clientSecret', + 'tokenUrl', + ], + type: 'object', + }, + proxyURL: { + description: 'Optional proxy URL.', + type: 'string', + }, + tlsConfig: { + description: 'TLS configuration for the client.', + properties: { + ca: { + description: 'Certificate authority used when verifying server certificates.', + properties: { + configMap: { + description: 'ConfigMap containing data to use for the targets.', + properties: { + key: { + description: 'The key to select.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the ConfigMap or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + secret: { + description: 'Secret containing data to use for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + cert: { + description: 'Client certificate to present when doing client-authentication.', + properties: { + configMap: { + description: 'ConfigMap containing data to use for the targets.', + properties: { + key: { + description: 'The key to select.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the ConfigMap or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + secret: { + description: 'Secret containing data to use for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', + }, + insecureSkipVerify: { + description: 'Disable target certificate validation.', + type: 'boolean', + }, + keySecret: { + description: 'Secret containing the client key file for the targets.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + serverName: { + description: 'Used to verify the hostname for the targets.', + type: 'string', + }, }, - }, - required: [ - 'text', - 'type', - ], - type: 'object', - }, - type: 'array', - }, - apiURL: { - description: "The secret's key that contains the Slack webhook URL. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - properties: { - key: { - description: 'The key of the secret to select from. Must be a valid secret key.', - minLength: 1, - type: 'string', - }, - name: { - description: "The name of the secret in the object's namespace to select from.", - minLength: 1, - type: 'string', + type: 'object', }, }, - required: [ - 'key', - 'name', - ], type: 'object', }, - callbackId: { + iconEmoji: { type: 'string', }, - channel: { - description: 'The channel or user to send notifications to.', + iconURL: { type: 'string', }, - color: { + imageURL: { type: 'string', }, - fallback: { - type: 'string', + linkNames: { + type: 'boolean', }, - fields: { - description: 'A list of Slack fields that are sent with each notification.', + mrkdwnIn: { items: { - description: 'SlackField configures a single Slack field that is sent with each notification. Each field must contain a title, value, and optionally, a boolean value to indicate if the field is short enough to be displayed next to other fields designated as short. See https://api.slack.com/docs/message-attachments#fields for more information.', - properties: { - short: { - type: 'boolean', - }, - title: { - minLength: 1, - type: 'string', - }, - value: { - minLength: 1, - type: 'string', - }, - }, - required: [ - 'title', - 'value', - ], - type: 'object', + type: 'string', }, type: 'array', }, - footer: { + pretext: { + type: 'string', + }, + sendResolved: { + description: 'Whether or not to notify about resolved alerts.', + type: 'boolean', + }, + shortFields: { + type: 'boolean', + }, + text: { + type: 'string', + }, + thumbURL: { + type: 'string', + }, + title: { + type: 'string', + }, + titleLink: { + type: 'string', + }, + username: { + type: 'string', + }, + }, + type: 'object', + }, + type: 'array', + }, + snsConfigs: { + description: 'List of SNS configurations', + items: { + description: 'SNSConfig configures notifications via AWS SNS. See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs', + properties: { + apiURL: { + description: 'The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. If not specified, the SNS API URL from the SNS SDK will be used.', type: 'string', }, + attributes: { + additionalProperties: { + type: 'string', + }, + description: 'SNS message attributes.', + type: 'object', + }, httpConfig: { description: 'HTTP client configuration.', properties: { @@ -2667,47 +3494,90 @@ }, type: 'object', }, - iconEmoji: { - type: 'string', - }, - iconURL: { - type: 'string', - }, - imageURL: { + message: { + description: 'The message content of the SNS notification.', type: 'string', }, - linkNames: { - type: 'boolean', - }, - mrkdwnIn: { - items: { - type: 'string', - }, - type: 'array', - }, - pretext: { + phoneNumber: { + description: "Phone number if message is delivered via SMS in E.164 format. If you don't specify this value, you must specify a value for the TopicARN or TargetARN.", type: 'string', }, sendResolved: { description: 'Whether or not to notify about resolved alerts.', type: 'boolean', }, - shortFields: { - type: 'boolean', - }, - text: { - type: 'string', - }, - thumbURL: { - type: 'string', + sigv4: { + description: "Configures AWS's Signature Verification 4 signing process to sign requests.", + properties: { + accessKey: { + description: 'AccessKey is the AWS API key. If not specified, the environment variable `AWS_ACCESS_KEY_ID` is used.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + profile: { + description: 'Profile is the named AWS profile used to authenticate.', + type: 'string', + }, + region: { + description: 'Region is the AWS region. If blank, the region from the default credentials chain used.', + type: 'string', + }, + roleArn: { + description: 'RoleArn is the named AWS profile used to authenticate.', + type: 'string', + }, + secretKey: { + description: 'SecretKey is the AWS API secret. If not specified, the environment variable `AWS_SECRET_ACCESS_KEY` is used.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + type: 'string', + }, + name: { + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', + type: 'string', + }, + optional: { + description: 'Specify whether the Secret or its key must be defined', + type: 'boolean', + }, + }, + required: [ + 'key', + ], + type: 'object', + 'x-kubernetes-map-type': 'atomic', + }, + }, + type: 'object', }, - title: { + subject: { + description: 'Subject line when the message is delivered to email endpoints.', type: 'string', }, - titleLink: { + targetARN: { + description: "The mobile platform endpoint ARN if message is delivered via mobile notifications. If you don't specify this value, you must specify a value for the topic_arn or PhoneNumber.", type: 'string', }, - username: { + topicARN: { + description: "SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic If you don't specify this value, you must specify a value for the PhoneNumber or TargetARN.", type: 'string', }, }, @@ -2715,22 +3585,48 @@ }, type: 'array', }, - snsConfigs: { - description: 'List of SNS configurations', + telegramConfigs: { + description: 'List of Telegram configurations.', items: { - description: 'SNSConfig configures notifications via AWS SNS. See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs', + description: 'TelegramConfig configures notifications via Telegram. See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config', properties: { apiURL: { - description: 'The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. If not specified, the SNS API URL from the SNS SDK will be used.', + description: 'The Telegram API URL i.e. https://api.telegram.org. If not specified, default API URL will be used.', type: 'string', }, - attributes: { - additionalProperties: { - type: 'string', + botToken: { + description: 'Telegram bot token. It is mutually exclusive with `botTokenFile`. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator. \n Either `botToken` or `botTokenFile` is required.', + properties: { + key: { + description: 'The key of the secret to select from. Must be a valid secret key.', + minLength: 1, + type: 'string', + }, + name: { + description: "The name of the secret in the object's namespace to select from.", + minLength: 1, + type: 'string', + }, }, - description: 'SNS message attributes.', + required: [ + 'key', + 'name', + ], type: 'object', }, + botTokenFile: { + description: 'File to read the Telegram bot token from. It is mutually exclusive with `botToken`. Either `botToken` or `botTokenFile` is required. \n It requires Alertmanager >= v0.26.0.', + type: 'string', + }, + chatID: { + description: 'The Telegram chat ID.', + format: 'int64', + type: 'integer', + }, + disableNotifications: { + description: 'Disable telegram notifications', + type: 'boolean', + }, httpConfig: { description: 'HTTP client configuration.', properties: { @@ -3086,107 +3982,34 @@ type: 'object', }, message: { - description: 'The message content of the SNS notification.', + description: 'Message template', type: 'string', }, - phoneNumber: { - description: "Phone number if message is delivered via SMS in E.164 format. If you don't specify this value, you must specify a value for the TopicARN or TargetARN.", + parseMode: { + description: 'Parse mode for telegram message', + enum: [ + 'MarkdownV2', + 'Markdown', + 'HTML', + ], type: 'string', }, sendResolved: { - description: 'Whether or not to notify about resolved alerts.', + description: 'Whether to notify about resolved alerts.', type: 'boolean', }, - sigv4: { - description: "Configures AWS's Signature Verification 4 signing process to sign requests.", - properties: { - accessKey: { - description: 'AccessKey is the AWS API key. If not specified, the environment variable `AWS_ACCESS_KEY_ID` is used.', - properties: { - key: { - description: 'The key of the secret to select from. Must be a valid secret key.', - type: 'string', - }, - name: { - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', - type: 'string', - }, - optional: { - description: 'Specify whether the Secret or its key must be defined', - type: 'boolean', - }, - }, - required: [ - 'key', - ], - type: 'object', - 'x-kubernetes-map-type': 'atomic', - }, - profile: { - description: 'Profile is the named AWS profile used to authenticate.', - type: 'string', - }, - region: { - description: 'Region is the AWS region. If blank, the region from the default credentials chain used.', - type: 'string', - }, - roleArn: { - description: 'RoleArn is the named AWS profile used to authenticate.', - type: 'string', - }, - secretKey: { - description: 'SecretKey is the AWS API secret. If not specified, the environment variable `AWS_SECRET_ACCESS_KEY` is used.', - properties: { - key: { - description: 'The key of the secret to select from. Must be a valid secret key.', - type: 'string', - }, - name: { - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?', - type: 'string', - }, - optional: { - description: 'Specify whether the Secret or its key must be defined', - type: 'boolean', - }, - }, - required: [ - 'key', - ], - type: 'object', - 'x-kubernetes-map-type': 'atomic', - }, - }, - type: 'object', - }, - subject: { - description: 'Subject line when the message is delivered to email endpoints.', - type: 'string', - }, - targetARN: { - description: "The mobile platform endpoint ARN if message is delivered via mobile notifications. If you don't specify this value, you must specify a value for the topic_arn or PhoneNumber.", - type: 'string', - }, - topicARN: { - description: "SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic If you don't specify this value, you must specify a value for the PhoneNumber or TargetARN.", - type: 'string', - }, }, type: 'object', }, type: 'array', }, - telegramConfigs: { - description: 'List of Telegram configurations.', + victoropsConfigs: { + description: 'List of VictorOps configurations.', items: { - description: 'TelegramConfig configures notifications via Telegram. See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config', + description: 'VictorOpsConfig configures notifications via VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config', properties: { - apiURL: { - description: 'The Telegram API URL i.e. https://api.telegram.org. If not specified, default API URL will be used.', - type: 'string', - }, - botToken: { - description: 'Telegram bot token The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.', + apiKey: { + description: "The secret's key that contains the API key to use when talking to the VictorOps API. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", properties: { key: { description: 'The key of the secret to select from. Must be a valid secret key.', @@ -3205,17 +4028,39 @@ ], type: 'object', }, - chatID: { - description: 'The Telegram chat ID.', - format: 'int64', - type: 'integer', + apiUrl: { + description: 'The VictorOps API URL.', + type: 'string', }, - disableNotifications: { - description: 'Disable telegram notifications', - type: 'boolean', + customFields: { + description: 'Additional custom fields for notification.', + items: { + description: 'KeyValue defines a (key, value) tuple.', + properties: { + key: { + description: 'Key of the tuple.', + minLength: 1, + type: 'string', + }, + value: { + description: 'Value of the tuple.', + type: 'string', + }, + }, + required: [ + 'key', + 'value', + ], + type: 'object', + }, + type: 'array', + }, + entityDisplayName: { + description: 'Contains summary of the alerted problem.', + type: 'string', }, httpConfig: { - description: 'HTTP client configuration.', + description: "The HTTP client's configuration.", properties: { authorization: { description: 'Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.', @@ -3568,86 +4413,43 @@ }, type: 'object', }, - message: { - description: 'Message template', + messageType: { + description: 'Describes the behavior of the alert (CRITICAL, WARNING, INFO).', type: 'string', }, - parseMode: { - description: 'Parse mode for telegram message', - enum: [ - 'MarkdownV2', - 'Markdown', - 'HTML', - ], + monitoringTool: { + description: 'The monitoring tool the state message is from.', + type: 'string', + }, + routingKey: { + description: 'A key used to map the alert to a team.', type: 'string', }, sendResolved: { - description: 'Whether to notify about resolved alerts.', + description: 'Whether or not to notify about resolved alerts.', type: 'boolean', }, + stateMessage: { + description: 'Contains long explanation of the alerted problem.', + type: 'string', + }, }, type: 'object', }, type: 'array', }, - victoropsConfigs: { - description: 'List of VictorOps configurations.', + webexConfigs: { + description: 'List of Webex configurations.', items: { - description: 'VictorOpsConfig configures notifications via VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config', + description: 'WebexConfig configures notification via Cisco Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config', properties: { - apiKey: { - description: "The secret's key that contains the API key to use when talking to the VictorOps API. The secret needs to be in the same namespace as the AlertmanagerConfig object and accessible by the Prometheus Operator.", - properties: { - key: { - description: 'The key of the secret to select from. Must be a valid secret key.', - minLength: 1, - type: 'string', - }, - name: { - description: "The name of the secret in the object's namespace to select from.", - minLength: 1, - type: 'string', - }, - }, - required: [ - 'key', - 'name', - ], - type: 'object', - }, - apiUrl: { - description: 'The VictorOps API URL.', - type: 'string', - }, - customFields: { - description: 'Additional custom fields for notification.', - items: { - description: 'KeyValue defines a (key, value) tuple.', - properties: { - key: { - description: 'Key of the tuple.', - minLength: 1, - type: 'string', - }, - value: { - description: 'Value of the tuple.', - type: 'string', - }, - }, - required: [ - 'key', - 'value', - ], - type: 'object', - }, - type: 'array', - }, - entityDisplayName: { - description: 'Contains summary of the alerted problem.', + apiURL: { + description: 'The Webex Teams API URL i.e. https://webexapis.com/v1/messages', + pattern: '^https?://.+$', type: 'string', }, httpConfig: { - description: "The HTTP client's configuration.", + description: "The HTTP client's configuration. You must use this configuration to supply the bot token as part of the HTTP `Authorization` header.", properties: { authorization: { description: 'Authorization header configuration for the client. This is mutually exclusive with BasicAuth and is only available starting from Alertmanager v0.22+.', @@ -4000,27 +4802,23 @@ }, type: 'object', }, - messageType: { - description: 'Describes the behavior of the alert (CRITICAL, WARNING, INFO).', - type: 'string', - }, - monitoringTool: { - description: 'The monitoring tool the state message is from.', + message: { + description: 'Message template', type: 'string', }, - routingKey: { - description: 'A key used to map the alert to a team.', + roomID: { + description: 'ID of the Webex Teams room where to send the messages.', + minLength: 1, type: 'string', }, sendResolved: { - description: 'Whether or not to notify about resolved alerts.', + description: 'Whether to notify about resolved alerts.', type: 'boolean', }, - stateMessage: { - description: 'Contains long explanation of the alerted problem.', - type: 'string', - }, }, + required: [ + 'roomID', + ], type: 'object', }, type: 'array', diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagers-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagers-crd.json index 91a79d83f..7c8ddd1ef 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagers-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/alertmanagers-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "alertmanagers.monitoring.coreos.com" @@ -2297,6 +2298,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -2378,7 +2383,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -2403,7 +2408,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -3537,6 +3542,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -3618,7 +3627,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -3643,7 +3652,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -3936,7 +3945,7 @@ "type": "boolean" }, "podMetadata": { - "description": "PodMetadata configures Labels and Annotations which are propagated to the alertmanager pods.", + "description": "PodMetadata configures labels and annotations which are propagated to the Alertmanager pods. \n The following items are reserved and cannot be overridden: * \"alertmanager\" label, set to the name of the Alertmanager instance. * \"app.kubernetes.io/instance\" label, set to the name of the Alertmanager instance. * \"app.kubernetes.io/managed-by\" label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" label, set to \"alertmanager\". * \"app.kubernetes.io/version\" label, set to the Alertmanager version. * \"kubectl.kubernetes.io/default-container\" annotation, set to \"alertmanager\".", "properties": { "annotations": { "additionalProperties": { @@ -4101,7 +4110,7 @@ "description": "The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -4156,7 +4165,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -4623,6 +4632,15 @@ }, "type": "array" }, + "allocatedResourceStatuses": { + "additionalProperties": { + "description": "When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource that it does not recognizes, then it should ignore that update and let other controllers handle it.", + "type": "string" + }, + "description": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n ClaimResourceStatus can be in any of following states: - ControllerResizeInProgress: State set when resize controller starts resizing the volume in control-plane. - ControllerResizeFailed: State set when resize has failed in resize controller with a terminal error. - NodeResizePending: State set when resize controller has finished resizing the volume but further resizing of volume is needed on the node. - NodeResizeInProgress: State set when kubelet starts resizing the volume. - NodeResizeFailed: State set when resizing has failed in kubelet with a terminal error. Transient errors don't set NodeResizeFailed. For example: if expanding a PVC for more capacity - this field can be one of the following states: - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\" When this field is not set, it means that no resize operation is in progress for the given PVC. \n A controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "type": "object", + "x-kubernetes-map-type": "granular" + }, "allocatedResources": { "additionalProperties": { "anyOf": [ @@ -4636,7 +4654,7 @@ "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true }, - "description": "allocatedResources is the storage resource within AllocatedResources tracks the capacity allocated to a PVC. It may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "description": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n Capacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. \n A controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", "type": "object" }, "capacity": { @@ -4697,10 +4715,6 @@ "phase": { "description": "phase represents the current phase of PersistentVolumeClaim.", "type": "string" - }, - "resizeStatus": { - "description": "resizeStatus stores status of resize operation. ResizeStatus is not set by default but when expansion is complete resizeStatus is set to empty string by resize controller or kubelet. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "type": "string" } }, "type": "object" diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/podmonitors-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/podmonitors-crd.json index 4cea05d9c..d8f7762cf 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/podmonitors-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/podmonitors-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "podmonitors.monitoring.coreos.com" @@ -58,6 +59,11 @@ "description": "The label to use to retrieve the job name from.", "type": "string" }, + "keepDroppedTargets": { + "description": "Per-scrape limit on the number of targets dropped by relabeling that will be kept in memory. 0 means no limit. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "labelLimit": { "description": "Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer.", "format": "int64", diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/probes-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/probes-crd.json index ffe85143a..6d85036de 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/probes-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/probes-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "probes.monitoring.coreos.com" @@ -157,6 +158,11 @@ "description": "The job name assigned to scraped metrics by default.", "type": "string" }, + "keepDroppedTargets": { + "description": "Per-scrape limit on the number of targets dropped by relabeling that will be kept in memory. 0 means no limit. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "labelLimit": { "description": "Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer.", "format": "int64", diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet index c26d688f6..1b78c2178 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet @@ -136,6 +136,11 @@ function(params) { resources: ['ingresses'], verbs: ['get', 'list', 'watch'], }, + { + apiGroups: ['storage.k8s.io'], + resources: ['storageclasses'], + verbs: ['get'], + }, ], }, diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusagents-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusagents-crd.json index 35f2c23e1..8b4862aa0 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusagents-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusagents-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "prometheusagents.monitoring.coreos.com" @@ -1879,6 +1880,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -1960,7 +1965,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -1985,7 +1990,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -2253,6 +2258,11 @@ "pattern": "(^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$", "type": "string" }, + "enforcedKeepDroppedTargets": { + "description": "When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets dropped by relabeling that will be kept in memory. The value overrides any `spec.keepDroppedTargets` set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` is greater than zero and less than `spec.enforcedKeepDroppedTargets`. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "enforcedLabelLimit": { "description": "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any `spec.labelLimit` set by ServiceMonitor, PodMonitor, Probe objects unless `spec.labelLimit` is greater than zero and less than `spec.enforcedLabelLimit`. \n It requires Prometheus >= v2.27.0.", "format": "int64", @@ -2369,7 +2379,7 @@ "type": "boolean" }, "ignoreNamespaceSelectors": { - "description": "When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe objec.", + "description": "When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe object.", "type": "boolean" }, "image": { @@ -3217,6 +3227,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -3298,7 +3312,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -3323,7 +3337,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -3575,6 +3589,11 @@ }, "type": "array" }, + "keepDroppedTargets": { + "description": "Per-scrape limit on the number of targets dropped by relabeling that will be kept in memory. 0 means no limit. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "labelLimit": { "description": "Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer.", "format": "int64", @@ -3639,7 +3658,7 @@ "type": "boolean" }, "podMetadata": { - "description": "PodMetadata configures labels and annotations which are propagated to the Prometheus pods.", + "description": "PodMetadata configures labels and annotations which are propagated to the Prometheus pods. \n The following items are reserved and cannot be overridden: * \"prometheus\" label, set to the name of the Prometheus object. * \"app.kubernetes.io/instance\" label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, set to the Prometheus version. * \"operator.prometheus.io/name\" label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" annotation, set to \"prometheus\".", "properties": { "annotations": { "additionalProperties": { @@ -3860,7 +3879,7 @@ "description": "RemoteWriteSpec defines the configuration to write samples from Prometheus to a remote endpoint.", "properties": { "authorization": { - "description": "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `sigv4`, `basicAuth`, or `oauth2`.", + "description": "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `sigv4`, `basicAuth`, `oauth2`, or `azureAd`.", "properties": { "credentials": { "description": "Selects a key of a Secret in the namespace that contains the credentials for authentication.", @@ -3895,8 +3914,39 @@ }, "type": "object" }, + "azureAd": { + "description": "AzureAD for the URL. \n It requires Prometheus >= v2.45.0. \n Cannot be set at the same time as `authorization`, `basicAuth`, `oauth2`, or `sigv4`.", + "properties": { + "cloud": { + "description": "The Azure Cloud. Options are 'AzurePublic', 'AzureChina', or 'AzureGovernment'.", + "enum": [ + "AzureChina", + "AzureGovernment", + "AzurePublic" + ], + "type": "string" + }, + "managedIdentity": { + "description": "ManagedIdentity defines the Azure User-assigned Managed identity.", + "properties": { + "clientId": { + "description": "The client id", + "type": "string" + } + }, + "required": [ + "clientId" + ], + "type": "object" + } + }, + "required": [ + "managedIdentity" + ], + "type": "object" + }, "basicAuth": { - "description": "BasicAuth configuration for the URL. \n Cannot be set at the same time as `sigv4`, `authorization`, or `oauth2`.", + "description": "BasicAuth configuration for the URL. \n Cannot be set at the same time as `sigv4`, `authorization`, `oauth2`, or `azureAd`.", "properties": { "password": { "description": "The secret in the service monitor namespace that contains the password for authentication.", @@ -3980,7 +4030,7 @@ "type": "string" }, "oauth2": { - "description": "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as `sigv4`, `authorization`, or `basicAuth`.", + "description": "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as `sigv4`, `authorization`, `basicAuth`, or `azureAd`.", "properties": { "clientId": { "description": "The secret or configmap containing the OAuth2 client id", @@ -4141,7 +4191,7 @@ "type": "boolean" }, "sigv4": { - "description": "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `authorization`, `basicAuth`, or `oauth2`.", + "description": "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `authorization`, `basicAuth`, `oauth2`, or `azureAd`.", "properties": { "accessKey": { "description": "AccessKey is the AWS API key. If not specified, the environment variable `AWS_ACCESS_KEY_ID` is used.", @@ -4664,7 +4714,7 @@ "description": "The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -4719,7 +4769,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -5273,6 +5323,15 @@ }, "type": "array" }, + "allocatedResourceStatuses": { + "additionalProperties": { + "description": "When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource that it does not recognizes, then it should ignore that update and let other controllers handle it.", + "type": "string" + }, + "description": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n ClaimResourceStatus can be in any of following states: - ControllerResizeInProgress: State set when resize controller starts resizing the volume in control-plane. - ControllerResizeFailed: State set when resize has failed in resize controller with a terminal error. - NodeResizePending: State set when resize controller has finished resizing the volume but further resizing of volume is needed on the node. - NodeResizeInProgress: State set when kubelet starts resizing the volume. - NodeResizeFailed: State set when resizing has failed in kubelet with a terminal error. Transient errors don't set NodeResizeFailed. For example: if expanding a PVC for more capacity - this field can be one of the following states: - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\" When this field is not set, it means that no resize operation is in progress for the given PVC. \n A controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "type": "object", + "x-kubernetes-map-type": "granular" + }, "allocatedResources": { "additionalProperties": { "anyOf": [ @@ -5286,7 +5345,7 @@ "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true }, - "description": "allocatedResources is the storage resource within AllocatedResources tracks the capacity allocated to a PVC. It may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "description": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n Capacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. \n A controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", "type": "object" }, "capacity": { @@ -5347,10 +5406,6 @@ "phase": { "description": "phase represents the current phase of PersistentVolumeClaim.", "type": "string" - }, - "resizeStatus": { - "description": "resizeStatus stores status of resize operation. ResizeStatus is not set by default but when expansion is complete resizeStatus is set to empty string by resize controller or kubelet. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "type": "string" } }, "type": "object" diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheuses-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheuses-crd.json index b8c74933e..a497b495f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheuses-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheuses-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "prometheuses.monitoring.coreos.com" @@ -844,7 +845,7 @@ "type": "string" }, "authorization": { - "description": "Authorization section for Alertmanager. \n Cannot be set at the same time as `basicAuth`, or `bearerTokenFile`.", + "description": "Authorization section for Alertmanager. \n Cannot be set at the same time as `basicAuth`, `bearerTokenFile` or `sigv4`.", "properties": { "credentials": { "description": "Selects a key of a Secret in the namespace that contains the credentials for authentication.", @@ -876,7 +877,7 @@ "type": "object" }, "basicAuth": { - "description": "BasicAuth configuration for Alertmanager. \n Cannot be set at the same time as `bearerTokenFile`, or `authorization`.", + "description": "BasicAuth configuration for Alertmanager. \n Cannot be set at the same time as `bearerTokenFile`, `authorization` or `sigv4`.", "properties": { "password": { "description": "The secret in the service monitor namespace that contains the password for authentication.", @@ -926,7 +927,7 @@ "type": "object" }, "bearerTokenFile": { - "description": "File to read bearer token for Alertmanager. \n Cannot be set at the same time as `basicAuth`, or `authorization`. \n *Deprecated: this will be removed in a future release. Prefer using `authorization`.*", + "description": "File to read bearer token for Alertmanager. \n Cannot be set at the same time as `basicAuth`, `authorization`, or `sigv4`. \n *Deprecated: this will be removed in a future release. Prefer using `authorization`.*", "type": "string" }, "enableHttp2": { @@ -961,6 +962,68 @@ "description": "Scheme to use when firing alerts.", "type": "string" }, + "sigv4": { + "description": "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.48.0. \n Cannot be set at the same time as `basicAuth`, `bearerTokenFile` or `authorization`.", + "properties": { + "accessKey": { + "description": "AccessKey is the AWS API key. If not specified, the environment variable `AWS_ACCESS_KEY_ID` is used.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "profile": { + "description": "Profile is the named AWS profile used to authenticate.", + "type": "string" + }, + "region": { + "description": "Region is the AWS region. If blank, the region from the default credentials chain used.", + "type": "string" + }, + "roleArn": { + "description": "RoleArn is the named AWS profile used to authenticate.", + "type": "string" + }, + "secretKey": { + "description": "SecretKey is the AWS API secret. If not specified, the environment variable `AWS_SECRET_ACCESS_KEY` is used.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + } + }, + "type": "object" + }, "timeout": { "description": "Timeout is a per-target Alertmanager timeout when pushing alerts.", "pattern": "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$", @@ -2230,6 +2293,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -2311,7 +2378,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -2336,7 +2403,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -2612,6 +2679,11 @@ "pattern": "(^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$", "type": "string" }, + "enforcedKeepDroppedTargets": { + "description": "When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets dropped by relabeling that will be kept in memory. The value overrides any `spec.keepDroppedTargets` set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` is greater than zero and less than `spec.enforcedKeepDroppedTargets`. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "enforcedLabelLimit": { "description": "When defined, enforcedLabelLimit specifies a global limit on the number of labels per sample. The value overrides any `spec.labelLimit` set by ServiceMonitor, PodMonitor, Probe objects unless `spec.labelLimit` is greater than zero and less than `spec.enforcedLabelLimit`. \n It requires Prometheus >= v2.27.0.", "format": "int64", @@ -2745,7 +2817,7 @@ "type": "boolean" }, "ignoreNamespaceSelectors": { - "description": "When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe objec.", + "description": "When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor and Probe objects will be ignored. They will only discover targets within the namespace of the PodMonitor, ServiceMonitor and Probe object.", "type": "boolean" }, "image": { @@ -3593,6 +3665,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -3674,7 +3750,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -3699,7 +3775,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -3951,6 +4027,11 @@ }, "type": "array" }, + "keepDroppedTargets": { + "description": "Per-scrape limit on the number of targets dropped by relabeling that will be kept in memory. 0 means no limit. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "labelLimit": { "description": "Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.45.0 and newer.", "format": "int64", @@ -4015,7 +4096,7 @@ "type": "boolean" }, "podMetadata": { - "description": "PodMetadata configures labels and annotations which are propagated to the Prometheus pods.", + "description": "PodMetadata configures labels and annotations which are propagated to the Prometheus pods. \n The following items are reserved and cannot be overridden: * \"prometheus\" label, set to the name of the Prometheus object. * \"app.kubernetes.io/instance\" label, set to the name of the Prometheus object. * \"app.kubernetes.io/managed-by\" label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" label, set to \"prometheus\". * \"app.kubernetes.io/version\" label, set to the Prometheus version. * \"operator.prometheus.io/name\" label, set to the name of the Prometheus object. * \"operator.prometheus.io/shard\" label, set to the shard number of the Prometheus object. * \"kubectl.kubernetes.io/default-container\" annotation, set to \"prometheus\".", "properties": { "annotations": { "additionalProperties": { @@ -4688,7 +4769,7 @@ "description": "RemoteWriteSpec defines the configuration to write samples from Prometheus to a remote endpoint.", "properties": { "authorization": { - "description": "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `sigv4`, `basicAuth`, or `oauth2`.", + "description": "Authorization section for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `sigv4`, `basicAuth`, `oauth2`, or `azureAd`.", "properties": { "credentials": { "description": "Selects a key of a Secret in the namespace that contains the credentials for authentication.", @@ -4723,8 +4804,39 @@ }, "type": "object" }, + "azureAd": { + "description": "AzureAD for the URL. \n It requires Prometheus >= v2.45.0. \n Cannot be set at the same time as `authorization`, `basicAuth`, `oauth2`, or `sigv4`.", + "properties": { + "cloud": { + "description": "The Azure Cloud. Options are 'AzurePublic', 'AzureChina', or 'AzureGovernment'.", + "enum": [ + "AzureChina", + "AzureGovernment", + "AzurePublic" + ], + "type": "string" + }, + "managedIdentity": { + "description": "ManagedIdentity defines the Azure User-assigned Managed identity.", + "properties": { + "clientId": { + "description": "The client id", + "type": "string" + } + }, + "required": [ + "clientId" + ], + "type": "object" + } + }, + "required": [ + "managedIdentity" + ], + "type": "object" + }, "basicAuth": { - "description": "BasicAuth configuration for the URL. \n Cannot be set at the same time as `sigv4`, `authorization`, or `oauth2`.", + "description": "BasicAuth configuration for the URL. \n Cannot be set at the same time as `sigv4`, `authorization`, `oauth2`, or `azureAd`.", "properties": { "password": { "description": "The secret in the service monitor namespace that contains the password for authentication.", @@ -4808,7 +4920,7 @@ "type": "string" }, "oauth2": { - "description": "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as `sigv4`, `authorization`, or `basicAuth`.", + "description": "OAuth2 configuration for the URL. \n It requires Prometheus >= v2.27.0. \n Cannot be set at the same time as `sigv4`, `authorization`, `basicAuth`, or `azureAd`.", "properties": { "clientId": { "description": "The secret or configmap containing the OAuth2 client id", @@ -4969,7 +5081,7 @@ "type": "boolean" }, "sigv4": { - "description": "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `authorization`, `basicAuth`, or `oauth2`.", + "description": "Sigv4 allows to configures AWS's Signature Verification 4 for the URL. \n It requires Prometheus >= v2.26.0. \n Cannot be set at the same time as `authorization`, `basicAuth`, `oauth2`, or `azureAd`.", "properties": { "accessKey": { "description": "AccessKey is the AWS API key. If not specified, the environment variable `AWS_ACCESS_KEY_ID` is used.", @@ -5612,7 +5724,7 @@ "description": "The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -5667,7 +5779,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -6225,6 +6337,15 @@ }, "type": "array" }, + "allocatedResourceStatuses": { + "additionalProperties": { + "description": "When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource that it does not recognizes, then it should ignore that update and let other controllers handle it.", + "type": "string" + }, + "description": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n ClaimResourceStatus can be in any of following states: - ControllerResizeInProgress: State set when resize controller starts resizing the volume in control-plane. - ControllerResizeFailed: State set when resize has failed in resize controller with a terminal error. - NodeResizePending: State set when resize controller has finished resizing the volume but further resizing of volume is needed on the node. - NodeResizeInProgress: State set when kubelet starts resizing the volume. - NodeResizeFailed: State set when resizing has failed in kubelet with a terminal error. Transient errors don't set NodeResizeFailed. For example: if expanding a PVC for more capacity - this field can be one of the following states: - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\" When this field is not set, it means that no resize operation is in progress for the given PVC. \n A controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "type": "object", + "x-kubernetes-map-type": "granular" + }, "allocatedResources": { "additionalProperties": { "anyOf": [ @@ -6238,7 +6359,7 @@ "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true }, - "description": "allocatedResources is the storage resource within AllocatedResources tracks the capacity allocated to a PVC. It may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "description": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n Capacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. \n A controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", "type": "object" }, "capacity": { @@ -6299,10 +6420,6 @@ "phase": { "description": "phase represents the current phase of PersistentVolumeClaim.", "type": "string" - }, - "resizeStatus": { - "description": "resizeStatus stores status of resize operation. ResizeStatus is not set by default but when expansion is complete resizeStatus is set to empty string by resize controller or kubelet. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "type": "string" } }, "type": "object" diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusrules-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusrules-crd.json index ae99286ab..53fd60233 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusrules-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/prometheusrules-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "prometheusrules.monitoring.coreos.com" diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/scrapeconfigs-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/scrapeconfigs-crd.json index 9e2c06eb0..b5871143f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/scrapeconfigs-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/scrapeconfigs-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "scrapeconfigs.monitoring.coreos.com" @@ -588,6 +589,138 @@ }, "type": "array" }, + "dnsSDConfigs": { + "description": "DNSSDConfigs defines a list of DNS service discovery configurations.", + "items": { + "description": "DNSSDConfig allows specifying a set of DNS domain names which are periodically queried to discover a list of targets. The DNS servers to be contacted are read from /etc/resolv.conf. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config", + "properties": { + "names": { + "description": "A list of DNS domain names to be queried.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "port": { + "description": "The port number used if the query type is not SRV Ignored for SRV records", + "type": "integer" + }, + "refreshInterval": { + "description": "RefreshInterval configures the time after which the provided names are refreshed. If not set, Prometheus uses its default value.", + "pattern": "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$", + "type": "string" + }, + "type": { + "description": "The type of DNS query to perform. One of SRV, A, AAAA or MX. If not set, Prometheus uses its default value.", + "enum": [ + "SRV", + "A", + "AAAA", + "MX" + ], + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "type": "array" + }, + "ec2SDConfigs": { + "description": "EC2SDConfigs defines a list of EC2 service discovery configurations.", + "items": { + "description": "EC2SDConfig allow retrieving scrape targets from AWS EC2 instances. The private IP address is used by default, but may be changed to the public IP address with relabeling. The IAM credentials used must have the ec2:DescribeInstances permission to discover scrape targets See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config", + "properties": { + "accessKey": { + "description": "AccessKey is the AWS API key.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "filters": { + "description": "Filters can be used optionally to filter the instance list by other criteria. Available filter criteria can be found here: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html Filter API documentation: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Filter.html", + "items": { + "description": "EC2Filter is the configuration for filtering EC2 instances.", + "properties": { + "name": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name", + "values" + ], + "type": "object" + }, + "type": "array" + }, + "port": { + "description": "The port to scrape metrics from. If using the public IP address, this must instead be specified in the relabeling rule.", + "type": "integer" + }, + "refreshInterval": { + "description": "RefreshInterval configures the refresh interval at which Prometheus will re-read the instance list.", + "pattern": "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$", + "type": "string" + }, + "region": { + "description": "The AWS region", + "type": "string" + }, + "roleARN": { + "description": "AWS Role ARN, an alternative to using AWS API keys.", + "type": "string" + }, + "secretKey": { + "description": "SecretKey is the AWS API secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", + "type": "string" + }, + "optional": { + "description": "Specify whether the Secret or its key must be defined", + "type": "boolean" + } + }, + "required": [ + "key" + ], + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, "fileSDConfigs": { "description": "FileSDConfigs defines a list of file service discovery configurations.", "items": { @@ -866,17 +999,54 @@ }, "type": "array" }, + "keepDroppedTargets": { + "description": "Per-scrape limit on the number of targets dropped by relabeling that will be kept in memory. 0 means no limit. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "kubernetesSDConfigs": { "description": "KubernetesSDConfigs defines a list of Kubernetes service discovery configurations.", "items": { "description": "KubernetesSDConfig allows retrieving scrape targets from Kubernetes' REST API. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config", "properties": { "role": { - "description": "Role of the Kubernetes entities that should be discovered. Currently the only supported role is \"Node\".", + "description": "Role of the Kubernetes entities that should be discovered.", "enum": [ - "Node" + "Node", + "node" ], "type": "string" + }, + "selectors": { + "description": "Selector to select objects.", + "items": { + "description": "K8SSelectorConfig is Kubernetes Selector Config", + "properties": { + "field": { + "type": "string" + }, + "label": { + "type": "string" + }, + "role": { + "description": "K8SRole is role of the service in Kubernetes. Currently the only supported role is \"Node\".", + "enum": [ + "Node", + "node" + ], + "type": "string" + } + }, + "required": [ + "role" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "role" + ], + "x-kubernetes-list-type": "map" } }, "required": [ @@ -901,6 +1071,75 @@ "format": "int64", "type": "integer" }, + "metricRelabelings": { + "description": "MetricRelabelConfigs to apply to samples before ingestion.", + "items": { + "description": "RelabelConfig allows dynamic rewriting of the label set for targets, alerts, scraped samples and remote write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config", + "properties": { + "action": { + "default": "replace", + "description": "Action to perform based on the regex matching. \n `Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0. \n Default: \"Replace\"", + "enum": [ + "replace", + "Replace", + "keep", + "Keep", + "drop", + "Drop", + "hashmod", + "HashMod", + "labelmap", + "LabelMap", + "labeldrop", + "LabelDrop", + "labelkeep", + "LabelKeep", + "lowercase", + "Lowercase", + "uppercase", + "Uppercase", + "keepequal", + "KeepEqual", + "dropequal", + "DropEqual" + ], + "type": "string" + }, + "modulus": { + "description": "Modulus to take of the hash of the source label values. \n Only applicable when the action is `HashMod`.", + "format": "int64", + "type": "integer" + }, + "regex": { + "description": "Regular expression against which the extracted value is matched.", + "type": "string" + }, + "replacement": { + "description": "Replacement value against which a Replace action is performed if the regular expression matches. \n Regex capture groups are available.", + "type": "string" + }, + "separator": { + "description": "Separator is the string between concatenated SourceLabels.", + "type": "string" + }, + "sourceLabels": { + "description": "The source labels select values from existing labels. Their content is concatenated using the configured Separator and matched against the configured regular expression.", + "items": { + "description": "LabelName is a valid Prometheus label name which may only contain ASCII letters, numbers, as well as underscores.", + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$", + "type": "string" + }, + "type": "array" + }, + "targetLabel": { + "description": "Label to which the resulting string is written in a replacement. \n It is mandatory for `Replace`, `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. \n Regex capture groups are available.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, "metricsPath": { "description": "MetricsPath HTTP path to scrape for metrics. If empty, Prometheus uses the default value (e.g. /metrics).", "type": "string" diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/servicemonitors-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/servicemonitors-crd.json index 85f3a4057..c6d92df01 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/servicemonitors-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/servicemonitors-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "servicemonitors.monitoring.coreos.com" @@ -636,6 +637,11 @@ "description": "JobLabel selects the label from the associated Kubernetes service which will be used as the `job` label for all metrics. \n For example: If in `ServiceMonitor.spec.jobLabel: foo` and in `Service.metadata.labels.foo: bar`, then the `job=\"bar\"` label is added to all metrics. \n If the value of this field is empty or if the label doesn't exist for the given Service, the `job` label of the metrics defaults to the name of the Kubernetes Service.", "type": "string" }, + "keepDroppedTargets": { + "description": "Per-scrape limit on the number of targets dropped by relabeling that will be kept in memory. 0 means no limit. \n It requires Prometheus >= v2.47.0.", + "format": "int64", + "type": "integer" + }, "labelLimit": { "description": "Per-scrape limit on number of labels that will be accepted for a sample. Only valid in Prometheus versions 2.27.0 and newer.", "format": "int64", diff --git a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/thanosrulers-crd.json b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/thanosrulers-crd.json index 1c20a1080..704ddcd9a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/thanosrulers-crd.json +++ b/otelcollector/otel-allocator/prometheus-operator/jsonnet/prometheus-operator/thanosrulers-crd.json @@ -3,7 +3,8 @@ "kind": "CustomResourceDefinition", "metadata": { "annotations": { - "controller-gen.kubebuilder.io/version": "v0.11.1" + "controller-gen.kubebuilder.io/version": "v0.11.1", + "operator.prometheus.io/version": "0.69.1" }, "creationTimestamp": null, "name": "thanosrulers.monitoring.coreos.com" @@ -1647,6 +1648,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -1728,7 +1733,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -1753,7 +1758,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -3083,6 +3088,10 @@ }, "type": "object" }, + "restartPolicy": { + "description": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "type": "string" + }, "securityContext": { "description": "SecurityContext defines the security options the container should be run with. If set, the fields of SecurityContext override the equivalent fields of PodSecurityContext. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", "properties": { @@ -3164,7 +3173,7 @@ "description": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -3189,7 +3198,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -3515,7 +3524,7 @@ "type": "boolean" }, "podMetadata": { - "description": "PodMetadata contains Labels and Annotations gets propagated to the thanos ruler pods.", + "description": "PodMetadata configures labels and annotations which are propagated to the ThanosRuler pods. \n The following items are reserved and cannot be overridden: * \"app.kubernetes.io/name\" label, set to \"thanos-ruler\". * \"app.kubernetes.io/managed-by\" label, set to \"prometheus-operator\". * \"app.kubernetes.io/instance\" label, set to the name of the ThanosRuler instance. * \"thanos-ruler\" label, set to the name of the ThanosRuler instance. * \"kubectl.kubernetes.io/default-container\" annotation, set to \"thanos-ruler\".", "properties": { "annotations": { "additionalProperties": { @@ -3810,7 +3819,7 @@ "description": "The seccomp options to use by the containers in this pod. Note that this field cannot be set when spec.os.name is windows.", "properties": { "localhostProfile": { - "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", + "description": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must be set if type is \"Localhost\". Must NOT be set for any other type.", "type": "string" }, "type": { @@ -3865,7 +3874,7 @@ "type": "string" }, "hostProcess": { - "description": "HostProcess determines if a container should be run as a 'Host Process' container. This field is alpha-level and will only be honored by components that enable the WindowsHostProcessContainers feature flag. Setting this field without the feature flag will result in errors when validating the Pod. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", + "description": "HostProcess determines if a container should be run as a 'Host Process' container. All of a Pod's containers must have the same effective HostProcess value (it is not allowed to have a mix of HostProcess containers and non-HostProcess containers). In addition, if HostProcess is true then HostNetwork must also be set to true.", "type": "boolean" }, "runAsUserName": { @@ -4328,6 +4337,15 @@ }, "type": "array" }, + "allocatedResourceStatuses": { + "additionalProperties": { + "description": "When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource that it does not recognizes, then it should ignore that update and let other controllers handle it.", + "type": "string" + }, + "description": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n ClaimResourceStatus can be in any of following states: - ControllerResizeInProgress: State set when resize controller starts resizing the volume in control-plane. - ControllerResizeFailed: State set when resize has failed in resize controller with a terminal error. - NodeResizePending: State set when resize controller has finished resizing the volume but further resizing of volume is needed on the node. - NodeResizeInProgress: State set when kubelet starts resizing the volume. - NodeResizeFailed: State set when resizing has failed in kubelet with a terminal error. Transient errors don't set NodeResizeFailed. For example: if expanding a PVC for more capacity - this field can be one of the following states: - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\" When this field is not set, it means that no resize operation is in progress for the given PVC. \n A controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "type": "object", + "x-kubernetes-map-type": "granular" + }, "allocatedResources": { "additionalProperties": { "anyOf": [ @@ -4341,7 +4359,7 @@ "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true }, - "description": "allocatedResources is the storage resource within AllocatedResources tracks the capacity allocated to a PVC. It may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "description": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either: * Un-prefixed keys: - storage - the capacity of the volume. * Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\" Apart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used. \n Capacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity. \n A controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC. \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", "type": "object" }, "capacity": { @@ -4402,10 +4420,6 @@ "phase": { "description": "phase represents the current phase of PersistentVolumeClaim.", "type": "string" - }, - "resizeStatus": { - "description": "resizeStatus stores status of resize operation. ResizeStatus is not set by default but when expansion is complete resizeStatus is set to empty string by resize controller or kubelet. This is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "type": "string" } }, "type": "object" diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission.go b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission.go index 139abe2ff..fa6a0cf2b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission.go @@ -23,7 +23,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/prometheus/client_golang/prometheus" v1 "k8s.io/api/admission/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -75,12 +74,8 @@ var ( // 1. PrometheusRules (validation, mutation) - ensuring created resources can be loaded by Promethues // 2. monitoringv1alpha1.AlertmanagerConfig (validation) - ensuring type Admission struct { - promRuleValidationErrorsCounter prometheus.Counter - promRuleValidationTriggeredCounter prometheus.Counter - amConfValidationErrorsCounter prometheus.Counter - amConfValidationTriggeredCounter prometheus.Counter - logger log.Logger - wh http.Handler + logger log.Logger + wh http.Handler } func New(logger log.Logger) *Admission { @@ -107,18 +102,6 @@ func (a *Admission) Register(mux *http.ServeMux) { mux.HandleFunc(convertPath, a.serveConvert) } -func (a *Admission) RegisterMetrics( - prometheusValidationTriggeredCounter, - prometheusValidationErrorsCounter, - alertManagerConfValidationTriggeredCounter, - alertManagerConfValidationErrorsCounter prometheus.Counter, -) { - a.promRuleValidationTriggeredCounter = prometheusValidationTriggeredCounter - a.promRuleValidationErrorsCounter = prometheusValidationErrorsCounter - a.amConfValidationTriggeredCounter = alertManagerConfValidationTriggeredCounter - a.amConfValidationErrorsCounter = alertManagerConfValidationErrorsCounter -} - type admitFunc func(ar v1.AdmissionReview) *v1.AdmissionResponse func (a *Admission) servePrometheusRulesMutate(w http.ResponseWriter, r *http.Request) { @@ -242,20 +225,17 @@ func (a *Admission) mutatePrometheusRules(ar v1.AdmissionReview) *v1.AdmissionRe } func (a *Admission) validatePrometheusRules(ar v1.AdmissionReview) *v1.AdmissionResponse { - a.incrementCounter(a.promRuleValidationTriggeredCounter) level.Debug(a.logger).Log("msg", "Validating prometheusrules") if ar.Request.Resource != prometheusRuleGVR { err := fmt.Errorf("expected resource to be %v, but received %v", prometheusRuleResource, ar.Request.Resource) level.Warn(a.logger).Log("err", err) - a.incrementCounter(a.promRuleValidationErrorsCounter) return toAdmissionResponseFailure("Unexpected resource kind", prometheusRuleResource, []error{err}) } promRule := &monitoringv1.PrometheusRule{} if err := json.Unmarshal(ar.Request.Object.Raw, promRule); err != nil { level.Info(a.logger).Log("msg", errUnmarshalRules, "err", err) - a.incrementCounter(a.promRuleValidationErrorsCounter) return toAdmissionResponseFailure(errUnmarshalRules, prometheusRuleResource, []error{err}) } @@ -267,7 +247,6 @@ func (a *Admission) validatePrometheusRules(ar v1.AdmissionReview) *v1.Admission level.Info(a.logger).Log("msg", m, "err", err) } - a.incrementCounter(a.promRuleValidationErrorsCounter) return toAdmissionResponseFailure("Rules are not valid", prometheusRuleResource, errors) } @@ -275,14 +254,12 @@ func (a *Admission) validatePrometheusRules(ar v1.AdmissionReview) *v1.Admission } func (a *Admission) validateAlertmanagerConfig(ar v1.AdmissionReview) *v1.AdmissionResponse { - a.incrementCounter(a.amConfValidationTriggeredCounter) level.Debug(a.logger).Log("msg", "Validating alertmanagerconfigs") gr := metav1.GroupResource{Group: ar.Request.Resource.Group, Resource: ar.Request.Resource.Resource} if gr != alertManagerConfigGR { err := fmt.Errorf("expected resource to be %v, but received %v", alertManagerConfigResource, ar.Request.Resource) level.Warn(a.logger).Log("err", err) - a.incrementCounter(a.amConfValidationErrorsCounter) return toAdmissionResponseFailure("Unexpected resource kind", alertManagerConfigResource, []error{err}) } @@ -299,7 +276,6 @@ func (a *Admission) validateAlertmanagerConfig(ar v1.AdmissionReview) *v1.Admiss if err := json.Unmarshal(ar.Request.Object.Raw, amConf); err != nil { level.Info(a.logger).Log("msg", errUnmarshalConfig, "err", err) - a.incrementCounter(a.amConfValidationErrorsCounter) return toAdmissionResponseFailure(errUnmarshalConfig, alertManagerConfigResource, []error{err}) } @@ -317,19 +293,7 @@ func (a *Admission) validateAlertmanagerConfig(ar v1.AdmissionReview) *v1.Admiss msg := "invalid config" level.Debug(a.logger).Log("msg", msg, "content", string(ar.Request.Object.Raw)) level.Info(a.logger).Log("msg", msg, "err", err) - a.incrementCounter(a.amConfValidationErrorsCounter) return toAdmissionResponseFailure("AlertmanagerConfig is invalid", alertManagerConfigResource, []error{err}) } return &v1.AdmissionResponse{Allowed: true} } - -// TODO (PhilipGough) - this can be removed when the following deprecated metrics are removed -// - prometheus_operator_rule_validation_triggered_total -// - prometheus_operator_rule_validation_errors_total -// - prometheus_operator_alertmanager_config_validation_errors_total -// - prometheus_operator_alertmanager_config_validation_triggered_total -func (a *Admission) incrementCounter(counter prometheus.Counter) { - if counter != nil { - counter.Inc() - } -} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission_test.go index 878d53b07..258d51461 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/admission_test.go @@ -28,7 +28,7 @@ import ( jsonpatch "github.com/evanphx/json-patch/v5" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/prometheus/client_golang/prometheus" + "gotest.tools/v3/golden" v1 "k8s.io/api/admission/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" @@ -40,7 +40,7 @@ func TestMutateRule(t *testing.T) { ts := server(api().servePrometheusRulesMutate) defer ts.Close() - resp := sendAdmissionReview(t, ts, goodRulesWithAnnotations) + resp := sendAdmissionReview(t, ts, golden.Get(t, "goodRulesWithAnnotations.golden")) if len(resp.Response.Patch) == 0 { t.Errorf("Expected a patch to be applied but found none") @@ -51,7 +51,7 @@ func TestMutateRuleNoAnnotations(t *testing.T) { ts := server(api().servePrometheusRulesMutate) defer ts.Close() - resp := sendAdmissionReview(t, ts, badRulesNoAnnotations) + resp := sendAdmissionReview(t, ts, golden.Get(t, "badRulesNoAnnotations.golden")) if len(resp.Response.Patch) == 0 { t.Errorf("Expected a patch to be applied but found none") @@ -62,7 +62,7 @@ func TestAdmitGoodRule(t *testing.T) { ts := server(api().servePrometheusRulesValidate) defer ts.Close() - resp := sendAdmissionReview(t, ts, goodRulesWithAnnotations) + resp := sendAdmissionReview(t, ts, golden.Get(t, "goodRulesWithAnnotations.golden")) if !resp.Response.Allowed { t.Errorf("Expected admission to be allowed but it was not") @@ -73,7 +73,7 @@ func TestAdmitGoodRuleExternalLabels(t *testing.T) { ts := server(api().servePrometheusRulesValidate) defer ts.Close() - resp := sendAdmissionReview(t, ts, goodRulesWithExternalLabelsInAnnotations) + resp := sendAdmissionReview(t, ts, golden.Get(t, "goodRulesWithExternalLabelsInAnnotations.golden")) if !resp.Response.Allowed { t.Errorf("Expected admission to be allowed but it was not") @@ -84,7 +84,7 @@ func TestAdmitBadRule(t *testing.T) { ts := server(api().servePrometheusRulesValidate) defer ts.Close() - resp := sendAdmissionReview(t, ts, badRulesNoAnnotations) + resp := sendAdmissionReview(t, ts, golden.Get(t, "badRulesNoAnnotations.golden")) if resp.Response.Allowed { t.Errorf("Expected admission to not be allowed but it was") @@ -115,7 +115,7 @@ func TestAdmitBadRuleWithBooleanInAnnotations(t *testing.T) { ts := server(api().servePrometheusRulesValidate) defer ts.Close() - resp := sendAdmissionReview(t, ts, badRulesWithBooleanInAnnotations) + resp := sendAdmissionReview(t, ts, golden.Get(t, "badRulesWithBooleanInAnnotations.golden")) if resp.Response.Allowed { t.Errorf("Expected admission to not be allowed but it was") @@ -129,7 +129,7 @@ func TestAdmitBadRuleWithBooleanInAnnotations(t *testing.T) { } func TestMutateNonStringsToStrings(t *testing.T) { - request := nonStringsInLabelsAnnotations + request := golden.Get(t, "nonStringsInLabelsAnnotations.golden") ts := server(api().servePrometheusRulesMutate) resp := sendAdmissionReview(t, ts, request) if len(resp.Response.Patch) == 0 { @@ -142,7 +142,7 @@ func TestMutateNonStringsToStrings(t *testing.T) { t.Fatal(err, "Expected a valid patch") } rev := v1.AdmissionReview{} - deserializer.Decode(nonStringsInLabelsAnnotations, nil, &rev) + deserializer.Decode(golden.Get(t, "nonStringsInLabelsAnnotations.golden"), nil, &rev) rev.Request.Object.Raw, err = patchObj.Apply(rev.Request.Object.Raw) if err != nil { fmt.Println(string(resp.Response.Patch)) @@ -171,348 +171,62 @@ func TestAlertmanagerConfigAdmission(t *testing.T) { testCases := []struct { name string apiVersion string - spec string + golden string expectAdmissionAllowed bool }{ { - name: "Test reject on duplicate receiver", - apiVersion: "v1alpha1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example" - }, - { - "name": "wechat-example" - } - ] -}`, + name: "Test reject on duplicate receiver", + apiVersion: "v1alpha1", + golden: "Test_reject_on_duplicate_receiver_v1alpha1.golden", expectAdmissionAllowed: false, }, { - name: "Test reject on duplicate receiver", - apiVersion: "v1beta1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example" - }, - { - "name": "wechat-example" - } - ] -}`, + name: "Test reject on duplicate receiver", + apiVersion: "v1beta1", + golden: "Test_reject_on_duplicate_receiver_v1beta1.golden", expectAdmissionAllowed: false, }, { - name: "Test reject on invalid receiver", - apiVersion: "v1alpha1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "https://%<>wechatserver:8080/", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ] -}`, + name: "Test reject on invalid receiver", + apiVersion: "v1alpha1", + golden: "Test_reject_on_invalid_receiver_v1alpha1.golden", expectAdmissionAllowed: false, }, { - name: "Test reject on invalid receiver", - apiVersion: "v1beta1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "https://%<>wechatserver:8080/", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ] -}`, + name: "Test reject on invalid receiver", + apiVersion: "v1beta1", + golden: "Test_reject_on_invalid_receiver_v1beta1.golden", expectAdmissionAllowed: false, }, { - name: "Test reject on invalid mute time intervals", - apiVersion: "v1alpha1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "https://wechatserver:8080", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ], - "muteTimeIntervals": [ - { - "name": "out-of-business-hours", - "timeIntervals": [ - { - "weekdays": [ - "Xaturday", - "Sunday" - ] - }, - { - "times": [ - { - "startTime": "50:00", - "endTime": "08:00" - }, - { - "startTime": "18:00", - "endTime": "24:00" - } - ] - } - ] - } - ] -}`, + name: "Test reject on invalid mute time intervals", + apiVersion: "v1alpha1", + golden: "Test_reject_on_invalid_mute_time_intervals_v1alpha1.golden", expectAdmissionAllowed: false, }, { - name: "Test reject on invalid time intervals", - apiVersion: "v1beta1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "https://wechatserver:8080", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ], - "timeIntervals": [ - { - "name": "out-of-business-hours", - "timeIntervals": [ - { - "weekdays": [ - "Xaturday", - "Sunday" - ] - }, - { - "times": [ - { - "startTime": "50:00", - "endTime": "08:00" - }, - { - "startTime": "18:00", - "endTime": "24:00" - } - ] - } - ] - } - ] -}`, + name: "Test reject on invalid time intervals", + apiVersion: "v1beta1", + golden: "Test_reject_on_invalid_time_intervals_v1beta1.golden", expectAdmissionAllowed: false, }, { - name: "Test happy path", - apiVersion: "v1alpha1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "http://wechatserver:8080/", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ], - "muteTimeIntervals": [ - { - "name": "out-of-business-hours", - "timeIntervals": [ - { - "weekdays": [ - "Saturday", - "Sunday" - ] - }, - { - "times": [ - { - "startTime": "00:00", - "endTime": "08:00" - }, - { - "startTime": "18:00", - "endTime": "24:00" - } - ] - } - ] - } - ] -}`, + name: "Test happy path", + apiVersion: "v1alpha1", + golden: "Test_happy_path_v1alpha1.golden", expectAdmissionAllowed: true, }, { - name: "Test happy path", - apiVersion: "v1beta1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "http://wechatserver:8080/", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ], - "timeIntervals": [ - { - "name": "out-of-business-hours", - "timeIntervals": [ - { - "weekdays": [ - "Saturday", - "Sunday" - ] - }, - { - "times": [ - { - "startTime": "00:00", - "endTime": "08:00" - }, - { - "startTime": "18:00", - "endTime": "24:00" - } - ] - } - ] - } - ] -}`, + name: "Test happy path", + apiVersion: "v1beta1", + golden: "Test_happy_path_v1beta1.golden", expectAdmissionAllowed: true, }, } for _, tc := range testCases { t.Run(tc.name+","+tc.apiVersion, func(t *testing.T) { - resp := sendAdmissionReview(t, ts, buildAdmissionReviewFromAlertmanagerConfigSpec(t, tc.apiVersion, tc.spec)) + resp := sendAdmissionReview(t, ts, buildAdmissionReviewFromAlertmanagerConfigSpec(t, tc.apiVersion, string(golden.Get(t, tc.golden)[:]))) if resp.Response.Allowed != tc.expectAdmissionAllowed { t.Errorf( "Unexpected admission result, wanted %v but got %v - (warnings=%v) - (details=%v)", @@ -527,69 +241,18 @@ func TestAlertmanagerConfigConversion(t *testing.T) { t.Cleanup(ts.Close) for _, tc := range []struct { - name string - from string - to string - spec string + name string + from string + to string + golden string checkFn func(converted []byte) error }{ { - name: "happy path", - from: "v1alpha1", - to: "v1beta1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "http://wechatserver:8080/", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ], - "muteTimeIntervals": [ - { - "name": "out-of-business-hours", - "timeIntervals": [ - { - "weekdays": [ - "Saturday", - "Sunday" - ] - }, - { - "times": [ - { - "startTime": "00:00", - "endTime": "08:00" - }, - { - "startTime": "18:00", - "endTime": "24:00" - } - ] - } - ] - } - ] -}`, - + name: "happy path", + from: "v1alpha1", + to: "v1beta1", + golden: "happy_path_v1alpha1_v1beta1.golden", checkFn: func(converted []byte) error { o := v1beta1.AlertmanagerConfig{} @@ -610,61 +273,10 @@ func TestAlertmanagerConfigConversion(t *testing.T) { }, }, { - name: "happy path", - from: "v1beta1", - to: "v1alpha1", - spec: `{ - "route": { - "groupBy": [ - "job" - ], - "groupWait": "30s", - "groupInterval": "5m", - "repeatInterval": "12h", - "receiver": "wechat-example" - }, - "receivers": [ - { - "name": "wechat-example", - "wechatConfigs": [ - { - "apiURL": "http://wechatserver:8080/", - "corpID": "wechat-corpid", - "apiSecret": { - "name": "wechat-config", - "key": "apiSecret" - } - } - ] - } - ], - "timeIntervals": [ - { - "name": "out-of-business-hours", - "timeIntervals": [ - { - "weekdays": [ - "Saturday", - "Sunday" - ] - }, - { - "times": [ - { - "startTime": "00:00", - "endTime": "08:00" - }, - { - "startTime": "18:00", - "endTime": "24:00" - } - ] - } - ] - } - ] -}`, - + name: "happy path", + from: "v1beta1", + to: "v1alpha1", + golden: "happy_path_v1beta1_v1alpha1.golden", checkFn: func(converted []byte) error { o := v1alpha1.AlertmanagerConfig{} @@ -686,7 +298,7 @@ func TestAlertmanagerConfigConversion(t *testing.T) { }, } { t.Run(tc.name+","+tc.from+">"+tc.to, func(t *testing.T) { - resp := sendConversionReview(t, ts, buildConversionReviewFromAlertmanagerConfigSpec(t, tc.from, tc.to, tc.spec)) + resp := sendConversionReview(t, ts, buildConversionReviewFromAlertmanagerConfigSpec(t, tc.from, tc.to, string(golden.Get(t, tc.golden)[:]))) if resp.Response.Result.Status != "Success" { t.Fatalf( "Unexpected conversion result, wanted 'Success' but got %v - (result=%v)", @@ -711,27 +323,7 @@ func TestAlertmanagerConfigConversion(t *testing.T) { } func api() *Admission { - validationTriggered := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_rule_validation_triggered_total", - Help: "Number of times a prometheusRule object triggered validation", - }) - - validationErrors := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_rule_validation_errors_total", - Help: "Number of errors that occurred while validating a prometheusRules object", - }) - alertManagerConfigValidationTriggered := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_alertmanager_config_validation_triggered_total", - Help: "Number of times an alertmanagerconfig object triggered validation", - }) - - alertManagerConfigValidationError := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "prometheus_operator_alertmanager_config_validation_errors_total", - Help: "Number of errors that occurred while validating a alertmanagerconfig object", - }) - a := New(level.NewFilter(log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)), level.AllowNone())) - a.RegisterMetrics(validationTriggered, validationErrors, alertManagerConfigValidationTriggered, alertManagerConfigValidationError) return a } @@ -779,341 +371,6 @@ func sendConversionReview(t *testing.T, ts *httptest.Server, b []byte) *apiexten return rev } -var goodRulesWithAnnotations = []byte(` -{ - "kind": "AdmissionReview", - "apiVersion": "admission.k8s.io/v1", - "request": { - "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", - "kind": { - "group": "monitoring.coreos.com", - "version": "v1", - "kind": "PrometheusRule" - }, - "resource": { - "group": "monitoring.coreos.com", - "version": "v1", - "resource": "prometheusrules" - }, - "namespace": "monitoring", - "operation": "CREATE", - "userInfo": { - "username": "kubernetes-admin", - "groups": [ - "system:masters", - "system:authenticated" - ] - }, - "object": { - "apiVersion": "monitoring.coreos.com/v1", - "kind": "PrometheusRule", - "metadata": { - "annotations": { - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" - }, - "creationTimestamp": "2019-03-27T13:02:09Z", - "generation": 1, - "name": "test", - "namespace": "monitoring", - "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" - }, - "spec": { - "groups": [ - { - "name": "test.rules", - "partial_response_strategy": "abort", - "rules": [ - { - "alert": "Test", - "annotations": { - "message": "Test rule", - "humanizePercentage": "Should work {{ $value | humanizePercentage }}" - }, - "expr": "vector(1)", - "for": "5m", - "labels": { - "severity": "critical" - } - } - ] - } - ] - } - }, - "oldObject": null, - "dryRun": false - } -} -`) - -var goodRulesWithExternalLabelsInAnnotations = []byte(` -{ - "kind": "AdmissionReview", - "apiVersion": "admission.k8s.io/v1", - "request": { - "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", - "kind": { - "group": "monitoring.coreos.com", - "version": "v1", - "kind": "PrometheusRule" - }, - "resource": { - "group": "monitoring.coreos.com", - "version": "v1", - "resource": "prometheusrules" - }, - "namespace": "monitoring", - "operation": "CREATE", - "userInfo": { - "username": "kubernetes-admin", - "groups": [ - "system:masters", - "system:authenticated" - ] - }, - "object": { - "apiVersion": "monitoring.coreos.com/v1", - "kind": "PrometheusRule", - "metadata": { - "annotations": { - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" - }, - "creationTimestamp": "2019-03-27T13:02:09Z", - "generation": 1, - "name": "test", - "namespace": "monitoring", - "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" - }, - "spec": { - "groups": [ - { - "name": "test.rules", - "rules": [ - { - "alert": "Test", - "annotations": { - "message": "Test externalLabels {{ $externalLabels.cluster }}" - }, - "expr": "vector(1)", - "for": "5m", - "labels": { - "severity": "critical" - } - } - ] - } - ] - } - }, - "oldObject": null, - "dryRun": false - } -} -`) - -var badRulesNoAnnotations = []byte(` -{ - "kind": "AdmissionReview", - "apiVersion": "admission.k8s.io/v1", - "request": { - "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", - "kind": { - "group": "monitoring.coreos.com", - "version": "v1", - "kind": "PrometheusRule" - }, - "resource": { - "group": "monitoring.coreos.com", - "version": "v1", - "resource": "prometheusrules" - }, - "namespace": "monitoring", - "operation": "CREATE", - "userInfo": { - "username": "kubernetes-admin", - "groups": [ - "system:masters", - "system:authenticated" - ] - }, - "object": { - "apiVersion": "monitoring.coreos.com/v1", - "kind": "PrometheusRule", - "metadata": { - "creationTimestamp": "2019-03-27T13:02:09Z", - "generation": 1, - "name": "test", - "namespace": "monitoring", - "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" - }, - "spec": { - "groups": [ - { - "name": "test.rules", - "rules": [ - { - "alert": "Test", - "annotations": { - "message": "Test rule", - "val": "{{ print “%f“ $value }}" - }, - "expr": "vector(1))", - "for": "5m", - "labels": { - "severity": "critical" - } - } - ] - } - ] - } - }, - "oldObject": null, - "dryRun": false - } -} -`) - -var badRulesWithBooleanInAnnotations = []byte(` -{ - "kind": "AdmissionReview", - "apiVersion": "admission.k8s.io/v1", - "request": { - "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", - "kind": { - "group": "monitoring.coreos.com", - "version": "v1", - "kind": "PrometheusRule" - }, - "resource": { - "group": "monitoring.coreos.com", - "version": "v1", - "resource": "prometheusrules" - }, - "namespace": "monitoring", - "operation": "CREATE", - "userInfo": { - "username": "kubernetes-admin", - "groups": [ - "system:masters", - "system:authenticated" - ] - }, - "object": { - "apiVersion": "monitoring.coreos.com/v1", - "kind": "PrometheusRule", - "metadata": { - "annotations": { - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" - }, - "creationTimestamp": "2019-03-27T13:02:09Z", - "generation": 1, - "name": "test", - "namespace": "monitoring", - "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" - }, - "spec": { - "groups": [ - { - "name": "test.rules", - "rules": [ - { - "alert": "Test", - "annotations": { - "badBoolean": false, - "message": "Test rule", - "humanizePercentage": "Should work {{ $value | humanizePercentage }}" - }, - "expr": "vector(1)", - "for": "5m", - "labels": { - "severity": "critical" - } - } - ] - } - ] - } - }, - "oldObject": null, - "dryRun": false - } -} -`) - -var nonStringsInLabelsAnnotations = []byte(` -{ - "kind": "AdmissionReview", - "apiVersion": "admission.k8s.io/v1", - "request": { - "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", - "kind": { - "group": "monitoring.coreos.com", - "version": "v1", - "kind": "PrometheusRule" - }, - "resource": { - "group": "monitoring.coreos.com", - "version": "v1", - "resource": "prometheusrules" - }, - "namespace": "monitoring", - "operation": "CREATE", - "userInfo": { - "username": "kubernetes-admin", - "groups": [ - "system:masters", - "system:authenticated" - ] - }, - "object": { - "apiVersion": "monitoring.coreos.com/v1", - "kind": "PrometheusRule", - "metadata": { - "annotations": { - "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" - }, - "creationTimestamp": "2019-03-27T13:02:09Z", - "generation": 1, - "name": "test", - "namespace": "monitoring", - "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" - }, - "spec": { - "groups": [ - { - "name": "test.rules", - "rules": [ - { - "alert": "Test", - "annotations": { - "annBool": false, - "message": "Test rule", - "annNil": null, - "humanizePercentage": "Should work {{ $value | humanizePercentage }}", - "annEmpty": "", - "annInteger": 1 - }, - "expr": "vector(1)", - "for": "5m", - "labels": { - "severity": "critical", - "labNil": null, - "labInt": 1, - "labEmpty": "", - "labBool": true - } - } - ] - } - ] - } - }, - "oldObject": null, - "dryRun": false - } -}`) - func buildAdmissionReviewFromAlertmanagerConfigSpec(t *testing.T, version, spec string) []byte { t.Helper() tmpl := fmt.Sprintf(` diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/jsonpatch.go b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/jsonpatch.go index b1611ed0a..79500e2cf 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/jsonpatch.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/jsonpatch.go @@ -17,14 +17,12 @@ package admission import ( "encoding/json" "fmt" - - "github.com/pkg/errors" ) func generatePatchesForNonStringLabelsAnnotations(content []byte) ([]string, error) { groups := &RuleGroups{} if err := json.Unmarshal(content, groups); err != nil { - return nil, errors.Wrap(err, "cannot unmarshal RuleGroups") + return nil, fmt.Errorf("cannot unmarshal RuleGroups: %w", err) } patches := new([]string) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1alpha1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1alpha1.golden new file mode 100644 index 000000000..c3c386670 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1alpha1.golden @@ -0,0 +1,51 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "http://wechatserver:8080/", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ], + "muteTimeIntervals": [ + { + "name": "out-of-business-hours", + "timeIntervals": [ + { + "weekdays": [ + "Saturday", + "Sunday" + ] + }, + { + "times": [ + { + "startTime": "00:00", + "endTime": "08:00" + }, + { + "startTime": "18:00", + "endTime": "24:00" + } + ] + } + ] + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1beta1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1beta1.golden new file mode 100644 index 000000000..1b23c8355 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_happy_path_v1beta1.golden @@ -0,0 +1,51 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "http://wechatserver:8080/", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ], + "timeIntervals": [ + { + "name": "out-of-business-hours", + "timeIntervals": [ + { + "weekdays": [ + "Saturday", + "Sunday" + ] + }, + { + "times": [ + { + "startTime": "00:00", + "endTime": "08:00" + }, + { + "startTime": "18:00", + "endTime": "24:00" + } + ] + } + ] + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1alpha1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1alpha1.golden new file mode 100644 index 000000000..6e1c8f8f1 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1alpha1.golden @@ -0,0 +1,19 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example" + }, + { + "name": "wechat-example" + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1beta1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1beta1.golden new file mode 100644 index 000000000..6e1c8f8f1 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_duplicate_receiver_v1beta1.golden @@ -0,0 +1,19 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example" + }, + { + "name": "wechat-example" + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_mute_time_intervals_v1alpha1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_mute_time_intervals_v1alpha1.golden new file mode 100644 index 000000000..9ac971ab0 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_mute_time_intervals_v1alpha1.golden @@ -0,0 +1,51 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "https://wechatserver:8080", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ], + "muteTimeIntervals": [ + { + "name": "out-of-business-hours", + "timeIntervals": [ + { + "weekdays": [ + "Xaturday", + "Sunday" + ] + }, + { + "times": [ + { + "startTime": "50:00", + "endTime": "08:00" + }, + { + "startTime": "18:00", + "endTime": "24:00" + } + ] + } + ] + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1alpha1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1alpha1.golden new file mode 100644 index 000000000..f8b6a1f3a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1alpha1.golden @@ -0,0 +1,26 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "https://%<>wechatserver:8080/", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1beta1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1beta1.golden new file mode 100644 index 000000000..f8b6a1f3a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_receiver_v1beta1.golden @@ -0,0 +1,26 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "https://%<>wechatserver:8080/", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_time_intervals_v1beta1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_time_intervals_v1beta1.golden new file mode 100644 index 000000000..86312ccc2 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/Test_reject_on_invalid_time_intervals_v1beta1.golden @@ -0,0 +1,51 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "https://wechatserver:8080", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ], + "timeIntervals": [ + { + "name": "out-of-business-hours", + "timeIntervals": [ + { + "weekdays": [ + "Xaturday", + "Sunday" + ] + }, + { + "times": [ + { + "startTime": "50:00", + "endTime": "08:00" + }, + { + "startTime": "18:00", + "endTime": "24:00" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesNoAnnotations.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesNoAnnotations.golden new file mode 100644 index 000000000..ec8ff95ca --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesNoAnnotations.golden @@ -0,0 +1,60 @@ +{ + "kind": "AdmissionReview", + "apiVersion": "admission.k8s.io/v1", + "request": { + "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", + "kind": { + "group": "monitoring.coreos.com", + "version": "v1", + "kind": "PrometheusRule" + }, + "resource": { + "group": "monitoring.coreos.com", + "version": "v1", + "resource": "prometheusrules" + }, + "namespace": "monitoring", + "operation": "CREATE", + "userInfo": { + "username": "kubernetes-admin", + "groups": [ + "system:masters", + "system:authenticated" + ] + }, + "object": { + "apiVersion": "monitoring.coreos.com/v1", + "kind": "PrometheusRule", + "metadata": { + "creationTimestamp": "2019-03-27T13:02:09Z", + "generation": 1, + "name": "test", + "namespace": "monitoring", + "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" + }, + "spec": { + "groups": [ + { + "name": "test.rules", + "rules": [ + { + "alert": "Test", + "annotations": { + "message": "Test rule", + "val": "{{ print “%f“ $value }}" + }, + "expr": "vector(1))", + "for": "5m", + "labels": { + "severity": "critical" + } + } + ] + } + ] + } + }, + "oldObject": null, + "dryRun": false + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesWithBooleanInAnnotations.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesWithBooleanInAnnotations.golden new file mode 100644 index 000000000..57c099855 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/badRulesWithBooleanInAnnotations.golden @@ -0,0 +1,64 @@ +{ + "kind": "AdmissionReview", + "apiVersion": "admission.k8s.io/v1", + "request": { + "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", + "kind": { + "group": "monitoring.coreos.com", + "version": "v1", + "kind": "PrometheusRule" + }, + "resource": { + "group": "monitoring.coreos.com", + "version": "v1", + "resource": "prometheusrules" + }, + "namespace": "monitoring", + "operation": "CREATE", + "userInfo": { + "username": "kubernetes-admin", + "groups": [ + "system:masters", + "system:authenticated" + ] + }, + "object": { + "apiVersion": "monitoring.coreos.com/v1", + "kind": "PrometheusRule", + "metadata": { + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" + }, + "creationTimestamp": "2019-03-27T13:02:09Z", + "generation": 1, + "name": "test", + "namespace": "monitoring", + "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" + }, + "spec": { + "groups": [ + { + "name": "test.rules", + "rules": [ + { + "alert": "Test", + "annotations": { + "badBoolean": false, + "message": "Test rule", + "humanizePercentage": "Should work {{ $value | humanizePercentage }}" + }, + "expr": "vector(1)", + "for": "5m", + "labels": { + "severity": "critical" + } + } + ] + } + ] + } + }, + "oldObject": null, + "dryRun": false + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithAnnotations.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithAnnotations.golden new file mode 100644 index 000000000..fe92c9411 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithAnnotations.golden @@ -0,0 +1,64 @@ +{ + "kind": "AdmissionReview", + "apiVersion": "admission.k8s.io/v1", + "request": { + "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", + "kind": { + "group": "monitoring.coreos.com", + "version": "v1", + "kind": "PrometheusRule" + }, + "resource": { + "group": "monitoring.coreos.com", + "version": "v1", + "resource": "prometheusrules" + }, + "namespace": "monitoring", + "operation": "CREATE", + "userInfo": { + "username": "kubernetes-admin", + "groups": [ + "system:masters", + "system:authenticated" + ] + }, + "object": { + "apiVersion": "monitoring.coreos.com/v1", + "kind": "PrometheusRule", + "metadata": { + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" + }, + "creationTimestamp": "2019-03-27T13:02:09Z", + "generation": 1, + "name": "test", + "namespace": "monitoring", + "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" + }, + "spec": { + "groups": [ + { + "name": "test.rules", + "partial_response_strategy": "abort", + "rules": [ + { + "alert": "Test", + "annotations": { + "message": "Test rule", + "humanizePercentage": "Should work {{ $value | humanizePercentage }}" + }, + "expr": "vector(1)", + "for": "5m", + "labels": { + "severity": "critical" + } + } + ] + } + ] + } + }, + "oldObject": null, + "dryRun": false + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithExternalLabelsInAnnotations.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithExternalLabelsInAnnotations.golden new file mode 100644 index 000000000..26cfe43ed --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/goodRulesWithExternalLabelsInAnnotations.golden @@ -0,0 +1,62 @@ +{ + "kind": "AdmissionReview", + "apiVersion": "admission.k8s.io/v1", + "request": { + "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", + "kind": { + "group": "monitoring.coreos.com", + "version": "v1", + "kind": "PrometheusRule" + }, + "resource": { + "group": "monitoring.coreos.com", + "version": "v1", + "resource": "prometheusrules" + }, + "namespace": "monitoring", + "operation": "CREATE", + "userInfo": { + "username": "kubernetes-admin", + "groups": [ + "system:masters", + "system:authenticated" + ] + }, + "object": { + "apiVersion": "monitoring.coreos.com/v1", + "kind": "PrometheusRule", + "metadata": { + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" + }, + "creationTimestamp": "2019-03-27T13:02:09Z", + "generation": 1, + "name": "test", + "namespace": "monitoring", + "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" + }, + "spec": { + "groups": [ + { + "name": "test.rules", + "rules": [ + { + "alert": "Test", + "annotations": { + "message": "Test externalLabels {{ $externalLabels.cluster }}" + }, + "expr": "vector(1)", + "for": "5m", + "labels": { + "severity": "critical" + } + } + ] + } + ] + } + }, + "oldObject": null, + "dryRun": false + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1alpha1_v1beta1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1alpha1_v1beta1.golden new file mode 100644 index 000000000..c3c386670 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1alpha1_v1beta1.golden @@ -0,0 +1,51 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "http://wechatserver:8080/", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ], + "muteTimeIntervals": [ + { + "name": "out-of-business-hours", + "timeIntervals": [ + { + "weekdays": [ + "Saturday", + "Sunday" + ] + }, + { + "times": [ + { + "startTime": "00:00", + "endTime": "08:00" + }, + { + "startTime": "18:00", + "endTime": "24:00" + } + ] + } + ] + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1beta1_v1alpha1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1beta1_v1alpha1.golden new file mode 100644 index 000000000..1b23c8355 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/happy_path_v1beta1_v1alpha1.golden @@ -0,0 +1,51 @@ +{ + "route": { + "groupBy": [ + "job" + ], + "groupWait": "30s", + "groupInterval": "5m", + "repeatInterval": "12h", + "receiver": "wechat-example" + }, + "receivers": [ + { + "name": "wechat-example", + "wechatConfigs": [ + { + "apiURL": "http://wechatserver:8080/", + "corpID": "wechat-corpid", + "apiSecret": { + "name": "wechat-config", + "key": "apiSecret" + } + } + ] + } + ], + "timeIntervals": [ + { + "name": "out-of-business-hours", + "timeIntervals": [ + { + "weekdays": [ + "Saturday", + "Sunday" + ] + }, + { + "times": [ + { + "startTime": "00:00", + "endTime": "08:00" + }, + { + "startTime": "18:00", + "endTime": "24:00" + } + ] + } + ] + } + ] +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/nonStringsInLabelsAnnotations.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/nonStringsInLabelsAnnotations.golden new file mode 100644 index 000000000..4f545ab9d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/admission/testdata/nonStringsInLabelsAnnotations.golden @@ -0,0 +1,71 @@ +{ + "kind": "AdmissionReview", + "apiVersion": "admission.k8s.io/v1", + "request": { + "uid": "87c5df7f-5090-11e9-b9b4-02425473f309", + "kind": { + "group": "monitoring.coreos.com", + "version": "v1", + "kind": "PrometheusRule" + }, + "resource": { + "group": "monitoring.coreos.com", + "version": "v1", + "resource": "prometheusrules" + }, + "namespace": "monitoring", + "operation": "CREATE", + "userInfo": { + "username": "kubernetes-admin", + "groups": [ + "system:masters", + "system:authenticated" + ] + }, + "object": { + "apiVersion": "monitoring.coreos.com/v1", + "kind": "PrometheusRule", + "metadata": { + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"monitoring.coreos.com/v1\",\"kind\":\"PrometheusRule\",\"metadata\":{\"annotations\":{},\"name\":\"test\",\"namespace\":\"monitoring\"},\"spec\":{\"groups\":[{\"name\":\"test.rules\",\"rules\":[{\"alert\":\"Test\",\"annotations\":{\"message\":\"Test rule\"},\"expr\":\"vector(1))\",\"for\":\"5m\",\"labels\":{\"severity\":\"critical\"}}]}]}}\n" + }, + "creationTimestamp": "2019-03-27T13:02:09Z", + "generation": 1, + "name": "test", + "namespace": "monitoring", + "uid": "87c5d31d-5090-11e9-b9b4-02425473f309" + }, + "spec": { + "groups": [ + { + "name": "test.rules", + "rules": [ + { + "alert": "Test", + "annotations": { + "annBool": false, + "message": "Test rule", + "annNil": null, + "humanizePercentage": "Should work {{ $value | humanizePercentage }}", + "annEmpty": "", + "annInteger": 1 + }, + "expr": "vector(1)", + "for": "5m", + "labels": { + "severity": "critical", + "labNil": null, + "labInt": 1, + "labEmpty": "", + "labBool": true + } + } + ] + } + ] + } + }, + "oldObject": null, + "dryRun": false + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg.go index ac506d144..61af75697 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg.go @@ -17,6 +17,7 @@ package alertmanager import ( "context" "crypto/tls" + "errors" "fmt" "net" "net/url" @@ -28,7 +29,6 @@ import ( "github.com/blang/semver/v4" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/alertmanager/config" "github.com/prometheus/alertmanager/timeinterval" "github.com/prometheus/common/model" @@ -63,7 +63,7 @@ func alertmanagerConfigFromBytes(b []byte) (*alertmanagerConfig, error) { } if err := checkAlertmanagerConfigRootRoute(cfg.Route); err != nil { - return nil, errors.Wrap(err, "check AlertmanagerConfig root route failed") + return nil, fmt.Errorf("check AlertmanagerConfig root route failed: %w", err) } return cfg, nil @@ -326,7 +326,7 @@ func (cb *configBuilder) addAlertmanagerConfigs(ctx context.Context, amConfigs m for _, receiver := range amConfigs[amConfigIdentifier].Spec.Receivers { receivers, err := cb.convertReceiver(ctx, &receiver, crKey) if err != nil { - return errors.Wrapf(err, "AlertmanagerConfig %s", crKey.String()) + return fmt.Errorf("AlertmanagerConfig %s: %w", crKey.String(), err) } cb.cfg.Receivers = append(cb.cfg.Receivers, receivers) } @@ -334,7 +334,7 @@ func (cb *configBuilder) addAlertmanagerConfigs(ctx context.Context, amConfigs m for _, muteTimeInterval := range amConfigs[amConfigIdentifier].Spec.MuteTimeIntervals { mti, err := convertMuteTimeInterval(&muteTimeInterval, crKey) if err != nil { - return errors.Wrapf(err, "AlertmanagerConfig %s", crKey.String()) + return fmt.Errorf("AlertmanagerConfig %s: %w", crKey.String(), err) } cb.cfg.MuteTimeIntervals = append(cb.cfg.MuteTimeIntervals, mti) } @@ -352,12 +352,12 @@ func (cb *configBuilder) addAlertmanagerConfigs(ctx context.Context, amConfigs m func (cb *configBuilder) getValidURLFromSecret(ctx context.Context, namespace string, selector v1.SecretKeySelector) (string, error) { url, err := cb.store.GetSecretKey(ctx, namespace, selector) if err != nil { - return "", errors.Wrap(err, "failed to get URL") + return "", fmt.Errorf("failed to get URL: %w", err) } url = strings.TrimSpace(url) if _, err := validation.ValidateURL(url); err != nil { - return url, errors.Wrapf(err, "invalid URL %q in key %q from secret %q", url, selector.Key, selector.Name) + return url, fmt.Errorf("invalid URL %q in key %q from secret %q: %w", url, selector.Key, selector.Name, err) } return url, nil } @@ -371,14 +371,14 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.SMTPConfig != nil { if err := cb.convertSMTPConfig(ctx, out, *in.SMTPConfig, crKey); err != nil { - return nil, errors.Wrap(err, "invalid global smtpConfig") + return nil, fmt.Errorf("invalid global smtpConfig: %w", err) } } if in.HTTPConfig != nil { httpConfig, err := cb.convertHTTPConfigForV1(ctx, *in.HTTPConfig, crKey) if err != nil { - return nil, errors.Wrap(err, "invalid global httpConfig") + return nil, fmt.Errorf("invalid global httpConfig: %w", err) } out.HTTPConfig = httpConfig } @@ -386,7 +386,7 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.ResolveTimeout != "" { timeout, err := model.ParseDuration(string(in.ResolveTimeout)) if err != nil { - return nil, errors.Wrap(err, "parse resolve timeout") + return nil, fmt.Errorf("parse resolve timeout: %w", err) } out.ResolveTimeout = &timeout } @@ -394,11 +394,11 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.SlackAPIURL != nil { slackAPIURL, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.SlackAPIURL) if err != nil { - return nil, errors.Wrap(err, "failed to get Slack API URL") + return nil, fmt.Errorf("failed to get Slack API URL: %w", err) } u, err := url.Parse(slackAPIURL) if err != nil { - return nil, errors.Wrap(err, "parse slack API URL") + return nil, fmt.Errorf("parse slack API URL: %w", err) } out.SlackAPIURL = &config.URL{URL: u} } @@ -406,11 +406,11 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.OpsGenieAPIURL != nil { opsgenieAPIURL, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.OpsGenieAPIURL) if err != nil { - return nil, errors.Wrap(err, "failed to get OpsGenie API URL") + return nil, fmt.Errorf("failed to get OpsGenie API URL: %w", err) } u, err := url.Parse(opsgenieAPIURL) if err != nil { - return nil, errors.Wrap(err, "parse OpsGenie API URL") + return nil, fmt.Errorf("parse OpsGenie API URL: %w", err) } out.OpsGenieAPIURL = &config.URL{URL: u} } @@ -418,7 +418,7 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.OpsGenieAPIKey != nil { opsGenieAPIKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.OpsGenieAPIKey) if err != nil { - return nil, errors.Wrap(err, "failed to get OpsGenie API KEY") + return nil, fmt.Errorf("failed to get OpsGenie API KEY: %w", err) } out.OpsGenieAPIKey = opsGenieAPIKey } @@ -426,7 +426,7 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.PagerdutyURL != nil { u, err := url.Parse(*in.PagerdutyURL) if err != nil { - return nil, errors.Wrap(err, "parse Pagerduty URL") + return nil, fmt.Errorf("parse Pagerduty URL: %w", err) } out.PagerdutyURL = &config.URL{URL: u} } @@ -513,7 +513,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.PagerDutyConfigs { receiver, err := cb.convertPagerdutyConfig(ctx, in.PagerDutyConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "PagerDutyConfig[%d]", i) + return nil, fmt.Errorf("PagerDutyConfig[%d]: %w", i, err) } pagerdutyConfigs[i] = receiver } @@ -525,7 +525,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.DiscordConfigs { receiver, err := cb.convertDiscordConfig(ctx, in.DiscordConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "DiscordConfig[%d]", i) + return nil, fmt.Errorf("DiscordConfig[%d]: %w", i, err) } discordConfigs[i] = receiver } @@ -537,7 +537,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.SlackConfigs { receiver, err := cb.convertSlackConfig(ctx, in.SlackConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "SlackConfig[%d]", i) + return nil, fmt.Errorf("SlackConfig[%d]: %w", i, err) } slackConfigs[i] = receiver } @@ -549,7 +549,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.WebhookConfigs { receiver, err := cb.convertWebhookConfig(ctx, in.WebhookConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "WebhookConfig[%d]", i) + return nil, fmt.Errorf("WebhookConfig[%d]: %w", i, err) } webhookConfigs[i] = receiver } @@ -561,7 +561,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.OpsGenieConfigs { receiver, err := cb.convertOpsgenieConfig(ctx, in.OpsGenieConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "OpsGenieConfigs[%d]", i) + return nil, fmt.Errorf("OpsGenieConfigs[%d]: %w", i, err) } opsgenieConfigs[i] = receiver } @@ -573,7 +573,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.WeChatConfigs { receiver, err := cb.convertWeChatConfig(ctx, in.WeChatConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "WeChatConfig[%d]", i) + return nil, fmt.Errorf("WeChatConfig[%d]: %w", i, err) } weChatConfigs[i] = receiver } @@ -585,7 +585,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.EmailConfigs { receiver, err := cb.convertEmailConfig(ctx, in.EmailConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "EmailConfig[%d]", i) + return nil, fmt.Errorf("EmailConfig[%d]: %w", i, err) } emailConfigs[i] = receiver } @@ -597,7 +597,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.VictorOpsConfigs { receiver, err := cb.convertVictorOpsConfig(ctx, in.VictorOpsConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "VictorOpsConfig[%d]", i) + return nil, fmt.Errorf("VictorOpsConfig[%d]: %w", i, err) } victorOpsConfigs[i] = receiver } @@ -609,7 +609,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.PushoverConfigs { receiver, err := cb.convertPushoverConfig(ctx, in.PushoverConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "PushoverConfig[%d]", i) + return nil, fmt.Errorf("PushoverConfig[%d]: %w", i, err) } pushoverConfigs[i] = receiver } @@ -621,7 +621,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.SNSConfigs { receiver, err := cb.convertSnsConfig(ctx, in.SNSConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "SNSConfig[%d]", i) + return nil, fmt.Errorf("SNSConfig[%d]: %w", i, err) } snsConfigs[i] = receiver } @@ -633,12 +633,36 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.TelegramConfigs { receiver, err := cb.convertTelegramConfig(ctx, in.TelegramConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "TelegramConfig[%d]", i) + return nil, fmt.Errorf("TelegramConfig[%d]: %w", i, err) } telegramConfigs[i] = receiver } } + var msTeamsConfigs []*msTeamsConfig + if l := len(in.MSTeamsConfigs); l > 0 { + msTeamsConfigs = make([]*msTeamsConfig, l) + for i := range in.MSTeamsConfigs { + receiver, err := cb.convertMSTeamsConfig(ctx, in.MSTeamsConfigs[i], crKey) + if err != nil { + return nil, fmt.Errorf("MSTeamsConfig[%d]: %w", i, err) + } + msTeamsConfigs[i] = receiver + } + } + + var webexConfigs []*webexConfig + if l := len(in.WebexConfigs); l > 0 { + webexConfigs = make([]*webexConfig, l) + for i := range in.WebexConfigs { + receiver, err := cb.convertWebexConfig(ctx, in.WebexConfigs[i], crKey) + if err != nil { + return nil, fmt.Errorf("WebexConfig[%d]: %w", i, err) + } + webexConfigs[i] = receiver + } + } + return &receiver{ Name: makeNamespacedString(in.Name, crKey), OpsgenieConfigs: opsgenieConfigs, @@ -652,6 +676,8 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al PushoverConfigs: pushoverConfigs, SNSConfigs: snsConfigs, TelegramConfigs: telegramConfigs, + WebexConfigs: webexConfigs, + MSTeamsConfigs: msTeamsConfigs, }, nil } @@ -819,7 +845,7 @@ func (cb *configBuilder) convertPagerdutyConfig(ctx context.Context, in monitori if in.RoutingKey != nil { routingKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.RoutingKey) if err != nil { - return nil, errors.Wrap(err, "failed to get routing key") + return nil, fmt.Errorf("failed to get routing key: %w", err) } out.RoutingKey = routingKey } @@ -827,7 +853,7 @@ func (cb *configBuilder) convertPagerdutyConfig(ctx context.Context, in monitori if in.ServiceKey != nil { serviceKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.ServiceKey) if err != nil { - return nil, errors.Wrap(err, "failed to get service key") + return nil, fmt.Errorf("failed to get service key: %w", err) } out.ServiceKey = serviceKey } @@ -895,7 +921,7 @@ func (cb *configBuilder) convertOpsgenieConfig(ctx context.Context, in monitorin if in.APIKey != nil { apiKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.APIKey) if err != nil { - return nil, errors.Wrap(err, "failed to get API key") + return nil, fmt.Errorf("failed to get API key: %w", err) } out.APIKey = apiKey } @@ -951,7 +977,7 @@ func (cb *configBuilder) convertWeChatConfig(ctx context.Context, in monitoringv if in.APISecret != nil { apiSecret, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.APISecret) if err != nil { - return nil, errors.Wrap(err, "failed to get API secret") + return nil, fmt.Errorf("failed to get API secret: %w", err) } out.APISecret = apiSecret } @@ -967,6 +993,31 @@ func (cb *configBuilder) convertWeChatConfig(ctx context.Context, in monitoringv return out, nil } +func (cb *configBuilder) convertWebexConfig(ctx context.Context, in monitoringv1alpha1.WebexConfig, crKey types.NamespacedName) (*webexConfig, error) { + out := &webexConfig{ + VSendResolved: in.SendResolved, + RoomID: in.RoomID, + } + + if in.APIURL != nil { + out.APIURL = string(*in.APIURL) + } + + if in.Message != nil { + out.Message = *in.Message + } + + if in.HTTPConfig != nil { + httpConfig, err := cb.convertHTTPConfig(ctx, *in.HTTPConfig, crKey) + if err != nil { + return nil, err + } + out.HTTPConfig = httpConfig + } + + return out, nil +} + func (cb *configBuilder) convertEmailConfig(ctx context.Context, in monitoringv1alpha1.EmailConfig, crKey types.NamespacedName) (*emailConfig, error) { out := &emailConfig{ VSendResolved: in.SendResolved, @@ -987,7 +1038,7 @@ func (cb *configBuilder) convertEmailConfig(ctx context.Context, in monitoringv1 if in.AuthPassword != nil { authPassword, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.AuthPassword) if err != nil { - return nil, errors.Wrap(err, "failed to get auth password") + return nil, fmt.Errorf("failed to get auth password: %w", err) } out.AuthPassword = authPassword } @@ -995,7 +1046,7 @@ func (cb *configBuilder) convertEmailConfig(ctx context.Context, in monitoringv1 if in.AuthSecret != nil { authSecret, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.AuthSecret) if err != nil { - return nil, errors.Wrap(err, "failed to get auth secret") + return nil, fmt.Errorf("failed to get auth secret: %w", err) } out.AuthSecret = authSecret } @@ -1029,7 +1080,7 @@ func (cb *configBuilder) convertVictorOpsConfig(ctx context.Context, in monitori if in.APIKey != nil { apiKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.APIKey) if err != nil { - return nil, errors.Wrap(err, "failed to get API key") + return nil, fmt.Errorf("failed to get API key: %w", err) } out.APIKey = apiKey } @@ -1049,7 +1100,7 @@ func (cb *configBuilder) convertVictorOpsConfig(ctx context.Context, in monitori customFields = make(map[string]string, l) for _, d := range in.CustomFields { if _, ok := reservedFields[d.Key]; ok { - return nil, errors.Errorf("VictorOps config contains custom field %s which cannot be used as it conflicts with the fixed/static fields", d.Key) + return nil, fmt.Errorf("VictorOps config contains custom field %s which cannot be used as it conflicts with the fixed/static fields", d.Key) } customFields[d.Key] = d.Value } @@ -1080,10 +1131,10 @@ func (cb *configBuilder) convertPushoverConfig(ctx context.Context, in monitorin { userKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.UserKey) if err != nil { - return nil, errors.Wrap(err, "failed to get user key") + return nil, fmt.Errorf("failed to get user key: %w", err) } if userKey == "" { - return nil, errors.Errorf("mandatory field %q is empty", "userKey") + return nil, fmt.Errorf("mandatory field %q is empty", "userKey") } out.UserKey = userKey } @@ -1091,10 +1142,10 @@ func (cb *configBuilder) convertPushoverConfig(ctx context.Context, in monitorin { token, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Token) if err != nil { - return nil, errors.Wrap(err, "failed to get token") + return nil, fmt.Errorf("failed to get token: %w", err) } if token == "" { - return nil, errors.Errorf("mandatory field %q is empty", "token") + return nil, fmt.Errorf("mandatory field %q is empty", "token") } out.Token = token } @@ -1143,7 +1194,7 @@ func (cb *configBuilder) convertTelegramConfig(ctx context.Context, in monitorin if in.BotToken != nil { botToken, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.BotToken) if err != nil { - return nil, errors.Wrap(err, "failed to get bot token") + return nil, fmt.Errorf("failed to get bot token: %w", err) } if botToken == "" { return nil, fmt.Errorf("mandatory field %q is empty", "botToken") @@ -1184,12 +1235,12 @@ func (cb *configBuilder) convertSnsConfig(ctx context.Context, in monitoringv1al if in.Sigv4.AccessKey != nil && in.Sigv4.SecretKey != nil { accessKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Sigv4.AccessKey) if err != nil { - return nil, errors.Wrap(err, "failed to get access key") + return nil, fmt.Errorf("failed to get access key: %w", err) } secretKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Sigv4.SecretKey) if err != nil { - return nil, errors.Wrap(err, "failed to get AWS secret key") + return nil, fmt.Errorf("failed to get AWS secret key: %w", err) } out.Sigv4.AccessKey = accessKey @@ -1200,6 +1251,33 @@ func (cb *configBuilder) convertSnsConfig(ctx context.Context, in monitoringv1al return out, nil } +func (cb *configBuilder) convertMSTeamsConfig( + ctx context.Context, in monitoringv1alpha1.MSTeamsConfig, crKey types.NamespacedName, +) (*msTeamsConfig, error) { + out := &msTeamsConfig{ + SendResolved: in.SendResolved, + Title: *in.Title, + Text: *in.Text, + } + + webHookURL, err := cb.store.GetSecretKey(ctx, crKey.Namespace, in.WebhookURL) + if err != nil { + return nil, err + } + + out.WebhookURL = webHookURL + + if in.HTTPConfig != nil { + httpConfig, err := cb.convertHTTPConfig(ctx, *in.HTTPConfig, crKey) + if err != nil { + return nil, err + } + out.HTTPConfig = httpConfig + } + + return out, nil +} + func (cb *configBuilder) convertInhibitRule(in *monitoringv1alpha1.InhibitRule) *inhibitRule { matchersV2Allowed := cb.amVersion.GTE(semver.MustParse("0.22.0")) var sourceMatchers []string @@ -1409,12 +1487,12 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.BasicAuth != nil { username, err := cb.store.GetSecretKey(ctx, crKey.Namespace, in.BasicAuth.Username) if err != nil { - return nil, errors.Wrap(err, "failed to get BasicAuth username") + return nil, fmt.Errorf("failed to get BasicAuth username: %w", err) } password, err := cb.store.GetSecretKey(ctx, crKey.Namespace, in.BasicAuth.Password) if err != nil { - return nil, errors.Wrap(err, "failed to get BasicAuth password") + return nil, fmt.Errorf("failed to get BasicAuth password: %w", err) } if username != "" || password != "" { @@ -1425,7 +1503,7 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.Authorization != nil { credentials, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Authorization.Credentials) if err != nil { - return nil, errors.Wrap(err, "failed to get Authorization credentials") + return nil, fmt.Errorf("failed to get Authorization credentials: %w", err) } if credentials != "" { @@ -1444,7 +1522,7 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.BearerTokenSecret != nil { bearerToken, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.BearerTokenSecret) if err != nil { - return nil, errors.Wrap(err, "failed to get bearer token") + return nil, fmt.Errorf("failed to get bearer token: %w", err) } out.BearerToken = bearerToken } @@ -1452,12 +1530,12 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.OAuth2 != nil { clientID, err := cb.store.GetKey(ctx, crKey.Namespace, in.OAuth2.ClientID) if err != nil { - return nil, errors.Wrap(err, "failed to get clientID") + return nil, fmt.Errorf("failed to get clientID: %w", err) } clientSecret, err := cb.store.GetSecretKey(ctx, crKey.Namespace, in.OAuth2.ClientSecret) if err != nil { - return nil, errors.Wrap(err, "failed to get client secret") + return nil, fmt.Errorf("failed to get client secret: %w", err) } out.OAuth2 = &oauth2{ ClientID: clientID, @@ -1511,7 +1589,7 @@ func (c *alertmanagerConfig) sanitize(amVersion semver.Version, logger log.Logge for i, rule := range c.InhibitRules { if err := rule.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "inhibit_rules[%d]", i) + return fmt.Errorf("inhibit_rules[%d]: %w", i, err) } } @@ -1529,13 +1607,13 @@ func (c *alertmanagerConfig) sanitize(amVersion semver.Version, logger log.Logge for _, ti := range c.MuteTimeIntervals { if err := ti.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "mute_time_intervals[%s]", ti.Name) + return fmt.Errorf("mute_time_intervals[%s]: %w", ti.Name, err) } } for _, ti := range c.TimeIntervals { if err := ti.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "time_intervals[%s]", ti.Name) + return fmt.Errorf("time_intervals[%s]: %w", ti.Name, err) } } @@ -1770,6 +1848,12 @@ func (r *receiver) sanitize(amVersion semver.Version, logger log.Logger) error { } } + for _, conf := range r.MSTeamsConfigs { + if err := conf.sanitize(amVersion, withLogger); err != nil { + return err + } + } + return nil } @@ -1879,6 +1963,40 @@ func (pdc *pagerdutyConfig) sanitize(amVersion semver.Version, logger log.Logger } func (poc *pushoverConfig) sanitize(amVersion semver.Version, logger log.Logger) error { + lessThanV0_26 := amVersion.LT(semver.MustParse("0.26.0")) + + if poc.UserKeyFile != "" && lessThanV0_26 { + msg := "'user_key_file' supported in Alertmanager >= 0.26.0 only - dropping field from pushover receiver config" + level.Warn(logger).Log("msg", msg, "current_version", amVersion.String()) + poc.UserKeyFile = "" + } + + if poc.UserKey == "" && poc.UserKeyFile == "" { + return fmt.Errorf("missing mandatory field user_key or user_key_file") + } + + if poc.UserKey != "" && poc.UserKeyFile != "" { + msg := "'user_key' and 'user_key_file' are mutually exclusive for pushover receiver config - 'user_key' has taken precedence" + level.Warn(logger).Log("msg", msg) + poc.UserKeyFile = "" + } + + if poc.TokenFile != "" && lessThanV0_26 { + msg := "'token_file' supported in Alertmanager >= 0.26.0 only - dropping field from pushover receiver config" + level.Warn(logger).Log("msg", msg, "current_version", amVersion.String()) + poc.TokenFile = "" + } + + if poc.Token == "" && poc.TokenFile == "" { + return fmt.Errorf("missing mandatory field token or token_file") + } + + if poc.Token != "" && poc.TokenFile != "" { + msg := "'token' and 'token_file' are mutually exclusive for pushover receiver config - 'token' has taken precedence" + level.Warn(logger).Log("msg", msg) + poc.TokenFile = "" + } + return poc.HTTPConfig.sanitize(amVersion, logger) } @@ -1929,7 +2047,35 @@ func (voc *victorOpsConfig) sanitize(amVersion semver.Version, logger log.Logger } func (whc *webhookConfig) sanitize(amVersion semver.Version, logger log.Logger) error { - return whc.HTTPConfig.sanitize(amVersion, logger) + if err := whc.HTTPConfig.sanitize(amVersion, logger); err != nil { + return err + } + + if whc.URLFile != "" && amVersion.LT(semver.MustParse("0.26.0")) { + msg := "'url_file' supported in Alertmanager >= 0.26.0 only - dropping field from provided config" + level.Warn(logger).Log("msg", msg, "current_version", amVersion.String()) + whc.URLFile = "" + } + + if whc.URL != "" && whc.URLFile != "" { + msg := "'url' and 'url_file' are mutually exclusive for webhook receiver config - 'url' has taken precedence" + level.Warn(logger).Log("msg", msg) + whc.URLFile = "" + } + + return nil +} + +func (tc *msTeamsConfig) sanitize(amVersion semver.Version, logger log.Logger) error { + if amVersion.LT(semver.MustParse("0.26.0")) { + return fmt.Errorf(`invalid syntax in receivers config; msteams integration is only available in Alertmanager >= 0.26.0`) + } + + if tc.WebhookURL == "" { + return fmt.Errorf("mandatory field %q is empty", "webhook_url") + } + + return tc.HTTPConfig.sanitize(amVersion, logger) } func (wcc *weChatConfig) sanitize(amVersion semver.Version, logger log.Logger) error { @@ -1941,17 +2087,31 @@ func (sc *snsConfig) sanitize(amVersion semver.Version, logger log.Logger) error } func (tc *telegramConfig) sanitize(amVersion semver.Version, logger log.Logger) error { + lessThanV0_26 := amVersion.LT(semver.MustParse("0.26.0")) telegramAllowed := amVersion.GTE(semver.MustParse("0.24.0")) + if !telegramAllowed { return fmt.Errorf(`invalid syntax in receivers config; telegram integration is available in Alertmanager >= 0.24.0`) } if tc.ChatID == 0 { - return errors.Errorf("mandatory field %q is empty", "chatID") + return fmt.Errorf("mandatory field %q is empty", "chatID") } - if tc.BotToken == "" { - return fmt.Errorf("mandatory field %q is empty", "botToken") + if tc.BotTokenFile != "" && lessThanV0_26 { + msg := "'bot_token_file' supported in Alertmanager >= 0.26.0 only - dropping field from provided config" + level.Warn(logger).Log("msg", msg, "current_version", amVersion.String()) + tc.BotTokenFile = "" + } + + if tc.BotToken == "" && tc.BotTokenFile == "" { + return fmt.Errorf("missing mandatory field botToken or botTokenFile") + } + + if tc.BotToken != "" && tc.BotTokenFile != "" { + msg := "'bot_token' and 'bot_token_file' are mutually exclusive for telegram receiver config - 'bot_token' has taken precedence" + level.Warn(logger).Log("msg", msg) + tc.BotTokenFile = "" } return tc.HTTPConfig.sanitize(amVersion, logger) @@ -1973,7 +2133,7 @@ func (tc *webexConfig) sanitize(amVersion semver.Version, logger log.Logger) err } if tc.RoomID == "" { - return errors.Errorf("mandatory field %q is empty", "room_id") + return fmt.Errorf("mandatory field %q is empty", "room_id") } return tc.HTTPConfig.sanitize(amVersion, logger) @@ -2061,7 +2221,7 @@ func (r *route) sanitize(amVersion semver.Version, logger log.Logger) error { for i, child := range r.Routes { if err := child.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "route[%d]", i) + return fmt.Errorf("route[%d]: %w", i, err) } } // Set to nil if empty so that it doesn't show up in the resulting yaml. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg_test.go index 312a20647..b1d8824e3 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/amcfg_test.go @@ -24,17 +24,17 @@ import ( "github.com/blang/semver/v4" "github.com/go-kit/log" - "github.com/google/go-cmp/cmp" "github.com/prometheus/alertmanager/config" "github.com/prometheus/alertmanager/timeinterval" "github.com/prometheus/common/model" "github.com/stretchr/testify/require" + "gotest.tools/v3/golden" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" monitoringingv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" @@ -69,27 +69,27 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) { name: "valid global config", globalConfig: &monitoringingv1.AlertmanagerGlobalConfig{ SMTPConfig: &monitoringingv1.GlobalSMTPConfig{ - From: pointer.String("from"), + From: ptr.To("from"), SmartHost: &monitoringingv1.HostPort{ Host: "smtp.example.org", Port: "587", }, - Hello: pointer.String("smtp.example.org"), - AuthUsername: pointer.String("dev@smtp.example.org"), + Hello: ptr.To("smtp.example.org"), + AuthUsername: ptr.To("dev@smtp.example.org"), AuthPassword: &corev1.SecretKeySelector{ LocalObjectReference: corev1.LocalObjectReference{ Name: "smtp-auth", }, Key: "password", }, - AuthIdentity: pointer.String("dev@smtp.example.org"), + AuthIdentity: ptr.To("dev@smtp.example.org"), AuthSecret: &corev1.SecretKeySelector{ LocalObjectReference: corev1.LocalObjectReference{ Name: "smtp-auth", }, Key: "secret", }, - RequireTLS: pointer.Bool(true), + RequireTLS: ptr.To(true), }, ResolveTimeout: "30s", HTTPConfig: &monitoringingv1.HTTPConfig{ @@ -114,7 +114,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) { "some": "value", }, }, - FollowRedirects: pointer.Bool(true), + FollowRedirects: ptr.To(true), }, }, amConfig: &monitoringv1alpha1.AlertmanagerConfig{ @@ -143,7 +143,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) { }, want: &alertmanagerConfig{ Global: &globalConfig{ - ResolveTimeout: func(d model.Duration) *model.Duration { return &d }(model.Duration(30 * time.Second)), + ResolveTimeout: ptr.To(model.Duration(30 * time.Second)), SMTPFrom: "from", SMTPSmarthost: config.HostPort{ Host: "smtp.example.org", @@ -154,7 +154,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) { SMTPAuthPassword: "password", SMTPAuthIdentity: "dev@smtp.example.org", SMTPAuthSecret: "secret", - SMTPRequireTLS: pointer.Bool(true), + SMTPRequireTLS: ptr.To(true), HTTPConfig: &httpClientConfig{ OAuth2: &oauth2{ ClientID: "clientID", @@ -165,7 +165,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) { "some": "value", }, }, - FollowRedirects: pointer.Bool(true), + FollowRedirects: ptr.To(true), }, }, Receivers: []*receiver{ @@ -635,7 +635,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) { name: "globalConfig has null resolve timeout", globalConfig: &monitoringingv1.AlertmanagerGlobalConfig{ HTTPConfig: &monitoringingv1.HTTPConfig{ - FollowRedirects: pointer.Bool(true), + FollowRedirects: ptr.To(true), }, }, amConfig: &monitoringv1alpha1.AlertmanagerConfig{ @@ -660,7 +660,7 @@ func TestInitializeFromAlertmanagerConfig(t *testing.T) { want: &alertmanagerConfig{ Global: &globalConfig{ HTTPConfig: &httpClientConfig{ - FollowRedirects: pointer.Bool(true), + FollowRedirects: ptr.To(true), }, }, Receivers: []*receiver{ @@ -757,13 +757,18 @@ func TestGenerateConfig(t *testing.T) { amVersion *semver.Version matcherStrategy monitoringingv1.AlertmanagerConfigMatcherStrategy amConfigs map[string]*monitoringv1alpha1.AlertmanagerConfig - expected string + golden string } version24, err := semver.ParseTolerant("v0.24.0") if err != nil { t.Fatal(err) } + version26, err := semver.ParseTolerant("v0.26.0") + if err != nil { + t.Fatal(err) + } + globalSlackAPIURL, err := url.Parse("http://slack.example.com") if err != nil { t.Fatal("Could not parse slack API URL") @@ -778,72 +783,46 @@ func TestGenerateConfig(t *testing.T) { Receivers: []*receiver{{Name: "null"}}, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `route: - receiver: "null" -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base_no_CRs.golden", }, { name: "skeleton base with global send_revolved, no CRs", kclient: fake.NewSimpleClientset(), baseConfig: alertmanagerConfig{ Global: &globalConfig{ - ResolveTimeout: func(d model.Duration) *model.Duration { return &d }(model.Duration(time.Minute)), + ResolveTimeout: ptr.To(model.Duration(time.Minute)), }, Route: &route{Receiver: "null"}, Receivers: []*receiver{{Name: "null"}}, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `global: - resolve_timeout: 1m -route: - receiver: "null" -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base_with_global_send_revolved_no_CRs.golden", }, { name: "skeleton base with global smtp_require_tls set to false, no CRs", kclient: fake.NewSimpleClientset(), baseConfig: alertmanagerConfig{ Global: &globalConfig{ - SMTPRequireTLS: func(b bool) *bool { return &b }(false), + SMTPRequireTLS: ptr.To(false), }, Route: &route{Receiver: "null"}, Receivers: []*receiver{{Name: "null"}}, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `global: - smtp_require_tls: false -route: - receiver: "null" -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base_with_global_smtp_require_tls_set_to_false,_no_CRs.golden", }, { name: "skeleton base with global smtp_require_tls set to true, no CRs", kclient: fake.NewSimpleClientset(), baseConfig: alertmanagerConfig{ Global: &globalConfig{ - SMTPRequireTLS: func(b bool) *bool { return &b }(true), + SMTPRequireTLS: ptr.To(true), }, Route: &route{Receiver: "null"}, Receivers: []*receiver{{Name: "null"}}, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `global: - smtp_require_tls: true -route: - receiver: "null" -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base_with_global_smtp_require_tls_set_to_true_no_CRs.golden", }, { name: "skeleton base with inhibit rules, no CRs", @@ -859,19 +838,7 @@ templates: [] Receivers: []*receiver{{Name: "null"}}, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `route: - receiver: "null" -inhibit_rules: -- target_matchers: - - test!=dropped - - expect=~this-value - source_matchers: - - test!=dropped - - expect=~this-value -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base_with_inhibit_rules_no_CRs.golden", }, { name: "base with sub route and matchers, no CRs", @@ -890,17 +857,7 @@ templates: [] }, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `route: - receiver: "null" - routes: - - receiver: custom - matchers: - - namespace=custom-test -receivers: -- name: "null" -- name: custom -templates: [] -`, + golden: "base_with_sub_route_and_matchers_no_CRs.golden", }, { name: "skeleton base with mute time intervals, no CRs", @@ -953,20 +910,7 @@ templates: [] }, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `route: - receiver: "null" -receivers: -- name: "null" -mute_time_intervals: -- name: maintenance_windows - time_intervals: - - times: - - start_time: "17:00" - end_time: "24:00" - days_of_month: ["7", "18", "28"] - months: ["1"] -templates: [] -`, + golden: "skeleton_base_with_mute_time_intervals_no_CRs.golden", }, { name: "skeleton base with sns receiver, no CRs", @@ -996,24 +940,7 @@ templates: [] }, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `route: - receiver: sns-test -receivers: -- name: sns-test - sns_configs: - - api_url: https://sns.us-west-2.amazonaws.com - sigv4: - region: us-west-2 - access_key: key - secret_key: secret - profile: dev - role_arn: arn:dev - topic_arn: arn:test - phone_number: "+12345" - target_arn: arn:target - subject: testing -templates: [] -`, + golden: "skeleton_base_with_sns_receiver_no_CRs.golden", }, { name: "skeleton base with active_time_intervals, no CRs", @@ -1046,20 +973,7 @@ templates: [] }, }, amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{}, - expected: `route: - receiver: "null" - routes: - - receiver: "null" - active_time_intervals: - - workdays -receivers: -- name: "null" -time_intervals: -- name: workdays - time_intervals: - - weekdays: ['monday:friday'] -templates: [] -`, + golden: "skeleton_base_with_active_time_intervals_no_CRs.golden", }, { name: "skeleton base, simple CR", @@ -1083,20 +997,66 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - group_by: - - job - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test -templates: [] -`, + golden: "skeleton_base_simple_CR.golden", + }, + { + name: "multiple AlertmanagerConfig objects", + kclient: fake.NewSimpleClientset(), + baseConfig: alertmanagerConfig{ + Route: &route{ + Receiver: "null", + Routes: []*route{ + { + Receiver: "watchdog", + Matchers: []string{"alertname=Watchdog"}, + GroupByStr: []string{"alertname"}, + }, + }, + }, + Receivers: []*receiver{{Name: "null"}, {Name: "watchdog"}}, + }, + amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{ + "ns1/amc1": { + ObjectMeta: metav1.ObjectMeta{ + Name: "amc1", + Namespace: "ns1", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "test1", + GroupBy: []string{"job"}, + }, + Receivers: []monitoringv1alpha1.Receiver{{Name: "test1"}}, + }, + }, + "ns1/amc2": { + ObjectMeta: metav1.ObjectMeta{ + Name: "amc2", + Namespace: "ns1", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "test2", + GroupBy: []string{"instance"}, + }, + Receivers: []monitoringv1alpha1.Receiver{{Name: "test2"}}, + }, + }, + "ns2/amc1": { + ObjectMeta: metav1.ObjectMeta{ + Name: "amc1", + Namespace: "ns2", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "test3", + GroupBy: []string{"job", "instance"}, + }, + Receivers: []monitoringv1alpha1.Receiver{{Name: "test3"}}, + }, + }, + }, + golden: "skeleton_base_multiple_alertmanagerconfigs.golden", }, { name: "skeleton base, simple CR with namespaceMatcher disabled", @@ -1123,18 +1083,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - group_by: - - job - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test -templates: [] -`, + golden: "skeleton_base_simple_CR_with_namespaceMatcher_disabled.golden", }, { name: "skeleton base, CR with inhibition rules only (deprecated matchers not converted)", @@ -1174,21 +1123,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" -inhibit_rules: -- target_match: - alertname: TargetDown - namespace: mynamespace - source_match: - alertname: NodeNotReady - namespace: mynamespace - equal: - - node -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_not_converted.golden", }, { name: "skeleton base, CR with inhibition rules only (deprecated matchers are converted)", @@ -1225,21 +1160,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" -inhibit_rules: -- target_matchers: - - alertname="TargetDown" - - namespace="mynamespace" - source_matchers: - - alertname=~"NodeNotReady" - - namespace="mynamespace" - equal: - - node -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_are_converted.golden", }, { name: "skeleton base, CR with inhibition rules only", @@ -1277,21 +1198,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" -inhibit_rules: -- target_matchers: - - alertname!="TargetDown" - - namespace="mynamespace" - source_matchers: - - alertname=~"NodeNotReady" - - namespace="mynamespace" - equal: - - node -receivers: -- name: "null" -templates: [] -`, + golden: "skeleton_base,_CR_with_inhibition_rules_only.golden", }, { name: "base with subroute - deprecated matching pattern, simple CR", @@ -1317,19 +1224,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true - - receiver: "null" -receivers: -- name: "null" -- name: mynamespace/myamc/test -templates: [] -`, + golden: "base_with_subroute_deprecated_matching_pattern_simple_CR.golden", }, { name: "CR with Pagerduty Receiver", @@ -1387,27 +1282,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test-pd - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test-pd - pagerduty_configs: - - routing_key: 1234abc - images: - - src: https://some-image.com - alt: some-image - href: https://some-image.com - links: - - href: https://some-link.com - text: some-link -templates: [] -`, + golden: "CR_with_Pagerduty_Receiver.golden", }, { name: "CR with Webhook Receiver and custom http config (oauth2)", @@ -1450,9 +1325,7 @@ templates: [] Receivers: []monitoringv1alpha1.Receiver{{ Name: "test", WebhookConfigs: []monitoringv1alpha1.WebhookConfig{{ - URL: func(s string) *string { - return &s - }("http://test.url"), + URL: ptr.To("http://test.url"), HTTPConfig: &monitoringv1alpha1.HTTPConfig{ OAuth2: &monitoringingv1.OAuth2{ ClientID: monitoringingv1.SecretOrConfigMap{ @@ -1475,37 +1348,14 @@ templates: [] "some": "value", }, }, - FollowRedirects: pointer.Bool(true), + FollowRedirects: ptr.To(true), }, }}, }}, }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - webhook_configs: - - url: http://test.url - http_config: - oauth2: - client_id: clientID - client_secret: clientSecret - scopes: - - any - token_url: https://test.com - endpoint_params: - some: value - follow_redirects: true -templates: [] -`, + golden: "CR_with_Webhook_Receiver_and_custom_http_config_oauth2.golden", }, { name: "CR with Opsgenie Receiver", @@ -1550,20 +1400,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - opsgenie_configs: - - api_key: 1234abc -templates: [] -`, + golden: "CR_with_Opsgenie_Receiver.golden", }, { name: "CR with Opsgenie Team Responder", @@ -1612,23 +1449,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - opsgenie_configs: - - api_key: 1234abc - responders: - - name: myname - type: team -templates: [] -`, + golden: "CR_with_Opsgenie_Team_Responder.golden", }, { name: "CR with WeChat Receiver", @@ -1674,21 +1495,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - wechat_configs: - - api_secret: wechatsecret - corp_id: wechatcorpid -templates: [] -`, + golden: "CR_with_WeChat_Receiver.golden", }, { @@ -1737,24 +1544,8 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - telegram_configs: - - api_url: https://api.telegram.org - bot_token: bipbop - chat_id: 12345 -templates: [] -`, + golden: "CR_with_Telegram_Receiver.golden", }, - { name: "CR with Slack Receiver and global Slack URL", @@ -1802,30 +1593,7 @@ templates: [] }, }, }, - expected: `global: - slack_api_url: http://slack.example.com -route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - slack_configs: - - fields: - - title: title - value: value - actions: - - type: type - text: text - name: my-action - confirm: - text: text -templates: [] -`, + golden: "CR_with_Slack_Receiver_and_global_Slack_URL.golden", }, { @@ -1874,30 +1642,7 @@ templates: [] }, }, }, - expected: `global: - slack_api_url_file: /etc/test -route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - slack_configs: - - fields: - - title: title - value: value - actions: - - type: type - text: text - name: my-action - confirm: - text: text -templates: [] -`, + golden: "CR_with_Slack_Receiver_and_global_Slack_URL_File.golden", }, { @@ -1956,25 +1701,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - sns_configs: - - api_url: https://sns.us-east-2.amazonaws.com - sigv4: - region: us-east-2 - access_key: xyz - secret_key: "123" - topic_arn: test-topicARN -templates: [] -`, + golden: "CR_with_SNS_Receiver_with_Access_and_Key.golden", }, { @@ -2022,24 +1749,7 @@ templates: [] }, }, }, - expected: `route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true -receivers: -- name: "null" -- name: mynamespace/myamc/test - sns_configs: - - api_url: https://sns.us-east-2.amazonaws.com - sigv4: - region: us-east-2 - role_arn: test-roleARN - topic_arn: test-topicARN -templates: [] -`, + golden: "CR_with_SNS_Receiver_with_roleARN.golden", }, { @@ -2120,42 +1830,7 @@ templates: [] }, }, }, - expected: `global: - slack_api_url_file: /etc/test -route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true - mute_time_intervals: - - mynamespace/myamc/test -receivers: -- name: "null" -- name: mynamespace/myamc/test - slack_configs: - - fields: - - title: title - value: value - actions: - - type: type - text: text - name: my-action - confirm: - text: text -mute_time_intervals: -- name: mynamespace/myamc/test - time_intervals: - - times: - - start_time: "08:00" - end_time: "17:00" - weekdays: [saturday, sunday] - days_of_month: ["1:10"] - months: ["1:3"] - years: ['2030:2050'] -templates: [] -`, + golden: "CR_with_Mute_Time_Intervals.golden", }, { name: "CR with Active Time Intervals", @@ -2236,42 +1911,59 @@ templates: [] }, }, }, - expected: `global: - slack_api_url_file: /etc/test -route: - receiver: "null" - routes: - - receiver: mynamespace/myamc/test - matchers: - - namespace="mynamespace" - continue: true - active_time_intervals: - - mynamespace/myamc/test -receivers: -- name: "null" -- name: mynamespace/myamc/test - slack_configs: - - fields: - - title: title - value: value - actions: - - type: type - text: text - name: my-action - confirm: - text: text -mute_time_intervals: -- name: mynamespace/myamc/test - time_intervals: - - times: - - start_time: "08:00" - end_time: "17:00" - weekdays: [saturday, sunday] - days_of_month: ["1:10"] - months: ["1:3"] - years: ['2030:2050'] -templates: [] -`, + golden: "CR_with_Active_Time_Intervals.golden", + }, + { + name: "CR with MSTeams Receiver", + amVersion: &version26, + kclient: fake.NewSimpleClientset( + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ms-teams-secret", + Namespace: "mynamespace", + }, + Data: map[string][]byte{ + "url": []byte("https://webhook.office.com/webhookb2/id/IncomingWebhook/id"), + }, + }, + ), + baseConfig: alertmanagerConfig{ + Route: &route{ + Receiver: "null", + }, + Receivers: []*receiver{{Name: "null"}}, + }, + amConfigs: map[string]*monitoringv1alpha1.AlertmanagerConfig{ + "mynamespace": { + ObjectMeta: metav1.ObjectMeta{ + Name: "myamc", + Namespace: "mynamespace", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "test", + }, + Receivers: []monitoringv1alpha1.Receiver{ + { + Name: "test", + MSTeamsConfigs: []monitoringv1alpha1.MSTeamsConfig{ + { + WebhookURL: corev1.SecretKeySelector{ + Key: "url", + LocalObjectReference: corev1.LocalObjectReference{ + Name: "ms-teams-secret", + }, + }, + Title: ptr.To("test title"), + Text: ptr.To("test text"), + }, + }, + }, + }, + }, + }, + }, + golden: "CR_with_MSTeams_Receiver.golden", }, } @@ -2301,9 +1993,7 @@ templates: [] } // Verify the generated yaml is as expected - if diff := cmp.Diff(tc.expected, string(cfgBytes)); diff != "" { - t.Errorf("Unexpected result (-want +got):\n%s", diff) - } + golden.Assert(t, string(cfgBytes), tc.golden) // Verify the generated config is something that Alertmanager will be happy with _, err = alertmanagerConfigFromBytes(cfgBytes) @@ -2331,6 +2021,9 @@ func TestSanitizeConfig(t *testing.T) { versionWebexAllowed := semver.Version{Major: 0, Minor: 25} versionWebexNotAllowed := semver.Version{Major: 0, Minor: 24} + versionTelegramBotTokenFileAllowed := semver.Version{Major: 0, Minor: 26} + versionTelegramBotTokenFileNotAllowed := semver.Version{Major: 0, Minor: 25} + for _, tc := range []struct { name string againstVersion semver.Version @@ -2731,6 +2424,129 @@ func TestSanitizeConfig(t *testing.T) { }, expectErr: true, }, + { + name: "bot_token_file field for Telegram config", + againstVersion: versionTelegramBotTokenFileAllowed, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{ + { + ChatID: 12345, + BotTokenFile: "/test", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{ + { + ChatID: 12345, + BotTokenFile: "/test", + }, + }, + }, + }, + }, + }, + { + name: "bot_token_file and bot_token fields for Telegram config", + againstVersion: versionTelegramBotTokenFileAllowed, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{ + { + ChatID: 12345, + BotToken: "test", + BotTokenFile: "/test", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{{ + ChatID: 12345, + BotToken: "test", + }}, + }, + }, + }, + }, + { + name: "bot_token not specified and bot_token_file is dropped for unsupported versions", + againstVersion: versionTelegramBotTokenFileNotAllowed, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{ + { + ChatID: 12345, + BotTokenFile: "/test", + }, + }, + }, + }, + }, + expectErr: true, + }, + { + name: "bot_token specified and bot_token_file is dropped for unsupported versions", + againstVersion: versionTelegramBotTokenFileNotAllowed, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{ + { + ChatID: 12345, + BotToken: "test", + BotTokenFile: "/test", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{{ + ChatID: 12345, + BotToken: "test", + }}, + }, + }, + }, + }, + { + name: "bot_token and bot_token_file empty", + againstVersion: versionTelegramBotTokenFileAllowed, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + Name: "telegram", + TelegramConfigs: []*telegramConfig{ + { + ChatID: 12345, + }, + }, + }, + }, + }, + expectErr: true, + }, } { t.Run(tc.name, func(t *testing.T) { err := tc.in.sanitize(tc.againstVersion, logger) @@ -2795,7 +2611,7 @@ func TestHTTPClientConfig(t *testing.T) { TokenURL: "d", ProxyURL: "http://example.com/", }, - EnableHTTP2: pointer.Bool(false), + EnableHTTP2: ptr.To(false), TLSConfig: &tlsConfig{ MinVersion: "TLS12", MaxVersion: "TLS12", @@ -2810,7 +2626,7 @@ func TestHTTPClientConfig(t *testing.T) { TokenURL: "d", ProxyURL: "http://example.com/", }, - EnableHTTP2: pointer.Bool(false), + EnableHTTP2: ptr.To(false), TLSConfig: &tlsConfig{ MinVersion: "TLS12", MaxVersion: "TLS12", @@ -2880,7 +2696,7 @@ func TestHTTPClientConfig(t *testing.T) { TokenURL: "d", ProxyURL: "http://example.com/", }, - EnableHTTP2: pointer.Bool(false), + EnableHTTP2: ptr.To(false), TLSConfig: &tlsConfig{ MinVersion: "TLS13", MaxVersion: "TLS12", @@ -2899,7 +2715,7 @@ func TestHTTPClientConfig(t *testing.T) { TokenURL: "d", ProxyURL: "http://example.com/", }, - EnableHTTP2: pointer.Bool(false), + EnableHTTP2: ptr.To(false), TLSConfig: &tlsConfig{ MinVersion: "TLS14", }, @@ -2917,7 +2733,7 @@ func TestHTTPClientConfig(t *testing.T) { TokenURL: "d", ProxyURL: "http://example.com/", }, - EnableHTTP2: pointer.Bool(false), + EnableHTTP2: ptr.To(false), TLSConfig: &tlsConfig{ MaxVersion: "TLS14", }, @@ -2935,7 +2751,7 @@ func TestHTTPClientConfig(t *testing.T) { TokenURL: "d", ProxyURL: "http://example.com/", }, - EnableHTTP2: pointer.Bool(false), + EnableHTTP2: ptr.To(false), TLSConfig: &tlsConfig{ MinVersion: "TLS12", MaxVersion: "TLS12", @@ -3126,7 +2942,126 @@ func TestTimeInterval(t *testing.T) { }) } } +func TestSanitizePushoverReceiverConfig(t *testing.T) { + logger := log.NewNopLogger() + for _, tc := range []struct { + name string + againstVersion semver.Version + in *alertmanagerConfig + expect alertmanagerConfig + expectErr bool + }{ + { + name: "Test pushover user_key/token takes precedence in pushover config", + againstVersion: semver.Version{Major: 0, Minor: 26}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + UserKeyFile: "/path/use_key_file", + Token: "bar", + TokenFile: "/path/token_file", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + UserKeyFile: "", + Token: "bar", + TokenFile: "", + }, + }, + }, + }, + }, + }, + { + name: "Test pushover token or token_file must be configured", + againstVersion: semver.Version{Major: 0, Minor: 26}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + }, + }, + }, + }, + }, + expectErr: true, + }, + { + name: "Test pushover user_key or user_key_file must be configured", + againstVersion: semver.Version{Major: 0, Minor: 26}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + Token: "bar", + }, + }, + }, + }, + }, + expectErr: true, + }, + { + name: "Test pushover user_key/token_file dropped in pushover config for unsupported versions", + againstVersion: semver.Version{Major: 0, Minor: 25}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + TokenFile: "/path/token_file", + }, + }, + }, + }, + }, + expectErr: true, + }, + { + name: "Test pushover user_key_file/token dropped in pushover config for unsupported versions", + againstVersion: semver.Version{Major: 0, Minor: 25}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKeyFile: "/path/use_key_file", + Token: "bar", + }, + }, + }, + }, + }, + expectErr: true, + }, + } { + t.Run(tc.name, func(t *testing.T) { + err := tc.in.sanitize(tc.againstVersion, logger) + if tc.expectErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.Equal(t, tc.expect, *tc.in) + }) + } +} func TestSanitizeEmailConfig(t *testing.T) { logger := log.NewNopLogger() @@ -3349,6 +3284,235 @@ func TestSanitizeVictorOpsConfig(t *testing.T) { } } +func TestSanitizeWebhookConfig(t *testing.T) { + logger := log.NewNopLogger() + + for _, tc := range []struct { + name string + againstVersion semver.Version + in *alertmanagerConfig + expect alertmanagerConfig + expectErr bool + }{ + { + name: "Test webhook_url_file is dropped in webhook config for unsupported versions", + againstVersion: semver.Version{Major: 0, Minor: 25}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + WebhookConfigs: []*webhookConfig{ + { + URLFile: "foo", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + WebhookConfigs: []*webhookConfig{ + { + URLFile: "", + }, + }, + }, + }, + }, + }, + { + name: "Test url takes precedence in webhook config", + againstVersion: semver.Version{Major: 0, Minor: 26}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + WebhookConfigs: []*webhookConfig{ + { + URL: "foo", + URLFile: "bar", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + WebhookConfigs: []*webhookConfig{ + { + URL: "foo", + }, + }, + }, + }, + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + err := tc.in.sanitize(tc.againstVersion, logger) + if tc.expectErr { + if err == nil { + t.Fatal("expected error but got none") + } + return + } + + if err != nil { + t.Fatalf("expected no error but got: %q", err) + } + + require.Equal(t, tc.expect, *tc.in) + }) + } +} + +func TestSanitizePushoverConfig(t *testing.T) { + logger := log.NewNopLogger() + + for _, tc := range []struct { + name string + againstVersion semver.Version + in *alertmanagerConfig + expect alertmanagerConfig + expectErr bool + }{ + { + name: "Test pushover_user_key_file is dropped in pushover config for unsupported versions", + againstVersion: semver.Version{Major: 0, Minor: 25}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "key", + UserKeyFile: "foo", + Token: "token", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "key", + UserKeyFile: "", + Token: "token", + }, + }, + }, + }, + }, + }, + { + name: "Test pushover_token_file is dropped in pushover config for unsupported versions", + againstVersion: semver.Version{Major: 0, Minor: 25}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "key", + Token: "token", + TokenFile: "foo", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "key", + Token: "token", + TokenFile: "", + }, + }, + }, + }, + }, + }, + { + name: "Test user_key takes precedence in pushover config", + againstVersion: semver.Version{Major: 0, Minor: 26}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + UserKeyFile: "bar", + Token: "token", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + Token: "token", + }, + }, + }, + }, + }, + }, + { + name: "Test token takes precedence in pushover config", + againstVersion: semver.Version{Major: 0, Minor: 26}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + Token: "foo", + TokenFile: "bar", + }, + }, + }, + }, + }, + expect: alertmanagerConfig{ + Receivers: []*receiver{ + { + PushoverConfigs: []*pushoverConfig{ + { + UserKey: "foo", + Token: "foo", + }, + }, + }, + }, + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + err := tc.in.sanitize(tc.againstVersion, logger) + if tc.expectErr { + if err == nil { + t.Fatal("expected error but got none") + } + return + } + + if err != nil { + t.Fatalf("expected no error but got: %q", err) + } + + require.Equal(t, tc.expect, *tc.in) + }) + } +} + func TestSanitizePagerDutyConfig(t *testing.T) { logger := log.NewNopLogger() @@ -3627,25 +3791,12 @@ func TestSanitizeRoute(t *testing.T) { func TestLoadConfig(t *testing.T) { testCase := []struct { name string - rawConf []byte expected *alertmanagerConfig + golden string }{ { - name: "mute_time_intervals field", - rawConf: []byte(`route: - receiver: "null" -receivers: -- name: "null" -mute_time_intervals: -- name: maintenance_windows - time_intervals: - - times: - - start_time: "17:00" - end_time: "24:00" - days_of_month: ["7", "18", "28"] - months: ["january"] -templates: [] -`), + name: "mute_time_intervals field", + golden: "mute_time_intervals_field.golden", expected: &alertmanagerConfig{ Global: nil, Route: &route{ @@ -3703,15 +3854,8 @@ templates: [] }, }, { - name: "Global opsgenie_api_key_file field", - rawConf: []byte(`route: - receiver: "null" -receivers: -- name: "null" -global: - opsgenie_api_key_file: "xxx" -templates: [] -`), + name: "Global opsgenie_api_key_file field", + golden: "Global_opsgenie_api_key_file_field.golden", expected: &alertmanagerConfig{ Global: &globalConfig{ OpsGenieAPIKeyFile: "xxx", @@ -3728,17 +3872,8 @@ templates: [] }, }, { - name: "OpsGenie entity and actions fields", - rawConf: []byte(`route: - receiver: "opsgenie" -receivers: -- name: "opsgenie" - opsgenie_configs: - - entity: entity1 - actions: action1,action2 - api_key: xxx -templates: [] -`), + name: "OpsGenie entity and actions fields", + golden: "OpsGenie_entity_and_actions_fields.golden", expected: &alertmanagerConfig{ Route: &route{ Receiver: "opsgenie", @@ -3759,15 +3894,8 @@ templates: [] }, }, { - name: "Discord url field", - rawConf: []byte(`route: - receiver: "discord" -receivers: -- name: "discord" - discord_configs: - - webhook_url: http://example.com -templates: [] -`), + name: "Discord url field", + golden: "Discord_url_field.golden", expected: &alertmanagerConfig{ Route: &route{ Receiver: "discord", @@ -3789,7 +3917,7 @@ templates: [] for _, tc := range testCase { t.Run(tc.name, func(t *testing.T) { - ac, err := alertmanagerConfigFromBytes(tc.rawConf) + ac, err := alertmanagerConfigFromBytes(golden.Get(t, tc.golden)) if err != nil { t.Fatalf("expecing no error, got %v", err) } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator.go index 9fa445caa..e113c35a4 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator.go @@ -17,6 +17,7 @@ package alertmanager import ( "bytes" "context" + "errors" "fmt" "path" "regexp" @@ -27,7 +28,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/mitchellh/hashstructure" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" @@ -35,8 +35,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/kubernetes" + authv1 "k8s.io/client-go/kubernetes/typed/authorization/v1" "k8s.io/client-go/metadata" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager/validation" @@ -44,6 +47,7 @@ import ( monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" "github.com/prometheus-operator/prometheus-operator/pkg/assets" + monitoringv1ac "github.com/prometheus-operator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1" monitoringclient "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned" "github.com/prometheus-operator/prometheus-operator/pkg/informers" "github.com/prometheus-operator/prometheus-operator/pkg/k8sutil" @@ -67,9 +71,11 @@ var ( // Operator manages life cycle of Alertmanager deployments and // monitoring configurations. type Operator struct { - kclient kubernetes.Interface - mdClient metadata.Interface - mclient monitoringclient.Interface + kclient kubernetes.Interface + mdClient metadata.Interface + mclient monitoringclient.Interface + ssarClient authv1.SelfSubjectAccessReviewInterface + logger log.Logger accessor *operator.Accessor @@ -86,10 +92,13 @@ type Operator struct { metrics *operator.Metrics reconciliations *operator.ReconciliationTracker + canReadStorageClass bool + config Config } type Config struct { + KubernetesVersion version.Info LocalHost string ClusterDomain string ReloaderConfig operator.ContainerConfig @@ -102,40 +111,39 @@ type Config struct { } // New creates a new controller. -func New(ctx context.Context, c operator.Config, logger log.Logger, r prometheus.Registerer) (*Operator, error) { - cfg, err := k8sutil.NewClusterConfig(c.Host, c.TLSInsecure, &c.TLSConfig) - if err != nil { - return nil, errors.Wrap(err, "instantiating cluster config failed") - } - - client, err := kubernetes.NewForConfig(cfg) +func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger log.Logger, r prometheus.Registerer, canReadStorageClass bool) (*Operator, error) { + client, err := kubernetes.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") + return nil, fmt.Errorf("instantiating kubernetes client failed: %w", err) } - mdClient, err := metadata.NewForConfig(cfg) + mdClient, err := metadata.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") + return nil, fmt.Errorf("instantiating kubernetes client failed: %w", err) } - mclient, err := monitoringclient.NewForConfig(cfg) + mclient, err := monitoringclient.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating monitoring client failed") + return nil, fmt.Errorf("instantiating monitoring client failed: %w", err) } // All the metrics exposed by the controller get the controller="alertmanager" label. r = prometheus.WrapRegistererWith(prometheus.Labels{"controller": "alertmanager"}, r) o := &Operator{ - kclient: client, - mdClient: mdClient, - mclient: mclient, + kclient: client, + mdClient: mdClient, + mclient: mclient, + ssarClient: client.AuthorizationV1().SelfSubjectAccessReviews(), + logger: logger, accessor: operator.NewAccessor(logger), - metrics: operator.NewMetrics(r), - reconciliations: &operator.ReconciliationTracker{}, + metrics: operator.NewMetrics(r), + reconciliations: &operator.ReconciliationTracker{}, + canReadStorageClass: canReadStorageClass, config: Config{ + KubernetesVersion: c.KubernetesVersion, LocalHost: c.LocalHost, ClusterDomain: c.ClusterDomain, ReloaderConfig: c.ReloaderConfig, @@ -167,7 +175,7 @@ func (c *Operator) bootstrap(ctx context.Context) error { var err error if _, err := labels.Parse(c.config.AlertManagerSelector); err != nil { - return errors.Wrap(err, "can not parse alertmanager selector value") + return fmt.Errorf("can not parse alertmanager selector value: %w", err) } c.metrics.MustRegister(c.reconciliations) @@ -185,7 +193,7 @@ func (c *Operator) bootstrap(ctx context.Context) error { monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.AlertmanagerName), ) if err != nil { - return errors.Wrap(err, "error creating alertmanager informers") + return fmt.Errorf("error creating alertmanager informers: %w", err) } var alertmanagerStores []cache.Store @@ -205,12 +213,12 @@ func (c *Operator) bootstrap(ctx context.Context) error { monitoringv1alpha1.SchemeGroupVersion.WithResource(monitoringv1alpha1.AlertmanagerConfigName), ) if err != nil { - return errors.Wrap(err, "error creating alertmanagerconfig informers") + return fmt.Errorf("error creating alertmanagerconfig informers: %w", err) } secretListWatchSelector, err := fields.ParseSelector(c.config.SecretListWatchSelector) if err != nil { - return errors.Wrap(err, "can not parse secrets selector value") + return fmt.Errorf("can not parse secrets selector value: %w", err) } c.secrInfs, err = informers.NewInformersForResource( @@ -226,7 +234,7 @@ func (c *Operator) bootstrap(ctx context.Context) error { v1.SchemeGroupVersion.WithResource("secrets"), ) if err != nil { - return errors.Wrap(err, "error creating secret informers") + return fmt.Errorf("error creating secret informers: %w", err) } c.ssetInfs, err = informers.NewInformersForResource( @@ -240,35 +248,43 @@ func (c *Operator) bootstrap(ctx context.Context) error { appsv1.SchemeGroupVersion.WithResource("statefulsets"), ) if err != nil { - return errors.Wrap(err, "error creating statefulset informers") - } - - newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) cache.SharedIndexInformer { - // nsResyncPeriod is used to control how often the namespace informer - // should resync. If the unprivileged ListerWatcher is used, then the - // informer must resync more often because it cannot watch for - // namespace changes. - nsResyncPeriod := 15 * time.Second - // If the only namespace is v1.NamespaceAll, then the client must be - // privileged and a regular cache.ListWatch will be used. In this case - // watching works and we do not need to resync so frequently. - if listwatch.IsAllNamespaces(allowList) { - nsResyncPeriod = resyncPeriod - } - nsInf := cache.NewSharedIndexInformer( - o.metrics.NewInstrumentedListerWatcher( - listwatch.NewUnprivilegedNamespaceListWatchFromClient(ctx, o.logger, o.kclient.CoreV1().RESTClient(), allowList, o.config.Namespaces.DenyList, fields.Everything()), - ), - &v1.Namespace{}, nsResyncPeriod, cache.Indexers{}, + return fmt.Errorf("error creating statefulset informers: %w", err) + } + + newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) (cache.SharedIndexInformer, error) { + lw, privileged, err := listwatch.NewNamespaceListWatchFromClient( + ctx, + o.logger, + o.config.KubernetesVersion, + o.kclient.CoreV1(), + o.ssarClient, + allowList, + o.config.Namespaces.DenyList, ) + if err != nil { + return nil, fmt.Errorf("failed to create namespace lister/watcher: %w", err) + } - return nsInf + level.Debug(c.logger).Log("msg", "creating namespace informer", "privileged", privileged) + return cache.NewSharedIndexInformer( + o.metrics.NewInstrumentedListerWatcher(lw), + &v1.Namespace{}, + resyncPeriod, + cache.Indexers{}, + ), nil + } + c.nsAlrtCfgInf, err = newNamespaceInformer(c, c.config.Namespaces.AlertmanagerConfigAllowList) + if err != nil { + return err } - c.nsAlrtCfgInf = newNamespaceInformer(c, c.config.Namespaces.AlertmanagerConfigAllowList) + if listwatch.IdenticalNamespaces(c.config.Namespaces.AlertmanagerConfigAllowList, c.config.Namespaces.AlertmanagerAllowList) { c.nsAlrtInf = c.nsAlrtCfgInf } else { - c.nsAlrtInf = newNamespaceInformer(c, c.config.Namespaces.AlertmanagerAllowList) + c.nsAlrtInf, err = newNamespaceInformer(c, c.config.Namespaces.AlertmanagerAllowList) + if err != nil { + return err + } } return nil @@ -287,7 +303,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { } { for _, inf := range infs.informersForResource.GetInformers() { if !operator.WaitForNamedCacheSync(ctx, "alertmanager", log.With(c.logger, "informer", infs.name), inf.Informer()) { - return errors.Errorf("failed to sync cache for %s informer", infs.name) + return fmt.Errorf("failed to sync cache for %s informer", infs.name) } } } @@ -300,7 +316,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { {"AlertmanagerConfigNamespace", c.nsAlrtCfgInf}, } { if !operator.WaitForNamedCacheSync(ctx, "alertmanager", log.With(c.logger, "informer", inf.name), inf.informer) { - return errors.Errorf("failed to sync cache for %s informer", inf.name) + return fmt.Errorf("failed to sync cache for %s informer", inf.name) } } @@ -466,27 +482,6 @@ func (c *Operator) enqueueForNamespace(nsName string) { // Run the controller. func (c *Operator) Run(ctx context.Context) error { - errChan := make(chan error) - go func() { - v, err := c.kclient.Discovery().ServerVersion() - if err != nil { - errChan <- errors.Wrap(err, "communicating with server failed") - return - } - level.Info(c.logger).Log("msg", "connection established", "cluster-version", v) - errChan <- nil - }() - - select { - case err := <-errChan: - if err != nil { - return err - } - level.Info(c.logger).Log("msg", "CRD API endpoints ready") - case <-ctx.Done(): - return nil - } - go c.rr.Run(ctx) defer c.rr.Stop() @@ -642,7 +637,12 @@ func (c *Operator) sync(ctx context.Context, key string) error { am := aobj.(*monitoringv1.Alertmanager) am = am.DeepCopy() if err := k8sutil.AddTypeInformationToObject(am); err != nil { - return errors.Wrap(err, "failed to set Alertmanager type information") + return fmt.Errorf("failed to set Alertmanager type information: %w", err) + } + + // Check if the Alertmanager instance is marked for deletion. + if c.rr.DeletionInProgress(am) { + return nil } if am.Spec.Paused { @@ -654,25 +654,29 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Info(logger).Log("msg", "sync alertmanager") + if err := operator.CheckStorageClass(ctx, c.canReadStorageClass, c.kclient, am.Spec.Storage); err != nil { + return err + } + assetStore := assets.NewStore(c.kclient.CoreV1(), c.kclient.CoreV1()) if err := c.provisionAlertmanagerConfiguration(ctx, am, assetStore); err != nil { - return errors.Wrap(err, "provision alertmanager configuration") + return fmt.Errorf("provision alertmanager configuration: %w", err) } tlsAssets, err := c.createOrUpdateTLSAssetSecrets(ctx, am, assetStore) if err != nil { - return errors.Wrap(err, "creating tls asset secrets failed") + return fmt.Errorf("creating tls asset secrets failed: %w", err) } if err := c.createOrUpdateWebConfigSecret(ctx, am); err != nil { - return errors.Wrap(err, "synchronizing web config secret failed") + return fmt.Errorf("synchronizing web config secret failed: %w", err) } // Create governing service if it doesn't exist. svcClient := c.kclient.CoreV1().Services(am.Namespace) if err = k8sutil.CreateOrUpdateService(ctx, svcClient, makeStatefulSetService(am, c.config)); err != nil { - return errors.Wrap(err, "synchronizing governing service failed") + return fmt.Errorf("synchronizing governing service failed: %w", err) } existingStatefulSet, err := c.getStatefulSetFromAlertmanagerKey(key) @@ -697,7 +701,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { sset, err := makeStatefulSet(am, c.config, newSSetInputHash, tlsAssets.ShardNames()) if err != nil { - return errors.Wrap(err, "failed to make statefulset") + return fmt.Errorf("failed to generate statefulset: %w", err) } operator.SanitizeSTS(sset) @@ -711,7 +715,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Debug(logger).Log("msg", "no current statefulset found") level.Debug(logger).Log("msg", "creating statefulset") if _, err := ssetClient.Create(ctx, sset, metav1.CreateOptions{}); err != nil { - return errors.Wrap(err, "creating statefulset failed") + return fmt.Errorf("creating statefulset failed: %w", err) } return nil } @@ -731,13 +735,13 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Info(logger).Log("msg", "recreating AlertManager StatefulSet because the update operation wasn't possible", "reason", strings.Join(failMsg, ", ")) propagationPolicy := metav1.DeletePropagationForeground if err := ssetClient.Delete(ctx, sset.GetName(), metav1.DeleteOptions{PropagationPolicy: &propagationPolicy}); err != nil { - return errors.Wrap(err, "failed to delete StatefulSet to avoid forbidden action") + return fmt.Errorf("failed to delete StatefulSet to avoid forbidden action: %w", err) } return nil } if err != nil { - return errors.Wrap(err, "updating StatefulSet failed") + return fmt.Errorf("updating StatefulSet failed: %w", err) } return nil @@ -752,7 +756,7 @@ func (c *Operator) getAlertmanagerFromKey(key string) (*monitoringv1.Alertmanage level.Info(c.logger).Log("msg", "Alertmanager not found", "key", key) return nil, nil } - return nil, errors.Wrap(err, "failed to retrieve Alertmanager from informer") + return nil, fmt.Errorf("failed to retrieve Alertmanager from informer: %w", err) } return obj.(*monitoringv1.Alertmanager).DeepCopy(), nil @@ -760,7 +764,7 @@ func (c *Operator) getAlertmanagerFromKey(key string) (*monitoringv1.Alertmanage // getStatefulSetFromAlertmanagerKey returns a copy of the StatefulSet object // corresponding to the Alertmanager object identified by key. -// If the object is not found, it returns a nil pointer. +// If the object is not found, it returns a nil pointer without error. func (c *Operator) getStatefulSetFromAlertmanagerKey(key string) (*appsv1.StatefulSet, error) { ssetName := alertmanagerKeyToStatefulSetKey(key) @@ -770,7 +774,7 @@ func (c *Operator) getStatefulSetFromAlertmanagerKey(key string) (*appsv1.Statef level.Info(c.logger).Log("msg", "StatefulSet not found", "key", ssetName) return nil, nil } - return nil, errors.Wrap(err, "failed to retrieve StatefulSet from informer") + return nil, fmt.Errorf("failed to retrieve StatefulSet from informer: %w", err) } return obj.(*appsv1.StatefulSet).DeepCopy(), nil @@ -791,16 +795,16 @@ func (c *Operator) UpdateStatus(ctx context.Context, key string) error { sset, err := c.getStatefulSetFromAlertmanagerKey(key) if err != nil { - return errors.Wrap(err, "failed to get StatefulSet") + return fmt.Errorf("failed to get StatefulSet: %w", err) } - if sset == nil || c.rr.DeletionInProgress(sset) { + if sset != nil && c.rr.DeletionInProgress(sset) { return nil } stsReporter, err := operator.NewStatefulSetReporter(ctx, c.kclient, sset) if err != nil { - return errors.Wrap(err, "failed to retrieve statefulset state") + return fmt.Errorf("failed to retrieve statefulset state: %w", err) } availableCondition := stsReporter.Update(a) @@ -808,8 +812,8 @@ func (c *Operator) UpdateStatus(ctx context.Context, key string) error { a.Status.Conditions = operator.UpdateConditions(a.Status.Conditions, availableCondition, reconciledCondition) a.Status.Paused = a.Spec.Paused - if _, err = c.mclient.MonitoringV1().Alertmanagers(a.Namespace).UpdateStatus(ctx, a, metav1.UpdateOptions{}); err != nil { - return errors.Wrap(err, "failed to update status subresource") + if _, err = c.mclient.MonitoringV1().Alertmanagers(a.Namespace).ApplyStatus(ctx, ApplyConfigurationFromAlertmanager(a), metav1.ApplyOptions{FieldManager: operator.PrometheusOperatorFieldManager, Force: true}); err != nil { + return fmt.Errorf("failed to apply status subresource: %w", err) } return nil @@ -821,6 +825,11 @@ func createSSetInputHash(a monitoringv1.Alertmanager, c Config, tlsAssets *opera http2 = a.Spec.Web.WebConfigFileFields.HTTPConfig.HTTP2 } + // The controller should ignore any changes to RevisionHistoryLimit field because + // it may be modified by external actors. + // See https://github.com/prometheus-operator/prometheus-operator/issues/5712 + s.RevisionHistoryLimit = nil + hash, err := hashstructure.Hash(struct { AlertmanagerLabels map[string]string AlertmanagerAnnotations map[string]string @@ -841,7 +850,7 @@ func createSSetInputHash(a monitoringv1.Alertmanager, c Config, tlsAssets *opera nil, ) if err != nil { - return "", errors.Wrap(err, "failed to calculate combined hash") + return "", fmt.Errorf("failed to calculate combined hash: %w", err) } return fmt.Sprintf("%d", hash), nil @@ -904,12 +913,12 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m amRawConfiguration, additionalData, err := c.loadConfigurationFromSecret(ctx, am) if err != nil { - return errors.Wrap(err, "failed to retrieve configuration from secret") + return fmt.Errorf("failed to retrieve configuration from secret: %w", err) } err = c.createOrUpdateGeneratedConfigSecret(ctx, am, amRawConfiguration, additionalData) if err != nil { - return errors.Wrap(err, "create or update generated config secret failed") + return fmt.Errorf("create or update generated config secret failed: %w", err) } return nil @@ -918,12 +927,12 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m amVersion := operator.StringValOrDefault(am.Spec.Version, operator.DefaultAlertmanagerVersion) version, err := semver.ParseTolerant(amVersion) if err != nil { - return errors.Wrap(err, "failed to parse alertmanager version") + return fmt.Errorf("failed to parse alertmanager version: %w", err) } amConfigs, err := c.selectAlertmanagerConfigs(ctx, am, version, store) if err != nil { - return errors.Wrap(err, "failed to select AlertmanagerConfig objects") + return fmt.Errorf("failed to select AlertmanagerConfig objects: %w", err) } var ( @@ -936,12 +945,12 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m globalAmConfig, err := c.mclient.MonitoringV1alpha1().AlertmanagerConfigs(am.Namespace). Get(ctx, am.Spec.AlertmanagerConfiguration.Name, metav1.GetOptions{}) if err != nil { - return errors.Wrap(err, "failed to get global AlertmanagerConfig") + return fmt.Errorf("failed to get global AlertmanagerConfig: %w", err) } err = cfgBuilder.initializeFromAlertmanagerConfig(ctx, am.Spec.AlertmanagerConfiguration.Global, globalAmConfig) if err != nil { - return errors.Wrap(err, "failed to initialize from global AlertmangerConfig") + return fmt.Errorf("failed to initialize from global AlertmangerConfig: %w", err) } // set templates @@ -962,27 +971,27 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m amRawConfiguration, additionalData, err = c.loadConfigurationFromSecret(ctx, am) if err != nil { - return errors.Wrap(err, "failed to retrieve configuration from secret") + return fmt.Errorf("failed to retrieve configuration from secret: %w", err) } err = cfgBuilder.initializeFromRawConfiguration(amRawConfiguration) if err != nil { - return errors.Wrap(err, "failed to initialize from secret") + return fmt.Errorf("failed to initialize from secret: %w", err) } } if err := cfgBuilder.addAlertmanagerConfigs(ctx, amConfigs); err != nil { - return errors.Wrap(err, "failed to generate Alertmanager configuration") + return fmt.Errorf("failed to generate Alertmanager configuration: %w", err) } generatedConfig, err := cfgBuilder.marshalJSON() if err != nil { - return errors.Wrap(err, "failed to marshal configuration") + return fmt.Errorf("failed to marshal configuration: %w", err) } err = c.createOrUpdateGeneratedConfigSecret(ctx, am, generatedConfig, additionalData) if err != nil { - return errors.Wrap(err, "failed to create or update the generated configuration secret") + return fmt.Errorf("failed to create or update the generated configuration secret: %w", err) } return nil @@ -1017,13 +1026,13 @@ func (c *Operator) createOrUpdateGeneratedConfigSecret(ctx context.Context, am * // Compress config to avoid 1mb secret limit for a while var buf bytes.Buffer if err := operator.GzipConfig(&buf, conf); err != nil { - return errors.Wrap(err, "couldnt gzip config") + return fmt.Errorf("couldnt gzip config: %w", err) } generatedConfigSecret.Data[alertmanagerConfigFileCompressed] = buf.Bytes() err := k8sutil.CreateOrUpdateSecret(ctx, sClient, generatedConfigSecret) if err != nil { - return errors.Wrap(err, "failed to update generated config secret") + return fmt.Errorf("failed to update generated config secret: %w", err) } return nil @@ -1047,7 +1056,7 @@ func (c *Operator) selectAlertmanagerConfigs(ctx context.Context, am *monitoring namespaces = append(namespaces, obj.(*v1.Namespace).Name) }) if err != nil { - return nil, errors.Wrap(err, "failed to list namespaces") + return nil, fmt.Errorf("failed to list namespaces: %w", err) } level.Debug(c.logger).Log("msg", "filtering namespaces to select AlertmanagerConfigs from", "namespaces", strings.Join(namespaces, ","), "namespace", am.Namespace, "alertmanager", am.Name) @@ -1074,7 +1083,7 @@ func (c *Operator) selectAlertmanagerConfigs(ctx context.Context, am *monitoring } }) if err != nil { - return nil, errors.Wrapf(err, "failed to list alertmanager configs in namespace %s", ns) + return nil, fmt.Errorf("failed to list alertmanager configs in namespace %s: %w", ns, err) } } @@ -1210,6 +1219,11 @@ func checkReceivers(ctx context.Context, amc *monitoringv1alpha1.AlertmanagerCon return err } + err = checkWebexConfigs(ctx, receiver.WebexConfigs, amc.GetNamespace(), amcKey, store, amVersion) + if err != nil { + return err + } + err = checkEmailConfigs(ctx, receiver.EmailConfigs, amc.GetNamespace(), store) if err != nil { return err @@ -1234,6 +1248,11 @@ func checkReceivers(ctx context.Context, amc *monitoringv1alpha1.AlertmanagerCon if err != nil { return err } + + err = checkMSTeamsConfigs(ctx, receiver.MSTeamsConfigs, amc.GetNamespace(), amcKey, store, amVersion) + if err != nil { + return err + } } return nil @@ -1396,7 +1415,7 @@ func checkWebhookConfigs( return err } if _, err := validation.ValidateURL(strings.TrimSpace(url)); err != nil { - return errors.Wrapf(err, "webhook 'url' %s invalid", url) + return fmt.Errorf("webhook 'url' %s invalid: %w", url, err) } } @@ -1436,6 +1455,36 @@ func checkWechatConfigs( return nil } +func checkWebexConfigs( + ctx context.Context, + configs []monitoringv1alpha1.WebexConfig, + namespace string, + key string, + store *assets.Store, + amVersion semver.Version, +) error { + if len(configs) == 0 { + return nil + } + + if amVersion.LT(semver.MustParse("0.25.0")) { + return fmt.Errorf(`webexConfigs' is available in Alertmanager >= 0.25.0 only - current %s`, amVersion) + } + + for i, config := range configs { + if err := checkHTTPConfig(config.HTTPConfig, amVersion); err != nil { + return err + } + webexConfigKey := fmt.Sprintf("%s/webex/%d", key, i) + + if err := configureHTTPConfigInStore(ctx, config.HTTPConfig, namespace, webexConfigKey, store); err != nil { + return err + } + } + + return nil +} + func checkEmailConfigs(ctx context.Context, configs []monitoringv1alpha1.EmailConfig, namespace string, store *assets.Store) error { for _, config := range configs { if config.AuthPassword != nil { @@ -1494,7 +1543,7 @@ func checkPushoverConfigs( ) error { checkSecret := func(secret *v1.SecretKeySelector, name string) error { if secret == nil { - return errors.Errorf("mandatory field %s is empty", name) + return fmt.Errorf("mandatory field %s is empty", name) } s, err := store.GetSecretKey(ctx, namespace, *secret) if err != nil { @@ -1586,6 +1635,36 @@ func checkTelegramConfigs( return nil } +func checkMSTeamsConfigs( + ctx context.Context, + configs []monitoringv1alpha1.MSTeamsConfig, + namespace string, + key string, + store *assets.Store, + amVersion semver.Version, +) error { + if len(configs) == 0 { + return nil + } + if amVersion.LT(semver.MustParse("0.26.0")) { + return fmt.Errorf(`invalid syntax in receivers config; msteams integration is only available in Alertmanager >= 0.26.0`) + } + + for i, config := range configs { + if err := checkHTTPConfig(config.HTTPConfig, amVersion); err != nil { + return err + } + + msteamsConfigKey := fmt.Sprintf("%s/msteams/%d", key, i) + + if err := configureHTTPConfigInStore(ctx, config.HTTPConfig, namespace, msteamsConfigKey, store); err != nil { + return err + } + } + + return nil +} + func checkInhibitRules(amc *monitoringv1alpha1.AlertmanagerConfig, version semver.Version) error { matchersV2Allowed := version.GTE(semver.MustParse("0.22.0")) @@ -1603,13 +1682,13 @@ func checkInhibitRules(amc *monitoringv1alpha1.AlertmanagerConfig, version semve for j, tm := range rule.TargetMatch { if err := tm.Validate(); err != nil { - return errors.Wrapf(err, "invalid targetMatchers[%d] in inhibitRule[%d] in config %s", j, i, amc.Name) + return fmt.Errorf("invalid targetMatchers[%d] in inhibitRule[%d] in config %s: %w", j, i, amc.Name, err) } } for j, sm := range rule.SourceMatch { if err := sm.Validate(); err != nil { - return errors.Wrapf(err, "invalid sourceMatchers[%d] in inhibitRule[%d] in config %s", j, i, amc.Name) + return fmt.Errorf("invalid sourceMatchers[%d] in inhibitRule[%d] in config %s: %w", j, i, amc.Name, err) } } } @@ -1625,7 +1704,7 @@ func configureHTTPConfigInStore(ctx context.Context, httpConfig *monitoringv1alp var err error if httpConfig.BearerTokenSecret != nil { - if err = store.AddBearerToken(ctx, namespace, *httpConfig.BearerTokenSecret, key); err != nil { + if err = store.AddBearerToken(ctx, namespace, httpConfig.BearerTokenSecret, key); err != nil { return err } } @@ -1657,7 +1736,7 @@ func (c *Operator) createOrUpdateTLSAssetSecrets(ctx context.Context, am *monito sClient := c.kclient.CoreV1().Secrets(am.Namespace) if err := sSecret.StoreSecrets(ctx, sClient); err != nil { - return nil, errors.Wrapf(err, "failed to create TLS assets secret for Alertmanager") + return nil, fmt.Errorf("failed to create TLS assets secret for Alertmanager: %w", err) } level.Debug(c.logger).Log("msg", "tls-asset secret: stored") @@ -1700,7 +1779,7 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, a *monitor fields, ) if err != nil { - return errors.Wrap(err, "failed to initialize web config") + return fmt.Errorf("failed to initialize web config: %w", err) } secretClient := c.kclient.CoreV1().Secrets(a.Namespace) @@ -1716,7 +1795,7 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, a *monitor secretLabels := c.config.Labels.Merge(managedByOperatorLabels) if err := webConfig.CreateOrUpdateWebConfigSecret(ctx, secretClient, secretAnnotations, secretLabels, ownerReference); err != nil { - return errors.Wrap(err, "failed to reconcile web config secret") + return fmt.Errorf("failed to reconcile web config secret: %w", err) } return nil @@ -1750,3 +1829,26 @@ func ListOptions(name string) metav1.ListOptions { func tlsAssetsSecretName(name string) string { return fmt.Sprintf("%s-tls-assets", prefixedName(name)) } + +func ApplyConfigurationFromAlertmanager(a *monitoringv1.Alertmanager) *monitoringv1ac.AlertmanagerApplyConfiguration { + asac := monitoringv1ac.AlertmanagerStatus(). + WithPaused(a.Status.Paused). + WithReplicas(a.Status.Replicas). + WithAvailableReplicas(a.Status.AvailableReplicas). + WithUpdatedReplicas(a.Status.UpdatedReplicas). + WithUnavailableReplicas(a.Status.UnavailableReplicas) + + for _, condition := range a.Status.Conditions { + asac.WithConditions( + monitoringv1ac.Condition(). + WithType(condition.Type). + WithStatus(condition.Status). + WithLastTransitionTime(condition.LastTransitionTime). + WithReason(condition.Reason). + WithMessage(condition.Message). + WithObservedGeneration(condition.ObservedGeneration), + ) + } + + return monitoringv1ac.Alertmanager(a.Name, a.Namespace).WithStatus(asac) +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator_test.go index 37ea7e1f4..c64dd332e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/operator_test.go @@ -24,13 +24,14 @@ import ( "github.com/go-kit/log/level" "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" + authv1 "k8s.io/api/authorization/v1" v1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" @@ -188,7 +189,7 @@ func TestCreateStatefulSetInputHash(t *testing.T) { t.Fatal("expected two Alertmanager CRDs to produce the same hash but got different hash") } - a2Hash, err = createSSetInputHash(tc.a, Config{}, nil, appsv1.StatefulSetSpec{Replicas: func(i int32) *int32 { return &i }(2)}) + a2Hash, err = createSSetInputHash(tc.a, Config{}, nil, appsv1.StatefulSetSpec{Replicas: ptr.To(int32(2))}) if err != nil { t.Fatal(err) } @@ -482,7 +483,7 @@ func TestCheckAlertmanagerConfig(t *testing.T) { Name: "recv1", WebhookConfigs: []monitoringv1alpha1.WebhookConfig{ { - URL: pointer.String("http://test.local"), + URL: ptr.To("http://test.local"), }, }, }}, @@ -1233,10 +1234,21 @@ func TestProvisionAlertmanagerConfiguration(t *testing.T) { c := fake.NewSimpleClientset(tc.objects...) o := &Operator{ - kclient: c, - mclient: monitoringfake.NewSimpleClientset(), - logger: level.NewFilter(log.NewLogfmtLogger(os.Stderr), level.AllowInfo()), - metrics: operator.NewMetrics(prometheus.NewRegistry()), + kclient: c, + mclient: monitoringfake.NewSimpleClientset(), + ssarClient: &alwaysAllowed{}, + logger: level.NewFilter(log.NewLogfmtLogger(os.Stderr), level.AllowInfo()), + metrics: operator.NewMetrics(prometheus.NewRegistry()), + config: Config{ + Namespaces: operator.Namespaces{ + AlertmanagerConfigAllowList: map[string]struct{}{ + v1.NamespaceAll: {}, + }, + AlertmanagerAllowList: map[string]struct{}{ + "foo": {}, + }, + }, + }, } err := o.bootstrap(context.Background()) @@ -1275,3 +1287,14 @@ func TestProvisionAlertmanagerConfiguration(t *testing.T) { }) } } + +// alwaysAllowed implements SelfSubjectAccessReviewInterface. +type alwaysAllowed struct{} + +func (*alwaysAllowed) Create(_ context.Context, _ *authv1.SelfSubjectAccessReview, _ metav1.CreateOptions) (*authv1.SelfSubjectAccessReview, error) { + return &authv1.SelfSubjectAccessReview{ + Status: authv1.SubjectAccessReviewStatus{ + Allowed: true, + }, + }, nil +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset.go index 3258894ba..d0520caad 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset.go @@ -21,7 +21,6 @@ import ( "strings" "github.com/blang/semver/v4" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -235,12 +234,12 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe operator.StringValOrDefault(a.Spec.SHA, ""), ) if err != nil { - return nil, errors.Wrap(err, "failed to build image path") + return nil, fmt.Errorf("failed to build image path: %w", err) } version, err := semver.ParseTolerant(amVersion) if err != nil { - return nil, errors.Wrap(err, "failed to parse alertmanager version") + return nil, fmt.Errorf("failed to parse alertmanager version: %w", err) } amArgs := []string{ @@ -306,6 +305,17 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe amArgs = append(amArgs, fmt.Sprintf("--cluster.peer-timeout=%s", a.Spec.ClusterPeerTimeout)) } + // If multiple Alertmanager clusters are deployed on the same cluster, it can happen + // that because pod IP addresses are recycled, an Alertmanager instance from cluster B + // connects with cluster A. + // --cluster.label flag was introduced in alertmanager v0.26, this helps to block + // any traffic that is not meant for the cluster. + // The value is hardcoded and the value is guaranteed to be unique in a given cluster but + // if there's a use case, we can consider a new field in the CRD. + if version.GTE(semver.MustParse("0.26.0")) { + amArgs = append(amArgs, fmt.Sprintf("--cluster.label=%s/%s", a.Namespace, a.Name)) + } + isHTTPS := a.Spec.Web != nil && a.Spec.Web.TLSConfig != nil && version.GTE(semver.MustParse("0.22.0")) livenessProbeHandler := v1.ProbeHandler{ @@ -360,15 +370,11 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe "alertmanager": a.Name, } if a.Spec.PodMetadata != nil { - if a.Spec.PodMetadata.Labels != nil { - for k, v := range a.Spec.PodMetadata.Labels { - podLabels[k] = v - } + for k, v := range a.Spec.PodMetadata.Labels { + podLabels[k] = v } - if a.Spec.PodMetadata.Annotations != nil { - for k, v := range a.Spec.PodMetadata.Annotations { - podAnnotations[k] = v - } + for k, v := range a.Spec.PodMetadata.Annotations { + podAnnotations[k] = v } } for k, v := range podSelectorLabels { @@ -452,7 +458,7 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe }) } default: - return nil, errors.Errorf("unsupported Alertmanager major version %s", version) + return nil, fmt.Errorf("unsupported Alertmanager major version %s", version) } assetsVolume := v1.Volume{ @@ -727,7 +733,7 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe containers, err := k8sutil.MergePatchContainers(defaultContainers, a.Spec.Containers) if err != nil { - return nil, errors.Wrap(err, "failed to merge containers spec") + return nil, fmt.Errorf("failed to merge containers spec: %w", err) } var minReadySeconds int32 @@ -753,7 +759,7 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe initContainers, err := k8sutil.MergePatchContainers(operatorInitContainers, a.Spec.InitContainers) if err != nil { - return nil, errors.Wrap(err, "failed to merge init containers spec") + return nil, fmt.Errorf("failed to merge init containers spec: %w", err) } // PodManagementPolicy is set to Parallel to mitigate issues in kubernetes: https://github.com/kubernetes/kubernetes/issues/60164 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset_test.go index 7fc2f2a5b..e5167628d 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/statefulset_test.go @@ -1186,6 +1186,48 @@ func TestAutomountServiceAccountToken(t *testing.T) { } } } + +func TestClusterLabel(t *testing.T) { + tt := []struct { + scenario string + version string + expectedClusterLabelArg bool + }{{ + scenario: "--cluster.label set by default for version >= v0.26.0", + version: "0.26.0", + expectedClusterLabelArg: true, + }, { + scenario: "no --cluster.label set for older versions", + version: "0.25.0", + expectedClusterLabelArg: false, + }} + + for _, ts := range tt { + t.Run(ts.scenario, func(t *testing.T) { + a := monitoringv1.Alertmanager{ + ObjectMeta: metav1.ObjectMeta{ + Name: "alertmanager", + Namespace: "monitoring", + }, + Spec: monitoringv1.AlertmanagerSpec{ + Replicas: toPtr(int32(1)), + Version: ts.version, + }, + } + + ss, err := makeStatefulSetSpec(&a, defaultTestConfig, nil) + require.NoError(t, err) + + args := ss.Template.Spec.Containers[0].Args + if ts.expectedClusterLabelArg { + require.Contains(t, args, "--cluster.label=monitoring/alertmanager") + return + } + require.NotContains(t, args, "--cluster.label") + }) + } +} + func containsString(sub string) func(string) bool { return func(x string) bool { return strings.Contains(x, sub) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Active_Time_Intervals.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Active_Time_Intervals.golden new file mode 100644 index 000000000..a6245be8a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Active_Time_Intervals.golden @@ -0,0 +1,35 @@ +global: + slack_api_url_file: /etc/test +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true + active_time_intervals: + - mynamespace/myamc/test +receivers: +- name: "null" +- name: mynamespace/myamc/test + slack_configs: + - fields: + - title: title + value: value + actions: + - type: type + text: text + name: my-action + confirm: + text: text +mute_time_intervals: +- name: mynamespace/myamc/test + time_intervals: + - times: + - start_time: "08:00" + end_time: "17:00" + weekdays: [saturday, sunday] + days_of_month: ["1:10"] + months: ["1:3"] + years: ['2030:2050'] +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_MSTeams_Receiver.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_MSTeams_Receiver.golden new file mode 100644 index 000000000..130cb6a91 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_MSTeams_Receiver.golden @@ -0,0 +1,15 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + msteams_configs: + - webhook_url: https://webhook.office.com/webhookb2/id/IncomingWebhook/id + title: test title + text: test text +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Mute_Time_Intervals.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Mute_Time_Intervals.golden new file mode 100644 index 000000000..9c1c29646 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Mute_Time_Intervals.golden @@ -0,0 +1,35 @@ +global: + slack_api_url_file: /etc/test +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true + mute_time_intervals: + - mynamespace/myamc/test +receivers: +- name: "null" +- name: mynamespace/myamc/test + slack_configs: + - fields: + - title: title + value: value + actions: + - type: type + text: text + name: my-action + confirm: + text: text +mute_time_intervals: +- name: mynamespace/myamc/test + time_intervals: + - times: + - start_time: "08:00" + end_time: "17:00" + weekdays: [saturday, sunday] + days_of_month: ["1:10"] + months: ["1:3"] + years: ['2030:2050'] +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Receiver.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Receiver.golden new file mode 100644 index 000000000..80e31fca5 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Receiver.golden @@ -0,0 +1,13 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + opsgenie_configs: + - api_key: 1234abc +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Team_Responder.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Team_Responder.golden new file mode 100644 index 000000000..fd0911190 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Opsgenie_Team_Responder.golden @@ -0,0 +1,16 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + opsgenie_configs: + - api_key: 1234abc + responders: + - name: myname + type: team +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Pagerduty_Receiver.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Pagerduty_Receiver.golden new file mode 100644 index 000000000..617b6ee0e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Pagerduty_Receiver.golden @@ -0,0 +1,20 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test-pd + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test-pd + pagerduty_configs: + - routing_key: 1234abc + images: + - src: https://some-image.com + alt: some-image + href: https://some-image.com + links: + - href: https://some-link.com + text: some-link +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_Access_and_Key.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_Access_and_Key.golden new file mode 100644 index 000000000..6ddc97a47 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_Access_and_Key.golden @@ -0,0 +1,18 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + sns_configs: + - api_url: https://sns.us-east-2.amazonaws.com + sigv4: + region: us-east-2 + access_key: xyz + secret_key: "123" + topic_arn: test-topicARN +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_roleARN.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_roleARN.golden new file mode 100644 index 000000000..86912f10e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_SNS_Receiver_with_roleARN.golden @@ -0,0 +1,17 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + sns_configs: + - api_url: https://sns.us-east-2.amazonaws.com + sigv4: + region: us-east-2 + role_arn: test-roleARN + topic_arn: test-topicARN +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL.golden new file mode 100644 index 000000000..7228b2d6d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL.golden @@ -0,0 +1,23 @@ +global: + slack_api_url: http://slack.example.com +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + slack_configs: + - fields: + - title: title + value: value + actions: + - type: type + text: text + name: my-action + confirm: + text: text +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL_File.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL_File.golden new file mode 100644 index 000000000..99f17482a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Slack_Receiver_and_global_Slack_URL_File.golden @@ -0,0 +1,23 @@ +global: + slack_api_url_file: /etc/test +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + slack_configs: + - fields: + - title: title + value: value + actions: + - type: type + text: text + name: my-action + confirm: + text: text +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Telegram_Receiver.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Telegram_Receiver.golden new file mode 100644 index 000000000..db7efc27f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Telegram_Receiver.golden @@ -0,0 +1,15 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + telegram_configs: + - api_url: https://api.telegram.org + bot_token: bipbop + chat_id: 12345 +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_WeChat_Receiver.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_WeChat_Receiver.golden new file mode 100644 index 000000000..ce85b6e6e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_WeChat_Receiver.golden @@ -0,0 +1,14 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + wechat_configs: + - api_secret: wechatsecret + corp_id: wechatcorpid +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Webhook_Receiver_and_custom_http_config_oauth2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Webhook_Receiver_and_custom_http_config_oauth2.golden new file mode 100644 index 000000000..bb46b53dd --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/CR_with_Webhook_Receiver_and_custom_http_config_oauth2.golden @@ -0,0 +1,23 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test + webhook_configs: + - url: http://test.url + http_config: + oauth2: + client_id: clientID + client_secret: clientSecret + scopes: + - any + token_url: https://test.com + endpoint_params: + some: value + follow_redirects: true +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Discord_url_field.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Discord_url_field.golden new file mode 100644 index 000000000..d5c61cd61 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Discord_url_field.golden @@ -0,0 +1,7 @@ +route: + receiver: "discord" +receivers: +- name: "discord" + discord_configs: + - webhook_url: http://example.com +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Global_opsgenie_api_key_file_field.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Global_opsgenie_api_key_file_field.golden new file mode 100644 index 000000000..4ab4f8e5b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/Global_opsgenie_api_key_file_field.golden @@ -0,0 +1,7 @@ +route: + receiver: "null" +receivers: +- name: "null" +global: + opsgenie_api_key_file: "xxx" +templates: [] \ No newline at end of file diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/OpsGenie_entity_and_actions_fields.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/OpsGenie_entity_and_actions_fields.golden new file mode 100644 index 000000000..1cfcf287f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/OpsGenie_entity_and_actions_fields.golden @@ -0,0 +1,9 @@ +route: + receiver: "opsgenie" +receivers: +- name: "opsgenie" + opsgenie_configs: + - entity: entity1 + actions: action1,action2 + api_key: xxx +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_sub_route_and_matchers_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_sub_route_and_matchers_no_CRs.golden new file mode 100644 index 000000000..6ad07606a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_sub_route_and_matchers_no_CRs.golden @@ -0,0 +1,10 @@ +route: + receiver: "null" + routes: + - receiver: custom + matchers: + - namespace=custom-test +receivers: +- name: "null" +- name: custom +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_subroute_deprecated_matching_pattern_simple_CR.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_subroute_deprecated_matching_pattern_simple_CR.golden new file mode 100644 index 000000000..8f7ba0b3e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/base_with_subroute_deprecated_matching_pattern_simple_CR.golden @@ -0,0 +1,12 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + matchers: + - namespace="mynamespace" + continue: true + - receiver: "null" +receivers: +- name: "null" +- name: mynamespace/myamc/test +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/mute_time_intervals_field.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/mute_time_intervals_field.golden new file mode 100644 index 000000000..9c5c6d426 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/mute_time_intervals_field.golden @@ -0,0 +1,13 @@ +route: + receiver: "null" +receivers: +- name: "null" +mute_time_intervals: +- name: maintenance_windows + time_intervals: + - times: + - start_time: "17:00" + end_time: "24:00" + days_of_month: ["7", "18", "28"] + months: ["january"] +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base,_CR_with_inhibition_rules_only.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base,_CR_with_inhibition_rules_only.golden new file mode 100644 index 000000000..99fb24cf1 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base,_CR_with_inhibition_rules_only.golden @@ -0,0 +1,14 @@ +route: + receiver: "null" +inhibit_rules: +- target_matchers: + - alertname!="TargetDown" + - namespace="mynamespace" + source_matchers: + - alertname=~"NodeNotReady" + - namespace="mynamespace" + equal: + - node +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_are_converted.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_are_converted.golden new file mode 100644 index 000000000..e9bb719e1 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_are_converted.golden @@ -0,0 +1,14 @@ +route: + receiver: "null" +inhibit_rules: +- target_matchers: + - alertname="TargetDown" + - namespace="mynamespace" + source_matchers: + - alertname=~"NodeNotReady" + - namespace="mynamespace" + equal: + - node +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_not_converted.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_not_converted.golden new file mode 100644 index 000000000..e70077b63 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_CR_with_inhibition_rules_only_deprecated_matchers_not_converted.golden @@ -0,0 +1,14 @@ +route: + receiver: "null" +inhibit_rules: +- target_match: + alertname: TargetDown + namespace: mynamespace + source_match: + alertname: NodeNotReady + namespace: mynamespace + equal: + - node +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_multiple_alertmanagerconfigs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_multiple_alertmanagerconfigs.golden new file mode 100644 index 000000000..5477d670e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_multiple_alertmanagerconfigs.golden @@ -0,0 +1,34 @@ +route: + receiver: "null" + routes: + - receiver: ns1/amc1/test1 + group_by: + - job + matchers: + - namespace="ns1" + continue: true + - receiver: ns1/amc2/test2 + group_by: + - instance + matchers: + - namespace="ns1" + continue: true + - receiver: ns2/amc1/test3 + group_by: + - job + - instance + matchers: + - namespace="ns2" + continue: true + - receiver: watchdog + group_by: + - alertname + matchers: + - alertname=Watchdog +receivers: +- name: "null" +- name: watchdog +- name: ns1/amc1/test1 +- name: ns1/amc2/test2 +- name: ns2/amc1/test3 +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_no_CRs.golden new file mode 100644 index 000000000..8ffdcb54b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_no_CRs.golden @@ -0,0 +1,5 @@ +route: + receiver: "null" +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR.golden new file mode 100644 index 000000000..00a81f196 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR.golden @@ -0,0 +1,13 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + group_by: + - job + matchers: + - namespace="mynamespace" + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR_with_namespaceMatcher_disabled.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR_with_namespaceMatcher_disabled.golden new file mode 100644 index 000000000..292400338 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_simple_CR_with_namespaceMatcher_disabled.golden @@ -0,0 +1,11 @@ +route: + receiver: "null" + routes: + - receiver: mynamespace/myamc/test + group_by: + - job + continue: true +receivers: +- name: "null" +- name: mynamespace/myamc/test +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_active_time_intervals_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_active_time_intervals_no_CRs.golden new file mode 100644 index 000000000..6dcaab899 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_active_time_intervals_no_CRs.golden @@ -0,0 +1,13 @@ +route: + receiver: "null" + routes: + - receiver: "null" + active_time_intervals: + - workdays +receivers: +- name: "null" +time_intervals: +- name: workdays + time_intervals: + - weekdays: ['monday:friday'] +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_send_revolved_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_send_revolved_no_CRs.golden new file mode 100644 index 000000000..c5798b232 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_send_revolved_no_CRs.golden @@ -0,0 +1,7 @@ +global: + resolve_timeout: 1m +route: + receiver: "null" +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_false,_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_false,_no_CRs.golden new file mode 100644 index 000000000..dd8b1fe1b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_false,_no_CRs.golden @@ -0,0 +1,7 @@ +global: + smtp_require_tls: false +route: + receiver: "null" +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_true_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_true_no_CRs.golden new file mode 100644 index 000000000..ddaea1361 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_global_smtp_require_tls_set_to_true_no_CRs.golden @@ -0,0 +1,7 @@ +global: + smtp_require_tls: true +route: + receiver: "null" +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_inhibit_rules_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_inhibit_rules_no_CRs.golden new file mode 100644 index 000000000..a6ee849fb --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_inhibit_rules_no_CRs.golden @@ -0,0 +1,12 @@ +route: + receiver: "null" +inhibit_rules: +- target_matchers: + - test!=dropped + - expect=~this-value + source_matchers: + - test!=dropped + - expect=~this-value +receivers: +- name: "null" +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_mute_time_intervals_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_mute_time_intervals_no_CRs.golden new file mode 100644 index 000000000..84aeaf819 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_mute_time_intervals_no_CRs.golden @@ -0,0 +1,13 @@ +route: + receiver: "null" +receivers: +- name: "null" +mute_time_intervals: +- name: maintenance_windows + time_intervals: + - times: + - start_time: "17:00" + end_time: "24:00" + days_of_month: ["7", "18", "28"] + months: ["1"] +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_sns_receiver_no_CRs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_sns_receiver_no_CRs.golden new file mode 100644 index 000000000..8ceca45ed --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/testdata/skeleton_base_with_sns_receiver_no_CRs.golden @@ -0,0 +1,17 @@ +route: + receiver: sns-test +receivers: +- name: sns-test + sns_configs: + - api_url: https://sns.us-west-2.amazonaws.com + sigv4: + region: us-west-2 + access_key: key + secret_key: secret + profile: dev + role_arn: arn:dev + topic_arn: arn:test + phone_number: "+12345" + target_arn: arn:target + subject: testing +templates: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/types.go index 07b64a55d..381287b80 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/types.go @@ -68,6 +68,7 @@ type globalConfig struct { VictorOpsAPIKey string `yaml:"victorops_api_key,omitempty" json:"victorops_api_key,omitempty"` VictorOpsAPIKeyFile string `yaml:"victorops_api_key_file,omitempty" json:"victorops_api_key_file,omitempty"` TelegramAPIURL *config.URL `yaml:"telegram_api_url,omitempty" json:"telegram_api_url,omitempty"` + WebexAPIURL *config.URL `yaml:"webex_api_url,omitempty" json:"webex_api_url,omitempty"` } type route struct { @@ -109,11 +110,13 @@ type receiver struct { TelegramConfigs []*telegramConfig `yaml:"telegram_configs,omitempty" json:"telegram_configs,omitempty"` DiscordConfigs []*discordConfig `yaml:"discord_configs,omitempty"` WebexConfigs []*webexConfig `yaml:"webex_configs,omitempty"` + MSTeamsConfigs []*msTeamsConfig `yaml:"msteams_configs,omitempty"` } type webhookConfig struct { VSendResolved *bool `yaml:"send_resolved,omitempty" json:"send_resolved,omitempty"` URL string `yaml:"url,omitempty" json:"url,omitempty"` + URLFile string `yaml:"url_file,omitempty" json:"url_file,omitempty"` HTTPConfig *httpClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` MaxAlerts int32 `yaml:"max_alerts,omitempty" json:"max_alerts,omitempty"` } @@ -297,8 +300,8 @@ type emailConfig struct { AuthSecret string `yaml:"auth_secret,omitempty" json:"auth_secret,omitempty"` AuthIdentity string `yaml:"auth_identity,omitempty" json:"auth_identity,omitempty"` Headers map[string]string `yaml:"headers,omitempty" json:"headers,omitempty"` - HTML string `yaml:"html,omitempty" json:"html,omitempty"` - Text string `yaml:"text,omitempty" json:"text,omitempty"` + HTML *string `yaml:"html,omitempty" json:"html,omitempty"` + Text *string `yaml:"text,omitempty" json:"text,omitempty"` RequireTLS *bool `yaml:"require_tls,omitempty" json:"require_tls,omitempty"` TLSConfig *tlsConfig `yaml:"tls_config,omitempty" json:"tls_config,omitempty"` } @@ -307,7 +310,9 @@ type pushoverConfig struct { VSendResolved *bool `yaml:"send_resolved,omitempty" json:"send_resolved,omitempty"` HTTPConfig *httpClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` UserKey string `yaml:"user_key,omitempty" json:"user_key,omitempty"` + UserKeyFile string `yaml:"user_key_file,omitempty" json:"user_key_file,omitempty"` Token string `yaml:"token,omitempty" json:"token,omitempty"` + TokenFile string `yaml:"token_file,omitempty" json:"token_file,omitempty"` Title string `yaml:"title,omitempty" json:"title,omitempty"` Message string `yaml:"message,omitempty" json:"message,omitempty"` URL string `yaml:"url,omitempty" json:"url,omitempty"` @@ -336,6 +341,7 @@ type telegramConfig struct { VSendResolved *bool `yaml:"send_resolved,omitempty" json:"send_resolved,omitempty"` APIUrl string `yaml:"api_url,omitempty" json:"api_url,omitempty"` BotToken string `yaml:"bot_token,omitempty" json:"bot_token,omitempty"` + BotTokenFile string `yaml:"bot_token_file,omitempty" json:"bot_token_file,omitempty"` ChatID int64 `yaml:"chat_id,omitempty" json:"chat_id,omitempty"` Message string `yaml:"message,omitempty" json:"message,omitempty"` DisableNotifications bool `yaml:"disable_notifications,omitempty" json:"disable_notifications,omitempty"` @@ -395,4 +401,12 @@ type victorOpsConfig struct { CustomFields map[string]string `yaml:"custom_fields,omitempty" json:"custom_fields,omitempty"` } +type msTeamsConfig struct { + SendResolved *bool `yaml:"send_resolved,omitempty"` + WebhookURL string `yaml:"webhook_url"` + Title string `yaml:"title,omitempty"` + Text string `yaml:"text,omitempty"` + HTTPConfig *httpClientConfig `yaml:"http_config,omitempty"` +} + type timeInterval config.TimeInterval diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1alpha1/validation.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1alpha1/validation.go index 259546309..f94f05152 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1alpha1/validation.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1alpha1/validation.go @@ -15,13 +15,12 @@ package v1alpha1 import ( + "errors" "fmt" "net" "regexp" "strings" - "github.com/pkg/errors" - "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager/validation" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" ) @@ -52,52 +51,60 @@ func validateReceivers(receivers []monitoringv1alpha1.Receiver) (map[string]stru for _, receiver := range receivers { if _, found := receiverNames[receiver.Name]; found { - return nil, errors.Errorf("%q receiver is not unique", receiver.Name) + return nil, fmt.Errorf("%q receiver is not unique: %w", receiver.Name, err) } receiverNames[receiver.Name] = struct{}{} if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pagerDutyConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pagerDutyConfig' - receiver %s: %w", receiver.Name, err) } if err := validateOpsGenieConfigs(receiver.OpsGenieConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'opsGenieConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'opsGenieConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSlackConfigs(receiver.SlackConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'slackConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'slackConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWebhookConfigs(receiver.WebhookConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'webhookConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'webhookConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWechatConfigs(receiver.WeChatConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'weChatConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'weChatConfig' - receiver %s: %w", receiver.Name, err) } if err := validateEmailConfig(receiver.EmailConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'emailConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'emailConfig' - receiver %s: %w", receiver.Name, err) } if err := validateVictorOpsConfigs(receiver.VictorOpsConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'victorOpsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'victorOpsConfig' - receiver %s: %w", receiver.Name, err) } if err := validatePushoverConfigs(receiver.PushoverConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pushOverConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pushOverConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSnsConfigs(receiver.SNSConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'snsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'snsConfig' - receiver %s: %w", receiver.Name, err) } if err := validateTelegramConfigs(receiver.TelegramConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'telegramConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'telegramConfig' - receiver %s: %w", receiver.Name, err) + } + + if err := validateWebexConfigs(receiver.WebexConfigs); err != nil { + return nil, fmt.Errorf("failed to validate 'webexConfig' - receiver %s: %w", receiver.Name, err) } if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'discordConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'discordConfig' - receiver %s: %w", receiver.Name, err) + } + + if err := validateMSTeamsConfigs(receiver.MSTeamsConfigs); err != nil { + return nil, fmt.Errorf("failed to validate 'msteamsConfig' - receiver %s: %w", receiver.Name, err) } } @@ -108,7 +115,7 @@ func validatePagerDutyConfigs(configs []monitoringv1alpha1.PagerDutyConfig) erro for _, conf := range configs { if conf.URL != "" { if _, err := validation.ValidateURL(conf.URL); err != nil { - return errors.Wrap(err, "pagerduty validation failed for 'url'") + return fmt.Errorf("pagerduty validation failed for 'url': %w", err) } } if conf.RoutingKey == nil && conf.ServiceKey == nil { @@ -129,7 +136,7 @@ func validateOpsGenieConfigs(configs []monitoringv1alpha1.OpsGenieConfig) error } if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -169,7 +176,7 @@ func validateWebhookConfigs(configs []monitoringv1alpha1.WebhookConfig) error { } if config.URL != nil { if _, err := validation.ValidateURL(*config.URL); err != nil { - return errors.Wrapf(err, "invalid 'url'") + return fmt.Errorf("invalid 'url': %w", err) } } @@ -184,7 +191,7 @@ func validateWechatConfigs(configs []monitoringv1alpha1.WeChatConfig) error { for _, config := range configs { if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -204,7 +211,7 @@ func validateEmailConfig(configs []monitoringv1alpha1.EmailConfig) error { if config.Smarthost != "" { _, _, err := net.SplitHostPort(config.Smarthost) if err != nil { - return errors.Wrapf(err, "invalid field 'smarthost': %s", config.Smarthost) + return fmt.Errorf("invalid 'smarthost' %s: %w", config.Smarthost, err) } } @@ -251,7 +258,7 @@ func validateVictorOpsConfigs(configs []monitoringv1alpha1.VictorOpsConfig) erro if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrapf(err, "'apiURL' %s invalid", config.APIURL) + return fmt.Errorf("'apiURL' %s invalid: %w", config.APIURL, err) } } @@ -264,12 +271,12 @@ func validateVictorOpsConfigs(configs []monitoringv1alpha1.VictorOpsConfig) erro func validatePushoverConfigs(configs []monitoringv1alpha1.PushoverConfig) error { for _, config := range configs { - if config.UserKey == nil { - return errors.Errorf("mandatory field %q is empty", "userKey") + if config.UserKey == nil && config.UserKeyFile == nil { + return fmt.Errorf("one of userKey or userKeyFile must be configured") } - if config.Token == nil { - return errors.Errorf("mandatory field %q is empty", "token") + if config.Token == nil && config.TokenFile == nil { + return fmt.Errorf("one of token or tokenFile must be configured") } if err := config.HTTPConfig.Validate(); err != nil { @@ -296,8 +303,8 @@ func validateSnsConfigs(configs []monitoringv1alpha1.SNSConfig) error { func validateTelegramConfigs(configs []monitoringv1alpha1.TelegramConfig) error { for _, config := range configs { - if config.BotToken == nil { - return fmt.Errorf("mandatory field %q is empty", "botToken") + if config.BotToken == nil && config.BotTokenFile == nil { + return fmt.Errorf("mandatory field botToken or botTokenfile is empty") } if config.ChatID == 0 { @@ -312,6 +319,32 @@ func validateTelegramConfigs(configs []monitoringv1alpha1.TelegramConfig) error return nil } +func validateWebexConfigs(configs []monitoringv1alpha1.WebexConfig) error { + for _, config := range configs { + if *config.APIURL != "" { + if _, err := validation.ValidateURL(string(*config.APIURL)); err != nil { + return fmt.Errorf("invalid 'apiURL': %w", err) + } + } + + if err := config.HTTPConfig.Validate(); err != nil { + return err + } + } + + return nil +} + +func validateMSTeamsConfigs(configs []monitoringv1alpha1.MSTeamsConfig) error { + for _, config := range configs { + if err := config.HTTPConfig.Validate(); err != nil { + return err + } + } + + return nil +} + // validateAlertManagerRoutes verifies that the given route and all its children are semantically valid. // because of the self-referential issues mentioned in https://github.com/kubernetes/kubernetes/issues/62872 // it is not currently possible to apply OpenAPI validation to a v1alpha1.Route @@ -322,11 +355,11 @@ func validateAlertManagerRoutes(r *monitoringv1alpha1.Route, receivers, muteTime if r.Receiver == "" { if topLevelRoute { - return errors.Errorf("root route must define a receiver") + return errors.New("root route must define a receiver") } } else { if _, found := receivers[r.Receiver]; !found { - return errors.Errorf("receiver %q not found", r.Receiver) + return fmt.Errorf("receiver %q not found", r.Receiver) } } @@ -334,38 +367,38 @@ func validateAlertManagerRoutes(r *monitoringv1alpha1.Route, receivers, muteTime groupedBy := make(map[string]struct{}, groupLen) for _, str := range r.GroupBy { if _, found := groupedBy[str]; found { - return errors.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) } groupedBy[str] = struct{}{} } if _, found := groupedBy["..."]; found && groupLen > 1 { - return errors.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) } } for _, namedMuteTimeInterval := range r.MuteTimeIntervals { if _, found := muteTimeIntervals[namedMuteTimeInterval]; !found { - return errors.Errorf("mute time interval %q not found", namedMuteTimeInterval) + return fmt.Errorf("mute time interval %q not found", namedMuteTimeInterval) } } for _, namedActiveTimeInterval := range r.ActiveTimeIntervals { if _, found := muteTimeIntervals[namedActiveTimeInterval]; !found { - return errors.Errorf("time interval %q not found", namedActiveTimeInterval) + return fmt.Errorf("time interval %q not found", namedActiveTimeInterval) } } // validate that if defaults are set, they match regex if r.GroupInterval != "" && !durationRe.MatchString(r.GroupInterval) { - return errors.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) + return fmt.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) } if r.GroupWait != "" && !durationRe.MatchString(r.GroupWait) { - return errors.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) + return fmt.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) } if r.RepeatInterval != "" && !durationRe.MatchString(r.RepeatInterval) { - return errors.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) + return fmt.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) } children, err := r.ChildRoutes() @@ -375,7 +408,7 @@ func validateAlertManagerRoutes(r *monitoringv1alpha1.Route, receivers, muteTime for i := range children { if err := validateAlertManagerRoutes(&children[i], receivers, muteTimeIntervals, false); err != nil { - return errors.Wrapf(err, "route[%d]", i) + return fmt.Errorf("route[%d]: %w", i, err) } } @@ -387,7 +420,7 @@ func validateMuteTimeIntervals(muteTimeIntervals []monitoringv1alpha1.MuteTimeIn for i, mti := range muteTimeIntervals { if err := mti.Validate(); err != nil { - return nil, errors.Wrapf(err, "mute time interval[%d] is invalid", i) + return nil, fmt.Errorf("mute time interval[%d] is invalid: %w", i, err) } muteTimeIntervalNames[mti.Name] = struct{}{} } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation.go index 3ff5ab35b..0e1ee8c5f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation.go @@ -15,13 +15,12 @@ package v1beta1 import ( + "errors" "fmt" "net" "regexp" "strings" - "github.com/pkg/errors" - "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager/validation" monitoringv1beta1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1beta1" ) @@ -52,48 +51,60 @@ func validateReceivers(receivers []monitoringv1beta1.Receiver) (map[string]struc for _, receiver := range receivers { if _, found := receiverNames[receiver.Name]; found { - return nil, errors.Errorf("%q receiver is not unique", receiver.Name) + return nil, fmt.Errorf("%q receiver is not unique", receiver.Name) } receiverNames[receiver.Name] = struct{}{} if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pagerDutyConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pagerDutyConfig' - receiver %s: %w", receiver.Name, err) } if err := validateOpsGenieConfigs(receiver.OpsGenieConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'opsGenieConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'opsGenieConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSlackConfigs(receiver.SlackConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'slackConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'slackConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWebhookConfigs(receiver.WebhookConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'webhookConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'webhookConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWechatConfigs(receiver.WeChatConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'weChatConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'weChatConfig' - receiver %s: %w", receiver.Name, err) } if err := validateEmailConfig(receiver.EmailConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'emailConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'emailConfig' - receiver %s: %w", receiver.Name, err) } if err := validateVictorOpsConfigs(receiver.VictorOpsConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'victorOpsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'victorOpsConfig' - receiver %s: %w", receiver.Name, err) } if err := validatePushoverConfigs(receiver.PushoverConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pushOverConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pushOverConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSnsConfigs(receiver.SNSConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'snsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'snsConfig' - receiver %s: %w", receiver.Name, err) + } + + if err := validateTelegramConfigs(receiver.TelegramConfigs); err != nil { + return nil, fmt.Errorf("failed to validate 'telegramConfig' - receiver %s: %w", receiver.Name, err) } if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'discordConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'discordConfig' - receiver %s: %w", receiver.Name, err) + } + + if err := validateWebexConfigs(receiver.WebexConfigs); err != nil { + return nil, fmt.Errorf("failed to validate 'webexConfig' - receiver %s: %w", receiver.Name, err) + } + + if err := validateMSTeamsConfigs(receiver.MSTeamsConfigs); err != nil { + return nil, fmt.Errorf("failed to validate 'msteamsConfig' - receiver %s: %w", receiver.Name, err) } } @@ -104,7 +115,7 @@ func validatePagerDutyConfigs(configs []monitoringv1beta1.PagerDutyConfig) error for _, conf := range configs { if conf.URL != "" { if _, err := validation.ValidateURL(conf.URL); err != nil { - return errors.Wrap(err, "pagerduty validation failed for 'url'") + return fmt.Errorf("pagerduty validation failed for 'url': %w", err) } } if conf.RoutingKey == nil && conf.ServiceKey == nil { @@ -125,7 +136,7 @@ func validateOpsGenieConfigs(configs []monitoringv1beta1.OpsGenieConfig) error { } if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -156,7 +167,7 @@ func validateWebhookConfigs(configs []monitoringv1beta1.WebhookConfig) error { } if config.URL != nil { if _, err := validation.ValidateURL(*config.URL); err != nil { - return errors.Wrapf(err, "invalid 'url'") + return fmt.Errorf("invalid 'url': %w", err) } } @@ -171,7 +182,7 @@ func validateWechatConfigs(configs []monitoringv1beta1.WeChatConfig) error { for _, config := range configs { if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -191,7 +202,7 @@ func validateEmailConfig(configs []monitoringv1beta1.EmailConfig) error { if config.Smarthost != "" { _, _, err := net.SplitHostPort(config.Smarthost) if err != nil { - return errors.Wrapf(err, "invalid field 'smarthost': %s", config.Smarthost) + return fmt.Errorf("invalid 'smarthost' %s: %w", config.Smarthost, err) } } @@ -238,7 +249,7 @@ func validateVictorOpsConfigs(configs []monitoringv1beta1.VictorOpsConfig) error if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrapf(err, "'apiURL' %s invalid", config.APIURL) + return fmt.Errorf("'apiURL' %s invalid: %w", config.APIURL, err) } } @@ -251,12 +262,12 @@ func validateVictorOpsConfigs(configs []monitoringv1beta1.VictorOpsConfig) error func validatePushoverConfigs(configs []monitoringv1beta1.PushoverConfig) error { for _, config := range configs { - if config.UserKey == nil { - return errors.Errorf("mandatory field %q is empty", "userKey") + if config.UserKey == nil && config.UserKeyFile == nil { + return fmt.Errorf("one of userKey or userKeyFile must be configured") } - if config.Token == nil { - return errors.Errorf("mandatory field %q is empty", "token") + if config.Token == nil && config.TokenFile == nil { + return fmt.Errorf("one of token or tokenFile must be configured") } if err := config.HTTPConfig.Validate(); err != nil { @@ -280,12 +291,58 @@ func validateSnsConfigs(configs []monitoringv1beta1.SNSConfig) error { return nil } +func validateTelegramConfigs(configs []monitoringv1beta1.TelegramConfig) error { + for _, config := range configs { + + if config.BotToken == nil && config.BotTokenFile == nil { + return fmt.Errorf("mandatory field botToken or botTokenfile is empty") + } + + if config.ChatID == 0 { + return fmt.Errorf("mandatory field %q is empty", "chatID") + } + + if err := config.HTTPConfig.Validate(); err != nil { + return err + } + } + + return nil +} + +func validateWebexConfigs(configs []monitoringv1beta1.WebexConfig) error { + for _, config := range configs { + if *config.APIURL != "" { + if _, err := validation.ValidateURL(string(*config.APIURL)); err != nil { + return fmt.Errorf("invalid 'apiURL': %w", err) + } + } + + if err := config.HTTPConfig.Validate(); err != nil { + return err + } + } + + return nil +} + func validateDiscordConfigs(configs []monitoringv1beta1.DiscordConfig) error { for _, config := range configs { if err := config.HTTPConfig.Validate(); err != nil { return err } } + + return nil +} + +func validateMSTeamsConfigs(configs []monitoringv1beta1.MSTeamsConfig) error { + for _, config := range configs { + if err := config.HTTPConfig.Validate(); err != nil { + return err + } + } + return nil } @@ -299,11 +356,11 @@ func validateAlertManagerRoutes(r *monitoringv1beta1.Route, receivers, timeInter if r.Receiver == "" { if topLevelRoute { - return errors.Errorf("root route must define a receiver") + return fmt.Errorf("root route must define a receiver") } } else { if _, found := receivers[r.Receiver]; !found { - return errors.Errorf("receiver %q not found", r.Receiver) + return fmt.Errorf("receiver %q not found", r.Receiver) } } @@ -311,38 +368,38 @@ func validateAlertManagerRoutes(r *monitoringv1beta1.Route, receivers, timeInter groupedBy := make(map[string]struct{}, groupLen) for _, str := range r.GroupBy { if _, found := groupedBy[str]; found { - return errors.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) } groupedBy[str] = struct{}{} } if _, found := groupedBy["..."]; found && groupLen > 1 { - return errors.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) } } for _, namedTimeInterval := range r.MuteTimeIntervals { if _, found := timeIntervals[namedTimeInterval]; !found { - return errors.Errorf("time interval %q not found", namedTimeInterval) + return fmt.Errorf("time interval %q not found", namedTimeInterval) } } for _, namedTimeInterval := range r.ActiveTimeIntervals { if _, found := timeIntervals[namedTimeInterval]; !found { - return errors.Errorf("time interval %q not found", namedTimeInterval) + return fmt.Errorf("time interval %q not found", namedTimeInterval) } } // validate that if defaults are set, they match regex if r.GroupInterval != "" && !durationRe.MatchString(r.GroupInterval) { - return errors.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) + return fmt.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) } if r.GroupWait != "" && !durationRe.MatchString(r.GroupWait) { - return errors.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) + return fmt.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) } if r.RepeatInterval != "" && !durationRe.MatchString(r.RepeatInterval) { - return errors.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) + return fmt.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) } children, err := r.ChildRoutes() @@ -352,7 +409,7 @@ func validateAlertManagerRoutes(r *monitoringv1beta1.Route, receivers, timeInter for i := range children { if err := validateAlertManagerRoutes(&children[i], receivers, timeIntervals, false); err != nil { - return errors.Wrapf(err, "route[%d]", i) + return fmt.Errorf("route[%d]: %w", i, err) } } @@ -364,7 +421,7 @@ func validateTimeIntervals(timeIntervals []monitoringv1beta1.TimeInterval) (map[ for i, ti := range timeIntervals { if err := ti.Validate(); err != nil { - return nil, errors.Wrapf(err, "time interval[%d] is invalid", i) + return nil, fmt.Errorf("time interval[%d] is invalid: %w", i, err) } timeIntervalNames[ti.Name] = struct{}{} } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation_test.go index 3517eed2a..4a1783ff5 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/alertmanager/validation/v1beta1/validation_test.go @@ -17,7 +17,7 @@ package v1beta1 import ( "testing" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" monitoringv1beta1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1beta1" ) @@ -229,7 +229,7 @@ func TestValidateAlertmanagerConfig(t *testing.T) { expectErr: true, }, { - name: "Test fail to validate PushoverConfigs - missing user key", + name: "Test fail to validate PushoverConfigs - missing user key and user key file", in: &monitoringv1beta1.AlertmanagerConfig{ Spec: monitoringv1beta1.AlertmanagerConfigSpec{ Receivers: []monitoringv1beta1.Receiver{ @@ -247,6 +247,80 @@ func TestValidateAlertmanagerConfig(t *testing.T) { }, expectErr: true, }, + { + name: "Test fail to validate PushoverConfigs - missing token and token file", + in: &monitoringv1beta1.AlertmanagerConfig{ + Spec: monitoringv1beta1.AlertmanagerConfigSpec{ + Receivers: []monitoringv1beta1.Receiver{ + { + Name: "same", + }, + { + Name: "different", + PushoverConfigs: []monitoringv1beta1.PushoverConfig{ + { + UserKey: &monitoringv1beta1.SecretKeySelector{ + Name: "creds", + Key: "user", + }, + }, + }, + }, + }, + }, + }, + expectErr: true, + }, + { + name: "Test fail to validate PushoverConfigs - token and tokenFile has be configured", + in: &monitoringv1beta1.AlertmanagerConfig{ + Spec: monitoringv1beta1.AlertmanagerConfigSpec{ + Receivers: []monitoringv1beta1.Receiver{ + { + Name: "same", + }, + { + Name: "different", + PushoverConfigs: []monitoringv1beta1.PushoverConfig{ + { + Token: &monitoringv1beta1.SecretKeySelector{ + Name: "creds", + Key: "user", + }, + TokenFile: ptr.To("/path/token_file"), + }, + }, + }, + }, + }, + }, + expectErr: true, + }, + { + name: "Test fail to validate PushoverConfigs - userKey and userKeyFile has be configured", + in: &monitoringv1beta1.AlertmanagerConfig{ + Spec: monitoringv1beta1.AlertmanagerConfigSpec{ + Receivers: []monitoringv1beta1.Receiver{ + { + Name: "same", + }, + { + Name: "different", + PushoverConfigs: []monitoringv1beta1.PushoverConfig{ + { + UserKey: &monitoringv1beta1.SecretKeySelector{ + Name: "creds", + Key: "user", + }, + UserKeyFile: ptr.To("/path/user_key_file"), + }, + }, + }, + }, + }, + }, + expectErr: true, + }, { name: "Test fail to validate PushoverConfigs - missing token", in: &monitoringv1beta1.AlertmanagerConfig{ @@ -382,7 +456,7 @@ func TestValidateAlertmanagerConfig(t *testing.T) { }, WebhookConfigs: []monitoringv1beta1.WebhookConfig{ { - URL: pointer.String("https://www.test.com"), + URL: ptr.To("https://www.test.com"), URLSecret: &monitoringv1beta1.SecretKeySelector{ Name: "creds", Key: "url", diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.mod b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.mod index 72b542dd6..61c380ade 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.mod +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.mod @@ -3,10 +3,10 @@ module github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring go 1.17 require ( - k8s.io/api v0.27.2 - k8s.io/apiextensions-apiserver v0.27.2 - k8s.io/apimachinery v0.27.2 - sigs.k8s.io/controller-runtime v0.15.0 + k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery v0.28.3 + sigs.k8s.io/controller-runtime v0.16.3 ) require ( @@ -16,12 +16,12 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/text v0.10.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect ) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.sum b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.sum index d54b4f571..ee0958574 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.sum +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/go.sum @@ -1,86 +1,1995 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cel-go v0.16.1/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= +github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= +github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= +github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= +github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.etcd.io/etcd/pkg/v3 v3.5.9/go.mod h1:BZl0SAShQFk0IpLWR78T/+pyt8AruMHhTNNX73hkNVY= +go.etcd.io/etcd/raft/v3 v3.5.9/go.mod h1:WnFkqzFdZua4LVlVXQEGhmooLeyS7mqzS4Pf4BCVqXg= +go.etcd.io/etcd/server/v3 v3.5.9/go.mod h1:GgI1fQClQCFIzuVjlvdbMxNbnISt90gdfYyqiAIt65g= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= +go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= +go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= +go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo= -k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= -k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo= -k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ= -k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg= -k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/apiserver v0.28.3/go.mod h1:YIpM+9wngNAv8Ctt0rHG4vQuX/I5rvkEMtZtsxW2rNM= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/code-generator v0.28.3/go.mod h1:A2EAHTRYvCvBrb/MM2zZBNipeCk3f8NtpdNIKawC43M= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= -k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU= -sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk= +k8s.io/kms v0.28.3/go.mod h1:kSMjU2tg7vjqqoWVVCcmPmNZ/CofPsoTbSxAipCvZuE= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0= +sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= +sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/alertmanager_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/alertmanager_types.go index 9bcbf3207..78815919f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/alertmanager_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/alertmanager_types.go @@ -60,7 +60,15 @@ func (l *Alertmanager) DeepCopyObject() runtime.Object { // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status // +k8s:openapi-gen=true type AlertmanagerSpec struct { - // PodMetadata configures Labels and Annotations which are propagated to the alertmanager pods. + // PodMetadata configures labels and annotations which are propagated to the Alertmanager pods. + // + // The following items are reserved and cannot be overridden: + // * "alertmanager" label, set to the name of the Alertmanager instance. + // * "app.kubernetes.io/instance" label, set to the name of the Alertmanager instance. + // * "app.kubernetes.io/managed-by" label, set to "prometheus-operator". + // * "app.kubernetes.io/name" label, set to "alertmanager". + // * "app.kubernetes.io/version" label, set to the Alertmanager version. + // * "kubectl.kubernetes.io/default-container" annotation, set to "alertmanager". PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"` // Image if specified has precedence over baseImage, tag and sha // combinations. Specifying the version is still necessary to ensure the @@ -115,10 +123,10 @@ type AlertmanagerSpec struct { // receiver (effectively dropping alert notifications). ConfigSecret string `json:"configSecret,omitempty"` // Log level for Alertmanager to be configured with. - //+kubebuilder:validation:Enum="";debug;info;warn;error + // +kubebuilder:validation:Enum="";debug;info;warn;error LogLevel string `json:"logLevel,omitempty"` // Log format for Alertmanager to be configured with. - //+kubebuilder:validation:Enum="";logfmt;json + // +kubebuilder:validation:Enum="";logfmt;json LogFormat string `json:"logFormat,omitempty"` // Size is the expected size of the alertmanager cluster. The controller will // eventually make the size of the running cluster equal to the expected diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/podmonitor_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/podmonitor_types.go index e68ba13e3..ee03102d0 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/podmonitor_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/podmonitor_types.go @@ -74,6 +74,13 @@ type PodMonitorSpec struct { // Only valid in Prometheus versions 2.27.0 and newer. // +optional LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + // Per-scrape limit on the number of targets dropped by relabeling + // that will be kept in memory. 0 means no limit. + // + // It requires Prometheus >= v2.47.0. + // + // +optional + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` // Attaches node metadata to discovered targets. // Requires Prometheus v2.35.0 and above. AttachMetadata *AttachMetadata `json:"attachMetadata,omitempty"` diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/probe_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/probe_types.go index b80948922..59b85ae6a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/probe_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/probe_types.go @@ -96,6 +96,13 @@ type ProbeSpec struct { // Only valid in Prometheus versions 2.27.0 and newer. // +optional LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + // Per-scrape limit on the number of targets dropped by relabeling + // that will be kept in memory. 0 means no limit. + // + // It requires Prometheus >= v2.47.0. + // + // +optional + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` } // ProbeTargets defines how to discover the probed targets. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/prometheus_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/prometheus_types.go index a01c48954..fff9bf06d 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/prometheus_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/prometheus_types.go @@ -60,6 +60,16 @@ func (l *Prometheus) GetStatus() PrometheusStatus { // +k8s:deepcopy-gen=true type CommonPrometheusFields struct { // PodMetadata configures labels and annotations which are propagated to the Prometheus pods. + // + // The following items are reserved and cannot be overridden: + // * "prometheus" label, set to the name of the Prometheus object. + // * "app.kubernetes.io/instance" label, set to the name of the Prometheus object. + // * "app.kubernetes.io/managed-by" label, set to "prometheus-operator". + // * "app.kubernetes.io/name" label, set to "prometheus". + // * "app.kubernetes.io/version" label, set to the Prometheus version. + // * "operator.prometheus.io/name" label, set to the name of the Prometheus object. + // * "operator.prometheus.io/shard" label, set to the shard number of the Prometheus object. + // * "kubectl.kubernetes.io/default-container" annotation, set to "prometheus". PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"` // ServiceMonitors to be selected for target discovery. An empty label @@ -205,10 +215,10 @@ type CommonPrometheusFields struct { PrometheusExternalLabelName *string `json:"prometheusExternalLabelName,omitempty"` // Log level for Prometheus and the config-reloader sidecar. - //+kubebuilder:validation:Enum="";debug;info;warn;error + // +kubebuilder:validation:Enum="";debug;info;warn;error LogLevel string `json:"logLevel,omitempty"` // Log format for Log level for Prometheus and the config-reloader sidecar. - //+kubebuilder:validation:Enum="";logfmt;json + // +kubebuilder:validation:Enum="";logfmt;json LogFormat string `json:"logFormat,omitempty"` // Interval between consecutive scrapes. @@ -302,7 +312,7 @@ type CommonPrometheusFields struct { // +optional Tolerations []v1.Toleration `json:"tolerations,omitempty"` // Defines the pod's topology spread constraints if specified. - //+optional + // +optional TopologySpreadConstraints []v1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"` // Defines the list of remote write configurations. @@ -407,7 +417,7 @@ type CommonPrometheusFields struct { // When true, `spec.namespaceSelector` from all PodMonitor, ServiceMonitor // and Probe objects will be ignored. They will only discover targets // within the namespace of the PodMonitor, ServiceMonitor and Probe - // objec. + // object. IgnoreNamespaceSelectors bool `json:"ignoreNamespaceSelectors,omitempty"` // When not empty, a label will be added to @@ -472,6 +482,16 @@ type CommonPrometheusFields struct { // // +optional EnforcedLabelValueLengthLimit *uint64 `json:"enforcedLabelValueLengthLimit,omitempty"` + // When defined, enforcedKeepDroppedTargets specifies a global limit on the number of targets + // dropped by relabeling that will be kept in memory. The value overrides + // any `spec.keepDroppedTargets` set by + // ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` is + // greater than zero and less than `spec.enforcedKeepDroppedTargets`. + // + // It requires Prometheus >= v2.47.0. + // + // +optional + EnforcedKeepDroppedTargets *uint64 `json:"enforcedKeepDroppedTargets,omitempty"` // When defined, enforcedBodySizeLimit specifies a global limit on the size // of uncompressed response body that will be accepted by Prometheus. // Targets responding with a body larger than this many bytes will cause @@ -580,6 +600,13 @@ type CommonPrometheusFields struct { // // +optional LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + // Per-scrape limit on the number of targets dropped by relabeling + // that will be kept in memory. 0 means no limit. + // + // It requires Prometheus >= v2.47.0. + // + // +optional + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` } // +genclient @@ -770,7 +797,7 @@ type PrometheusSpec struct { type PrometheusTracingConfig struct { // Client used to export the traces. Supported values are `http` or `grpc`. - //+kubebuilder:validation:Enum=http;grpc + // +kubebuilder:validation:Enum=http;grpc // +optional ClientType *string `json:"clientType"` @@ -792,7 +819,7 @@ type PrometheusTracingConfig struct { Headers map[string]string `json:"headers"` // Compression key for supported compression types. The only supported value is `gzip`. - //+kubebuilder:validation:Enum=gzip + // +kubebuilder:validation:Enum=gzip // +optional Compression *string `json:"compression"` @@ -1006,10 +1033,10 @@ type ThanosSpec struct { GRPCServerTLSConfig *TLSConfig `json:"grpcServerTlsConfig,omitempty"` // Log level for the Thanos sidecar. - //+kubebuilder:validation:Enum="";debug;info;warn;error + // +kubebuilder:validation:Enum="";debug;info;warn;error LogLevel string `json:"logLevel,omitempty"` // Log format for the Thanos sidecar. - //+kubebuilder:validation:Enum="";logfmt;json + // +kubebuilder:validation:Enum="";logfmt;json LogFormat string `json:"logFormat,omitempty"` // Defines the start of time range limit served by the Thanos sidecar's StoreAPI. @@ -1104,12 +1131,12 @@ type RemoteWriteSpec struct { // // It requires Prometheus >= v2.27.0. // - // Cannot be set at the same time as `sigv4`, `authorization`, or `basicAuth`. + // Cannot be set at the same time as `sigv4`, `authorization`, `basicAuth`, or `azureAd`. // +optional OAuth2 *OAuth2 `json:"oauth2,omitempty"` // BasicAuth configuration for the URL. // - // Cannot be set at the same time as `sigv4`, `authorization`, or `oauth2`. + // Cannot be set at the same time as `sigv4`, `authorization`, `oauth2`, or `azureAd`. // // +optional BasicAuth *BasicAuth `json:"basicAuth,omitempty"` @@ -1121,7 +1148,7 @@ type RemoteWriteSpec struct { // // It requires Prometheus >= v2.26.0. // - // Cannot be set at the same time as `sigv4`, `basicAuth`, or `oauth2`. + // Cannot be set at the same time as `sigv4`, `basicAuth`, `oauth2`, or `azureAd`. // // +optional Authorization *Authorization `json:"authorization,omitempty"` @@ -1129,11 +1156,20 @@ type RemoteWriteSpec struct { // // It requires Prometheus >= v2.26.0. // - // Cannot be set at the same time as `authorization`, `basicAuth`, or `oauth2`. + // Cannot be set at the same time as `authorization`, `basicAuth`, `oauth2`, or `azureAd`. // // +optional Sigv4 *Sigv4 `json:"sigv4,omitempty"` + // AzureAD for the URL. + // + // It requires Prometheus >= v2.45.0. + // + // Cannot be set at the same time as `authorization`, `basicAuth`, `oauth2`, or `sigv4`. + // + // +optional + AzureAD *AzureAD `json:"azureAd,omitempty"` + // *Warning: this field shouldn't be used because the token value appears // in clear-text. Prefer using `authorization`.* // @@ -1202,6 +1238,26 @@ type Sigv4 struct { RoleArn string `json:"roleArn,omitempty"` } +// AzureAD defines the configuration for remote write's azuread parameters. +// +k8s:openapi-gen=true +type AzureAD struct { + // The Azure Cloud. Options are 'AzurePublic', 'AzureChina', or 'AzureGovernment'. + // +kubebuilder:validation:Enum=AzureChina;AzureGovernment;AzurePublic + // +optional + Cloud *string `json:"cloud,omitempty"` + // ManagedIdentity defines the Azure User-assigned Managed identity. + // +required + ManagedIdentity ManagedIdentity `json:"managedIdentity"` +} + +// ManagedIdentity defines the Azure User-assigned Managed identity. +// +k8s:openapi-gen=true +type ManagedIdentity struct { + // The client id + // +required + ClientID string `json:"clientId"` +} + // RemoteReadSpec defines the configuration for Prometheus to read back samples // from a remote endpoint. // +k8s:openapi-gen=true @@ -1411,25 +1467,34 @@ type AlertmanagerEndpoints struct { // BasicAuth configuration for Alertmanager. // - // Cannot be set at the same time as `bearerTokenFile`, or `authorization`. + // Cannot be set at the same time as `bearerTokenFile`, `authorization` or `sigv4`. // // +optional BasicAuth *BasicAuth `json:"basicAuth,omitempty"` // File to read bearer token for Alertmanager. // - // Cannot be set at the same time as `basicAuth`, or `authorization`. + // Cannot be set at the same time as `basicAuth`, `authorization`, or `sigv4`. // // *Deprecated: this will be removed in a future release. Prefer using `authorization`.* BearerTokenFile string `json:"bearerTokenFile,omitempty"` // Authorization section for Alertmanager. // - // Cannot be set at the same time as `basicAuth`, or `bearerTokenFile`. + // Cannot be set at the same time as `basicAuth`, `bearerTokenFile` or `sigv4`. // // +optional Authorization *SafeAuthorization `json:"authorization,omitempty"` + // Sigv4 allows to configures AWS's Signature Verification 4 for the URL. + // + // It requires Prometheus >= v2.48.0. + // + // Cannot be set at the same time as `basicAuth`, `bearerTokenFile` or `authorization`. + // + // +optional + Sigv4 *Sigv4 `json:"sigv4,omitempty"` + // Version of the Alertmanager API that Prometheus uses to send alerts. // It can be "v1" or "v2". APIVersion string `json:"apiVersion,omitempty"` diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/register.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/register.go index a4866d6bf..1a323f301 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/register.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/register.go @@ -19,9 +19,9 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" - "os" + + "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" ) var PackageGroupName = func() string { diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types.go index 4f59cbaf1..9a0890dc9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types.go @@ -82,6 +82,13 @@ type ServiceMonitorSpec struct { // Only valid in Prometheus versions 2.27.0 and newer. // +optional LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + // Per-scrape limit on the number of targets dropped by relabeling + // that will be kept in memory. 0 means no limit. + // + // It requires Prometheus >= v2.47.0. + // + // +optional + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` // Attaches node metadata to discovered targets. // Requires Prometheus v2.37.0 and above. AttachMetadata *AttachMetadata `json:"attachMetadata,omitempty"` diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types_test.go index ed4d89c3d..f963f1931 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types_test.go @@ -41,7 +41,7 @@ func TestMarshallServiceMonitor(t *testing.T) { }, }, } - expected := `{"metadata":{"name":"test","namespace":"default","creationTimestamp":null,"labels":{"group":"group1"}},"spec":{"endpoints":[{"port":"metric","bearerTokenSecret":{"key":""}}],"selector":{},"namespaceSelector":{"matchNames":["test"]}}}` + expected := `{"metadata":{"name":"test","namespace":"default","creationTimestamp":null,"labels":{"group":"group1"}},"spec":{"endpoints":[{"port":"metric"}],"selector":{},"namespaceSelector":{"matchNames":["test"]}}}` r, err := json.Marshal(sm) if err != nil { diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go index 6310b623b..c155df068 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go @@ -68,7 +68,14 @@ type ThanosRulerList struct { type ThanosRulerSpec struct { // Version of Thanos to be deployed. Version string `json:"version,omitempty"` - // PodMetadata contains Labels and Annotations gets propagated to the thanos ruler pods. + // PodMetadata configures labels and annotations which are propagated to the ThanosRuler pods. + // + // The following items are reserved and cannot be overridden: + // * "app.kubernetes.io/name" label, set to "thanos-ruler". + // * "app.kubernetes.io/managed-by" label, set to "prometheus-operator". + // * "app.kubernetes.io/instance" label, set to the name of the ThanosRuler instance. + // * "thanos-ruler" label, set to the name of the ThanosRuler instance. + // * "kubectl.kubernetes.io/default-container" annotation, set to "thanos-ruler". PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"` // Thanos container image URL. Image string `json:"image,omitempty"` @@ -158,10 +165,10 @@ type ThanosRulerSpec struct { // Deprecated: use excludedFromEnforcement instead. PrometheusRulesExcludedFromEnforce []PrometheusRuleExcludeConfig `json:"prometheusRulesExcludedFromEnforce,omitempty"` // Log level for ThanosRuler to be configured with. - //+kubebuilder:validation:Enum="";debug;info;warn;error + // +kubebuilder:validation:Enum="";debug;info;warn;error LogLevel string `json:"logLevel,omitempty"` // Log format for ThanosRuler to be configured with. - //+kubebuilder:validation:Enum="";logfmt;json + // +kubebuilder:validation:Enum="";logfmt;json LogFormat string `json:"logFormat,omitempty"` // Port name used for the pods and governing service. // Defaults to `web`. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/types.go index 5d5220bb8..2d379f64f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/types.go @@ -384,7 +384,8 @@ type Endpoint struct { // Secret to mount to read bearer token for scraping targets. The secret // needs to be in the same namespace as the service monitor and accessible by // the Prometheus Operator. - BearerTokenSecret v1.SecretKeySelector `json:"bearerTokenSecret,omitempty"` + //+ optional + BearerTokenSecret *v1.SecretKeySelector `json:"bearerTokenSecret,omitempty"` // Authorization section for this endpoint Authorization *SafeAuthorization `json:"authorization,omitempty"` // HonorLabels chooses the metric's labels on collisions with target labels. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go index 3d3e485da..101879d8e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go @@ -157,6 +157,11 @@ func (in *AlertmanagerEndpoints) DeepCopyInto(out *AlertmanagerEndpoints) { *out = new(SafeAuthorization) (*in).DeepCopyInto(*out) } + if in.Sigv4 != nil { + in, out := &in.Sigv4, &out.Sigv4 + *out = new(Sigv4) + (*in).DeepCopyInto(*out) + } if in.Timeout != nil { in, out := &in.Timeout, &out.Timeout *out = new(Duration) @@ -525,6 +530,27 @@ func (in *AuthorizationValidationError) DeepCopy() *AuthorizationValidationError return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureAD) DeepCopyInto(out *AzureAD) { + *out = *in + if in.Cloud != nil { + in, out := &in.Cloud, &out.Cloud + *out = new(string) + **out = **in + } + out.ManagedIdentity = in.ManagedIdentity +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureAD. +func (in *AzureAD) DeepCopy() *AzureAD { + if in == nil { + return nil + } + out := new(AzureAD) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BasicAuth) DeepCopyInto(out *BasicAuth) { *out = *in @@ -755,6 +781,11 @@ func (in *CommonPrometheusFields) DeepCopyInto(out *CommonPrometheusFields) { *out = new(uint64) **out = **in } + if in.EnforcedKeepDroppedTargets != nil { + in, out := &in.EnforcedKeepDroppedTargets, &out.EnforcedKeepDroppedTargets + *out = new(uint64) + **out = **in + } if in.MinReadySeconds != nil { in, out := &in.MinReadySeconds, &out.MinReadySeconds *out = new(uint32) @@ -822,6 +853,11 @@ func (in *CommonPrometheusFields) DeepCopyInto(out *CommonPrometheusFields) { *out = new(uint64) **out = **in } + if in.KeepDroppedTargets != nil { + in, out := &in.KeepDroppedTargets, &out.KeepDroppedTargets + *out = new(uint64) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CommonPrometheusFields. @@ -926,7 +962,11 @@ func (in *Endpoint) DeepCopyInto(out *Endpoint) { *out = new(TLSConfig) (*in).DeepCopyInto(*out) } - in.BearerTokenSecret.DeepCopyInto(&out.BearerTokenSecret) + if in.BearerTokenSecret != nil { + in, out := &in.BearerTokenSecret, &out.BearerTokenSecret + *out = new(corev1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } if in.Authorization != nil { in, out := &in.Authorization, &out.Authorization *out = new(SafeAuthorization) @@ -1156,6 +1196,21 @@ func (in *HostPort) DeepCopy() *HostPort { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ManagedIdentity) DeepCopyInto(out *ManagedIdentity) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagedIdentity. +func (in *ManagedIdentity) DeepCopy() *ManagedIdentity { + if in == nil { + return nil + } + out := new(ManagedIdentity) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MetadataConfig) DeepCopyInto(out *MetadataConfig) { *out = *in @@ -1457,6 +1512,11 @@ func (in *PodMonitorSpec) DeepCopyInto(out *PodMonitorSpec) { *out = new(uint64) **out = **in } + if in.KeepDroppedTargets != nil { + in, out := &in.KeepDroppedTargets, &out.KeepDroppedTargets + *out = new(uint64) + **out = **in + } if in.AttachMetadata != nil { in, out := &in.AttachMetadata, &out.AttachMetadata *out = new(AttachMetadata) @@ -1582,6 +1642,11 @@ func (in *ProbeSpec) DeepCopyInto(out *ProbeSpec) { *out = new(uint64) **out = **in } + if in.KeepDroppedTargets != nil { + in, out := &in.KeepDroppedTargets, &out.KeepDroppedTargets + *out = new(uint64) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProbeSpec. @@ -2212,6 +2277,11 @@ func (in *RemoteWriteSpec) DeepCopyInto(out *RemoteWriteSpec) { *out = new(Sigv4) (*in).DeepCopyInto(*out) } + if in.AzureAD != nil { + in, out := &in.AzureAD, &out.AzureAD + *out = new(AzureAD) + (*in).DeepCopyInto(*out) + } if in.TLSConfig != nil { in, out := &in.TLSConfig, &out.TLSConfig *out = new(TLSConfig) @@ -2517,6 +2587,11 @@ func (in *ServiceMonitorSpec) DeepCopyInto(out *ServiceMonitorSpec) { *out = new(uint64) **out = **in } + if in.KeepDroppedTargets != nil { + in, out := &in.KeepDroppedTargets, &out.KeepDroppedTargets + *out = new(uint64) + **out = **in + } if in.AttachMetadata != nil { in, out := &in.AttachMetadata, &out.AttachMetadata *out = new(AttachMetadata) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go index f2a3a06c0..2b10b74dc 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/alertmanager_config_types.go @@ -41,8 +41,8 @@ const ( // +kubebuilder:resource:categories="prometheus-operator",shortName="amcfg" // +kubebuilder:storageversion -// AlertmanagerConfig defines a namespaced AlertmanagerConfig to be aggregated -// across multiple namespaces configuring one Alertmanager cluster. +// AlertmanagerConfig configures the Prometheus Alertmanager, +// specifying how alerts should be grouped, inhibited and notified to external systems. type AlertmanagerConfig struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -177,6 +177,11 @@ type Receiver struct { SNSConfigs []SNSConfig `json:"snsConfigs,omitempty"` // List of Telegram configurations. TelegramConfigs []TelegramConfig `json:"telegramConfigs,omitempty"` + // List of Webex configurations. + WebexConfigs []WebexConfig `json:"webexConfigs,omitempty"` + // List of MSTeams configurations. + // It requires Alertmanager >= 0.26.0. + MSTeamsConfigs []MSTeamsConfig `json:"msteamsConfigs,omitempty"` } // PagerDutyConfig configures notifications via PagerDuty. @@ -600,6 +605,33 @@ type HTTPConfig struct { FollowRedirects *bool `json:"followRedirects,omitempty"` } +// WebexConfig configures notification via Cisco Webex +// See https://prometheus.io/docs/alerting/latest/configuration/#webex_config +type WebexConfig struct { + // Whether to notify about resolved alerts. + // +optional + SendResolved *bool `json:"sendResolved,omitempty"` + + // The Webex Teams API URL i.e. https://webexapis.com/v1/messages + // Provide if different from the default API URL. + // +optional + APIURL *URL `json:"apiURL,omitempty"` + + // The HTTP client's configuration. + // You must supply the bot token via the `httpConfig.authorization` field. + // +optional + HTTPConfig *HTTPConfig `json:"httpConfig,omitempty"` + + // Message template + // +optional + Message *string `json:"message,omitempty"` + + // ID of the Webex Teams room where to send the messages. + // +kubebuilder:validation:MinLength=1 + // +required + RoomID string `json:"roomID"` +} + // WeChatConfig configures notifications via WeChat. // See https://prometheus.io/docs/alerting/latest/configuration/#wechat_config type WeChatConfig struct { @@ -670,10 +702,10 @@ type EmailConfig struct { Headers []KeyValue `json:"headers,omitempty"` // The HTML body of the email notification. // +optional - HTML string `json:"html,omitempty"` + HTML *string `json:"html,omitempty"` // The text body of the email notification. // +optional - Text string `json:"text,omitempty"` + Text *string `json:"text,omitempty"` // The SMTP TLS requirement. // Note that Go does not support unencrypted connections to remote SMTP endpoints. // +optional @@ -729,13 +761,25 @@ type PushoverConfig struct { // The secret's key that contains the recipient user's user key. // The secret needs to be in the same namespace as the AlertmanagerConfig // object and accessible by the Prometheus Operator. - // +kubebuilder:validation:Required + // Either `userKey` or `userKeyFile` is required. + // +optional UserKey *v1.SecretKeySelector `json:"userKey,omitempty"` + // The user key file that contains the recipient user's user key. + // Either `userKey` or `userKeyFile` is required. + // It requires Alertmanager >= v0.26.0. + // +optional + UserKeyFile *string `json:"userKeyFile,omitempty"` // The secret's key that contains the registered application's API token, see https://pushover.net/apps. // The secret needs to be in the same namespace as the AlertmanagerConfig // object and accessible by the Prometheus Operator. - // +kubebuilder:validation:Required + // Either `token` or `tokenFile` is required. + // +optional Token *v1.SecretKeySelector `json:"token,omitempty"` + // The token file that contains the registered application's API token, see https://pushover.net/apps. + // Either `token` or `tokenFile` is required. + // It requires Alertmanager >= v0.26.0. + // +optional + TokenFile *string `json:"tokenFile,omitempty"` // Notification title. // +optional Title string `json:"title,omitempty"` @@ -821,11 +865,23 @@ type TelegramConfig struct { // If not specified, default API URL will be used. // +optional APIURL string `json:"apiURL,omitempty"` - // Telegram bot token + // Telegram bot token. It is mutually exclusive with `botTokenFile`. // The secret needs to be in the same namespace as the AlertmanagerConfig // object and accessible by the Prometheus Operator. + // + // Either `botToken` or `botTokenFile` is required. + // + //+optional BotToken *v1.SecretKeySelector `json:"botToken,omitempty"` + // File to read the Telegram bot token from. It is mutually exclusive with `botToken`. + // Either `botToken` or `botTokenFile` is required. + // + // It requires Alertmanager >= v0.26.0. + // + // +optional + BotTokenFile *string `json:"botTokenFile,omitempty"` // The Telegram chat ID. + // +required ChatID int64 `json:"chatID,omitempty"` // Message template // +optional @@ -842,6 +898,26 @@ type TelegramConfig struct { HTTPConfig *HTTPConfig `json:"httpConfig,omitempty"` } +// MSTeamsConfig configures notifications via Microsoft Teams. +// It requires Alertmanager >= 0.26.0. +type MSTeamsConfig struct { + // Whether to notify about resolved alerts. + // +optional + SendResolved *bool `json:"sendResolved,omitempty"` + // MSTeams webhook URL. + // +kubebuilder:validation:Required + WebhookURL v1.SecretKeySelector `json:"webhookUrl"` + // Message title template. + // +optional + Title *string `json:"title,omitempty"` + // Message body template. + // +optional + Text *string `json:"text,omitempty"` + // HTTP client configuration. + // +optional + HTTPConfig *HTTPConfig `json:"httpConfig,omitempty"` +} + // InhibitRule defines an inhibition rule that allows to mute alerts when other // alerts are already firing. // See https://prometheus.io/docs/alerting/latest/configuration/#inhibit_rule @@ -1104,3 +1180,7 @@ var monthsInv = map[int]Month{ 11: November, 12: December, } + +// URL represents a valid URL +// +kubebuilder:validation:Pattern=`^https?://.+$` +type URL string diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/scrapeconfig_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/scrapeconfig_types.go index 614898744..001df7dc1 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/scrapeconfig_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/scrapeconfig_types.go @@ -34,6 +34,25 @@ type Target string // +kubebuilder:validation:Pattern=`^[^*]*(\*[^/]*)?\.(json|yml|yaml|JSON|YML|YAML)$` type SDFile string +// EC2Filter is the configuration for filtering EC2 instances. +type EC2Filter struct { + Name string `json:"name"` + Values []string `json:"values"` +} + +// K8SRole is role of the service in Kubernetes. +// Currently the only supported role is "Node". +// +kubebuilder:validation:Enum=Node;node +type K8SRole string + +// K8SSelectorConfig is Kubernetes Selector Config +type K8SSelectorConfig struct { + // +kubebuilder:validation:Required + Role K8SRole `json:"role"` + Label string `json:"label,omitempty"` + Field string `json:"field,omitempty"` +} + // +genclient // +k8s:openapi-gen=true // +kubebuilder:resource:categories="prometheus-operator",shortName="scfg" @@ -87,6 +106,12 @@ type ScrapeConfigSpec struct { // ConsulSDConfigs defines a list of Consul service discovery configurations. // +optional ConsulSDConfigs []ConsulSDConfig `json:"consulSDConfigs,omitempty"` + //DNSSDConfigs defines a list of DNS service discovery configurations. + // +optional + DNSSDConfigs []DNSSDConfig `json:"dnsSDConfigs,omitempty"` + // EC2SDConfigs defines a list of EC2 service discovery configurations. + // +optional + EC2SDConfigs []EC2SDConfig `json:"ec2SDConfigs,omitempty"` // RelabelConfigs defines how to rewrite the target's labels before scraping. // Prometheus Operator automatically adds relabelings for a few standard Kubernetes fields. // The original scrape job's name is available via the `__tmp_prometheus_job_name` label. @@ -144,6 +169,16 @@ type ScrapeConfigSpec struct { // Only valid in Prometheus versions 2.27.0 and newer. // +optional LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + // Per-scrape limit on the number of targets dropped by relabeling + // that will be kept in memory. 0 means no limit. + // + // It requires Prometheus >= v2.47.0. + // + // +optional + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` + // MetricRelabelConfigs to apply to samples before ingestion. + // +optional + MetricRelabelConfigs []*v1.RelabelConfig `json:"metricRelabelings,omitempty"` } // StaticConfig defines a Prometheus static configuration. @@ -203,10 +238,13 @@ type HTTPSDConfig struct { // +k8s:openapi-gen=true type KubernetesSDConfig struct { // Role of the Kubernetes entities that should be discovered. - // Currently the only supported role is "Node". - // +kubebuilder:validation:Enum=Node // +required - Role string `json:"role"` + Role K8SRole `json:"role"` + // Selector to select objects. + // +optional + // +listType=map + // +listMapKey=role + Selectors []K8SSelectorConfig `json:"selectors,omitempty"` } // ConsulSDConfig defines a Consul service discovery configuration @@ -296,3 +334,59 @@ type ConsulSDConfig struct { // +optional TLSConfig *v1.SafeTLSConfig `json:"tlsConfig,omitempty"` } + +// DNSSDConfig allows specifying a set of DNS domain names which are periodically queried to discover a list of targets. +// The DNS servers to be contacted are read from /etc/resolv.conf. +// See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config +// +k8s:openapi-gen=true +type DNSSDConfig struct { + // A list of DNS domain names to be queried. + // +kubebuilder:validation:MinItems:=1 + Names []string `json:"names"` + // RefreshInterval configures the time after which the provided names are refreshed. + // If not set, Prometheus uses its default value. + // +optional + RefreshInterval *v1.Duration `json:"refreshInterval,omitempty"` + // The type of DNS query to perform. One of SRV, A, AAAA or MX. + // If not set, Prometheus uses its default value. + // +kubebuilder:validation:Enum=SRV;A;AAAA;MX + // +optional + Type *string `json:"type"` + // The port number used if the query type is not SRV + // Ignored for SRV records + // +optional + Port *int `json:"port"` +} + +// EC2SDConfig allow retrieving scrape targets from AWS EC2 instances. +// The private IP address is used by default, but may be changed to the public IP address with relabeling. +// The IAM credentials used must have the ec2:DescribeInstances permission to discover scrape targets +// See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config +// +k8s:openapi-gen=true +type EC2SDConfig struct { + // The AWS region + // +optional + Region *string `json:"region"` + // AccessKey is the AWS API key. + // +optional + AccessKey *corev1.SecretKeySelector `json:"accessKey,omitempty"` + // SecretKey is the AWS API secret. + // +optional + SecretKey *corev1.SecretKeySelector `json:"secretKey,omitempty"` + // AWS Role ARN, an alternative to using AWS API keys. + // +optional + RoleARN *string `json:"roleARN,omitempty"` + // RefreshInterval configures the refresh interval at which Prometheus will re-read the instance list. + // +optional + RefreshInterval *v1.Duration `json:"refreshInterval,omitempty"` + // The port to scrape metrics from. If using the public IP address, this must + // instead be specified in the relabeling rule. + // +optional + Port *int `json:"port"` + // Filters can be used optionally to filter the instance list by other criteria. + // Available filter criteria can be found here: + // https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html + // Filter API documentation: https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Filter.html + // +optional + Filters []*EC2Filter `json:"filters"` +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go index c5d894df1..fc14a49e3 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1alpha1/zz_generated.deepcopy.go @@ -236,6 +236,41 @@ func (in *ConsulSDConfig) DeepCopy() *ConsulSDConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNSSDConfig) DeepCopyInto(out *DNSSDConfig) { + *out = *in + if in.Names != nil { + in, out := &in.Names, &out.Names + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.RefreshInterval != nil { + in, out := &in.RefreshInterval, &out.RefreshInterval + *out = new(monitoringv1.Duration) + **out = **in + } + if in.Type != nil { + in, out := &in.Type, &out.Type + *out = new(string) + **out = **in + } + if in.Port != nil { + in, out := &in.Port, &out.Port + *out = new(int) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSSDConfig. +func (in *DNSSDConfig) DeepCopy() *DNSSDConfig { + if in == nil { + return nil + } + out := new(DNSSDConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DayOfMonthRange) DeepCopyInto(out *DayOfMonthRange) { *out = *in @@ -287,6 +322,82 @@ func (in *DiscordConfig) DeepCopy() *DiscordConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EC2Filter) DeepCopyInto(out *EC2Filter) { + *out = *in + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EC2Filter. +func (in *EC2Filter) DeepCopy() *EC2Filter { + if in == nil { + return nil + } + out := new(EC2Filter) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EC2SDConfig) DeepCopyInto(out *EC2SDConfig) { + *out = *in + if in.Region != nil { + in, out := &in.Region, &out.Region + *out = new(string) + **out = **in + } + if in.AccessKey != nil { + in, out := &in.AccessKey, &out.AccessKey + *out = new(corev1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.SecretKey != nil { + in, out := &in.SecretKey, &out.SecretKey + *out = new(corev1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.RoleARN != nil { + in, out := &in.RoleARN, &out.RoleARN + *out = new(string) + **out = **in + } + if in.RefreshInterval != nil { + in, out := &in.RefreshInterval, &out.RefreshInterval + *out = new(monitoringv1.Duration) + **out = **in + } + if in.Port != nil { + in, out := &in.Port, &out.Port + *out = new(int) + **out = **in + } + if in.Filters != nil { + in, out := &in.Filters, &out.Filters + *out = make([]*EC2Filter, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(EC2Filter) + (*in).DeepCopyInto(*out) + } + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EC2SDConfig. +func (in *EC2SDConfig) DeepCopy() *EC2SDConfig { + if in == nil { + return nil + } + out := new(EC2SDConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EmailConfig) DeepCopyInto(out *EmailConfig) { *out = *in @@ -310,6 +421,16 @@ func (in *EmailConfig) DeepCopyInto(out *EmailConfig) { *out = make([]KeyValue, len(*in)) copy(*out, *in) } + if in.HTML != nil { + in, out := &in.HTML, &out.HTML + *out = new(string) + **out = **in + } + if in.Text != nil { + in, out := &in.Text, &out.Text + *out = new(string) + **out = **in + } if in.RequireTLS != nil { in, out := &in.RequireTLS, &out.RequireTLS *out = new(bool) @@ -467,6 +588,21 @@ func (in *InhibitRule) DeepCopy() *InhibitRule { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *K8SSelectorConfig) DeepCopyInto(out *K8SSelectorConfig) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new K8SSelectorConfig. +func (in *K8SSelectorConfig) DeepCopy() *K8SSelectorConfig { + if in == nil { + return nil + } + out := new(K8SSelectorConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *KeyValue) DeepCopyInto(out *KeyValue) { *out = *in @@ -485,6 +621,11 @@ func (in *KeyValue) DeepCopy() *KeyValue { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *KubernetesSDConfig) DeepCopyInto(out *KubernetesSDConfig) { *out = *in + if in.Selectors != nil { + in, out := &in.Selectors, &out.Selectors + *out = make([]K8SSelectorConfig, len(*in)) + copy(*out, *in) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubernetesSDConfig. @@ -497,6 +638,42 @@ func (in *KubernetesSDConfig) DeepCopy() *KubernetesSDConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MSTeamsConfig) DeepCopyInto(out *MSTeamsConfig) { + *out = *in + if in.SendResolved != nil { + in, out := &in.SendResolved, &out.SendResolved + *out = new(bool) + **out = **in + } + in.WebhookURL.DeepCopyInto(&out.WebhookURL) + if in.Title != nil { + in, out := &in.Title, &out.Title + *out = new(string) + **out = **in + } + if in.Text != nil { + in, out := &in.Text, &out.Text + *out = new(string) + **out = **in + } + if in.HTTPConfig != nil { + in, out := &in.HTTPConfig, &out.HTTPConfig + *out = new(HTTPConfig) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MSTeamsConfig. +func (in *MSTeamsConfig) DeepCopy() *MSTeamsConfig { + if in == nil { + return nil + } + out := new(MSTeamsConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Matcher) DeepCopyInto(out *Matcher) { *out = *in @@ -750,11 +927,21 @@ func (in *PushoverConfig) DeepCopyInto(out *PushoverConfig) { *out = new(corev1.SecretKeySelector) (*in).DeepCopyInto(*out) } + if in.UserKeyFile != nil { + in, out := &in.UserKeyFile, &out.UserKeyFile + *out = new(string) + **out = **in + } if in.Token != nil { in, out := &in.Token, &out.Token *out = new(corev1.SecretKeySelector) (*in).DeepCopyInto(*out) } + if in.TokenFile != nil { + in, out := &in.TokenFile, &out.TokenFile + *out = new(string) + **out = **in + } if in.HTTPConfig != nil { in, out := &in.HTTPConfig, &out.HTTPConfig *out = new(HTTPConfig) @@ -852,6 +1039,20 @@ func (in *Receiver) DeepCopyInto(out *Receiver) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.WebexConfigs != nil { + in, out := &in.WebexConfigs, &out.WebexConfigs + *out = make([]WebexConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.MSTeamsConfigs != nil { + in, out := &in.MSTeamsConfigs, &out.MSTeamsConfigs + *out = make([]MSTeamsConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Receiver. @@ -1016,7 +1217,9 @@ func (in *ScrapeConfigSpec) DeepCopyInto(out *ScrapeConfigSpec) { if in.KubernetesSDConfigs != nil { in, out := &in.KubernetesSDConfigs, &out.KubernetesSDConfigs *out = make([]KubernetesSDConfig, len(*in)) - copy(*out, *in) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } if in.ConsulSDConfigs != nil { in, out := &in.ConsulSDConfigs, &out.ConsulSDConfigs @@ -1025,6 +1228,20 @@ func (in *ScrapeConfigSpec) DeepCopyInto(out *ScrapeConfigSpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.DNSSDConfigs != nil { + in, out := &in.DNSSDConfigs, &out.DNSSDConfigs + *out = make([]DNSSDConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.EC2SDConfigs != nil { + in, out := &in.EC2SDConfigs, &out.EC2SDConfigs + *out = make([]EC2SDConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.RelabelConfigs != nil { in, out := &in.RelabelConfigs, &out.RelabelConfigs *out = make([]*monitoringv1.RelabelConfig, len(*in)) @@ -1121,6 +1338,22 @@ func (in *ScrapeConfigSpec) DeepCopyInto(out *ScrapeConfigSpec) { *out = new(uint64) **out = **in } + if in.KeepDroppedTargets != nil { + in, out := &in.KeepDroppedTargets, &out.KeepDroppedTargets + *out = new(uint64) + **out = **in + } + if in.MetricRelabelConfigs != nil { + in, out := &in.MetricRelabelConfigs, &out.MetricRelabelConfigs + *out = make([]*monitoringv1.RelabelConfig, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(monitoringv1.RelabelConfig) + (*in).DeepCopyInto(*out) + } + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScrapeConfigSpec. @@ -1277,6 +1510,11 @@ func (in *TelegramConfig) DeepCopyInto(out *TelegramConfig) { *out = new(corev1.SecretKeySelector) (*in).DeepCopyInto(*out) } + if in.BotTokenFile != nil { + in, out := &in.BotTokenFile, &out.BotTokenFile + *out = new(string) + **out = **in + } if in.DisableNotifications != nil { in, out := &in.DisableNotifications, &out.DisableNotifications *out = new(bool) @@ -1419,6 +1657,41 @@ func (in *WeChatConfig) DeepCopy() *WeChatConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WebexConfig) DeepCopyInto(out *WebexConfig) { + *out = *in + if in.SendResolved != nil { + in, out := &in.SendResolved, &out.SendResolved + *out = new(bool) + **out = **in + } + if in.APIURL != nil { + in, out := &in.APIURL, &out.APIURL + *out = new(URL) + **out = **in + } + if in.HTTPConfig != nil { + in, out := &in.HTTPConfig, &out.HTTPConfig + *out = new(HTTPConfig) + (*in).DeepCopyInto(*out) + } + if in.Message != nil { + in, out := &in.Message, &out.Message + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebexConfig. +func (in *WebexConfig) DeepCopy() *WebexConfig { + if in == nil { + return nil + } + out := new(WebexConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WebhookConfig) DeepCopyInto(out *WebhookConfig) { *out = *in diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go index 2b8c69d58..dda3ac08c 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/alertmanager_config_types.go @@ -40,8 +40,8 @@ const ( // +k8s:openapi-gen=true // +kubebuilder:resource:categories="prometheus-operator",shortName="amcfg" -// AlertmanagerConfig defines a namespaced AlertmanagerConfig to be aggregated -// across multiple namespaces configuring one Alertmanager cluster. +// AlertmanagerConfig configures the Prometheus Alertmanager, +// specifying how alerts should be grouped, inhibited and notified to external systems. type AlertmanagerConfig struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -175,6 +175,11 @@ type Receiver struct { SNSConfigs []SNSConfig `json:"snsConfigs,omitempty"` // List of Telegram configurations. TelegramConfigs []TelegramConfig `json:"telegramConfigs,omitempty"` + // List of Webex configurations. + WebexConfigs []WebexConfig `json:"webexConfigs,omitempty"` + // List of MSTeams configurations. + // It requires Alertmanager >= 0.26.0. + MSTeamsConfigs []MSTeamsConfig `json:"msteamsConfigs,omitempty"` } // PagerDutyConfig configures notifications via PagerDuty. @@ -594,6 +599,31 @@ type HTTPConfig struct { FollowRedirects *bool `json:"followRedirects,omitempty"` } +// WebexConfig configures notification via Cisco Webex +// See https://prometheus.io/docs/alerting/latest/configuration/#webex_config +type WebexConfig struct { + // Whether to notify about resolved alerts. + // +optional + SendResolved *bool `json:"sendResolved,omitempty"` + + // The Webex Teams API URL i.e. https://webexapis.com/v1/messages + // +optional + APIURL *URL `json:"apiURL,omitempty"` + + // The HTTP client's configuration. + // You must use this configuration to supply the bot token as part of the HTTP `Authorization` header. + HTTPConfig *HTTPConfig `json:"httpConfig,omitempty"` + + // Message template + // +optional + Message *string `json:"message,omitempty"` + + // ID of the Webex Teams room where to send the messages. + // +kubebuilder:validation:MinLength=1 + // +required + RoomID string `json:"roomID"` +} + // WeChatConfig configures notifications via WeChat. // See https://prometheus.io/docs/alerting/latest/configuration/#wechat_config type WeChatConfig struct { @@ -664,10 +694,10 @@ type EmailConfig struct { Headers []KeyValue `json:"headers,omitempty"` // The HTML body of the email notification. // +optional - HTML string `json:"html,omitempty"` + HTML *string `json:"html,omitempty"` // The text body of the email notification. // +optional - Text string `json:"text,omitempty"` + Text *string `json:"text,omitempty"` // The SMTP TLS requirement. // Note that Go does not support unencrypted connections to remote SMTP endpoints. // +optional @@ -723,13 +753,25 @@ type PushoverConfig struct { // The secret's key that contains the recipient user's user key. // The secret needs to be in the same namespace as the AlertmanagerConfig // object and accessible by the Prometheus Operator. - // +kubebuilder:validation:Required + // Either `userKey` or `userKeyFile` is required. + // +optional UserKey *SecretKeySelector `json:"userKey,omitempty"` + // The user key file that contains the recipient user's user key. + // Either `userKey` or `userKeyFile` is required. + // It requires Alertmanager >= v0.26.0. + // +optional + UserKeyFile *string `json:"userKeyFile,omitempty"` // The secret's key that contains the registered application's API token, see https://pushover.net/apps. // The secret needs to be in the same namespace as the AlertmanagerConfig // object and accessible by the Prometheus Operator. - // +kubebuilder:validation:Required + // Either `token` or `tokenFile` is required. + // +optional Token *SecretKeySelector `json:"token,omitempty"` + // The token file that contains the registered application's API token, see https://pushover.net/apps. + // Either `token` or `tokenFile` is required. + // It requires Alertmanager >= v0.26.0. + // +optional + TokenFile *string `json:"tokenFile,omitempty"` // Notification title. // +optional Title string `json:"title,omitempty"` @@ -815,11 +857,23 @@ type TelegramConfig struct { // If not specified, default API URL will be used. // +optional APIURL string `json:"apiURL,omitempty"` - // Telegram bot token + // Telegram bot token. It is mutually exclusive with `botTokenFile`. // The secret needs to be in the same namespace as the AlertmanagerConfig // object and accessible by the Prometheus Operator. + // + // Either `botToken` or `botTokenFile` is required. + // + //+optional BotToken *SecretKeySelector `json:"botToken,omitempty"` + // File to read the Telegram bot token from. It is mutually exclusive with `botToken`. + // Either `botToken` or `botTokenFile` is required. + // + // It requires Alertmanager >= v0.26.0. + // + // +optional + BotTokenFile *string `json:"botTokenFile,omitempty"` // The Telegram chat ID. + // +required ChatID int64 `json:"chatID,omitempty"` // Message template // +optional @@ -836,6 +890,26 @@ type TelegramConfig struct { HTTPConfig *HTTPConfig `json:"httpConfig,omitempty"` } +// MSTeamsConfig configures notifications via Microsoft Teams. +// It requires Alertmanager >= 0.26.0. +type MSTeamsConfig struct { + // Whether to notify about resolved alerts. + // +optional + SendResolved *bool `json:"sendResolved,omitempty"` + // MSTeams webhook URL. + // +kubebuilder:validation:Required + WebhookURL v1.SecretKeySelector `json:"webhookUrl"` + // Message title template. + // +optional + Title *string `json:"title,omitempty"` + // Message body template. + // +optional + Text *string `json:"text,omitempty"` + // HTTP client configuration. + // +optional + HTTPConfig *HTTPConfig `json:"httpConfig,omitempty"` +} + // InhibitRule defines an inhibition rule that allows to mute alerts when other // alerts are already firing. // See https://prometheus.io/docs/alerting/latest/configuration/#inhibit_rule @@ -1106,3 +1180,7 @@ var monthsInv = map[int]Month{ 11: November, 12: December, } + +// URL represents a valid URL +// +kubebuilder:validation:Pattern=`^https?://.+$` +type URL string diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_from.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_from.go index 2e325ed2b..daba52948 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_from.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_from.go @@ -333,6 +333,16 @@ func convertSlackConfigFrom(in v1alpha1.SlackConfig) SlackConfig { } } +func convertWebexConfigFrom(in v1alpha1.WebexConfig) WebexConfig { + return WebexConfig{ + APIURL: (*URL)(in.APIURL), + HTTPConfig: convertHTTPConfigFrom(in.HTTPConfig), + Message: in.Message, + RoomID: in.RoomID, + SendResolved: in.SendResolved, + } +} + func convertWebhookConfigFrom(in v1alpha1.WebhookConfig) WebhookConfig { return WebhookConfig{ SendResolved: in.SendResolved, @@ -397,7 +407,9 @@ func convertPushoverConfigFrom(in v1alpha1.PushoverConfig) PushoverConfig { return PushoverConfig{ SendResolved: in.SendResolved, UserKey: convertSecretKeySelectorFrom(in.UserKey), + UserKeyFile: in.UserKeyFile, Token: convertSecretKeySelectorFrom(in.Token), + TokenFile: in.TokenFile, Title: in.Title, Message: in.Message, URL: in.URL, @@ -431,6 +443,7 @@ func convertTelegramConfigFrom(in v1alpha1.TelegramConfig) TelegramConfig { SendResolved: in.SendResolved, APIURL: in.APIURL, BotToken: convertSecretKeySelectorFrom(in.BotToken), + BotTokenFile: in.BotTokenFile, ChatID: in.ChatID, Message: in.Message, DisableNotifications: in.DisableNotifications, @@ -439,6 +452,16 @@ func convertTelegramConfigFrom(in v1alpha1.TelegramConfig) TelegramConfig { } } +func convertMSTeamsConfigFrom(in v1alpha1.MSTeamsConfig) MSTeamsConfig { + return MSTeamsConfig{ + SendResolved: in.SendResolved, + WebhookURL: in.WebhookURL, + Title: in.Title, + Text: in.Text, + HTTPConfig: convertHTTPConfigFrom(in.HTTPConfig), + } +} + // ConvertFrom converts from the Hub version (v1alpha1) to this version (v1beta1). func (dst *AlertmanagerConfig) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*v1alpha1.AlertmanagerConfig) @@ -478,6 +501,13 @@ func (dst *AlertmanagerConfig) ConvertFrom(srcRaw conversion.Hub) error { ) } + for _, in := range in.WebexConfigs { + out.WebexConfigs = append( + out.WebexConfigs, + convertWebexConfigFrom(in), + ) + } + for _, in := range in.WebhookConfigs { out.WebhookConfigs = append( out.WebhookConfigs, @@ -527,6 +557,13 @@ func (dst *AlertmanagerConfig) ConvertFrom(srcRaw conversion.Hub) error { ) } + for _, in := range in.MSTeamsConfigs { + out.MSTeamsConfigs = append( + out.MSTeamsConfigs, + convertMSTeamsConfigFrom(in), + ) + } + dst.Spec.Receivers = append(dst.Spec.Receivers, out) } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_to.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_to.go index 37270fb85..1e96af965 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_to.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/conversion_to.go @@ -329,6 +329,16 @@ func convertSlackConfigTo(in SlackConfig) v1alpha1.SlackConfig { } } +func convertWebexConfigTo(in WebexConfig) v1alpha1.WebexConfig { + return v1alpha1.WebexConfig{ + APIURL: (*v1alpha1.URL)(in.APIURL), + HTTPConfig: convertHTTPConfigTo(in.HTTPConfig), + Message: in.Message, + RoomID: in.RoomID, + SendResolved: in.SendResolved, + } +} + func convertWebhookConfigTo(in WebhookConfig) v1alpha1.WebhookConfig { return v1alpha1.WebhookConfig{ SendResolved: in.SendResolved, @@ -393,7 +403,9 @@ func convertPushoverConfigTo(in PushoverConfig) v1alpha1.PushoverConfig { return v1alpha1.PushoverConfig{ SendResolved: in.SendResolved, UserKey: convertSecretKeySelectorTo(in.UserKey), + UserKeyFile: in.UserKeyFile, Token: convertSecretKeySelectorTo(in.Token), + TokenFile: in.TokenFile, Title: in.Title, Message: in.Message, URL: in.URL, @@ -427,6 +439,7 @@ func convertTelegramConfigTo(in TelegramConfig) v1alpha1.TelegramConfig { SendResolved: in.SendResolved, APIURL: in.APIURL, BotToken: convertSecretKeySelectorTo(in.BotToken), + BotTokenFile: in.BotTokenFile, ChatID: in.ChatID, Message: in.Message, DisableNotifications: in.DisableNotifications, @@ -435,6 +448,16 @@ func convertTelegramConfigTo(in TelegramConfig) v1alpha1.TelegramConfig { } } +func convertMSTeamsConfigTo(in MSTeamsConfig) v1alpha1.MSTeamsConfig { + return v1alpha1.MSTeamsConfig{ + SendResolved: in.SendResolved, + WebhookURL: in.WebhookURL, + Title: in.Title, + Text: in.Text, + HTTPConfig: convertHTTPConfigTo(in.HTTPConfig), + } +} + // ConvertTo converts from this version (v1beta1) to the Hub version (v1alpha1). func (src *AlertmanagerConfig) ConvertTo(dstRaw conversion.Hub) error { dst := dstRaw.(*v1alpha1.AlertmanagerConfig) @@ -474,6 +497,13 @@ func (src *AlertmanagerConfig) ConvertTo(dstRaw conversion.Hub) error { ) } + for _, in := range in.WebexConfigs { + out.WebexConfigs = append( + out.WebexConfigs, + convertWebexConfigTo(in), + ) + } + for _, in := range in.WebhookConfigs { out.WebhookConfigs = append( out.WebhookConfigs, @@ -523,6 +553,13 @@ func (src *AlertmanagerConfig) ConvertTo(dstRaw conversion.Hub) error { ) } + for _, in := range in.MSTeamsConfigs { + out.MSTeamsConfigs = append( + out.MSTeamsConfigs, + convertMSTeamsConfigTo(in), + ) + } + dst.Spec.Receivers = append(dst.Spec.Receivers, out) } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go index cb7dd4bc8..ed2a3b1b9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/apis/monitoring/v1beta1/zz_generated.deepcopy.go @@ -185,6 +185,16 @@ func (in *EmailConfig) DeepCopyInto(out *EmailConfig) { *out = make([]KeyValue, len(*in)) copy(*out, *in) } + if in.HTML != nil { + in, out := &in.HTML, &out.HTML + *out = new(string) + **out = **in + } + if in.Text != nil { + in, out := &in.Text, &out.Text + *out = new(string) + **out = **in + } if in.RequireTLS != nil { in, out := &in.RequireTLS, &out.RequireTLS *out = new(bool) @@ -297,6 +307,42 @@ func (in *KeyValue) DeepCopy() *KeyValue { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MSTeamsConfig) DeepCopyInto(out *MSTeamsConfig) { + *out = *in + if in.SendResolved != nil { + in, out := &in.SendResolved, &out.SendResolved + *out = new(bool) + **out = **in + } + in.WebhookURL.DeepCopyInto(&out.WebhookURL) + if in.Title != nil { + in, out := &in.Title, &out.Title + *out = new(string) + **out = **in + } + if in.Text != nil { + in, out := &in.Text, &out.Text + *out = new(string) + **out = **in + } + if in.HTTPConfig != nil { + in, out := &in.HTTPConfig, &out.HTTPConfig + *out = new(HTTPConfig) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MSTeamsConfig. +func (in *MSTeamsConfig) DeepCopy() *MSTeamsConfig { + if in == nil { + return nil + } + out := new(MSTeamsConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Matcher) DeepCopyInto(out *Matcher) { *out = *in @@ -460,11 +506,21 @@ func (in *PushoverConfig) DeepCopyInto(out *PushoverConfig) { *out = new(SecretKeySelector) **out = **in } + if in.UserKeyFile != nil { + in, out := &in.UserKeyFile, &out.UserKeyFile + *out = new(string) + **out = **in + } if in.Token != nil { in, out := &in.Token, &out.Token *out = new(SecretKeySelector) **out = **in } + if in.TokenFile != nil { + in, out := &in.TokenFile, &out.TokenFile + *out = new(string) + **out = **in + } if in.HTTPConfig != nil { in, out := &in.HTTPConfig, &out.HTTPConfig *out = new(HTTPConfig) @@ -562,6 +618,20 @@ func (in *Receiver) DeepCopyInto(out *Receiver) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.WebexConfigs != nil { + in, out := &in.WebexConfigs, &out.WebexConfigs + *out = make([]WebexConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.MSTeamsConfigs != nil { + in, out := &in.MSTeamsConfigs, &out.MSTeamsConfigs + *out = make([]MSTeamsConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Receiver. @@ -785,6 +855,11 @@ func (in *TelegramConfig) DeepCopyInto(out *TelegramConfig) { *out = new(SecretKeySelector) **out = **in } + if in.BotTokenFile != nil { + in, out := &in.BotTokenFile, &out.BotTokenFile + *out = new(string) + **out = **in + } if in.DisableNotifications != nil { in, out := &in.DisableNotifications, &out.DisableNotifications *out = new(bool) @@ -949,6 +1024,41 @@ func (in *WeChatConfig) DeepCopy() *WeChatConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WebexConfig) DeepCopyInto(out *WebexConfig) { + *out = *in + if in.SendResolved != nil { + in, out := &in.SendResolved, &out.SendResolved + *out = new(bool) + **out = **in + } + if in.APIURL != nil { + in, out := &in.APIURL, &out.APIURL + *out = new(URL) + **out = **in + } + if in.HTTPConfig != nil { + in, out := &in.HTTPConfig, &out.HTTPConfig + *out = new(HTTPConfig) + (*in).DeepCopyInto(*out) + } + if in.Message != nil { + in, out := &in.Message, &out.Message + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebexConfig. +func (in *WebexConfig) DeepCopy() *WebexConfig { + if in == nil { + return nil + } + out := new(WebexConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WebhookConfig) DeepCopyInto(out *WebhookConfig) { *out = *in diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store.go b/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store.go index 6b9b7aa6c..e8bda344a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store.go @@ -19,9 +19,9 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" + "errors" "fmt" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" @@ -70,7 +70,7 @@ func assetKeyFunc(obj interface{}) (string, error) { case *v1.Secret: return fmt.Sprintf("1/%s/%s", v.GetNamespace(), v.GetName()), nil } - return "", errors.Errorf("unsupported type: %T", obj) + return "", fmt.Errorf("unsupported type: %T", obj) } // addTLSAssets processes the given SafeTLSConfig and adds the referenced CA, certificate and key to the store. @@ -84,18 +84,18 @@ func (s *Store) addTLSAssets(ctx context.Context, ns string, tlsConfig monitorin ca, err = s.GetKey(ctx, ns, tlsConfig.CA) if err != nil { - return errors.Wrap(err, "failed to get CA") + return fmt.Errorf("failed to get CA: %w", err) } cert, err = s.GetKey(ctx, ns, tlsConfig.Cert) if err != nil { - return errors.Wrap(err, "failed to get cert") + return fmt.Errorf("failed to get cert: %w", err) } if tlsConfig.KeySecret != nil { key, err = s.GetSecretKey(ctx, ns, *tlsConfig.KeySecret) if err != nil { - return errors.Wrap(err, "failed to get key") + return fmt.Errorf("failed to get key: %w", err) } } @@ -106,7 +106,7 @@ func (s *Store) addTLSAssets(ctx context.Context, ns string, tlsConfig monitorin } _, err = x509.ParseCertificate(block.Bytes) if err != nil { - return errors.Wrap(err, "failed to parse CA certificate") + return fmt.Errorf("failed to parse CA certificate: %w", err) } s.TLSAssets[TLSAssetKeyFromSelector(ns, tlsConfig.CA)] = TLSAsset(ca) } @@ -114,7 +114,7 @@ func (s *Store) addTLSAssets(ctx context.Context, ns string, tlsConfig monitorin if cert != "" && key != "" { _, err = tls.X509KeyPair([]byte(cert), []byte(key)) if err != nil { - return errors.Wrap(err, "failed to load X509 key pair") + return fmt.Errorf("failed to load X509 key pair: %w", err) } s.TLSAssets[TLSAssetKeyFromSelector(ns, tlsConfig.Cert)] = TLSAsset(cert) s.TLSAssets[TLSAssetKeyFromSelector(ns, monitoringv1.SecretOrConfigMap{Secret: tlsConfig.KeySecret})] = TLSAsset(key) @@ -131,7 +131,7 @@ func (s *Store) AddSafeTLSConfig(ctx context.Context, ns string, tlsConfig *moni err := tlsConfig.Validate() if err != nil { - return errors.Wrap(err, "failed to validate TLS configuration") + return fmt.Errorf("failed to validate TLS configuration: %w", err) } return s.addTLSAssets(ctx, ns, *tlsConfig) @@ -145,7 +145,7 @@ func (s *Store) AddTLSConfig(ctx context.Context, ns string, tlsConfig *monitori err := tlsConfig.Validate() if err != nil { - return errors.Wrap(err, "failed to validate TLS configuration") + return fmt.Errorf("failed to validate TLS configuration: %w", err) } return s.addTLSAssets(ctx, ns, tlsConfig.SafeTLSConfig) @@ -159,12 +159,12 @@ func (s *Store) AddBasicAuth(ctx context.Context, ns string, ba *monitoringv1.Ba username, err := s.GetSecretKey(ctx, ns, ba.Username) if err != nil { - return errors.Wrap(err, "failed to get basic auth username") + return fmt.Errorf("failed to get basic auth username: %w", err) } password, err := s.GetSecretKey(ctx, ns, ba.Password) if err != nil { - return errors.Wrap(err, "failed to get basic auth password") + return fmt.Errorf("failed to get basic auth password: %w", err) } s.BasicAuthAssets[key] = BasicAuthCredentials{ @@ -187,12 +187,12 @@ func (s *Store) AddOAuth2(ctx context.Context, ns string, oauth2 *monitoringv1.O clientID, err := s.GetKey(ctx, ns, oauth2.ClientID) if err != nil { - return errors.Wrap(err, "failed to get oauth2 client id") + return fmt.Errorf("failed to get oauth2 client id: %w", err) } clientSecret, err := s.GetSecretKey(ctx, ns, oauth2.ClientSecret) if err != nil { - return errors.Wrap(err, "failed to get oauth2 client secret") + return fmt.Errorf("failed to get oauth2 client secret: %w", err) } s.OAuth2Assets[key] = OAuth2Credentials{ @@ -204,14 +204,18 @@ func (s *Store) AddOAuth2(ctx context.Context, ns string, oauth2 *monitoringv1.O } // AddToken processes the given SecretKeySelector and adds the referenced data to the store. -func (s *Store) addToken(ctx context.Context, ns string, sel v1.SecretKeySelector, key string) error { +func (s *Store) addToken(ctx context.Context, ns string, sel *v1.SecretKeySelector, key string) error { + if sel == nil { + return nil + } + if sel.Name == "" { return nil } - token, err := s.GetSecretKey(ctx, ns, sel) + token, err := s.GetSecretKey(ctx, ns, *sel) if err != nil { - return errors.Wrap(err, "failed to get token from secret") + return fmt.Errorf("failed to get token from secret: %w", err) } s.TokenAssets[key] = Token(token) @@ -219,10 +223,10 @@ func (s *Store) addToken(ctx context.Context, ns string, sel v1.SecretKeySelecto return nil } -func (s *Store) AddBearerToken(ctx context.Context, ns string, sel v1.SecretKeySelector, key string) error { +func (s *Store) AddBearerToken(ctx context.Context, ns string, sel *v1.SecretKeySelector, key string) error { err := s.addToken(ctx, ns, sel, key) if err != nil { - return errors.Wrap(err, "failed to get bearer token") + return fmt.Errorf("failed to get bearer token: %w", err) } return nil } @@ -236,9 +240,9 @@ func (s *Store) AddSafeAuthorizationCredentials(ctx context.Context, namespace s return err } - err := s.addToken(ctx, namespace, *auth.Credentials, key) + err := s.addToken(ctx, namespace, auth.Credentials, key) if err != nil { - return errors.Wrapf(err, "failed to get authorization token of type %s", auth.Type) + return fmt.Errorf("failed to get authorization token of type %q: %w", auth.Type, err) } return nil } @@ -252,9 +256,9 @@ func (s *Store) AddAuthorizationCredentials(ctx context.Context, namespace strin return err } - err := s.addToken(ctx, namespace, *auth.Credentials, key) + err := s.addToken(ctx, namespace, auth.Credentials, key) if err != nil { - return errors.Wrapf(err, "failed to get authorization token of type %s", auth.Type) + return fmt.Errorf("failed to get authorization token of type %q: %w", auth.Type, err) } return nil } @@ -273,13 +277,13 @@ func (s *Store) AddSigV4(ctx context.Context, ns string, sigv4 *monitoringv1.Sig accessKey, err := s.GetSecretKey(ctx, ns, *sigv4.AccessKey) if err != nil { - return errors.Wrap(err, "failed to read SigV4 access-key") + return fmt.Errorf("failed to read SigV4 access-key: %w", err) } sigV4Credentials.AccessKeyID = accessKey secretKey, err := s.GetSecretKey(ctx, ns, *sigv4.SecretKey) if err != nil { - return errors.Wrap(err, "failed to read SigV4 secret-key") + return fmt.Errorf("failed to read SigV4 secret-key: %w", err) } sigV4Credentials.SecretKeyID = secretKey @@ -309,23 +313,23 @@ func (s *Store) GetConfigMapKey(ctx context.Context, namespace string, sel v1.Co }, }) if err != nil { - return "", errors.Wrapf(err, "unexpected store error when getting configmap %q", sel.Name) + return "", fmt.Errorf("unexpected store error when getting configmap %q: %w", sel.Name, err) } if !exists { cm, err := s.cmClient.ConfigMaps(namespace).Get(ctx, sel.Name, metav1.GetOptions{}) if err != nil { - return "", errors.Wrapf(err, "unable to get configmap %q", sel.Name) + return "", fmt.Errorf("unable to get configmap %q: %w", sel.Name, err) } if err = s.objStore.Add(cm); err != nil { - return "", errors.Wrapf(err, "unexpected store error when adding configmap %q", sel.Name) + return "", fmt.Errorf("unexpected store error when adding configmap %q: %w", sel.Name, err) } obj = cm } cm := obj.(*v1.ConfigMap) if _, found := cm.Data[sel.Key]; !found { - return "", errors.Errorf("key %q in configmap %q not found", sel.Key, sel.Name) + return "", fmt.Errorf("key %q in configmap %q not found", sel.Key, sel.Name) } return cm.Data[sel.Key], nil @@ -340,23 +344,23 @@ func (s *Store) GetSecretKey(ctx context.Context, namespace string, sel v1.Secre }, }) if err != nil { - return "", errors.Wrapf(err, "unexpected store error when getting secret %q", sel.Name) + return "", fmt.Errorf("unexpected store error when getting secret %q: %w", sel.Name, err) } if !exists { secret, err := s.sClient.Secrets(namespace).Get(ctx, sel.Name, metav1.GetOptions{}) if err != nil { - return "", errors.Wrapf(err, "unable to get secret %q", sel.Name) + return "", fmt.Errorf("unable to get secret %q: %w", sel.Name, err) } if err = s.objStore.Add(secret); err != nil { - return "", errors.Wrapf(err, "unexpected store error when adding secret %q", sel.Name) + return "", fmt.Errorf("unexpected store error when adding secret %q: %w", sel.Name, err) } obj = secret } secret := obj.(*v1.Secret) if _, found := secret.Data[sel.Key]; !found { - return "", errors.Errorf("key %q in secret %q not found", sel.Key, sel.Name) + return "", fmt.Errorf("key %q in secret %q not found", sel.Key, sel.Name) } return string(secret.Data[sel.Key]), nil diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store_test.go index 5a043ef76..702b2d0e9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/assets/store_test.go @@ -129,7 +129,7 @@ func TestAddBearerToken(t *testing.T) { } key := fmt.Sprintf("bearertoken/%d", i) - err := store.AddBearerToken(context.Background(), tc.ns, sel, key) + err := store.AddBearerToken(context.Background(), tc.ns, &sel, key) if tc.err { if err == nil { diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/alertmanagerendpoints.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/alertmanagerendpoints.go index f995a6504..9ec7b1a3f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/alertmanagerendpoints.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/alertmanagerendpoints.go @@ -33,6 +33,7 @@ type AlertmanagerEndpointsApplyConfiguration struct { BasicAuth *BasicAuthApplyConfiguration `json:"basicAuth,omitempty"` BearerTokenFile *string `json:"bearerTokenFile,omitempty"` Authorization *SafeAuthorizationApplyConfiguration `json:"authorization,omitempty"` + Sigv4 *Sigv4ApplyConfiguration `json:"sigv4,omitempty"` APIVersion *string `json:"apiVersion,omitempty"` Timeout *monitoringv1.Duration `json:"timeout,omitempty"` EnableHttp2 *bool `json:"enableHttp2,omitempty"` @@ -116,6 +117,14 @@ func (b *AlertmanagerEndpointsApplyConfiguration) WithAuthorization(value *SafeA return b } +// WithSigv4 sets the Sigv4 field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Sigv4 field is set to the value of the last call. +func (b *AlertmanagerEndpointsApplyConfiguration) WithSigv4(value *Sigv4ApplyConfiguration) *AlertmanagerEndpointsApplyConfiguration { + b.Sigv4 = value + return b +} + // WithAPIVersion sets the APIVersion field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the APIVersion field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/azuread.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/azuread.go new file mode 100644 index 000000000..b6ea94eba --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/azuread.go @@ -0,0 +1,46 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// AzureADApplyConfiguration represents an declarative configuration of the AzureAD type for use +// with apply. +type AzureADApplyConfiguration struct { + Cloud *string `json:"cloud,omitempty"` + ManagedIdentity *ManagedIdentityApplyConfiguration `json:"managedIdentity,omitempty"` +} + +// AzureADApplyConfiguration constructs an declarative configuration of the AzureAD type for use with +// apply. +func AzureAD() *AzureADApplyConfiguration { + return &AzureADApplyConfiguration{} +} + +// WithCloud sets the Cloud field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Cloud field is set to the value of the last call. +func (b *AzureADApplyConfiguration) WithCloud(value string) *AzureADApplyConfiguration { + b.Cloud = &value + return b +} + +// WithManagedIdentity sets the ManagedIdentity field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ManagedIdentity field is set to the value of the last call. +func (b *AzureADApplyConfiguration) WithManagedIdentity(value *ManagedIdentityApplyConfiguration) *AzureADApplyConfiguration { + b.ManagedIdentity = value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/commonprometheusfields.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/commonprometheusfields.go index 01a305c5a..742cc1f0e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/commonprometheusfields.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/commonprometheusfields.go @@ -83,6 +83,7 @@ type CommonPrometheusFieldsApplyConfiguration struct { EnforcedLabelLimit *uint64 `json:"enforcedLabelLimit,omitempty"` EnforcedLabelNameLengthLimit *uint64 `json:"enforcedLabelNameLengthLimit,omitempty"` EnforcedLabelValueLengthLimit *uint64 `json:"enforcedLabelValueLengthLimit,omitempty"` + EnforcedKeepDroppedTargets *uint64 `json:"enforcedKeepDroppedTargets,omitempty"` EnforcedBodySizeLimit *monitoringv1.ByteSize `json:"enforcedBodySizeLimit,omitempty"` MinReadySeconds *uint32 `json:"minReadySeconds,omitempty"` HostAliases []HostAliasApplyConfiguration `json:"hostAliases,omitempty"` @@ -98,6 +99,7 @@ type CommonPrometheusFieldsApplyConfiguration struct { LabelLimit *uint64 `json:"labelLimit,omitempty"` LabelNameLengthLimit *uint64 `json:"labelNameLengthLimit,omitempty"` LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` } // CommonPrometheusFieldsApplyConfiguration constructs an declarative configuration of the CommonPrometheusFields type for use with @@ -607,6 +609,14 @@ func (b *CommonPrometheusFieldsApplyConfiguration) WithEnforcedLabelValueLengthL return b } +// WithEnforcedKeepDroppedTargets sets the EnforcedKeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EnforcedKeepDroppedTargets field is set to the value of the last call. +func (b *CommonPrometheusFieldsApplyConfiguration) WithEnforcedKeepDroppedTargets(value uint64) *CommonPrometheusFieldsApplyConfiguration { + b.EnforcedKeepDroppedTargets = &value + return b +} + // WithEnforcedBodySizeLimit sets the EnforcedBodySizeLimit field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the EnforcedBodySizeLimit field is set to the value of the last call. @@ -743,3 +753,11 @@ func (b *CommonPrometheusFieldsApplyConfiguration) WithLabelValueLengthLimit(val b.LabelValueLengthLimit = &value return b } + +// WithKeepDroppedTargets sets the KeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KeepDroppedTargets field is set to the value of the last call. +func (b *CommonPrometheusFieldsApplyConfiguration) WithKeepDroppedTargets(value uint64) *CommonPrometheusFieldsApplyConfiguration { + b.KeepDroppedTargets = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/managedidentity.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/managedidentity.go new file mode 100644 index 000000000..a53988d92 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/managedidentity.go @@ -0,0 +1,37 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// ManagedIdentityApplyConfiguration represents an declarative configuration of the ManagedIdentity type for use +// with apply. +type ManagedIdentityApplyConfiguration struct { + ClientID *string `json:"clientId,omitempty"` +} + +// ManagedIdentityApplyConfiguration constructs an declarative configuration of the ManagedIdentity type for use with +// apply. +func ManagedIdentity() *ManagedIdentityApplyConfiguration { + return &ManagedIdentityApplyConfiguration{} +} + +// WithClientID sets the ClientID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ClientID field is set to the value of the last call. +func (b *ManagedIdentityApplyConfiguration) WithClientID(value string) *ManagedIdentityApplyConfiguration { + b.ClientID = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/podmonitorspec.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/podmonitorspec.go index 6b2c6a890..7bfcfef38 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/podmonitorspec.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/podmonitorspec.go @@ -33,6 +33,7 @@ type PodMonitorSpecApplyConfiguration struct { LabelLimit *uint64 `json:"labelLimit,omitempty"` LabelNameLengthLimit *uint64 `json:"labelNameLengthLimit,omitempty"` LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` AttachMetadata *AttachMetadataApplyConfiguration `json:"attachMetadata,omitempty"` } @@ -129,6 +130,14 @@ func (b *PodMonitorSpecApplyConfiguration) WithLabelValueLengthLimit(value uint6 return b } +// WithKeepDroppedTargets sets the KeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KeepDroppedTargets field is set to the value of the last call. +func (b *PodMonitorSpecApplyConfiguration) WithKeepDroppedTargets(value uint64) *PodMonitorSpecApplyConfiguration { + b.KeepDroppedTargets = &value + return b +} + // WithAttachMetadata sets the AttachMetadata field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the AttachMetadata field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/probespec.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/probespec.go index b9ab5fd02..73145479d 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/probespec.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/probespec.go @@ -41,6 +41,7 @@ type ProbeSpecApplyConfiguration struct { LabelLimit *uint64 `json:"labelLimit,omitempty"` LabelNameLengthLimit *uint64 `json:"labelNameLengthLimit,omitempty"` LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` } // ProbeSpecApplyConfiguration constructs an declarative configuration of the ProbeSpec type for use with @@ -189,3 +190,11 @@ func (b *ProbeSpecApplyConfiguration) WithLabelValueLengthLimit(value uint64) *P b.LabelValueLengthLimit = &value return b } + +// WithKeepDroppedTargets sets the KeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KeepDroppedTargets field is set to the value of the last call. +func (b *ProbeSpecApplyConfiguration) WithKeepDroppedTargets(value uint64) *ProbeSpecApplyConfiguration { + b.KeepDroppedTargets = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go index 807a21e6b..a7ad3a2c9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/prometheusspec.go @@ -557,6 +557,14 @@ func (b *PrometheusSpecApplyConfiguration) WithEnforcedLabelValueLengthLimit(val return b } +// WithEnforcedKeepDroppedTargets sets the EnforcedKeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EnforcedKeepDroppedTargets field is set to the value of the last call. +func (b *PrometheusSpecApplyConfiguration) WithEnforcedKeepDroppedTargets(value uint64) *PrometheusSpecApplyConfiguration { + b.EnforcedKeepDroppedTargets = &value + return b +} + // WithEnforcedBodySizeLimit sets the EnforcedBodySizeLimit field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the EnforcedBodySizeLimit field is set to the value of the last call. @@ -694,6 +702,14 @@ func (b *PrometheusSpecApplyConfiguration) WithLabelValueLengthLimit(value uint6 return b } +// WithKeepDroppedTargets sets the KeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KeepDroppedTargets field is set to the value of the last call. +func (b *PrometheusSpecApplyConfiguration) WithKeepDroppedTargets(value uint64) *PrometheusSpecApplyConfiguration { + b.KeepDroppedTargets = &value + return b +} + // WithBaseImage sets the BaseImage field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the BaseImage field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/remotewritespec.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/remotewritespec.go index a8f6d39b4..da6385753 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/remotewritespec.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/remotewritespec.go @@ -35,6 +35,7 @@ type RemoteWriteSpecApplyConfiguration struct { BearerTokenFile *string `json:"bearerTokenFile,omitempty"` Authorization *AuthorizationApplyConfiguration `json:"authorization,omitempty"` Sigv4 *Sigv4ApplyConfiguration `json:"sigv4,omitempty"` + AzureAD *AzureADApplyConfiguration `json:"azureAd,omitempty"` BearerToken *string `json:"bearerToken,omitempty"` TLSConfig *TLSConfigApplyConfiguration `json:"tlsConfig,omitempty"` ProxyURL *string `json:"proxyUrl,omitempty"` @@ -155,6 +156,14 @@ func (b *RemoteWriteSpecApplyConfiguration) WithSigv4(value *Sigv4ApplyConfigura return b } +// WithAzureAD sets the AzureAD field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AzureAD field is set to the value of the last call. +func (b *RemoteWriteSpecApplyConfiguration) WithAzureAD(value *AzureADApplyConfiguration) *RemoteWriteSpecApplyConfiguration { + b.AzureAD = value + return b +} + // WithBearerToken sets the BearerToken field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the BearerToken field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/servicemonitorspec.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/servicemonitorspec.go index c6c76554a..2a31a823a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/servicemonitorspec.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1/servicemonitorspec.go @@ -34,6 +34,7 @@ type ServiceMonitorSpecApplyConfiguration struct { LabelLimit *uint64 `json:"labelLimit,omitempty"` LabelNameLengthLimit *uint64 `json:"labelNameLengthLimit,omitempty"` LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` AttachMetadata *AttachMetadataApplyConfiguration `json:"attachMetadata,omitempty"` } @@ -140,6 +141,14 @@ func (b *ServiceMonitorSpecApplyConfiguration) WithLabelValueLengthLimit(value u return b } +// WithKeepDroppedTargets sets the KeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KeepDroppedTargets field is set to the value of the last call. +func (b *ServiceMonitorSpecApplyConfiguration) WithKeepDroppedTargets(value uint64) *ServiceMonitorSpecApplyConfiguration { + b.KeepDroppedTargets = &value + return b +} + // WithAttachMetadata sets the AttachMetadata field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the AttachMetadata field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/dnssdconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/dnssdconfig.go new file mode 100644 index 000000000..a25316865 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/dnssdconfig.go @@ -0,0 +1,70 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" +) + +// DNSSDConfigApplyConfiguration represents an declarative configuration of the DNSSDConfig type for use +// with apply. +type DNSSDConfigApplyConfiguration struct { + Names []string `json:"names,omitempty"` + RefreshInterval *v1.Duration `json:"refreshInterval,omitempty"` + Type *string `json:"type,omitempty"` + Port *int `json:"port,omitempty"` +} + +// DNSSDConfigApplyConfiguration constructs an declarative configuration of the DNSSDConfig type for use with +// apply. +func DNSSDConfig() *DNSSDConfigApplyConfiguration { + return &DNSSDConfigApplyConfiguration{} +} + +// WithNames adds the given value to the Names field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Names field. +func (b *DNSSDConfigApplyConfiguration) WithNames(values ...string) *DNSSDConfigApplyConfiguration { + for i := range values { + b.Names = append(b.Names, values[i]) + } + return b +} + +// WithRefreshInterval sets the RefreshInterval field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RefreshInterval field is set to the value of the last call. +func (b *DNSSDConfigApplyConfiguration) WithRefreshInterval(value v1.Duration) *DNSSDConfigApplyConfiguration { + b.RefreshInterval = &value + return b +} + +// WithType sets the Type field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Type field is set to the value of the last call. +func (b *DNSSDConfigApplyConfiguration) WithType(value string) *DNSSDConfigApplyConfiguration { + b.Type = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *DNSSDConfigApplyConfiguration) WithPort(value int) *DNSSDConfigApplyConfiguration { + b.Port = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2filter.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2filter.go new file mode 100644 index 000000000..a470782cc --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2filter.go @@ -0,0 +1,48 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +// EC2FilterApplyConfiguration represents an declarative configuration of the EC2Filter type for use +// with apply. +type EC2FilterApplyConfiguration struct { + Name *string `json:"name,omitempty"` + Values []string `json:"values,omitempty"` +} + +// EC2FilterApplyConfiguration constructs an declarative configuration of the EC2Filter type for use with +// apply. +func EC2Filter() *EC2FilterApplyConfiguration { + return &EC2FilterApplyConfiguration{} +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *EC2FilterApplyConfiguration) WithName(value string) *EC2FilterApplyConfiguration { + b.Name = &value + return b +} + +// WithValues adds the given value to the Values field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Values field. +func (b *EC2FilterApplyConfiguration) WithValues(values ...string) *EC2FilterApplyConfiguration { + for i := range values { + b.Values = append(b.Values, values[i]) + } + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2sdconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2sdconfig.go new file mode 100644 index 000000000..2a838009c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/ec2sdconfig.go @@ -0,0 +1,102 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + v1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" + v1 "k8s.io/api/core/v1" +) + +// EC2SDConfigApplyConfiguration represents an declarative configuration of the EC2SDConfig type for use +// with apply. +type EC2SDConfigApplyConfiguration struct { + Region *string `json:"region,omitempty"` + AccessKey *v1.SecretKeySelector `json:"accessKey,omitempty"` + SecretKey *v1.SecretKeySelector `json:"secretKey,omitempty"` + RoleARN *string `json:"roleARN,omitempty"` + RefreshInterval *monitoringv1.Duration `json:"refreshInterval,omitempty"` + Port *int `json:"port,omitempty"` + Filters []*v1alpha1.EC2Filter `json:"filters,omitempty"` +} + +// EC2SDConfigApplyConfiguration constructs an declarative configuration of the EC2SDConfig type for use with +// apply. +func EC2SDConfig() *EC2SDConfigApplyConfiguration { + return &EC2SDConfigApplyConfiguration{} +} + +// WithRegion sets the Region field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Region field is set to the value of the last call. +func (b *EC2SDConfigApplyConfiguration) WithRegion(value string) *EC2SDConfigApplyConfiguration { + b.Region = &value + return b +} + +// WithAccessKey sets the AccessKey field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the AccessKey field is set to the value of the last call. +func (b *EC2SDConfigApplyConfiguration) WithAccessKey(value v1.SecretKeySelector) *EC2SDConfigApplyConfiguration { + b.AccessKey = &value + return b +} + +// WithSecretKey sets the SecretKey field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SecretKey field is set to the value of the last call. +func (b *EC2SDConfigApplyConfiguration) WithSecretKey(value v1.SecretKeySelector) *EC2SDConfigApplyConfiguration { + b.SecretKey = &value + return b +} + +// WithRoleARN sets the RoleARN field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoleARN field is set to the value of the last call. +func (b *EC2SDConfigApplyConfiguration) WithRoleARN(value string) *EC2SDConfigApplyConfiguration { + b.RoleARN = &value + return b +} + +// WithRefreshInterval sets the RefreshInterval field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RefreshInterval field is set to the value of the last call. +func (b *EC2SDConfigApplyConfiguration) WithRefreshInterval(value monitoringv1.Duration) *EC2SDConfigApplyConfiguration { + b.RefreshInterval = &value + return b +} + +// WithPort sets the Port field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Port field is set to the value of the last call. +func (b *EC2SDConfigApplyConfiguration) WithPort(value int) *EC2SDConfigApplyConfiguration { + b.Port = &value + return b +} + +// WithFilters adds the given value to the Filters field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Filters field. +func (b *EC2SDConfigApplyConfiguration) WithFilters(values ...**v1alpha1.EC2Filter) *EC2SDConfigApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithFilters") + } + b.Filters = append(b.Filters, *values[i]) + } + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/k8sselectorconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/k8sselectorconfig.go new file mode 100644 index 000000000..89402e774 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/k8sselectorconfig.go @@ -0,0 +1,59 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" +) + +// K8SSelectorConfigApplyConfiguration represents an declarative configuration of the K8SSelectorConfig type for use +// with apply. +type K8SSelectorConfigApplyConfiguration struct { + Role *v1alpha1.K8SRole `json:"role,omitempty"` + Label *string `json:"label,omitempty"` + Field *string `json:"field,omitempty"` +} + +// K8SSelectorConfigApplyConfiguration constructs an declarative configuration of the K8SSelectorConfig type for use with +// apply. +func K8SSelectorConfig() *K8SSelectorConfigApplyConfiguration { + return &K8SSelectorConfigApplyConfiguration{} +} + +// WithRole sets the Role field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Role field is set to the value of the last call. +func (b *K8SSelectorConfigApplyConfiguration) WithRole(value v1alpha1.K8SRole) *K8SSelectorConfigApplyConfiguration { + b.Role = &value + return b +} + +// WithLabel sets the Label field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Label field is set to the value of the last call. +func (b *K8SSelectorConfigApplyConfiguration) WithLabel(value string) *K8SSelectorConfigApplyConfiguration { + b.Label = &value + return b +} + +// WithField sets the Field field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Field field is set to the value of the last call. +func (b *K8SSelectorConfigApplyConfiguration) WithField(value string) *K8SSelectorConfigApplyConfiguration { + b.Field = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/kubernetessdconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/kubernetessdconfig.go index e3650d35a..fd3bb4b4e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/kubernetessdconfig.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/kubernetessdconfig.go @@ -16,10 +16,15 @@ package v1alpha1 +import ( + v1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" +) + // KubernetesSDConfigApplyConfiguration represents an declarative configuration of the KubernetesSDConfig type for use // with apply. type KubernetesSDConfigApplyConfiguration struct { - Role *string `json:"role,omitempty"` + Role *v1alpha1.K8SRole `json:"role,omitempty"` + Selectors []K8SSelectorConfigApplyConfiguration `json:"selectors,omitempty"` } // KubernetesSDConfigApplyConfiguration constructs an declarative configuration of the KubernetesSDConfig type for use with @@ -31,7 +36,20 @@ func KubernetesSDConfig() *KubernetesSDConfigApplyConfiguration { // WithRole sets the Role field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Role field is set to the value of the last call. -func (b *KubernetesSDConfigApplyConfiguration) WithRole(value string) *KubernetesSDConfigApplyConfiguration { +func (b *KubernetesSDConfigApplyConfiguration) WithRole(value v1alpha1.K8SRole) *KubernetesSDConfigApplyConfiguration { b.Role = &value return b } + +// WithSelectors adds the given value to the Selectors field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Selectors field. +func (b *KubernetesSDConfigApplyConfiguration) WithSelectors(values ...*K8SSelectorConfigApplyConfiguration) *KubernetesSDConfigApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithSelectors") + } + b.Selectors = append(b.Selectors, *values[i]) + } + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/msteamsconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/msteamsconfig.go new file mode 100644 index 000000000..0206b46f4 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/msteamsconfig.go @@ -0,0 +1,77 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// MSTeamsConfigApplyConfiguration represents an declarative configuration of the MSTeamsConfig type for use +// with apply. +type MSTeamsConfigApplyConfiguration struct { + SendResolved *bool `json:"sendResolved,omitempty"` + WebhookURL *v1.SecretKeySelector `json:"webhookUrl,omitempty"` + Title *string `json:"title,omitempty"` + Text *string `json:"text,omitempty"` + HTTPConfig *HTTPConfigApplyConfiguration `json:"httpConfig,omitempty"` +} + +// MSTeamsConfigApplyConfiguration constructs an declarative configuration of the MSTeamsConfig type for use with +// apply. +func MSTeamsConfig() *MSTeamsConfigApplyConfiguration { + return &MSTeamsConfigApplyConfiguration{} +} + +// WithSendResolved sets the SendResolved field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SendResolved field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithSendResolved(value bool) *MSTeamsConfigApplyConfiguration { + b.SendResolved = &value + return b +} + +// WithWebhookURL sets the WebhookURL field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WebhookURL field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithWebhookURL(value v1.SecretKeySelector) *MSTeamsConfigApplyConfiguration { + b.WebhookURL = &value + return b +} + +// WithTitle sets the Title field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Title field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithTitle(value string) *MSTeamsConfigApplyConfiguration { + b.Title = &value + return b +} + +// WithText sets the Text field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Text field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithText(value string) *MSTeamsConfigApplyConfiguration { + b.Text = &value + return b +} + +// WithHTTPConfig sets the HTTPConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTPConfig field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithHTTPConfig(value *HTTPConfigApplyConfiguration) *MSTeamsConfigApplyConfiguration { + b.HTTPConfig = value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/prometheusagentspec.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/prometheusagentspec.go index 792a1698e..81740fb7e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/prometheusagentspec.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/prometheusagentspec.go @@ -536,6 +536,14 @@ func (b *PrometheusAgentSpecApplyConfiguration) WithEnforcedLabelValueLengthLimi return b } +// WithEnforcedKeepDroppedTargets sets the EnforcedKeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the EnforcedKeepDroppedTargets field is set to the value of the last call. +func (b *PrometheusAgentSpecApplyConfiguration) WithEnforcedKeepDroppedTargets(value uint64) *PrometheusAgentSpecApplyConfiguration { + b.EnforcedKeepDroppedTargets = &value + return b +} + // WithEnforcedBodySizeLimit sets the EnforcedBodySizeLimit field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the EnforcedBodySizeLimit field is set to the value of the last call. @@ -672,3 +680,11 @@ func (b *PrometheusAgentSpecApplyConfiguration) WithLabelValueLengthLimit(value b.LabelValueLengthLimit = &value return b } + +// WithKeepDroppedTargets sets the KeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KeepDroppedTargets field is set to the value of the last call. +func (b *PrometheusAgentSpecApplyConfiguration) WithKeepDroppedTargets(value uint64) *PrometheusAgentSpecApplyConfiguration { + b.KeepDroppedTargets = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/pushoverconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/pushoverconfig.go index 20923157e..6d37966d1 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/pushoverconfig.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/pushoverconfig.go @@ -25,7 +25,9 @@ import ( type PushoverConfigApplyConfiguration struct { SendResolved *bool `json:"sendResolved,omitempty"` UserKey *v1.SecretKeySelector `json:"userKey,omitempty"` + UserKeyFile *string `json:"userKeyFile,omitempty"` Token *v1.SecretKeySelector `json:"token,omitempty"` + TokenFile *string `json:"tokenFile,omitempty"` Title *string `json:"title,omitempty"` Message *string `json:"message,omitempty"` URL *string `json:"url,omitempty"` @@ -60,6 +62,14 @@ func (b *PushoverConfigApplyConfiguration) WithUserKey(value v1.SecretKeySelecto return b } +// WithUserKeyFile sets the UserKeyFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UserKeyFile field is set to the value of the last call. +func (b *PushoverConfigApplyConfiguration) WithUserKeyFile(value string) *PushoverConfigApplyConfiguration { + b.UserKeyFile = &value + return b +} + // WithToken sets the Token field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Token field is set to the value of the last call. @@ -68,6 +78,14 @@ func (b *PushoverConfigApplyConfiguration) WithToken(value v1.SecretKeySelector) return b } +// WithTokenFile sets the TokenFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TokenFile field is set to the value of the last call. +func (b *PushoverConfigApplyConfiguration) WithTokenFile(value string) *PushoverConfigApplyConfiguration { + b.TokenFile = &value + return b +} + // WithTitle sets the Title field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Title field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/receiver.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/receiver.go index 3309d71fd..13a4175c5 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/receiver.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/receiver.go @@ -31,6 +31,8 @@ type ReceiverApplyConfiguration struct { PushoverConfigs []PushoverConfigApplyConfiguration `json:"pushoverConfigs,omitempty"` SNSConfigs []SNSConfigApplyConfiguration `json:"snsConfigs,omitempty"` TelegramConfigs []TelegramConfigApplyConfiguration `json:"telegramConfigs,omitempty"` + WebexConfigs []WebexConfigApplyConfiguration `json:"webexConfigs,omitempty"` + MSTeamsConfigs []MSTeamsConfigApplyConfiguration `json:"msteamsConfigs,omitempty"` } // ReceiverApplyConfiguration constructs an declarative configuration of the Receiver type for use with @@ -189,3 +191,29 @@ func (b *ReceiverApplyConfiguration) WithTelegramConfigs(values ...*TelegramConf } return b } + +// WithWebexConfigs adds the given value to the WebexConfigs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the WebexConfigs field. +func (b *ReceiverApplyConfiguration) WithWebexConfigs(values ...*WebexConfigApplyConfiguration) *ReceiverApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithWebexConfigs") + } + b.WebexConfigs = append(b.WebexConfigs, *values[i]) + } + return b +} + +// WithMSTeamsConfigs adds the given value to the MSTeamsConfigs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MSTeamsConfigs field. +func (b *ReceiverApplyConfiguration) WithMSTeamsConfigs(values ...*MSTeamsConfigApplyConfiguration) *ReceiverApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMSTeamsConfigs") + } + b.MSTeamsConfigs = append(b.MSTeamsConfigs, *values[i]) + } + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/scrapeconfigspec.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/scrapeconfigspec.go index 8ebdfb98f..e413267d4 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/scrapeconfigspec.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/scrapeconfigspec.go @@ -29,6 +29,8 @@ type ScrapeConfigSpecApplyConfiguration struct { HTTPSDConfigs []HTTPSDConfigApplyConfiguration `json:"httpSDConfigs,omitempty"` KubernetesSDConfigs []KubernetesSDConfigApplyConfiguration `json:"kubernetesSDConfigs,omitempty"` ConsulSDConfigs []ConsulSDConfigApplyConfiguration `json:"consulSDConfigs,omitempty"` + DNSSDConfigs []DNSSDConfigApplyConfiguration `json:"dnsSDConfigs,omitempty"` + EC2SDConfigs []EC2SDConfigApplyConfiguration `json:"ec2SDConfigs,omitempty"` RelabelConfigs []*v1.RelabelConfig `json:"relabelings,omitempty"` MetricsPath *string `json:"metricsPath,omitempty"` ScrapeInterval *v1.Duration `json:"scrapeInterval,omitempty"` @@ -45,6 +47,8 @@ type ScrapeConfigSpecApplyConfiguration struct { LabelLimit *uint64 `json:"labelLimit,omitempty"` LabelNameLengthLimit *uint64 `json:"labelNameLengthLimit,omitempty"` LabelValueLengthLimit *uint64 `json:"labelValueLengthLimit,omitempty"` + KeepDroppedTargets *uint64 `json:"keepDroppedTargets,omitempty"` + MetricRelabelConfigs []*v1.RelabelConfig `json:"metricRelabelings,omitempty"` } // ScrapeConfigSpecApplyConfiguration constructs an declarative configuration of the ScrapeConfigSpec type for use with @@ -118,6 +122,32 @@ func (b *ScrapeConfigSpecApplyConfiguration) WithConsulSDConfigs(values ...*Cons return b } +// WithDNSSDConfigs adds the given value to the DNSSDConfigs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the DNSSDConfigs field. +func (b *ScrapeConfigSpecApplyConfiguration) WithDNSSDConfigs(values ...*DNSSDConfigApplyConfiguration) *ScrapeConfigSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithDNSSDConfigs") + } + b.DNSSDConfigs = append(b.DNSSDConfigs, *values[i]) + } + return b +} + +// WithEC2SDConfigs adds the given value to the EC2SDConfigs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the EC2SDConfigs field. +func (b *ScrapeConfigSpecApplyConfiguration) WithEC2SDConfigs(values ...*EC2SDConfigApplyConfiguration) *ScrapeConfigSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithEC2SDConfigs") + } + b.EC2SDConfigs = append(b.EC2SDConfigs, *values[i]) + } + return b +} + // WithRelabelConfigs adds the given value to the RelabelConfigs field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, values provided by each call will be appended to the RelabelConfigs field. @@ -256,3 +286,24 @@ func (b *ScrapeConfigSpecApplyConfiguration) WithLabelValueLengthLimit(value uin b.LabelValueLengthLimit = &value return b } + +// WithKeepDroppedTargets sets the KeepDroppedTargets field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the KeepDroppedTargets field is set to the value of the last call. +func (b *ScrapeConfigSpecApplyConfiguration) WithKeepDroppedTargets(value uint64) *ScrapeConfigSpecApplyConfiguration { + b.KeepDroppedTargets = &value + return b +} + +// WithMetricRelabelConfigs adds the given value to the MetricRelabelConfigs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MetricRelabelConfigs field. +func (b *ScrapeConfigSpecApplyConfiguration) WithMetricRelabelConfigs(values ...**v1.RelabelConfig) *ScrapeConfigSpecApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMetricRelabelConfigs") + } + b.MetricRelabelConfigs = append(b.MetricRelabelConfigs, *values[i]) + } + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/telegramconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/telegramconfig.go index 374567ef3..44cd58124 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/telegramconfig.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/telegramconfig.go @@ -26,6 +26,7 @@ type TelegramConfigApplyConfiguration struct { SendResolved *bool `json:"sendResolved,omitempty"` APIURL *string `json:"apiURL,omitempty"` BotToken *v1.SecretKeySelector `json:"botToken,omitempty"` + BotTokenFile *string `json:"botTokenFile,omitempty"` ChatID *int64 `json:"chatID,omitempty"` Message *string `json:"message,omitempty"` DisableNotifications *bool `json:"disableNotifications,omitempty"` @@ -63,6 +64,14 @@ func (b *TelegramConfigApplyConfiguration) WithBotToken(value v1.SecretKeySelect return b } +// WithBotTokenFile sets the BotTokenFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BotTokenFile field is set to the value of the last call. +func (b *TelegramConfigApplyConfiguration) WithBotTokenFile(value string) *TelegramConfigApplyConfiguration { + b.BotTokenFile = &value + return b +} + // WithChatID sets the ChatID field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the ChatID field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/webexconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/webexconfig.go new file mode 100644 index 000000000..85689a14e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1/webexconfig.go @@ -0,0 +1,77 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" +) + +// WebexConfigApplyConfiguration represents an declarative configuration of the WebexConfig type for use +// with apply. +type WebexConfigApplyConfiguration struct { + SendResolved *bool `json:"sendResolved,omitempty"` + APIURL *v1alpha1.URL `json:"apiURL,omitempty"` + HTTPConfig *HTTPConfigApplyConfiguration `json:"httpConfig,omitempty"` + Message *string `json:"message,omitempty"` + RoomID *string `json:"roomID,omitempty"` +} + +// WebexConfigApplyConfiguration constructs an declarative configuration of the WebexConfig type for use with +// apply. +func WebexConfig() *WebexConfigApplyConfiguration { + return &WebexConfigApplyConfiguration{} +} + +// WithSendResolved sets the SendResolved field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SendResolved field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithSendResolved(value bool) *WebexConfigApplyConfiguration { + b.SendResolved = &value + return b +} + +// WithAPIURL sets the APIURL field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIURL field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithAPIURL(value v1alpha1.URL) *WebexConfigApplyConfiguration { + b.APIURL = &value + return b +} + +// WithHTTPConfig sets the HTTPConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTPConfig field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithHTTPConfig(value *HTTPConfigApplyConfiguration) *WebexConfigApplyConfiguration { + b.HTTPConfig = value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithMessage(value string) *WebexConfigApplyConfiguration { + b.Message = &value + return b +} + +// WithRoomID sets the RoomID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoomID field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithRoomID(value string) *WebexConfigApplyConfiguration { + b.RoomID = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/msteamsconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/msteamsconfig.go new file mode 100644 index 000000000..fe88de200 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/msteamsconfig.go @@ -0,0 +1,77 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// MSTeamsConfigApplyConfiguration represents an declarative configuration of the MSTeamsConfig type for use +// with apply. +type MSTeamsConfigApplyConfiguration struct { + SendResolved *bool `json:"sendResolved,omitempty"` + WebhookURL *v1.SecretKeySelector `json:"webhookUrl,omitempty"` + Title *string `json:"title,omitempty"` + Text *string `json:"text,omitempty"` + HTTPConfig *HTTPConfigApplyConfiguration `json:"httpConfig,omitempty"` +} + +// MSTeamsConfigApplyConfiguration constructs an declarative configuration of the MSTeamsConfig type for use with +// apply. +func MSTeamsConfig() *MSTeamsConfigApplyConfiguration { + return &MSTeamsConfigApplyConfiguration{} +} + +// WithSendResolved sets the SendResolved field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SendResolved field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithSendResolved(value bool) *MSTeamsConfigApplyConfiguration { + b.SendResolved = &value + return b +} + +// WithWebhookURL sets the WebhookURL field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the WebhookURL field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithWebhookURL(value v1.SecretKeySelector) *MSTeamsConfigApplyConfiguration { + b.WebhookURL = &value + return b +} + +// WithTitle sets the Title field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Title field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithTitle(value string) *MSTeamsConfigApplyConfiguration { + b.Title = &value + return b +} + +// WithText sets the Text field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Text field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithText(value string) *MSTeamsConfigApplyConfiguration { + b.Text = &value + return b +} + +// WithHTTPConfig sets the HTTPConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTPConfig field is set to the value of the last call. +func (b *MSTeamsConfigApplyConfiguration) WithHTTPConfig(value *HTTPConfigApplyConfiguration) *MSTeamsConfigApplyConfiguration { + b.HTTPConfig = value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/pushoverconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/pushoverconfig.go index 603e44c8f..a2ec444c4 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/pushoverconfig.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/pushoverconfig.go @@ -21,7 +21,9 @@ package v1beta1 type PushoverConfigApplyConfiguration struct { SendResolved *bool `json:"sendResolved,omitempty"` UserKey *SecretKeySelectorApplyConfiguration `json:"userKey,omitempty"` + UserKeyFile *string `json:"userKeyFile,omitempty"` Token *SecretKeySelectorApplyConfiguration `json:"token,omitempty"` + TokenFile *string `json:"tokenFile,omitempty"` Title *string `json:"title,omitempty"` Message *string `json:"message,omitempty"` URL *string `json:"url,omitempty"` @@ -56,6 +58,14 @@ func (b *PushoverConfigApplyConfiguration) WithUserKey(value *SecretKeySelectorA return b } +// WithUserKeyFile sets the UserKeyFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UserKeyFile field is set to the value of the last call. +func (b *PushoverConfigApplyConfiguration) WithUserKeyFile(value string) *PushoverConfigApplyConfiguration { + b.UserKeyFile = &value + return b +} + // WithToken sets the Token field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Token field is set to the value of the last call. @@ -64,6 +74,14 @@ func (b *PushoverConfigApplyConfiguration) WithToken(value *SecretKeySelectorApp return b } +// WithTokenFile sets the TokenFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TokenFile field is set to the value of the last call. +func (b *PushoverConfigApplyConfiguration) WithTokenFile(value string) *PushoverConfigApplyConfiguration { + b.TokenFile = &value + return b +} + // WithTitle sets the Title field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the Title field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/receiver.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/receiver.go index e0912469a..b952896a8 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/receiver.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/receiver.go @@ -31,6 +31,8 @@ type ReceiverApplyConfiguration struct { PushoverConfigs []PushoverConfigApplyConfiguration `json:"pushoverConfigs,omitempty"` SNSConfigs []SNSConfigApplyConfiguration `json:"snsConfigs,omitempty"` TelegramConfigs []TelegramConfigApplyConfiguration `json:"telegramConfigs,omitempty"` + WebexConfigs []WebexConfigApplyConfiguration `json:"webexConfigs,omitempty"` + MSTeamsConfigs []MSTeamsConfigApplyConfiguration `json:"msteamsConfigs,omitempty"` } // ReceiverApplyConfiguration constructs an declarative configuration of the Receiver type for use with @@ -189,3 +191,29 @@ func (b *ReceiverApplyConfiguration) WithTelegramConfigs(values ...*TelegramConf } return b } + +// WithWebexConfigs adds the given value to the WebexConfigs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the WebexConfigs field. +func (b *ReceiverApplyConfiguration) WithWebexConfigs(values ...*WebexConfigApplyConfiguration) *ReceiverApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithWebexConfigs") + } + b.WebexConfigs = append(b.WebexConfigs, *values[i]) + } + return b +} + +// WithMSTeamsConfigs adds the given value to the MSTeamsConfigs field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the MSTeamsConfigs field. +func (b *ReceiverApplyConfiguration) WithMSTeamsConfigs(values ...*MSTeamsConfigApplyConfiguration) *ReceiverApplyConfiguration { + for i := range values { + if values[i] == nil { + panic("nil value passed to WithMSTeamsConfigs") + } + b.MSTeamsConfigs = append(b.MSTeamsConfigs, *values[i]) + } + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/telegramconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/telegramconfig.go index 84c647d44..7cbf3237c 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/telegramconfig.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/telegramconfig.go @@ -22,6 +22,7 @@ type TelegramConfigApplyConfiguration struct { SendResolved *bool `json:"sendResolved,omitempty"` APIURL *string `json:"apiURL,omitempty"` BotToken *SecretKeySelectorApplyConfiguration `json:"botToken,omitempty"` + BotTokenFile *string `json:"botTokenFile,omitempty"` ChatID *int64 `json:"chatID,omitempty"` Message *string `json:"message,omitempty"` DisableNotifications *bool `json:"disableNotifications,omitempty"` @@ -59,6 +60,14 @@ func (b *TelegramConfigApplyConfiguration) WithBotToken(value *SecretKeySelector return b } +// WithBotTokenFile sets the BotTokenFile field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the BotTokenFile field is set to the value of the last call. +func (b *TelegramConfigApplyConfiguration) WithBotTokenFile(value string) *TelegramConfigApplyConfiguration { + b.BotTokenFile = &value + return b +} + // WithChatID sets the ChatID field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. // If called multiple times, the ChatID field is set to the value of the last call. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/webexconfig.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/webexconfig.go new file mode 100644 index 000000000..05c020419 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1beta1/webexconfig.go @@ -0,0 +1,77 @@ +// Copyright The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1beta1" +) + +// WebexConfigApplyConfiguration represents an declarative configuration of the WebexConfig type for use +// with apply. +type WebexConfigApplyConfiguration struct { + SendResolved *bool `json:"sendResolved,omitempty"` + APIURL *v1beta1.URL `json:"apiURL,omitempty"` + HTTPConfig *HTTPConfigApplyConfiguration `json:"httpConfig,omitempty"` + Message *string `json:"message,omitempty"` + RoomID *string `json:"roomID,omitempty"` +} + +// WebexConfigApplyConfiguration constructs an declarative configuration of the WebexConfig type for use with +// apply. +func WebexConfig() *WebexConfigApplyConfiguration { + return &WebexConfigApplyConfiguration{} +} + +// WithSendResolved sets the SendResolved field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the SendResolved field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithSendResolved(value bool) *WebexConfigApplyConfiguration { + b.SendResolved = &value + return b +} + +// WithAPIURL sets the APIURL field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIURL field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithAPIURL(value v1beta1.URL) *WebexConfigApplyConfiguration { + b.APIURL = &value + return b +} + +// WithHTTPConfig sets the HTTPConfig field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the HTTPConfig field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithHTTPConfig(value *HTTPConfigApplyConfiguration) *WebexConfigApplyConfiguration { + b.HTTPConfig = value + return b +} + +// WithMessage sets the Message field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Message field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithMessage(value string) *WebexConfigApplyConfiguration { + b.Message = &value + return b +} + +// WithRoomID sets the RoomID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the RoomID field is set to the value of the last call. +func (b *WebexConfigApplyConfiguration) WithRoomID(value string) *WebexConfigApplyConfiguration { + b.RoomID = &value + return b +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/utils.go b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/utils.go index 4b3b3b3b7..26091e38a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/utils.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/applyconfiguration/utils.go @@ -59,6 +59,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &monitoringv1.AttachMetadataApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("Authorization"): return &monitoringv1.AuthorizationApplyConfiguration{} + case v1.SchemeGroupVersion.WithKind("AzureAD"): + return &monitoringv1.AzureADApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("BasicAuth"): return &monitoringv1.BasicAuthApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("CommonPrometheusFields"): @@ -81,6 +83,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &monitoringv1.HostPortApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("HTTPConfig"): return &monitoringv1.HTTPConfigApplyConfiguration{} + case v1.SchemeGroupVersion.WithKind("ManagedIdentity"): + return &monitoringv1.ManagedIdentityApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("MetadataConfig"): return &monitoringv1.MetadataConfigApplyConfiguration{} case v1.SchemeGroupVersion.WithKind("NamespaceSelector"): @@ -193,6 +197,12 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &monitoringv1alpha1.DayOfMonthRangeApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("DiscordConfig"): return &monitoringv1alpha1.DiscordConfigApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("DNSSDConfig"): + return &monitoringv1alpha1.DNSSDConfigApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("EC2Filter"): + return &monitoringv1alpha1.EC2FilterApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("EC2SDConfig"): + return &monitoringv1alpha1.EC2SDConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("EmailConfig"): return &monitoringv1alpha1.EmailConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("FileSDConfig"): @@ -203,12 +213,16 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &monitoringv1alpha1.HTTPSDConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("InhibitRule"): return &monitoringv1alpha1.InhibitRuleApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("K8SSelectorConfig"): + return &monitoringv1alpha1.K8SSelectorConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("KeyValue"): return &monitoringv1alpha1.KeyValueApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("KubernetesSDConfig"): return &monitoringv1alpha1.KubernetesSDConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("Matcher"): return &monitoringv1alpha1.MatcherApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("MSTeamsConfig"): + return &monitoringv1alpha1.MSTeamsConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("MuteTimeInterval"): return &monitoringv1alpha1.MuteTimeIntervalApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("OpsGenieConfig"): @@ -255,6 +269,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &monitoringv1alpha1.TimeRangeApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("VictorOpsConfig"): return &monitoringv1alpha1.VictorOpsConfigApplyConfiguration{} + case v1alpha1.SchemeGroupVersion.WithKind("WebexConfig"): + return &monitoringv1alpha1.WebexConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("WebhookConfig"): return &monitoringv1alpha1.WebhookConfigApplyConfiguration{} case v1alpha1.SchemeGroupVersion.WithKind("WeChatConfig"): @@ -279,6 +295,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &monitoringv1beta1.KeyValueApplyConfiguration{} case v1beta1.SchemeGroupVersion.WithKind("Matcher"): return &monitoringv1beta1.MatcherApplyConfiguration{} + case v1beta1.SchemeGroupVersion.WithKind("MSTeamsConfig"): + return &monitoringv1beta1.MSTeamsConfigApplyConfiguration{} case v1beta1.SchemeGroupVersion.WithKind("OpsGenieConfig"): return &monitoringv1beta1.OpsGenieConfigApplyConfiguration{} case v1beta1.SchemeGroupVersion.WithKind("OpsGenieConfigResponder"): @@ -317,6 +335,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &monitoringv1beta1.TimeRangeApplyConfiguration{} case v1beta1.SchemeGroupVersion.WithKind("VictorOpsConfig"): return &monitoringv1beta1.VictorOpsConfigApplyConfiguration{} + case v1beta1.SchemeGroupVersion.WithKind("WebexConfig"): + return &monitoringv1beta1.WebexConfigApplyConfiguration{} case v1beta1.SchemeGroupVersion.WithKind("WebhookConfig"): return &monitoringv1beta1.WebhookConfigApplyConfiguration{} case v1beta1.SchemeGroupVersion.WithKind("WeChatConfig"): diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.mod b/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.mod index bbaa6d5aa..ab3c528f7 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.mod +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.mod @@ -3,28 +3,28 @@ module github.com/prometheus-operator/prometheus-operator/pkg/client go 1.19 require ( - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.67.1 - k8s.io/api v0.27.2 - k8s.io/apiextensions-apiserver v0.27.2 - k8s.io/apimachinery v0.27.2 - k8s.io/client-go v0.27.2 - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1 + k8s.io/api v0.28.3 + k8s.io/apiextensions-apiserver v0.28.3 + k8s.io/apimachinery v0.28.3 + k8s.io/client-go v0.28.3 + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/go-logr/logr v1.2.4 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.6.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -32,21 +32,21 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect - golang.org/x/text v0.10.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect - sigs.k8s.io/controller-runtime v0.15.0 // indirect + k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/controller-runtime v0.16.3 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.sum b/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.sum index 2e3e98d61..394157b51 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.sum +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/client/go.sum @@ -1,37 +1,17 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= @@ -40,31 +20,12 @@ github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -72,19 +33,16 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -98,169 +56,113 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= -github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo= -k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= -k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo= -k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ= -k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg= -k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v0.27.2 h1:vDLSeuYvCHKeoQRhCXjxXO45nHVv2Ip4Fe0MfioMrhE= -k8s.io/client-go v0.27.2/go.mod h1:tY0gVmUsHrAmjzHX9zs7eCjxcBsf8IiNe7KQ52biTcQ= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= -k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU= -sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk= +k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f h1:eeEUOoGYWhOz7EyXqhlR2zHKNw2mNJ9vzJmub6YN6kk= +k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= +sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/informers/informers.go b/otelcollector/otel-allocator/prometheus-operator/pkg/informers/informers.go index cfac9cc4f..736834782 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/informers/informers.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/informers/informers.go @@ -15,9 +15,9 @@ package informers import ( + "fmt" "sort" - "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -64,7 +64,7 @@ func NewInformersForResource(ifs FactoriesForNamespaces, resource schema.GroupVe for _, ns := range namespaces { informer, err := ifs.ForResource(ns, resource) if err != nil { - return nil, errors.Wrapf(err, "error getting informer in namespace %q for resource %v", ns, resource) + return nil, fmt.Errorf("error getting informer in namespace %q for resource %v: %w", ns, resource, err) } informers = append(informers, informer) } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/k8sutil.go b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/k8sutil.go index 165014b3d..14b903900 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/k8sutil.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/k8sutil.go @@ -16,6 +16,7 @@ package k8sutil import ( "context" + "errors" "fmt" "net/http" "net/url" @@ -24,7 +25,6 @@ import ( "strings" "github.com/cespare/xxhash/v2" - "github.com/pkg/errors" promversion "github.com/prometheus/common/version" appsv1 "k8s.io/api/apps/v1" authv1 "k8s.io/api/authorization/v1" @@ -33,10 +33,11 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/client-go/discovery" - "k8s.io/client-go/kubernetes" clientappsv1 "k8s.io/client-go/kubernetes/typed/apps/v1" + clientauthv1 "k8s.io/client-go/kubernetes/typed/authorization/v1" clientv1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" @@ -54,31 +55,12 @@ var invalidDNS1123Characters = regexp.MustCompile("[^-a-z0-9]+") var scheme = runtime.NewScheme() -var ErrPrerequiresitesFailed = errors.New("unmet prerequisites") - func init() { _ = monitoringv1.SchemeBuilder.AddToScheme(scheme) _ = monitoringv1alpha1.SchemeBuilder.AddToScheme(scheme) _ = monitoringv1beta1.SchemeBuilder.AddToScheme(scheme) } -type CRDChecker struct { - kclient kubernetes.Interface -} - -func NewCRDChecker(host string, tlsInsecure bool, tlsConfig *rest.TLSClientConfig) (*CRDChecker, error) { - cfg, err := NewClusterConfig(host, tlsInsecure, tlsConfig) - if err != nil { - return nil, errors.Wrap(err, "instantiating cluster config failed") - } - - kclient, err := kubernetes.NewForConfig(cfg) - if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") - } - return &CRDChecker{kclient: kclient}, nil -} - // PodRunningAndReady returns whether a pod is running and each container has // passed it's ready state. func PodRunningAndReady(pod v1.Pod) (bool, error) { @@ -97,7 +79,7 @@ func PodRunningAndReady(pod v1.Pod) (bool, error) { return false, nil } -func NewClusterConfig(host string, tlsInsecure bool, tlsConfig *rest.TLSClientConfig) (*rest.Config, error) { +func NewClusterConfig(host string, tlsInsecure bool, tlsConfig *rest.TLSClientConfig, asUser string) (*rest.Config, error) { var cfg *rest.Config var err error @@ -132,73 +114,96 @@ func NewClusterConfig(host string, tlsInsecure bool, tlsConfig *rest.TLSClientCo cfg.Burst = 100 cfg.UserAgent = fmt.Sprintf("PrometheusOperator/%s", promversion.Version) + cfg.Impersonate.UserName = asUser return cfg, nil } -// CheckPrerequisites checks if given resource's CRD is installed in the cluster and the operator -// serviceaccount has the necessary RBAC verbs in the namespace list to reconcile it. -func (cc CRDChecker) CheckPrerequisites(ctx context.Context, nsAllowList []string, verbs map[string][]string, sgv, resource string) error { - if err := cc.validateCRDInstallation(sgv, resource); err != nil { - return err - } - - missingPermissions, err := cc.getMissingPermissions(ctx, nsAllowList, verbs) - if err != nil { - return err - } - if len(missingPermissions) > 0 { - return fmt.Errorf("%w: some permissions are missing: %v", ErrPrerequiresitesFailed, missingPermissions) - } - - return nil +// ResourceAttribute represents authorization attributes to check on a given resource. +type ResourceAttribute struct { + Resource string + Name string + Group string + Version string + Verbs []string } -func (cc CRDChecker) validateCRDInstallation(sgv, resource string) error { - crdInstalled, err := IsAPIGroupVersionResourceSupported(cc.kclient.Discovery(), sgv, resource) - if err != nil { - return fmt.Errorf("failed to check if the API supports %s resource (apiGroup: %q): %w", resource, sgv, err) +// IsAllowed returns whether the user (e.g. the operator's service account) has +// been granted the required RBAC attributes. +// It returns true when the conditions are met for the namespaces (an empty +// namespace value means "all"). +// The second return value returns the list of permissions that are missing if +// the requirements aren't met. +func IsAllowed( + ctx context.Context, + ssarClient clientauthv1.SelfSubjectAccessReviewInterface, + namespaces []string, + attributes ...ResourceAttribute, +) (bool, []error, error) { + if len(attributes) == 0 { + return false, nil, fmt.Errorf("resource attributes must not be empty") } - if !crdInstalled { - return fmt.Errorf("%w: %s resource (apiGroup: %q) not installed", ErrPrerequiresitesFailed, resource, sgv) + + if len(namespaces) == 0 { + namespaces = []string{v1.NamespaceAll} } - return nil -} -// getMissingPermissions returns the RBAC permissions that the controller would need to be -// granted to fulfill its mission. An empty map means that everything is ok. -func (cc CRDChecker) getMissingPermissions(ctx context.Context, nsAllowList []string, verbs map[string][]string) (map[string][]string, error) { - var ssar *authv1.SelfSubjectAccessReview - var ssarResponse *authv1.SelfSubjectAccessReview - var err error - missingPermissions := map[string][]string{} + var missingPermissions []error + for _, ns := range namespaces { + for _, ra := range attributes { + for _, verb := range ra.Verbs { + resourceAttributes := authv1.ResourceAttributes{ + Verb: verb, + Group: ra.Group, + Version: ra.Version, + Resource: ra.Resource, + // An empty name value means "all" resources. + Name: ra.Name, + // An empty namespace value means "all" for namespace-scoped resources. + Namespace: ns, + } - for _, ns := range nsAllowList { - for resource, verbs := range verbs { - for _, verb := range verbs { - ssar = &authv1.SelfSubjectAccessReview{ + // Special case for SAR on namespaces resources: Namespace and + // Name need to be equal. + if resourceAttributes.Group == "" && resourceAttributes.Resource == "namespaces" && resourceAttributes.Name != "" && resourceAttributes.Namespace == "" { + resourceAttributes.Namespace = resourceAttributes.Name + } + + ssar := &authv1.SelfSubjectAccessReview{ Spec: authv1.SelfSubjectAccessReviewSpec{ - ResourceAttributes: &authv1.ResourceAttributes{ - Verb: verb, - Group: monitoringv1alpha1.SchemeGroupVersion.Group, - Resource: resource, - // If ns is empty string, it will check cluster-wide - Namespace: ns, - }, + ResourceAttributes: &resourceAttributes, }, } - ssarResponse, err = cc.kclient.AuthorizationV1().SelfSubjectAccessReviews().Create(ctx, ssar, metav1.CreateOptions{}) + + // FIXME(simonpasquier): retry in case of server-side errors. + ssarResponse, err := ssarClient.Create(ctx, ssar, metav1.CreateOptions{}) if err != nil { - return nil, err + return false, nil, err } + if !ssarResponse.Status.Allowed { - missingPermissions[resource] = append(missingPermissions[resource], verb) + var ( + reason error + resource = ra.Resource + ) + if ra.Name != "" { + resource += "/" + ra.Name + } + + switch { + case ns == v1.NamespaceAll: + reason = fmt.Errorf("missing %q permission on resource %q (group: %q) for all namespaces", verb, resource, ra.Group) + default: + reason = fmt.Errorf("missing %q permission on resource %q (group: %q) for namespace %q", verb, resource, ra.Group, ns) + } + + missingPermissions = append(missingPermissions, reason) } } } } - return missingPermissions, nil + return len(missingPermissions) == 0, missingPermissions, nil } func IsResourceNotFoundError(err error) bool { @@ -206,9 +211,11 @@ func IsResourceNotFoundError(err error) bool { if !ok { return false } + if se.Status().Code == http.StatusNotFound && se.Status().Reason == metav1.StatusReasonNotFound { return true } + return false } @@ -302,14 +309,13 @@ func CreateOrUpdateSecret(ctx context.Context, secretClient clientv1.SecretInter } // IsAPIGroupVersionResourceSupported checks if given groupVersion and resource is supported by the cluster. -// -// you can exec `kubectl api-resources` to find groupVersion and resource. -func IsAPIGroupVersionResourceSupported(discoveryCli discovery.DiscoveryInterface, groupversion string, resource string) (bool, error) { - apiResourceList, err := discoveryCli.ServerResourcesForGroupVersion(groupversion) +func IsAPIGroupVersionResourceSupported(discoveryCli discovery.DiscoveryInterface, groupVersion schema.GroupVersion, resource string) (bool, error) { + apiResourceList, err := discoveryCli.ServerResourcesForGroupVersion(groupVersion.String()) if err != nil { if IsResourceNotFoundError(err) { return false, nil } + return false, err } @@ -318,6 +324,7 @@ func IsAPIGroupVersionResourceSupported(discoveryCli discovery.DiscoveryInterfac return true, nil } } + return false, nil } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/labels.go b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/labels.go index b177cb6db..259899fd6 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/labels.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/labels.go @@ -15,9 +15,9 @@ package k8sutil import ( + "fmt" "reflect" - "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" ) @@ -32,7 +32,7 @@ func LabelSelectionHasChanged(old, current map[string]string, selector *metav1.L sel, err := metav1.LabelSelectorAsSelector(selector) if err != nil { - return false, errors.Wrapf(err, "failed to convert selector %q", selector.String()) + return false, fmt.Errorf("failed to convert selector %q: %w", selector.String(), err) } // The selector doesn't restrict the selection thus old and current labels always match. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/merge.go b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/merge.go index 7eb6a3e1f..676a631df 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/merge.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/merge.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/strategicpatch" ) @@ -44,23 +43,23 @@ func MergePatchContainers(base, patches []v1.Container) ([]v1.Container, error) containerBytes, err := json.Marshal(container) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("failed to marshal JSON for container %s", container.Name)) + return nil, fmt.Errorf("failed to marshal JSON for container %s: %w", container.Name, err) } patchBytes, err := json.Marshal(patchContainer) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("failed to marshal JSON for patch container %s", container.Name)) + return nil, fmt.Errorf("failed to marshal JSON for patch container %s: %w", container.Name, err) } // Calculate the patch result. jsonResult, err := strategicpatch.StrategicMergePatch(containerBytes, patchBytes, v1.Container{}) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("failed to generate merge patch for container %s", container.Name)) + return nil, fmt.Errorf("failed to generate merge patch for container %s: %w", container.Name, err) } var patchResult v1.Container if err := json.Unmarshal(jsonResult, &patchResult); err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("failed to unmarshal merged container %s", container.Name)) + return nil, fmt.Errorf("failed to unmarshal merged container %s: %w", container.Name, err) } // Add the patch result and remove the corresponding key from the to do list. diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets.go b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets.go new file mode 100644 index 000000000..2a8e2bc1c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets.go @@ -0,0 +1,62 @@ +// Copyright 2023 The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package k8sutil + +import ( + "context" + "fmt" + + "github.com/go-kit/log" + "github.com/go-kit/log/level" + v1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + clientv1 "k8s.io/client-go/kubernetes/typed/core/v1" + "k8s.io/utils/ptr" +) + +// LoadSecretRef returns the data from a secret key reference. +// If the reference is set as optional and the secret or key isn't found, the +// function returns no error. +func LoadSecretRef(ctx context.Context, logger log.Logger, client clientv1.SecretInterface, sks *v1.SecretKeySelector) ([]byte, error) { + if sks == nil { + return nil, nil + } + + // Unless explicitly defined, references aren't optional. + optional := ptr.Deref(sks.Optional, false) + + secret, err := client.Get(ctx, sks.Name, metav1.GetOptions{}) + if err != nil { + if apierrors.IsNotFound(err) && optional { + level.Debug(logger).Log("msg", fmt.Sprintf("secret %v could not be found", sks.Name)) + return nil, nil + } + + return nil, err + } + + b, found := secret.Data[sks.Key] + if !found { + if optional { + level.Debug(logger).Log("msg", fmt.Sprintf("secret %v could not be found", sks.Name)) + return nil, nil + } + + return nil, fmt.Errorf("key %v could not be found in secret %v", sks.Key, sks.Name) + } + + return b, nil +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets_test.go new file mode 100644 index 000000000..13e34095d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/k8sutil/secrets_test.go @@ -0,0 +1,117 @@ +// Copyright 2023 The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package k8sutil + +import ( + "context" + "testing" + + "github.com/go-kit/log" + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/fake" + "k8s.io/utils/ptr" +) + +func TestLoadSecretRef(t *testing.T) { + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "secret", + Namespace: "ns", + }, + Data: map[string][]byte{ + "key1": []byte("val1"), + }, + } + + sClient := fake.NewSimpleClientset(secret).CoreV1().Secrets("ns") + logger := log.NewNopLogger() + + for _, tc := range []struct { + name string + ref *v1.SecretKeySelector + expected []byte + err bool + }{ + { + name: "nil ref", + }, + { + name: "valid ref", + ref: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key1", + }, + expected: []byte("val1"), + }, + { + name: "missing secret", + ref: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret2", + }, + Key: "key1", + }, + err: true, + }, + { + name: "missing key", + ref: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key2", + }, + err: true, + }, + { + name: "missing optional secret", + ref: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret2", + }, + Key: "key1", + Optional: ptr.To(true), + }, + expected: nil, + }, + { + name: "missing optional key", + ref: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key2", + Optional: ptr.To(true), + }, + expected: nil, + }, + } { + t.Run(tc.name, func(t *testing.T) { + b, err := LoadSecretRef(context.Background(), logger, sClient, tc.ref) + if tc.err { + require.Error(t, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.expected, b) + }) + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch.go b/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch.go index eb2411268..3ebb3f19a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch.go @@ -16,22 +16,35 @@ package listwatch import ( "context" + "crypto/rand" + "fmt" + "math/big" + "sort" "strings" + "time" + "github.com/blang/semver/v4" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/version" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/kubernetes/scheme" + authv1 "k8s.io/client-go/kubernetes/typed/authorization/v1" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/cache" + + "github.com/prometheus-operator/prometheus-operator/pkg/k8sutil" +) + +const ( + pollInterval = 15 * time.Second ) -// NewUnprivilegedNamespaceListWatchFromClient mimics +// NewNamespaceListWatchFromClient mimics // cache.NewListWatchFromClient. It allows for the creation of a // cache.ListWatch for namespaces from a client that does not have `List` // privileges. If the slice of namespaces contains only v1.NamespaceAll, then @@ -45,64 +58,119 @@ import ( // // If the allowed namespaces includes exactly one entry with the value v1.NamespaceAll (empty string), // the given denied namespaces are applied. -func NewUnprivilegedNamespaceListWatchFromClient( +func NewNamespaceListWatchFromClient( ctx context.Context, l log.Logger, - c cache.Getter, + k8sVersion version.Info, + corev1Client corev1.CoreV1Interface, + ssarClient authv1.SelfSubjectAccessReviewInterface, allowedNamespaces, deniedNamespaces map[string]struct{}, - fieldSelector fields.Selector, -) cache.ListerWatcher { +) (cache.ListerWatcher, bool, error) { if l == nil { l = log.NewNopLogger() } - optionsModifier := func(options *metav1.ListOptions) { - options.FieldSelector = fieldSelector.String() + listWatchAllowed, reasons, err := k8sutil.IsAllowed( + ctx, + ssarClient, + nil, // namespaces is a cluster-scoped resource. + k8sutil.ResourceAttribute{ + Resource: "namespaces", + Verbs: []string{"list", "watch"}, + }, + ) + if err != nil { + return nil, false, err + } + + // The "kubernetes.io/metadata.name" label is GA since Kubernetes 1.22. + var metadataNameLabelSupported bool + v, err := semver.ParseTolerant(k8sVersion.String()) + if err != nil { + level.Warn(l).Log("msg", "failed to parse Kubernetes version", "version", k8sVersion.String(), "err", err) + } else { + metadataNameLabelSupported = v.GTE(semver.MustParse("1.22.0")) } - // If the only namespace given is `v1.NamespaceAll`, then this - // cache.ListWatch must be privileged. In this case, return a regular - // cache.ListWatch tweaked with denylist fieldselector - // filtering the given denied namespaces. if IsAllNamespaces(allowedNamespaces) { - tweak := func(options *metav1.ListOptions) { - optionsModifier(options) + if !listWatchAllowed { + err := fmt.Errorf("missing list/watch permissions on the 'namespaces' resource") + for _, r := range reasons { + err = fmt.Errorf("%w: %w", err, r) + } + return nil, false, err + } + + // deniedNamespaces is only supported with allowedNamespaces = "all". + tweak := func(options *metav1.ListOptions) { DenyTweak(options, "metadata.name", deniedNamespaces) } + if metadataNameLabelSupported { + // Using a label selector is more efficient but requires Kubernetes 1.22 at least. + tweak = func(options *metav1.ListOptions) { + TweakByLabel(options, "kubernetes.io/metadata.name", ExcludeFilterType, deniedNamespaces) + } + } - return cache.NewFilteredListWatchFromClient(c, "namespaces", metav1.NamespaceAll, tweak) + return cache.NewFilteredListWatchFromClient( + corev1Client.RESTClient(), + "namespaces", + metav1.NamespaceAll, + tweak, + ), true, nil } - listFunc := func(options metav1.ListOptions) (runtime.Object, error) { - optionsModifier(&options) - list := &v1.NamespaceList{} - for name := range allowedNamespaces { - result := &v1.Namespace{} - err := c.Get(). - Resource("namespaces"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(ctx). - Into(result) - if apierrors.IsNotFound(err) { - level.Info(l).Log("msg", "namespace not found", "namespace", name) - continue - } - if err != nil { - return nil, errors.Wrap(err, "unexpected error while listing namespaces") - } - list.Items = append(list.Items, *result) + if listWatchAllowed && metadataNameLabelSupported { + level.Debug(l).Log("msg", "using privileged namespace lister/watcher") + return cache.NewFilteredListWatchFromClient( + corev1Client.RESTClient(), + "namespaces", + metav1.NamespaceAll, + func(options *metav1.ListOptions) { + TweakByLabel(options, "kubernetes.io/metadata.name", IncludeFilterType, allowedNamespaces) + }, + ), true, nil + } + + // At this point, the operator has no list/watch permissions on the + // namespaces resource. Check if it has at least the get permission to + // emulate the list/watch operations. + attrs := make([]k8sutil.ResourceAttribute, 0, len(allowedNamespaces)) + for n := range allowedNamespaces { + attrs = append(attrs, k8sutil.ResourceAttribute{ + Verbs: []string{"get"}, + Resource: "namespaces", + Name: n, + }) + } + + getAllowed, reasons, err := k8sutil.IsAllowed( + ctx, + ssarClient, + nil, // namespaces is a cluster-scoped resource. + attrs..., + ) + if err != nil { + return nil, false, err + } + + // Only log a warning to preserve backward compatibility. + if !getAllowed { + err := fmt.Errorf("missing permissions") + for _, r := range reasons { + err = fmt.Errorf("%w: %w", err, r) } - return list, nil + + level.Warn(l).Log("msg", "the operator lacks required permissions which may result in degraded functionalities", "err", err) } - watchFunc := func(_ metav1.ListOptions) (watch.Interface, error) { - // Since the client does not have Watch privileges, do not - // actually watch anything. Use a watch.FakeWatcher here to - // implement watch.Interface but not send any events. - return watch.NewFake(), nil + + var namespaces []string + for ns := range allowedNamespaces { + namespaces = append(namespaces, ns) } - return &cache.ListWatch{ListFunc: listFunc, WatchFunc: watchFunc} + + return newPollBasedListerWatcher(ctx, l, corev1Client, namespaces), false, nil } // IsAllNamespaces checks if the given map of namespaces @@ -127,18 +195,56 @@ func IdenticalNamespaces(a, b map[string]struct{}) bool { return true } -// DenyTweak modifies the given list options -// by adding a field selector not matching the given values. +type FilterType string + +const ( + IncludeFilterType = "Include" + ExcludeFilterType = "Exclude" +) + +// TweakByLabel modifies the given list options by adding a label selector +// matching/excluding the given values. +func TweakByLabel(options *metav1.ListOptions, label string, filter FilterType, valueSet map[string]struct{}) { + if len(valueSet) == 0 { + return + } + + var labels []string + for value := range valueSet { + labels = append(labels, value) + } + sort.Strings(labels) + + var op string + switch filter { + case IncludeFilterType: + op = "in" + case ExcludeFilterType: + op = "notin" + default: + panic(fmt.Sprintf("unsupported filter: %q", filter)) + } + selectors := []string{fmt.Sprintf("%s %s (%s)", label, op, strings.Join(labels, ","))} + + if options.LabelSelector != "" { + selectors = append(selectors, options.LabelSelector) + } + + options.LabelSelector = strings.Join(selectors, ",") +} + +// DenyTweak modifies the given list options by adding a field selector *not* +// matching the given values. func DenyTweak(options *metav1.ListOptions, field string, valueSet map[string]struct{}) { if len(valueSet) == 0 { return } var selectors []string - for value := range valueSet { selectors = append(selectors, field+"!="+value) } + sort.Strings(selectors) if options.FieldSelector != "" { selectors = append(selectors, options.FieldSelector) @@ -146,3 +252,151 @@ func DenyTweak(options *metav1.ListOptions, field string, valueSet map[string]st options.FieldSelector = strings.Join(selectors, ",") } + +type pollBasedListerWatcher struct { + corev1Client corev1.CoreV1Interface + ch chan watch.Event + + ctx context.Context + l log.Logger + + cache map[string]cacheEntry +} + +type cacheEntry struct { + present bool + ns *v1.Namespace +} + +var _ = watch.Interface(&pollBasedListerWatcher{}) +var _ = cache.ListerWatcher(&pollBasedListerWatcher{}) + +func newPollBasedListerWatcher(ctx context.Context, l log.Logger, corev1Client corev1.CoreV1Interface, namespaces []string) *pollBasedListerWatcher { + if l == nil { + l = log.NewNopLogger() + } + + pblw := &pollBasedListerWatcher{ + corev1Client: corev1Client, + ch: make(chan watch.Event, 1), + ctx: ctx, + l: l, + cache: make(map[string]cacheEntry, len(namespaces)), + } + + for _, ns := range namespaces { + pblw.cache[ns] = cacheEntry{} + } + + return pblw +} + +func (pblw *pollBasedListerWatcher) List(_ metav1.ListOptions) (runtime.Object, error) { + list := &v1.NamespaceList{} + + for ns := range pblw.cache { + result, err := pblw.corev1Client.Namespaces().Get(pblw.ctx, ns, metav1.GetOptions{}) + if err != nil { + if apierrors.IsNotFound(err) { + level.Info(pblw.l).Log("msg", "namespace not found", "namespace", ns) + continue + } + + return nil, fmt.Errorf("unexpected error while listing namespaces: %w", err) + } + + pblw.cache[ns] = cacheEntry{ + present: true, + ns: result, + } + list.Items = append(list.Items, *result) + } + + return list, nil +} + +func (pblw *pollBasedListerWatcher) Watch(_ metav1.ListOptions) (watch.Interface, error) { + return pblw, nil +} + +func (pblw *pollBasedListerWatcher) Stop() {} + +func (pblw *pollBasedListerWatcher) ResultChan() <-chan watch.Event { + go func() { + jitter, err := rand.Int(rand.Reader, big.NewInt(int64(pollInterval))) + if err == nil { + time.Sleep(time.Duration(jitter.Int64())) + } else { + level.Info(pblw.l).Log("msg", "failed to generate random jitter", "err", err) + } + + _ = wait.PollUntilContextCancel(pblw.ctx, pollInterval, false, pblw.poll) + }() + + return pblw.ch +} + +func (pblw *pollBasedListerWatcher) poll(ctx context.Context) (bool, error) { + var ( + updated []*v1.Namespace + deleted []string + ) + + for ns, entry := range pblw.cache { + result, err := pblw.corev1Client.Namespaces().Get(ctx, ns, metav1.GetOptions{ResourceVersion: entry.ns.ResourceVersion}) + if err != nil { + switch { + case apierrors.IsNotFound(err): + if entry.present { + deleted = append(deleted, ns) + } + default: + level.Warn(pblw.l).Log("msg", "watch error", "err", err, "namespace", ns) + } + continue + } + + if entry.ns.ResourceVersion != result.ResourceVersion { + updated = append(updated, result) + } + } + + for _, ns := range deleted { + entry := pblw.cache[ns] + + pblw.ch <- watch.Event{ + Type: watch.Deleted, + Object: entry.ns, + } + + pblw.cache[ns] = cacheEntry{ + present: false, + } + } + + for _, ns := range updated { + var ( + eventType = watch.Modified + entry = pblw.cache[ns.Name] + ) + + switch { + case !entry.present: + eventType = watch.Added + case ns.ResourceVersion == entry.ns.ResourceVersion: + continue + } + + pblw.ch <- watch.Event{ + Type: eventType, + Object: ns, + } + + pblw.cache[ns.Name] = cacheEntry{ + ns: ns, + present: true, + } + } + + return false, nil +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch_test.go index 490ab4dcb..0143ce16b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/listwatch/listwatch_test.go @@ -16,6 +16,9 @@ package listwatch import ( "testing" + + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func TestIdenticalNamespaces(t *testing.T) { @@ -51,3 +54,142 @@ func TestIdenticalNamespaces(t *testing.T) { }) } } + +func TestDenyTweak(t *testing.T) { + for _, tc := range []struct { + options metav1.ListOptions + field string + valueSet map[string]struct{} + + exp string + }{ + { + field: "metadata.name", + valueSet: map[string]struct{}{}, + exp: "", + }, + { + options: metav1.ListOptions{ + FieldSelector: "metadata.namespace=foo", + }, + field: "metadata.name", + valueSet: map[string]struct{}{}, + exp: "metadata.namespace=foo", + }, + { + field: "metadata.name", + valueSet: map[string]struct{}{ + "foo": {}, + "bar": {}, + }, + exp: "metadata.name!=bar,metadata.name!=foo", + }, + { + options: metav1.ListOptions{ + FieldSelector: "metadata.namespace=foo", + }, + field: "metadata.name", + valueSet: map[string]struct{}{ + "foo": {}, + "bar": {}, + }, + exp: "metadata.name!=bar,metadata.name!=foo,metadata.namespace=foo", + }, + } { + t.Run("", func(t *testing.T) { + options := tc.options + DenyTweak(&options, tc.field, tc.valueSet) + require.Equal(t, tc.exp, options.FieldSelector) + }) + } +} + +func TestOnlyTweak(t *testing.T) { + for _, tc := range []struct { + options metav1.ListOptions + label string + filter FilterType + valueSet map[string]struct{} + + exp string + }{ + { + label: "kubernetes.io/metadata.name", + filter: IncludeFilterType, + valueSet: map[string]struct{}{}, + exp: "", + }, + { + options: metav1.ListOptions{ + LabelSelector: "foo=bar", + }, + label: "kubernetes.io/metadata.name", + filter: IncludeFilterType, + valueSet: map[string]struct{}{}, + exp: "foo=bar", + }, + { + label: "kubernetes.io/metadata.name", + filter: IncludeFilterType, + valueSet: map[string]struct{}{ + "foo": {}, + "bar": {}, + }, + exp: "kubernetes.io/metadata.name in (bar,foo)", + }, + { + options: metav1.ListOptions{ + LabelSelector: "foo=bar", + }, + label: "kubernetes.io/metadata.name", + filter: IncludeFilterType, + valueSet: map[string]struct{}{ + "foo": {}, + "bar": {}, + }, + exp: "kubernetes.io/metadata.name in (bar,foo),foo=bar", + }, + { + label: "kubernetes.io/metadata.name", + filter: ExcludeFilterType, + valueSet: map[string]struct{}{}, + exp: "", + }, + { + options: metav1.ListOptions{ + LabelSelector: "foo=bar", + }, + label: "kubernetes.io/metadata.name", + filter: ExcludeFilterType, + valueSet: map[string]struct{}{}, + exp: "foo=bar", + }, + { + label: "kubernetes.io/metadata.name", + filter: ExcludeFilterType, + valueSet: map[string]struct{}{ + "foo": {}, + "bar": {}, + }, + exp: "kubernetes.io/metadata.name notin (bar,foo)", + }, + { + options: metav1.ListOptions{ + LabelSelector: "foo=bar", + }, + label: "kubernetes.io/metadata.name", + filter: ExcludeFilterType, + valueSet: map[string]struct{}{ + "foo": {}, + "bar": {}, + }, + exp: "kubernetes.io/metadata.name notin (bar,foo),foo=bar", + }, + } { + t.Run("", func(t *testing.T) { + options := tc.options + TweakByLabel(&options, tc.label, tc.filter, tc.valueSet) + require.Equal(t, tc.exp, options.LabelSelector) + }) + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/namespacelabeler/labeler.go b/otelcollector/otel-allocator/prometheus-operator/pkg/namespacelabeler/labeler.go index 4eae10bbf..c1fb38211 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/namespacelabeler/labeler.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/namespacelabeler/labeler.go @@ -15,7 +15,8 @@ package namespacelabeler import ( - "github.com/pkg/errors" + "fmt" + "github.com/prometheus-community/prom-label-proxy/injectproxy" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/promql/parser" @@ -115,7 +116,7 @@ func (l *Labeler) EnforceNamespaceLabel(rule *monitoringv1.PrometheusRule) error expr := r.Expr.String() parsedExpr, err := parser.ParseExpr(expr) if err != nil { - return errors.Wrap(err, "failed to parse promql expression") + return fmt.Errorf("failed to parse promql expression: %w", err) } enforcer := injectproxy.NewEnforcer(false, &labels.Matcher{ Name: l.enforcedNsLabel, @@ -124,7 +125,7 @@ func (l *Labeler) EnforceNamespaceLabel(rule *monitoringv1.PrometheusRule) error }) err = enforcer.EnforceNode(parsedExpr) if err != nil { - return errors.Wrap(err, "failed to inject labels to expression") + return fmt.Errorf("failed to inject labels to expression: %w", err) } rule.Spec.Groups[gi].Rules[ri].Expr = intstr.FromString(parsedExpr.String()) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config.go index d0cd85a8b..5113de164 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config.go @@ -20,6 +20,9 @@ import ( "strings" "golang.org/x/exp/maps" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/rest" "github.com/prometheus-operator/prometheus-operator/pkg/server" @@ -27,13 +30,17 @@ import ( // Config defines configuration parameters for the Operator. type Config struct { - Host string + // Kubernetes client configuration. + Host string + TLSInsecure bool + TLSConfig rest.TLSClientConfig + ImpersonateUser string + KubernetesVersion version.Info + ClusterDomain string KubeletObject string KubeletSelector string ListenAddress string - TLSInsecure bool - TLSConfig rest.TLSClientConfig ServerTLSConfig server.TLSServerConfig ReloaderConfig ContainerConfig AlertmanagerDefaultBaseImage string @@ -51,20 +58,80 @@ type Config struct { SecretListWatchSelector string } +func DefaultConfig(cpu, memory string) Config { + return Config{ + ReloaderConfig: ContainerConfig{ + CPURequests: Quantity{q: resource.MustParse(cpu)}, + CPULimits: Quantity{q: resource.MustParse(cpu)}, + MemoryRequests: Quantity{q: resource.MustParse(memory)}, + MemoryLimits: Quantity{q: resource.MustParse(memory)}, + }, + } +} + // ContainerConfig holds some configuration for the ConfigReloader sidecar // that can be set through prometheus-operator command line arguments type ContainerConfig struct { - CPURequest string - CPULimit string - MemoryRequest string - MemoryLimit string - Image string - EnableProbes bool + // The struct tag are needed for github.com/mitchellh/hashstructure to take + // the field values into account when generating the statefulset hash. + CPURequests Quantity `hash:"string"` + CPULimits Quantity `hash:"string"` + MemoryRequests Quantity `hash:"string"` + MemoryLimits Quantity `hash:"string"` + Image string + EnableProbes bool +} + +func (cc ContainerConfig) ResourceRequirements() v1.ResourceRequirements { + resources := v1.ResourceRequirements{ + Limits: v1.ResourceList{}, + Requests: v1.ResourceList{}, + } + + if cc.CPURequests.String() != "0" { + resources.Requests[v1.ResourceCPU] = cc.CPURequests.q + } + if cc.CPULimits.String() != "0" { + resources.Limits[v1.ResourceCPU] = cc.CPULimits.q + } + if cc.MemoryRequests.String() != "0" { + resources.Requests[v1.ResourceMemory] = cc.MemoryRequests.q + } + if cc.MemoryLimits.String() != "0" { + resources.Limits[v1.ResourceMemory] = cc.MemoryLimits.q + } + + return resources +} + +type Quantity struct { + q resource.Quantity +} + +var _ = fmt.Stringer(Quantity{}) + +// String implements the flag.Value and fmt.Stringer interfaces. +func (q Quantity) String() string { + return q.q.String() +} + +// Set implements the flag.Value interface. +func (q *Quantity) Set(value string) error { + if value == "" { + return nil + } + + quantity, err := resource.ParseQuantity(value) + if err == nil { + q.q = quantity + } + + return err } type Map map[string]string -// Implement the flag.Value interface +// String implements the flag.Value interface func (m *Map) String() string { if m == nil { return "" @@ -98,7 +165,7 @@ func (m *Map) Merge(other map[string]string) map[string]string { return merged } -// Set implements the flag.Set interface. +// Set implements the flag.Value interface. func (m *Map) Set(value string) error { if value == "" { return nil diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader.go index d8c92cb54..8f7874256 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader.go @@ -21,7 +21,6 @@ import ( "strconv" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/util/intstr" ) @@ -42,6 +41,7 @@ const ( type ConfigReloader struct { name string config ContainerConfig + webConfigFile string configFile string configEnvsubstFile string imagePullPolicy v1.PullPolicy @@ -72,6 +72,13 @@ func WatchedDirectories(watchedDirectories []string) ReloaderOption { } } +// WebConfigFile sets the webConfigFile option for the config-reloader container +func WebConfigFile(config string) ReloaderOption { + return func(c *ConfigReloader) { + c.webConfigFile = config + } +} + // ConfigFile sets the configFile option for the config-reloader container func ConfigFile(configFile string) ReloaderOption { return func(c *ConfigReloader) { @@ -121,7 +128,7 @@ func LogFormat(logFormat string) ReloaderOption { } } -// LogLevel sets the logLevel option for the config-reloader container\ +// LogLevel sets the logLevel option for the config-reloader container func LogLevel(logLevel string) ReloaderOption { return func(c *ConfigReloader) { c.logLevel = logLevel @@ -189,6 +196,10 @@ func CreateConfigReloader(name string, options ...ReloaderOption) v1.Container { ) } + if len(configReloader.webConfigFile) > 0 { + args = append(args, fmt.Sprintf("--web-config-file=%s", configReloader.webConfigFile)) + } + if len(configReloader.reloadURL.String()) > 0 { args = append(args, fmt.Sprintf("--reload-url=%s", configReloader.reloadURL.String())) } @@ -215,24 +226,6 @@ func CreateConfigReloader(name string, options ...ReloaderOption) v1.Container { args = append(args, fmt.Sprintf("--log-format=%s", configReloader.logFormat)) } - resources := v1.ResourceRequirements{ - Limits: v1.ResourceList{}, - Requests: v1.ResourceList{}, - } - - if configReloader.config.CPURequest != "0" { - resources.Requests[v1.ResourceCPU] = resource.MustParse(configReloader.config.CPURequest) - } - if configReloader.config.CPULimit != "0" { - resources.Limits[v1.ResourceCPU] = resource.MustParse(configReloader.config.CPULimit) - } - if configReloader.config.MemoryRequest != "0" { - resources.Requests[v1.ResourceMemory] = resource.MustParse(configReloader.config.MemoryRequest) - } - if configReloader.config.MemoryLimit != "0" { - resources.Limits[v1.ResourceMemory] = resource.MustParse(configReloader.config.MemoryLimit) - } - if configReloader.shard != nil { envVars = append(envVars, v1.EnvVar{ Name: ShardEnvVar, @@ -252,7 +245,7 @@ func CreateConfigReloader(name string, options ...ReloaderOption) v1.Container { Args: args, Ports: ports, VolumeMounts: configReloader.volumeMounts, - Resources: resources, + Resources: configReloader.config.ResourceRequirements(), SecurityContext: &v1.SecurityContext{ AllowPrivilegeEscalation: &boolFalse, ReadOnlyRootFilesystem: &boolTrue, diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test.go index b49058c74..583a5afe1 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test.go @@ -21,14 +21,15 @@ import ( "testing" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" ) var reloaderConfig = ContainerConfig{ - CPURequest: "100m", - CPULimit: "100m", - MemoryRequest: "50Mi", - MemoryLimit: "50Mi", - Image: "quay.io/prometheus-operator/prometheus-config-reloader:latest", + CPURequests: Quantity{q: resource.MustParse("100m")}, + CPULimits: Quantity{q: resource.MustParse("100m")}, + MemoryRequests: Quantity{q: resource.MustParse("50Mi")}, + MemoryLimits: Quantity{q: resource.MustParse("50Mi")}, + Image: "quay.io/prometheus-operator/prometheus-config-reloader:latest", } func TestCreateConfigReloaderEnableProbes(t *testing.T) { @@ -121,6 +122,7 @@ func TestCreateConfigReloader(t *testing.T) { logFormat := "logFormat" logLevel := "logLevel" configFile := "configFile" + webConfigFile := "webConfigFile" configEnvsubstFile := "configEnvsubstFile" watchedDirectories := []string{"directory1", "directory2"} shard := int32(1) @@ -140,6 +142,7 @@ func TestCreateConfigReloader(t *testing.T) { ConfigFile(configFile), ConfigEnvsubstFile(configEnvsubstFile), WatchedDirectories(watchedDirectories), + WebConfigFile(webConfigFile), Shard(shard), ImagePullPolicy(expectedImagePullPolicy), ) @@ -164,6 +167,9 @@ func TestCreateConfigReloader(t *testing.T) { if !contains(container.Args, "--config-envsubst-file=configEnvsubstFile") { t.Errorf("Expected '--config-envsubst-file=%s' not found in %s", configEnvsubstFile, container.Args) } + if !contains(container.Args, "--web-config-file=webConfigFile") { + t.Errorf("Expected '--web-config-file=%s' not found in %s", webConfigFile, container.Args) + } for _, dir := range watchedDirectories { if !contains(container.Args, fmt.Sprintf("--watched-dir=%s", dir)) { t.Errorf("Expected '--watched-dir=%s' not found in %s", dir, container.Args) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test_lib.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test_lib.go index 88ec0ece3..2aa2e3dd2 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test_lib.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/config_reloader_test_lib.go @@ -27,11 +27,11 @@ import ( var ( DefaultReloaderTestConfig = &Config{ ReloaderConfig: ContainerConfig{ - CPURequest: "100m", - CPULimit: "100m", - MemoryRequest: "50Mi", - MemoryLimit: "50Mi", - Image: "quay.io/prometheus-operator/prometheus-config-reloader:latest", + CPURequests: Quantity{q: resource.MustParse("100m")}, + CPULimits: Quantity{q: resource.MustParse("100m")}, + MemoryRequests: Quantity{q: resource.MustParse("50Mi")}, + MemoryLimits: Quantity{q: resource.MustParse("50Mi")}, + Image: "quay.io/prometheus-operator/prometheus-config-reloader:latest", }, } ) @@ -45,11 +45,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_resources", reloaderConfig: ContainerConfig{ - CPURequest: "0", - CPULimit: "0", - MemoryRequest: "0", - MemoryLimit: "0", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("0")}, + CPULimits: Quantity{q: resource.MustParse("0")}, + MemoryRequests: Quantity{q: resource.MustParse("0")}, + MemoryLimits: Quantity{q: resource.MustParse("0")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{}, @@ -59,11 +59,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_requests", reloaderConfig: ContainerConfig{ - CPURequest: "0", - CPULimit: "100m", - MemoryRequest: "0", - MemoryLimit: "50Mi", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("0")}, + CPULimits: Quantity{q: resource.MustParse("100m")}, + MemoryRequests: Quantity{q: resource.MustParse("0")}, + MemoryLimits: Quantity{q: resource.MustParse("50Mi")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{ @@ -76,11 +76,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_limits", reloaderConfig: ContainerConfig{ - CPURequest: "100m", - CPULimit: "0", - MemoryRequest: "50Mi", - MemoryLimit: "0", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("100m")}, + CPULimits: Quantity{q: resource.MustParse("0")}, + MemoryRequests: Quantity{q: resource.MustParse("50Mi")}, + MemoryLimits: Quantity{q: resource.MustParse("0")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{}, @@ -93,11 +93,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_CPU_resources", reloaderConfig: ContainerConfig{ - CPURequest: "0", - CPULimit: "0", - MemoryRequest: "50Mi", - MemoryLimit: "50Mi", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("0")}, + CPULimits: Quantity{q: resource.MustParse("0")}, + MemoryRequests: Quantity{q: resource.MustParse("50Mi")}, + MemoryLimits: Quantity{q: resource.MustParse("50Mi")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{ @@ -111,11 +111,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_CPU_requests", reloaderConfig: ContainerConfig{ - CPURequest: "0", - CPULimit: "100m", - MemoryRequest: "50Mi", - MemoryLimit: "50Mi", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("0")}, + CPULimits: Quantity{q: resource.MustParse("100m")}, + MemoryRequests: Quantity{q: resource.MustParse("50Mi")}, + MemoryLimits: Quantity{q: resource.MustParse("50Mi")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{ @@ -130,11 +130,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_CPU_limits", reloaderConfig: ContainerConfig{ - CPURequest: "100m", - CPULimit: "0", - MemoryRequest: "50Mi", - MemoryLimit: "50Mi", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("100m")}, + CPULimits: Quantity{q: resource.MustParse("0")}, + MemoryRequests: Quantity{q: resource.MustParse("50Mi")}, + MemoryLimits: Quantity{q: resource.MustParse("50Mi")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{ @@ -149,11 +149,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_memory_resources", reloaderConfig: ContainerConfig{ - CPURequest: "100m", - CPULimit: "100m", - MemoryRequest: "0", - MemoryLimit: "0", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("100m")}, + CPULimits: Quantity{q: resource.MustParse("100m")}, + MemoryRequests: Quantity{q: resource.MustParse("0")}, + MemoryLimits: Quantity{q: resource.MustParse("0")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{ @@ -167,11 +167,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_memory_requests", reloaderConfig: ContainerConfig{ - CPURequest: "100m", - CPULimit: "100m", - MemoryRequest: "0", - MemoryLimit: "50Mi", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("100m")}, + CPULimits: Quantity{q: resource.MustParse("100m")}, + MemoryRequests: Quantity{q: resource.MustParse("0")}, + MemoryLimits: Quantity{q: resource.MustParse("50Mi")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{ @@ -186,11 +186,11 @@ func TestSidecarsResources(t *testing.T, makeStatefulSet func(reloaderConfig Con { name: "no_memory_limits", reloaderConfig: ContainerConfig{ - CPURequest: "100m", - CPULimit: "100m", - MemoryRequest: "50Mi", - MemoryLimit: "0", - Image: DefaultReloaderTestConfig.ReloaderConfig.Image, + CPURequests: Quantity{q: resource.MustParse("100m")}, + CPULimits: Quantity{q: resource.MustParse("100m")}, + MemoryRequests: Quantity{q: resource.MustParse("50Mi")}, + MemoryLimits: Quantity{q: resource.MustParse("0")}, + Image: DefaultReloaderTestConfig.ReloaderConfig.Image, }, expectedResources: v1.ResourceRequirements{ Limits: v1.ResourceList{ diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/defaults.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/defaults.go index 970e81d00..0d0b552b3 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/defaults.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/defaults.go @@ -18,14 +18,14 @@ import "github.com/prometheus/common/version" const ( // DefaultAlertmanagerVersion is a default image tag for the prometheus alertmanager - DefaultAlertmanagerVersion = "v0.25.0" + DefaultAlertmanagerVersion = "v0.26.0" // DefaultAlertmanagerBaseImage is a base container registry address for the prometheus alertmanager DefaultAlertmanagerBaseImage = "quay.io/prometheus/alertmanager" // DefaultAlertmanagerImage is a default image pulling address for the prometheus alertmanager DefaultAlertmanagerImage = DefaultAlertmanagerBaseImage + ":" + DefaultAlertmanagerVersion // DefaultThanosVersion is a default image tag for the Thanos long-term prometheus storage collector - DefaultThanosVersion = "v0.31.0" + DefaultThanosVersion = "v0.32.4" // DefaultThanosBaseImage is a base container registry address for the Thanos long-term prometheus // storage collector DefaultThanosBaseImage = "quay.io/thanos/thanos" @@ -76,5 +76,9 @@ var ( "v2.43.1", "v2.44.0", "v2.45.0", + "v2.46.0", + "v2.47.0", + "v2.47.1", + "v2.47.2", } ) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/image.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/image.go index 07d05fe63..a7ccaedb7 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/image.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/image.go @@ -18,7 +18,7 @@ import ( "fmt" "strings" - dockerref "github.com/docker/distribution/reference" + ref "github.com/distribution/reference" ) // BuildImagePath builds a container image path based on @@ -31,12 +31,12 @@ func BuildImagePath(specImage, baseImage, version, tag, sha string) (string, err if strings.TrimSpace(specImage) != "" { return specImage, nil } - named, err := dockerref.ParseNormalizedNamed(baseImage) + named, err := ref.ParseNormalizedNamed(baseImage) if err != nil { return "", fmt.Errorf("couldn't parse image reference %q: %v", baseImage, err) } - _, isTagged := named.(dockerref.Tagged) - _, isDigested := named.(dockerref.Digested) + _, isTagged := named.(ref.Tagged) + _, isDigested := named.(ref.Digested) if isTagged || isDigested { return baseImage, nil } @@ -44,7 +44,7 @@ func BuildImagePath(specImage, baseImage, version, tag, sha string) (string, err if sha != "" { return fmt.Sprintf("%s@sha256:%s", baseImage, sha), nil } else if tag != "" { - imageTag, err := dockerref.WithTag(named, tag) + imageTag, err := ref.WithTag(named, tag) if err != nil { return "", err } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/operator.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/operator.go index 481571878..490d14ae1 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/operator.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/operator.go @@ -32,6 +32,8 @@ import ( monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" ) +const PrometheusOperatorFieldManager = "PrometheusOperator" + var ( syncsDesc = prometheus.NewDesc( "prometheus_operator_syncs", diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/resource_reconciler.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/resource_reconciler.go index 90ec48cc8..91237d53f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/resource_reconciler.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/resource_reconciler.go @@ -23,7 +23,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "golang.org/x/sync/errgroup" appsv1 "k8s.io/api/apps/v1" @@ -301,7 +300,7 @@ func (rr *ResourceReconciler) onStatefulSetAdd(ss *appsv1.StatefulSet) { } func (rr *ResourceReconciler) onStatefulSetUpdate(old, cur *appsv1.StatefulSet) { - level.Debug(rr.logger).Log("msg", "update handler", "old", old.ResourceVersion, "cur", cur.ResourceVersion) + level.Debug(rr.logger).Log("msg", "update handler", "resource", "statefulset", "old", old.ResourceVersion, "cur", cur.ResourceVersion) if rr.DeletionInProgress(cur) { return @@ -403,7 +402,7 @@ func (rr *ResourceReconciler) processNextReconcileItem(ctx context.Context) bool } rr.reconcileErrors.Inc() - utilruntime.HandleError(errors.Wrap(err, fmt.Sprintf("sync %q failed", key))) + utilruntime.HandleError(fmt.Errorf("sync %q failed: %w", key, err)) rr.reconcileQ.AddRateLimited(key) return true @@ -424,7 +423,7 @@ func (rr *ResourceReconciler) processNextStatusItem(ctx context.Context) bool { return true } - utilruntime.HandleError(errors.Wrap(err, fmt.Sprintf("status %q failed", key))) + utilruntime.HandleError(fmt.Errorf("status %q failed: %w", key, err)) rr.statusQ.AddRateLimited(key) return true @@ -438,7 +437,7 @@ func ListMatchingNamespaces(selector labels.Selector, nsInf cache.SharedIndexInf ns = append(ns, obj.(*v1.Namespace).Name) }) if err != nil { - return nil, errors.Wrap(err, "failed to list namespaces") + return nil, fmt.Errorf("failed to list namespaces: %w", err) } return ns, nil } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/rules.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/rules.go index 7b0746c2f..af77810d7 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/rules.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/rules.go @@ -15,13 +15,13 @@ package operator import ( + "errors" "fmt" "strings" "github.com/blang/semver/v4" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/prometheus/model/rulefmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -52,12 +52,12 @@ type PrometheusRuleSelector struct { func NewPrometheusRuleSelector(ruleFormat RuleConfigurationFormat, version string, labelSelector *metav1.LabelSelector, nsLabeler *namespacelabeler.Labeler, ruleInformer *informers.ForResource, logger log.Logger) (*PrometheusRuleSelector, error) { componentVersion, err := semver.ParseTolerant(version) if err != nil { - return nil, errors.Wrap(err, "failed to parse version") + return nil, fmt.Errorf("failed to parse version: %w", err) } ruleSelector, err := metav1.LabelSelectorAsSelector(labelSelector) if err != nil { - return nil, errors.Wrap(err, "convert rule label selector to selector") + return nil, fmt.Errorf("convert rule label selector to selector: %w", err) } return &PrometheusRuleSelector{ @@ -78,7 +78,7 @@ func (prs *PrometheusRuleSelector) generateRulesConfiguration(promRule *monitori content, err := yaml.Marshal(promRuleSpec) if err != nil { - return "", errors.Wrap(err, "failed to marshal content") + return "", fmt.Errorf("failed to marshal content: %w", err) } errs := ValidateRule(promRuleSpec) @@ -158,7 +158,7 @@ func ValidateRule(promRuleSpec monitoringv1.PrometheusRuleSpec) []error { content, err := yaml.Marshal(promRuleSpec) if err != nil { - return []error{errors.Wrap(err, "failed to marshal content")} + return []error{fmt.Errorf("failed to marshal content: %w", err)} } _, errs := rulefmt.Parse(content) return errs @@ -180,7 +180,7 @@ func (prs *PrometheusRuleSelector) Select(namespaces []string) (map[string]strin promRules[fmt.Sprintf("%v-%v-%v.yaml", promRule.Namespace, promRule.Name, promRule.UID)] = promRule }) if err != nil { - return nil, 0, errors.Wrapf(err, "failed to list prometheus rules in namespace %s", ns) + return nil, 0, fmt.Errorf("failed to list prometheus rules in namespace %s: %w", ns, err) } } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/sharded_secret.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/sharded_secret.go index eb3d3c3e8..8de165ee2 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/sharded_secret.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/sharded_secret.go @@ -19,7 +19,6 @@ import ( "fmt" "sort" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -70,7 +69,7 @@ func (s *ShardedSecret) StoreSecrets(ctx context.Context, sClient corev1.SecretI for _, secret := range secrets { err := k8sutil.CreateOrUpdateSecret(ctx, sClient, secret) if err != nil { - return errors.Wrapf(err, "failed to create secret shard %q", secret.Name) + return fmt.Errorf("failed to create secret shard %q: %w", secret.Name, err) } } return s.cleanupExcessSecretShards(ctx, sClient, len(secrets)-1, s.namePrefix) @@ -130,7 +129,7 @@ func (s *ShardedSecret) cleanupExcessSecretShards(ctx context.Context, sClient c break } if err != nil { - return errors.Wrapf(err, "failed to delete excess secret shard %q", secretName) + return fmt.Errorf("failed to delete excess secret shard %q: %w", secretName, err) } } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/statefulset_reporter.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/statefulset_reporter.go index cf2ce8a30..19db7b83b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/statefulset_reporter.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/statefulset_reporter.go @@ -24,6 +24,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + "k8s.io/utils/ptr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" ) @@ -130,11 +131,16 @@ func (sr *StatefulSetReporter) Update(gObj GoverningObject) monitoringv1.Conditi gObj.SetAvailableReplicas(ready) gObj.SetUnavailableReplicas(len(sr.Pods) - ready) - if ready < gObj.ExpectedReplicas() { - if available == 0 { + switch { + case sr.sset == nil: + condition.Reason = "StatefulSetNotFound" + condition.Status = monitoringv1.ConditionFalse + case ready < gObj.ExpectedReplicas(): + switch { + case available == 0: condition.Reason = "NoPodReady" condition.Status = monitoringv1.ConditionFalse - } else { + default: condition.Reason = "SomePodsNotReady" condition.Status = monitoringv1.ConditionDegraded } @@ -154,6 +160,14 @@ func (sr *StatefulSetReporter) Update(gObj GoverningObject) monitoringv1.Conditi // NewStatefulSetReporter returns a statefulset's reporter. func NewStatefulSetReporter(ctx context.Context, kclient kubernetes.Interface, sset *appsv1.StatefulSet) (*StatefulSetReporter, error) { + if sset == nil { + // sset is nil when the controller couldn't create the statefulset + // (incompatible spec fields for instance). + return &StatefulSetReporter{ + Pods: []*Pod{}, + }, nil + } + ls, err := metav1.LabelSelectorAsSelector(sset.Spec.Selector) if err != nil { // Something is really broken if the statefulset's selector isn't valid. @@ -182,7 +196,7 @@ func NewStatefulSetReporter(ctx context.Context, kclient kubernetes.Interface, s continue } - stsReporter.Pods = append(stsReporter.Pods, (func(p Pod) *Pod { return &p })(Pod(p))) + stsReporter.Pods = append(stsReporter.Pods, ptr.To(Pod(p))) } return stsReporter, nil diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/operator/storageclass.go b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/storageclass.go new file mode 100644 index 000000000..a2e18e126 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/operator/storageclass.go @@ -0,0 +1,48 @@ +// Copyright 2023 The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package operator + +import ( + "context" + "fmt" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" +) + +func CheckStorageClass(ctx context.Context, canReadStorageClass bool, kclient kubernetes.Interface, storage *monitoringv1.StorageSpec) error { + // Check the existence of the storage class if not empty and if the operator has enough permissions. + if !canReadStorageClass || storage == nil { + return nil + } + + storageClassName := StringPtrValOrDefault(storage.VolumeClaimTemplate.Spec.StorageClassName, "") + if storageClassName == "" { + return nil + } + + _, err := kclient.StorageV1().StorageClasses().Get(ctx, storageClassName, metav1.GetOptions{}) + if err != nil { + if apierrors.IsNotFound(err) { + return fmt.Errorf("storage class %q does not exist", storageClassName) + } + return fmt.Errorf("cannot get %q storageclass: %w", storageClassName, err) + } + + return nil +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/operator.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/operator.go index a3e3fbf1c..a10c958c5 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/operator.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/operator.go @@ -23,7 +23,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/mitchellh/hashstructure" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" @@ -31,9 +30,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/metadata" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" - "k8s.io/utils/pointer" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" @@ -55,7 +56,9 @@ const ( // monitoring configurations. type Operator struct { kclient kubernetes.Interface + mdClient metadata.Interface mclient monitoringclient.Interface + logger log.Logger accessor *operator.Accessor @@ -79,34 +82,35 @@ type Operator struct { config operator.Config endpointSliceSupported bool scrapeConfigSupported bool + canReadStorageClass bool statusReporter prompkg.StatusReporter } // New creates a new controller. -func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometheus.Registerer, scrapeConfigSupported bool) (*Operator, error) { - cfg, err := k8sutil.NewClusterConfig(conf.Host, conf.TLSInsecure, &conf.TLSConfig) +func New(ctx context.Context, restConfig *rest.Config, conf operator.Config, logger log.Logger, r prometheus.Registerer, scrapeConfigSupported bool, canReadStorageClass bool) (*Operator, error) { + client, err := kubernetes.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating cluster config failed") + return nil, fmt.Errorf("instantiating kubernetes client failed: %w", err) } - client, err := kubernetes.NewForConfig(cfg) + mdClient, err := metadata.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") + return nil, fmt.Errorf("instantiating metadata client failed: %w", err) } - mclient, err := monitoringclient.NewForConfig(cfg) + mclient, err := monitoringclient.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating monitoring client failed") + return nil, fmt.Errorf("instantiating monitoring client failed: %w", err) } if _, err := labels.Parse(conf.PromSelector); err != nil { - return nil, errors.Wrap(err, "can not parse prometheus-agent selector value") + return nil, fmt.Errorf("can not parse prometheus-agent selector value: %w", err) } secretListWatchSelector, err := fields.ParseSelector(conf.SecretListWatchSelector) if err != nil { - return nil, errors.Wrap(err, "can not parse secrets selector value") + return nil, fmt.Errorf("can not parse secrets selector value: %w", err) } // All the metrics exposed by the controller get the controller="prometheus-agent" label. @@ -114,12 +118,14 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh c := &Operator{ kclient: client, + mdClient: mdClient, mclient: mclient, logger: logger, config: conf, metrics: operator.NewMetrics(r), reconciliations: &operator.ReconciliationTracker{}, scrapeConfigSupported: scrapeConfigSupported, + canReadStorageClass: canReadStorageClass, } c.metrics.MustRegister( c.reconciliations, @@ -146,7 +152,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1alpha1.SchemeGroupVersion.WithResource(monitoringv1alpha1.PrometheusAgentName), ) if err != nil { - return nil, errors.Wrap(err, "error creating prometheus-agent informers") + return nil, fmt.Errorf("error creating prometheus-agent informers: %w", err) } var promStores []cache.Store @@ -167,7 +173,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.ServiceMonitorName), ) if err != nil { - return nil, errors.Wrap(err, "error creating servicemonitor informers") + return nil, fmt.Errorf("error creating servicemonitor informers: %w", err) } c.pmonInfs, err = informers.NewInformersForResource( @@ -181,7 +187,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.PodMonitorName), ) if err != nil { - return nil, errors.Wrap(err, "error creating podmonitor informers") + return nil, fmt.Errorf("error creating podmonitor informers: %w", err) } c.probeInfs, err = informers.NewInformersForResource( @@ -195,7 +201,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.ProbeName), ) if err != nil { - return nil, errors.Wrap(err, "error creating probe informers") + return nil, fmt.Errorf("error creating probe informers: %w", err) } if c.scrapeConfigSupported { @@ -210,15 +216,15 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1alpha1.SchemeGroupVersion.WithResource(monitoringv1alpha1.ScrapeConfigName), ) if err != nil { - return nil, errors.Wrap(err, "error creating scrapeconfig informers") + return nil, fmt.Errorf("error creating scrapeconfig informers: %w", err) } } c.cmapInfs, err = informers.NewInformersForResource( - informers.NewKubeInformerFactories( + informers.NewMetadataInformerFactory( c.config.Namespaces.PrometheusAllowList, c.config.Namespaces.DenyList, - c.kclient, + c.mdClient, resyncPeriod, func(options *metav1.ListOptions) { options.LabelSelector = prompkg.LabelPrometheusName @@ -227,14 +233,14 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh v1.SchemeGroupVersion.WithResource(string(v1.ResourceConfigMaps)), ) if err != nil { - return nil, errors.Wrap(err, "error creating configmap informers") + return nil, fmt.Errorf("error creating configmap informers: %w", err) } c.secrInfs, err = informers.NewInformersForResource( - informers.NewKubeInformerFactories( + informers.NewMetadataInformerFactory( c.config.Namespaces.PrometheusAllowList, c.config.Namespaces.DenyList, - c.kclient, + c.mdClient, resyncPeriod, func(options *metav1.ListOptions) { options.FieldSelector = secretListWatchSelector.String() @@ -243,7 +249,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh v1.SchemeGroupVersion.WithResource(string(v1.ResourceSecrets)), ) if err != nil { - return nil, errors.Wrap(err, "error creating secrets informers") + return nil, fmt.Errorf("error creating secrets informers: %w", err) } c.ssetInfs, err = informers.NewInformersForResource( @@ -257,38 +263,45 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh appsv1.SchemeGroupVersion.WithResource("statefulsets"), ) if err != nil { - return nil, errors.Wrap(err, "error creating statefulset informers") - } - - newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) cache.SharedIndexInformer { - // nsResyncPeriod is used to control how often the namespace informer - // should resync. If the unprivileged ListerWatcher is used, then the - // informer must resync more often because it cannot watch for - // namespace changes. - nsResyncPeriod := 15 * time.Second - // If the only namespace is v1.NamespaceAll, then the client must be - // privileged and a regular cache.ListWatch will be used. In this case - // watching works and we do not need to resync so frequently. - if listwatch.IsAllNamespaces(allowList) { - nsResyncPeriod = resyncPeriod - } - nsInf := cache.NewSharedIndexInformer( - o.metrics.NewInstrumentedListerWatcher( - listwatch.NewUnprivilegedNamespaceListWatchFromClient(ctx, o.logger, o.kclient.CoreV1().RESTClient(), allowList, o.config.Namespaces.DenyList, fields.Everything()), - ), - &v1.Namespace{}, nsResyncPeriod, cache.Indexers{}, + return nil, fmt.Errorf("error creating statefulset informers: %w", err) + } + + newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) (cache.SharedIndexInformer, error) { + lw, privileged, err := listwatch.NewNamespaceListWatchFromClient( + ctx, + o.logger, + o.config.KubernetesVersion, + o.kclient.CoreV1(), + o.kclient.AuthorizationV1().SelfSubjectAccessReviews(), + allowList, + o.config.Namespaces.DenyList, ) + if err != nil { + return nil, err + } - return nsInf + level.Debug(c.logger).Log("msg", "creating namespace informer", "privileged", privileged) + return cache.NewSharedIndexInformer( + o.metrics.NewInstrumentedListerWatcher(lw), + &v1.Namespace{}, resyncPeriod, cache.Indexers{}, + ), nil } - c.nsMonInf = newNamespaceInformer(c, c.config.Namespaces.AllowList) + + c.nsMonInf, err = newNamespaceInformer(c, c.config.Namespaces.AllowList) + if err != nil { + return nil, err + } + if listwatch.IdenticalNamespaces(c.config.Namespaces.AllowList, c.config.Namespaces.PrometheusAllowList) { c.nsPromInf = c.nsMonInf } else { - c.nsPromInf = newNamespaceInformer(c, c.config.Namespaces.PrometheusAllowList) + c.nsPromInf, err = newNamespaceInformer(c, c.config.Namespaces.PrometheusAllowList) + if err != nil { + return nil, err + } } - endpointSliceSupported, err := k8sutil.IsAPIGroupVersionResourceSupported(c.kclient.Discovery(), "discovery.k8s.io/v1", "endpointslices") + endpointSliceSupported, err := k8sutil.IsAPIGroupVersionResourceSupported(c.kclient.Discovery(), schema.GroupVersion{Group: "discovery.k8s.io", Version: "v1"}, "endpointslices") if err != nil { level.Warn(c.logger).Log("msg", "failed to check if the API supports the endpointslice resources", "err ", err) } @@ -310,27 +323,6 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh // Run the controller. func (c *Operator) Run(ctx context.Context) error { - errChan := make(chan error) - go func() { - v, err := c.kclient.Discovery().ServerVersion() - if err != nil { - errChan <- errors.Wrap(err, "communicating with server failed") - return - } - level.Info(c.logger).Log("msg", "connection established", "cluster-version", v) - errChan <- nil - }() - - select { - case err := <-errChan: - if err != nil { - return err - } - level.Info(c.logger).Log("msg", "CRD API endpoints ready") - case <-ctx.Done(): - return nil - } - go c.rr.Run(ctx) defer c.rr.Stop() @@ -405,7 +397,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { for _, inf := range infs.informersForResource.GetInformers() { if !operator.WaitForNamedCacheSync(ctx, "prometheusagent", log.With(c.logger, "informer", infs.name), inf.Informer()) { - return errors.Errorf("failed to sync cache for %s informer", infs.name) + return fmt.Errorf("failed to sync cache for %s informer", infs.name) } } } @@ -418,7 +410,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { {"MonNamespace", c.nsMonInf}, } { if !operator.WaitForNamedCacheSync(ctx, "prometheusagent", log.With(c.logger, "informer", inf.name), inf.informer) { - return errors.Errorf("failed to sync cache for %s informer", inf.name) + return fmt.Errorf("failed to sync cache for %s informer", inf.name) } } @@ -525,10 +517,16 @@ func (c *Operator) sync(ctx context.Context, key string) error { p := pobj.(*monitoringv1alpha1.PrometheusAgent) p = p.DeepCopy() if err := k8sutil.AddTypeInformationToObject(p); err != nil { - return errors.Wrap(err, "failed to set Prometheus type information") + return fmt.Errorf("failed to set Prometheus type information: %w", err) } logger := log.With(c.logger, "key", key) + + // Check if the Agent instance is marked for deletion. + if c.rr.DeletionInProgress(p) { + return nil + } + if p.Spec.Paused { level.Info(logger).Log("msg", "the resource is paused, not reconciling") return nil @@ -536,6 +534,10 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Info(logger).Log("msg", "sync prometheus") + if err := operator.CheckStorageClass(ctx, c.canReadStorageClass, c.kclient, p.Spec.Storage); err != nil { + return err + } + cg, err := prompkg.NewConfigGenerator(c.logger, p, c.endpointSliceSupported) if err != nil { return err @@ -543,22 +545,22 @@ func (c *Operator) sync(ctx context.Context, key string) error { assetStore := assets.NewStore(c.kclient.CoreV1(), c.kclient.CoreV1()) if err := c.createOrUpdateConfigurationSecret(ctx, p, cg, assetStore); err != nil { - return errors.Wrap(err, "creating config failed") + return fmt.Errorf("creating config failed: %w", err) } tlsAssets, err := c.createOrUpdateTLSAssetSecrets(ctx, p, assetStore) if err != nil { - return errors.Wrap(err, "creating tls asset secret failed") + return fmt.Errorf("creating tls asset secret failed: %w", err) } if err := c.createOrUpdateWebConfigSecret(ctx, p); err != nil { - return errors.Wrap(err, "synchronizing web config secret failed") + return fmt.Errorf("synchronizing web config secret failed: %w", err) } // Create governing service if it doesn't exist. svcClient := c.kclient.CoreV1().Services(p.Namespace) if err := k8sutil.CreateOrUpdateService(ctx, svcClient, makeStatefulSetService(p, c.config)); err != nil { - return errors.Wrap(err, "synchronizing governing service failed") + return fmt.Errorf("synchronizing governing service failed: %w", err) } ssetClient := c.kclient.AppsV1().StatefulSets(p.Namespace) @@ -572,7 +574,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { obj, err := c.ssetInfs.Get(prompkg.KeyToStatefulSetKey(p, key, shard)) exists := !apierrors.IsNotFound(err) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "retrieving statefulset failed") + return fmt.Errorf("retrieving statefulset failed: %w", err) } existingStatefulSet := &appsv1.StatefulSet{} @@ -604,7 +606,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { int32(shard), tlsAssets.ShardNames()) if err != nil { - return errors.Wrap(err, "making statefulset failed") + return fmt.Errorf("making statefulset failed: %w", err) } operator.SanitizeSTS(sset) @@ -612,7 +614,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Debug(logger).Log("msg", "no current statefulset found") level.Debug(logger).Log("msg", "creating statefulset") if _, err := ssetClient.Create(ctx, sset, metav1.CreateOptions{}); err != nil { - return errors.Wrap(err, "creating statefulset failed") + return fmt.Errorf("creating statefulset failed: %w", err) } continue } @@ -644,13 +646,13 @@ func (c *Operator) sync(ctx context.Context, key string) error { propagationPolicy := metav1.DeletePropagationForeground if err := ssetClient.Delete(ctx, sset.GetName(), metav1.DeleteOptions{PropagationPolicy: &propagationPolicy}); err != nil { - return errors.Wrap(err, "failed to delete StatefulSet to avoid forbidden action") + return fmt.Errorf("failed to delete StatefulSet to avoid forbidden action: %w", err) } continue } if err != nil { - return errors.Wrap(err, "updating StatefulSet failed") + return fmt.Errorf("updating StatefulSet failed: %w", err) } } @@ -678,7 +680,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { } }) if err != nil { - return errors.Wrap(err, "listing StatefulSet resources failed") + return fmt.Errorf("listing StatefulSet resources failed: %w", err) } return nil @@ -689,33 +691,27 @@ func (c *Operator) createOrUpdateConfigurationSecret(ctx context.Context, p *mon smons, err := resourceSelector.SelectServiceMonitors(ctx, c.smonInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting ServiceMonitors failed") + return fmt.Errorf("selecting ServiceMonitors failed: %w", err) } pmons, err := resourceSelector.SelectPodMonitors(ctx, c.pmonInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting PodMonitors failed") + return fmt.Errorf("selecting PodMonitors failed: %w", err) } bmons, err := resourceSelector.SelectProbes(ctx, c.probeInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting Probes failed") + return fmt.Errorf("selecting Probes failed: %w", err) } var scrapeConfigs map[string]*monitoringv1alpha1.ScrapeConfig if c.sconInfs != nil { scrapeConfigs, err = resourceSelector.SelectScrapeConfigs(ctx, c.sconInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting ScrapeConfigs failed") + return fmt.Errorf("selecting ScrapeConfigs failed: %w", err) } } - sClient := c.kclient.CoreV1().Secrets(p.Namespace) - SecretsInPromNS, err := sClient.List(ctx, metav1.ListOptions{}) - if err != nil { - return err - } - if err := prompkg.AddRemoteWritesToStore(ctx, store, p.GetNamespace(), p.Spec.RemoteWrite); err != nil { return err } @@ -724,9 +720,10 @@ func (c *Operator) createOrUpdateConfigurationSecret(ctx context.Context, p *mon return err } - additionalScrapeConfigs, err := c.loadConfigFromSecret(p.Spec.AdditionalScrapeConfigs, SecretsInPromNS) + sClient := c.kclient.CoreV1().Secrets(p.Namespace) + additionalScrapeConfigs, err := k8sutil.LoadSecretRef(ctx, c.logger, sClient, p.Spec.AdditionalScrapeConfigs) if err != nil { - return errors.Wrap(err, "loading additional scrape configs from Secret failed") + return fmt.Errorf("loading additional scrape configs from Secret failed: %w", err) } // Update secret based on the most recent configuration. @@ -740,13 +737,13 @@ func (c *Operator) createOrUpdateConfigurationSecret(ctx context.Context, p *mon additionalScrapeConfigs, ) if err != nil { - return errors.Wrap(err, "generating config failed") + return fmt.Errorf("generating config failed: %w", err) } // Compress config to avoid 1mb secret limit for a while s, err := prompkg.MakeConfigurationSecret(p, c.config, conf) if err != nil { - return errors.Wrap(err, "creating compressed secret failed") + return fmt.Errorf("creating compressed secret failed: %w", err) } level.Debug(c.logger).Log("msg", "updating Prometheus configuration secret") @@ -759,6 +756,11 @@ func createSSetInputHash(p monitoringv1alpha1.PrometheusAgent, c operator.Config http2 = p.Spec.Web.WebConfigFileFields.HTTPConfig.HTTP2 } + // The controller should ignore any changes to RevisionHistoryLimit field because + // it may be modified by external actors. + // See https://github.com/prometheus-operator/prometheus-operator/issues/5712 + ssSpec.RevisionHistoryLimit = nil + hash, err := hashstructure.Hash(struct { PrometheusLabels map[string]string PrometheusAnnotations map[string]string @@ -779,7 +781,7 @@ func createSSetInputHash(p monitoringv1alpha1.PrometheusAgent, c operator.Config nil, ) if err != nil { - return "", errors.Wrap(err, "failed to calculate combined hash") + return "", fmt.Errorf("failed to calculate combined hash: %w", err) } return fmt.Sprintf("%d", hash), nil @@ -802,11 +804,12 @@ func (c *Operator) UpdateStatus(ctx context.Context, key string) error { pStatus, err := c.statusReporter.Process(ctx, p, key) if err != nil { - return errors.Wrap(err, "failed to get prometheus agent status") + return fmt.Errorf("failed to get prometheus agent status: %w", err) } p.Status = *pStatus - if _, err = c.mclient.MonitoringV1alpha1().PrometheusAgents(p.Namespace).UpdateStatus(ctx, p, metav1.UpdateOptions{}); err != nil { - return errors.Wrap(err, "failed to update prometheus agent status subresource") + + if _, err = c.mclient.MonitoringV1alpha1().PrometheusAgents(p.Namespace).ApplyStatus(ctx, prompkg.ApplyConfigurationFromPrometheusAgent(p), metav1.ApplyOptions{FieldManager: operator.PrometheusOperatorFieldManager, Force: true}); err != nil { + return fmt.Errorf("failed to Apply prometheus agent status subresource: %w", err) } return nil @@ -825,7 +828,7 @@ func (c *Operator) createOrUpdateTLSAssetSecrets(ctx context.Context, p *monitor sClient := c.kclient.CoreV1().Secrets(p.Namespace) if err := sSecret.StoreSecrets(ctx, sClient); err != nil { - return nil, errors.Wrapf(err, "failed to create TLS assets secret for Prometheus") + return nil, fmt.Errorf("failed to create TLS assets secret for Prometheus: %w", err) } level.Debug(c.logger).Log("msg", "tls-asset secret: stored") @@ -847,7 +850,7 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, p *monitor fields, ) if err != nil { - return errors.Wrap(err, "failed to initialize web config") + return fmt.Errorf("failed to initialize web config: %w", err) } secretClient := c.kclient.CoreV1().Secrets(p.Namespace) @@ -863,35 +866,12 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, p *monitor secretLabels := c.config.Labels.Merge(prompkg.ManagedByOperatorLabels) if err := webConfig.CreateOrUpdateWebConfigSecret(ctx, secretClient, secretAnnotations, secretLabels, ownerReference); err != nil { - return errors.Wrap(err, "failed to reconcile web config secret") + return fmt.Errorf("failed to reconcile web config secret: %w", err) } return nil } -func (c *Operator) loadConfigFromSecret(sks *v1.SecretKeySelector, s *v1.SecretList) ([]byte, error) { - if sks == nil { - return nil, nil - } - - for _, secret := range s.Items { - if secret.Name == sks.Name { - if c, ok := secret.Data[sks.Key]; ok { - return c, nil - } - - return nil, fmt.Errorf("key %v could not be found in secret %v", sks.Key, sks.Name) - } - } - - if !pointer.BoolDeref(sks.Optional, true) { - return nil, fmt.Errorf("secret %v could not be found", sks.Name) - } - - level.Debug(c.logger).Log("msg", fmt.Sprintf("secret %v could not be found", sks.Name)) - return nil, nil -} - // TODO: Don't enqueue just for the namespace func (c *Operator) handleSmonAdd(obj interface{}) { o, ok := c.accessor.ObjectMetadata(obj) @@ -1049,52 +1029,65 @@ func (c *Operator) handleConfigMapDelete(obj interface{}) { } func (c *Operator) handleConfigMapUpdate(old, cur interface{}) { - if old.(*v1.ConfigMap).ResourceVersion == cur.(*v1.ConfigMap).ResourceVersion { + oldObj, ok := c.accessor.ObjectMetadata(old) + if !ok { return } - o, ok := c.accessor.ObjectMetadata(cur) - if ok { - level.Debug(c.logger).Log("msg", "ConfigMap updated") - c.metrics.TriggerByCounter("ConfigMap", operator.UpdateEvent).Inc() + curObj, ok := c.accessor.ObjectMetadata(cur) + if !ok { + return + } - c.enqueueForPrometheusNamespace(o.GetNamespace()) + if oldObj.GetResourceVersion() == curObj.GetResourceVersion() { + return } + + level.Debug(c.logger).Log("msg", "ConfigMap updated") + c.metrics.TriggerByCounter("ConfigMap", operator.UpdateEvent).Inc() + c.enqueueForPrometheusNamespace(curObj.GetNamespace()) } // TODO: Do we need to enqueue secrets just for the namespace or in general? func (c *Operator) handleSecretDelete(obj interface{}) { o, ok := c.accessor.ObjectMetadata(obj) - if ok { - level.Debug(c.logger).Log("msg", "Secret deleted") - c.metrics.TriggerByCounter("Secret", operator.DeleteEvent).Inc() - - c.enqueueForPrometheusNamespace(o.GetNamespace()) + if !ok { + return } + + level.Debug(c.logger).Log("msg", "Secret deleted") + c.metrics.TriggerByCounter("Secret", operator.DeleteEvent).Inc() + c.enqueueForPrometheusNamespace(o.GetNamespace()) } func (c *Operator) handleSecretUpdate(old, cur interface{}) { - if old.(*v1.Secret).ResourceVersion == cur.(*v1.Secret).ResourceVersion { + oldObj, ok := c.accessor.ObjectMetadata(old) + if !ok { return } - o, ok := c.accessor.ObjectMetadata(cur) - if ok { - level.Debug(c.logger).Log("msg", "Secret updated") - c.metrics.TriggerByCounter("Secret", operator.UpdateEvent).Inc() + curObj, ok := c.accessor.ObjectMetadata(cur) + if !ok { + return + } - c.enqueueForPrometheusNamespace(o.GetNamespace()) + if oldObj.GetResourceVersion() == curObj.GetResourceVersion() { + return } + + level.Debug(c.logger).Log("msg", "Secret updated") + c.metrics.TriggerByCounter("Secret", operator.UpdateEvent).Inc() } func (c *Operator) handleSecretAdd(obj interface{}) { o, ok := c.accessor.ObjectMetadata(obj) - if ok { - level.Debug(c.logger).Log("msg", "Secret added") - c.metrics.TriggerByCounter("Secret", operator.AddEvent).Inc() - - c.enqueueForPrometheusNamespace(o.GetNamespace()) + if !ok { + return } + + level.Debug(c.logger).Log("msg", "Secret added") + c.metrics.TriggerByCounter("Secret", operator.AddEvent).Inc() + c.enqueueForPrometheusNamespace(o.GetNamespace()) } func (c *Operator) enqueueForPrometheusNamespace(nsName string) { diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/statefulset.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/statefulset.go index c9159f643..7d79eba88 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/statefulset.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/agent/statefulset.go @@ -20,7 +20,6 @@ import ( "path" "strings" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -63,7 +62,7 @@ func makeStatefulSet( p.SetCommonPrometheusFields(cpf) spec, err := makeStatefulSetSpec(p, config, cg, shard, tlsAssetSecrets) if err != nil { - return nil, errors.Wrap(err, "make StatefulSet spec") + return nil, fmt.Errorf("make StatefulSet spec: %w", err) } boolTrue := true @@ -328,7 +327,7 @@ func makeStatefulSetSpec( initContainers, err := k8sutil.MergePatchContainers(operatorInitContainers, cpf.InitContainers) if err != nil { - return nil, errors.Wrap(err, "failed to merge init containers spec") + return nil, fmt.Errorf("failed to merge init containers spec: %w", err) } containerArgs, err := operator.BuildArgs(promArgs, cpf.AdditionalArgs) @@ -382,7 +381,7 @@ func makeStatefulSetSpec( containers, err := k8sutil.MergePatchContainers(operatorContainers, cpf.Containers) if err != nil { - return nil, errors.Wrap(err, "failed to merge containers spec") + return nil, fmt.Errorf("failed to merge containers spec: %w", err) } // PodManagementPolicy is set to Parallel to mitigate issues in kubernetes: https://github.com/kubernetes/kubernetes/issues/60164 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/applyconfiguration.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/applyconfiguration.go new file mode 100644 index 000000000..a1c3618a6 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/applyconfiguration.go @@ -0,0 +1,66 @@ +// Copyright 2019 The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" + monitoringv1ac "github.com/prometheus-operator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1" + monitoringv1alpha1ac "github.com/prometheus-operator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1alpha1" +) + +func ApplyConfigurationFromPrometheusAgent(p *monitoringv1alpha1.PrometheusAgent) *monitoringv1alpha1ac.PrometheusAgentApplyConfiguration { + psac := prometheusStatusApplyConfigurationFromPrometheusStatus(&p.Status) + return monitoringv1alpha1ac.PrometheusAgent(p.Name, p.Namespace).WithStatus(psac) +} + +func ApplyConfigurationFromPrometheus(p *monitoringv1.Prometheus) *monitoringv1ac.PrometheusApplyConfiguration { + psac := prometheusStatusApplyConfigurationFromPrometheusStatus(&p.Status) + return monitoringv1ac.Prometheus(p.Name, p.Namespace).WithStatus(psac) +} + +func prometheusStatusApplyConfigurationFromPrometheusStatus(status *monitoringv1.PrometheusStatus) *monitoringv1ac.PrometheusStatusApplyConfiguration { + psac := monitoringv1ac.PrometheusStatus(). + WithPaused(status.Paused). + WithReplicas(status.Replicas). + WithAvailableReplicas(status.AvailableReplicas). + WithUpdatedReplicas(status.UpdatedReplicas). + WithUnavailableReplicas(status.UnavailableReplicas) + + for _, condition := range status.Conditions { + psac.WithConditions( + monitoringv1ac.Condition(). + WithType(condition.Type). + WithStatus(condition.Status). + WithLastTransitionTime(condition.LastTransitionTime). + WithReason(condition.Reason). + WithMessage(condition.Message). + WithObservedGeneration(condition.ObservedGeneration), + ) + } + + for _, shardStatus := range status.ShardStatuses { + psac.WithShardStatuses( + monitoringv1ac.ShardStatus(). + WithShardID(shardStatus.ShardID). + WithReplicas(shardStatus.Replicas). + WithUpdatedReplicas(shardStatus.UpdatedReplicas). + WithAvailableReplicas(shardStatus.AvailableReplicas). + WithUnavailableReplicas(shardStatus.UnavailableReplicas), + ) + } + + return psac +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/operator.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/operator.go index b5e4aa01a..f37bcd34b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/operator.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/operator.go @@ -23,7 +23,6 @@ import ( "strings" "time" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -108,6 +107,7 @@ func ValidateRemoteWriteSpec(spec monitoringv1.RemoteWriteSpec) error { "oauth2": spec.OAuth2, "authorization": spec.Authorization, "sigv4": spec.Sigv4, + "azureAd": spec.AzureAD, } { if reflect.ValueOf(v).IsNil() { continue @@ -116,7 +116,32 @@ func ValidateRemoteWriteSpec(spec monitoringv1.RemoteWriteSpec) error { } if len(nonNilFields) > 1 { - return errors.Errorf("%s can't be set at the same time, at most one of them must be defined", strings.Join(nonNilFields, " and ")) + return fmt.Errorf("%s can't be set at the same time, at most one of them must be defined", strings.Join(nonNilFields, " and ")) + } + + return nil +} + +func ValidateAlertmanagerEndpoints(am monitoringv1.AlertmanagerEndpoints) error { + var nonNilFields []string + + if am.BearerTokenFile != "" { + nonNilFields = append(nonNilFields, fmt.Sprintf("%q", "bearerTokenFile")) + } + + for k, v := range map[string]interface{}{ + "basicAuth": am.BasicAuth, + "authorization": am.Authorization, + "sigv4": am.Sigv4, + } { + if reflect.ValueOf(v).IsNil() { + continue + } + nonNilFields = append(nonNilFields, fmt.Sprintf("%q", k)) + } + + if len(nonNilFields) > 1 { + return fmt.Errorf("%s can't be set at the same time, at most one of them must be defined", strings.Join(nonNilFields, " and ")) } return nil @@ -131,9 +156,10 @@ func (sr *StatusReporter) Process(ctx context.Context, p monitoringv1.Prometheus } var ( + availableStatus monitoringv1.ConditionStatus = monitoringv1.ConditionTrue + availableReason string availableCondition = monitoringv1.Condition{ - Type: monitoringv1.Available, - Status: monitoringv1.ConditionTrue, + Type: monitoringv1.Available, LastTransitionTime: metav1.Time{ Time: time.Now().UTC(), }, @@ -153,20 +179,30 @@ func (sr *StatusReporter) Process(ctx context.Context, p monitoringv1.Prometheus obj, err := sr.SsetInfs.Get(ssetName) if err != nil { if apierrors.IsNotFound(err) { - // Object not yet in the store or already deleted. + // Statefulset hasn't been created or is already deleted. + availableStatus = monitoringv1.ConditionFalse + availableReason = "StatefulSetNotFound" + messages = append(messages, fmt.Sprintf("shard %d: statefulset %s not found", shard, ssetName)) + pStatus.ShardStatuses = append( + pStatus.ShardStatuses, + monitoringv1.ShardStatus{ + ShardID: strconv.Itoa(shard), + }) + continue } - return nil, errors.Wrap(err, "failed to retrieve statefulset") + + return nil, fmt.Errorf("failed to retrieve statefulset: %w", err) } - sset := obj.(*appsv1.StatefulSet) + sset := obj.(*appsv1.StatefulSet).DeepCopy() if sr.Rr.DeletionInProgress(sset) { continue } stsReporter, err := operator.NewStatefulSetReporter(ctx, sr.Kclient, sset) if err != nil { - return nil, errors.Wrap(err, "failed to retrieve statefulset state") + return nil, fmt.Errorf("failed to retrieve statefulset state: %w", err) } pStatus.Replicas += int32(len(stsReporter.Pods)) @@ -190,12 +226,13 @@ func (sr *StatusReporter) Process(ctx context.Context, p monitoringv1.Prometheus continue } - if len(stsReporter.ReadyPods()) == 0 { - availableCondition.Reason = "NoPodReady" - availableCondition.Status = monitoringv1.ConditionFalse - } else if availableCondition.Status != monitoringv1.ConditionFalse { - availableCondition.Reason = "SomePodsNotReady" - availableCondition.Status = monitoringv1.ConditionDegraded + switch { + case len(stsReporter.ReadyPods()) == 0: + availableReason = "NoPodReady" + availableStatus = monitoringv1.ConditionFalse + case availableCondition.Status != monitoringv1.ConditionFalse: + availableReason = "SomePodsNotReady" + availableStatus = monitoringv1.ConditionDegraded } for _, p := range stsReporter.Pods { @@ -205,10 +242,20 @@ func (sr *StatusReporter) Process(ctx context.Context, p monitoringv1.Prometheus } } - availableCondition.Message = strings.Join(messages, "\n") - - reconciledCondition := sr.Reconciliations.GetCondition(key, p.GetObjectMeta().GetGeneration()) - pStatus.Conditions = operator.UpdateConditions(pStatus.Conditions, availableCondition, reconciledCondition) + pStatus.Conditions = operator.UpdateConditions( + pStatus.Conditions, + monitoringv1.Condition{ + Type: monitoringv1.Available, + Status: availableStatus, + Reason: availableReason, + Message: strings.Join(messages, "\n"), + LastTransitionTime: metav1.Time{ + Time: time.Now().UTC(), + }, + ObservedGeneration: p.GetObjectMeta().GetGeneration(), + }, + sr.Reconciliations.GetCondition(key, p.GetObjectMeta().GetGeneration()), + ) return &pStatus, nil } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg.go index ce6ebb037..a45b07dea 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg.go @@ -25,7 +25,6 @@ import ( "github.com/blang/semver/v4" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" "gopkg.in/yaml.v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -43,7 +42,8 @@ const ( kubernetesSDRolePod = "pod" kubernetesSDRoleIngress = "ingress" - defaultReplicaExternalLabelName = "prometheus_replica" + defaultPrometheusExternalLabelName = "prometheus" + defaultReplicaExternalLabelName = "prometheus_replica" ) var invalidLabelCharRE = regexp.MustCompile(`[^a-zA-Z0-9_]`) @@ -71,11 +71,11 @@ func NewConfigGenerator(logger log.Logger, p monitoringv1.PrometheusInterface, e promVersion := operator.StringValOrDefault(p.GetCommonPrometheusFields().Version, operator.DefaultPrometheusVersion) version, err := semver.ParseTolerant(promVersion) if err != nil { - return nil, errors.Wrap(err, "failed to parse Prometheus version") + return nil, fmt.Errorf("failed to parse Prometheus version: %w", err) } if version.Major != 2 { - return nil, errors.Wrap(err, fmt.Sprintf("unsupported Prometheus major version %s", version)) + return nil, fmt.Errorf("unsupported Prometheus major version %s: %w", version, err) } logger = log.WithSuffix(logger, "version", promVersion) @@ -204,6 +204,11 @@ var ( prometheusField: "label_value_length_limit", minVersion: "2.27.0", } + keepDroppedTargetsKey = limitKey{ + specField: "keepDroppedTargets", + prometheusField: "keep_dropped_targets", + minVersion: "2.47.0", + } ) // AddLimitsToYAML appends the given limit key to the configuration if @@ -334,6 +339,35 @@ func (cg *ConfigGenerator) addBasicAuthToYaml(cfg yaml.MapSlice, return cg.WithKeyVals("component", strings.Split(assetStoreKey, "/")[0]).AppendMapItem(cfg, "basic_auth", authCfg) } +func (cg *ConfigGenerator) addSigv4ToYaml(cfg yaml.MapSlice, + assetStoreKey string, + store *assets.Store, + sigv4 *monitoringv1.Sigv4, +) yaml.MapSlice { + if sigv4 == nil { + return cfg + } + + sigv4Cfg := yaml.MapSlice{} + if sigv4.Region != "" { + sigv4Cfg = append(sigv4Cfg, yaml.MapItem{Key: "region", Value: sigv4.Region}) + } + if store.SigV4Assets[assetStoreKey].AccessKeyID != "" { + sigv4Cfg = append(sigv4Cfg, yaml.MapItem{Key: "access_key", Value: store.SigV4Assets[assetStoreKey].AccessKeyID}) + } + if store.SigV4Assets[assetStoreKey].SecretKeyID != "" { + sigv4Cfg = append(sigv4Cfg, yaml.MapItem{Key: "secret_key", Value: store.SigV4Assets[assetStoreKey].SecretKeyID}) + } + if sigv4.Profile != "" { + sigv4Cfg = append(sigv4Cfg, yaml.MapItem{Key: "profile", Value: sigv4.Profile}) + } + if sigv4.RoleArn != "" { + sigv4Cfg = append(sigv4Cfg, yaml.MapItem{Key: "role_arn", Value: sigv4.RoleArn}) + } + + return cg.WithKeyVals("component", strings.Split(assetStoreKey, "/")[0]).AppendMapItem(cfg, "sigv4", sigv4Cfg) +} + func (cg *ConfigGenerator) addSafeAuthorizationToYaml( cfg yaml.MapSlice, assetStoreKey string, @@ -387,7 +421,7 @@ func (cg *ConfigGenerator) buildExternalLabels() yaml.MapSlice { cpf := cg.prom.GetCommonPrometheusFields() objMeta := cg.prom.GetObjectMeta() - prometheusExternalLabelName := "prometheus" + prometheusExternalLabelName := defaultPrometheusExternalLabelName if cpf.PrometheusExternalLabelName != nil { prometheusExternalLabelName = *cpf.PrometheusExternalLabelName } @@ -407,9 +441,14 @@ func (cg *ConfigGenerator) buildExternalLabels() yaml.MapSlice { m[replicaExternalLabelName] = fmt.Sprintf("$(%s)", operator.PodNameEnvVar) } - for n, v := range cpf.ExternalLabels { - m[n] = v + for k, v := range cpf.ExternalLabels { + if _, found := m[k]; found { + level.Warn(cg.logger).Log("msg", "ignoring external label because it is a reserved key", "key", k) + continue + } + m[k] = v } + return stringMapToMapSlice(m) } @@ -419,15 +458,15 @@ func CompareScrapeTimeoutToScrapeInterval(scrapeTimeout, scrapeInterval monitori var err error if si, err = model.ParseDuration(string(scrapeInterval)); err != nil { - return errors.Wrapf(err, "invalid scrapeInterval %q", scrapeInterval) + return fmt.Errorf("invalid scrapeInterval %q: %w", scrapeInterval, err) } if st, err = model.ParseDuration(string(scrapeTimeout)); err != nil { - return errors.Wrapf(err, "invalid scrapeTimeout: %q", scrapeTimeout) + return fmt.Errorf("invalid scrapeTimeout: %q: %w", scrapeTimeout, err) } if st > si { - return errors.Errorf("scrapeTimeout %q greater than scrapeInterval %q", scrapeTimeout, scrapeInterval) + return fmt.Errorf("scrapeTimeout %q greater than scrapeInterval %q", scrapeTimeout, scrapeInterval) } return nil @@ -487,12 +526,12 @@ func (cg *ConfigGenerator) GenerateServerConfiguration( scrapeConfigs = cg.appendProbeConfigs(scrapeConfigs, probes, apiserverConfig, store, shards) scrapeConfigs, err := cg.appendScrapeConfigs(ctx, scrapeConfigs, sCons, store) if err != nil { - return nil, errors.Wrap(err, "generate scrape configs") + return nil, fmt.Errorf("generate scrape configs: %w", err) } scrapeConfigs, err = cg.appendAdditionalScrapeConfigs(scrapeConfigs, additionalScrapeConfigs, shards) if err != nil { - return nil, errors.Wrap(err, "generate additional scrape configs") + return nil, fmt.Errorf("generate additional scrape configs: %w", err) } cfg = append(cfg, yaml.MapItem{ Key: "scrape_configs", @@ -502,13 +541,13 @@ func (cg *ConfigGenerator) GenerateServerConfiguration( // Storage config cfg, err = cg.appendStorageSettingsConfig(cfg, exemplars, tsdb) if err != nil { - return nil, errors.Wrap(err, "generating storage_settings configuration failed") + return nil, fmt.Errorf("generating storage_settings configuration failed: %w", err) } // Alerting config cfg, err = cg.appendAlertingConfig(cfg, alerting, additionalAlertRelabelConfigs, additionalAlertManagerConfigs, store) if err != nil { - return nil, errors.Wrap(err, "generating alerting configuration failed") + return nil, fmt.Errorf("generating alerting configuration failed: %w", err) } // Remote write config @@ -525,7 +564,7 @@ func (cg *ConfigGenerator) GenerateServerConfiguration( tracingcfg, err := cg.generateTracingConfig() if err != nil { - return nil, errors.Wrap(err, "generating tracing configuration failed") + return nil, fmt.Errorf("generating tracing configuration failed: %w", err) } cfg = append(cfg, tracingcfg) @@ -582,7 +621,7 @@ func (cg *ConfigGenerator) appendAlertingConfig( var additionalAlertmanagerConfigsYaml []yaml.MapSlice if err := yaml.Unmarshal([]byte(additionalAlertmanagerConfigs), &additionalAlertmanagerConfigsYaml); err != nil { - return nil, errors.Wrap(err, "unmarshalling additional alertmanager configs failed") + return nil, fmt.Errorf("unmarshalling additional alertmanager configs failed") } alertmanagerConfigs = append(alertmanagerConfigs, additionalAlertmanagerConfigsYaml...) @@ -603,7 +642,7 @@ func (cg *ConfigGenerator) appendAlertingConfig( var additionalAlertRelabelConfigsYaml []yaml.MapSlice if err := yaml.Unmarshal([]byte(additionalAlertRelabelConfigs), &additionalAlertRelabelConfigsYaml); err != nil { - return nil, errors.Wrap(err, "unmarshalling additional alerting relabel configs failed") + return nil, fmt.Errorf("unmarshalling additional alerting relabel configs failed: %w", err) } alertRelabelConfigs = append(alertRelabelConfigs, additionalAlertRelabelConfigsYaml...) @@ -853,6 +892,7 @@ func (cg *ConfigGenerator) generatePodMonitorConfig( cfg = cg.AddLimitsToYAML(cfg, labelLimitKey, m.Spec.LabelLimit, cpf.EnforcedLabelLimit) cfg = cg.AddLimitsToYAML(cfg, labelNameLengthLimitKey, m.Spec.LabelNameLengthLimit, cpf.EnforcedLabelNameLengthLimit) cfg = cg.AddLimitsToYAML(cfg, labelValueLengthLimitKey, m.Spec.LabelValueLengthLimit, cpf.EnforcedLabelValueLengthLimit) + cfg = cg.AddLimitsToYAML(cfg, keepDroppedTargetsKey, m.Spec.KeepDroppedTargets, cpf.EnforcedKeepDroppedTargets) if cpf.EnforcedBodySizeLimit != "" { cfg = cg.WithMinimumVersion("2.28.0").AppendMapItem(cfg, "body_size_limit", cpf.EnforcedBodySizeLimit) @@ -918,6 +958,7 @@ func (cg *ConfigGenerator) generateProbeConfig( cfg = cg.AddLimitsToYAML(cfg, labelLimitKey, m.Spec.LabelLimit, cpf.EnforcedLabelLimit) cfg = cg.AddLimitsToYAML(cfg, labelNameLengthLimitKey, m.Spec.LabelNameLengthLimit, cpf.EnforcedLabelNameLengthLimit) cfg = cg.AddLimitsToYAML(cfg, labelValueLengthLimitKey, m.Spec.LabelValueLengthLimit, cpf.EnforcedLabelValueLengthLimit) + cfg = cg.AddLimitsToYAML(cfg, keepDroppedTargetsKey, m.Spec.KeepDroppedTargets, cpf.EnforcedKeepDroppedTargets) if cpf.EnforcedBodySizeLimit != "" { cfg = cg.WithMinimumVersion("2.28.0").AppendMapItem(cfg, "body_size_limit", cpf.EnforcedBodySizeLimit) @@ -981,7 +1022,6 @@ func (cg *ConfigGenerator) generateProbeConfig( // Add configured relabelings. xc := labeler.GetRelabelingConfigs(m.TypeMeta, m.ObjectMeta, m.Spec.Targets.StaticConfig.RelabelConfigs) relabelings = append(relabelings, generateRelabelConfig(xc)...) - cfg = append(cfg, yaml.MapItem{Key: "relabel_configs", Value: relabelings}) case m.Spec.Targets.Ingress != nil: // Generate kubernetes_sd_config section for the ingress resources. @@ -1077,12 +1117,11 @@ func (cg *ConfigGenerator) generateProbeConfig( // Add configured relabelings. relabelings = append(relabelings, generateRelabelConfig(labeler.GetRelabelingConfigs(m.TypeMeta, m.ObjectMeta, m.Spec.Targets.Ingress.RelabelConfigs))...) - relabelings = generateAddressShardingRelabelingRulesForProbes(relabelings, shards) - - cfg = append(cfg, yaml.MapItem{Key: "relabel_configs", Value: relabelings}) - } + relabelings = generateAddressShardingRelabelingRulesForProbes(relabelings, shards) + cfg = append(cfg, yaml.MapItem{Key: "relabel_configs", Value: relabelings}) + if m.Spec.TLSConfig != nil { cfg = addSafeTLStoYaml(cfg, m.Namespace, m.Spec.TLSConfig.SafeTLSConfig) } @@ -1171,7 +1210,7 @@ func (cg *ConfigGenerator) generateServiceMonitorConfig( cfg = append(cfg, yaml.MapItem{Key: "bearer_token_file", Value: ep.BearerTokenFile}) } - if ep.BearerTokenSecret.Name != "" { + if ep.BearerTokenSecret != nil && ep.BearerTokenSecret.Name != "" { if s, ok := store.TokenAssets[fmt.Sprintf("serviceMonitor/%s/%s/%d", m.Namespace, m.Name, i)]; ok { cfg = append(cfg, yaml.MapItem{Key: "bearer_token", Value: s}) } @@ -1371,6 +1410,7 @@ func (cg *ConfigGenerator) generateServiceMonitorConfig( cfg = cg.AddLimitsToYAML(cfg, labelLimitKey, m.Spec.LabelLimit, cpf.EnforcedLabelLimit) cfg = cg.AddLimitsToYAML(cfg, labelNameLengthLimitKey, m.Spec.LabelNameLengthLimit, cpf.EnforcedLabelNameLengthLimit) cfg = cg.AddLimitsToYAML(cfg, labelValueLengthLimitKey, m.Spec.LabelValueLengthLimit, cpf.EnforcedLabelValueLengthLimit) + cfg = cg.AddLimitsToYAML(cfg, keepDroppedTargetsKey, m.Spec.KeepDroppedTargets, cpf.EnforcedKeepDroppedTargets) if cpf.EnforcedBodySizeLimit != "" { cfg = cg.WithMinimumVersion("2.28.0").AppendMapItem(cfg, "body_size_limit", cpf.EnforcedBodySizeLimit) @@ -1597,6 +1637,8 @@ func (cg *ConfigGenerator) generateAlertmanagerConfig(alerting *monitoringv1.Ale cfg = cg.addSafeAuthorizationToYaml(cfg, fmt.Sprintf("alertmanager/auth/%d", i), store, am.Authorization) + cfg = cg.WithMinimumVersion("2.48.0").addSigv4ToYaml(cfg, fmt.Sprintf("alertmanager/auth/%d", i), store, am.Sigv4) + if am.APIVersion == "v1" || am.APIVersion == "v2" { cfg = cg.WithMinimumVersion("2.11.0").AppendMapItem(cfg, "api_version", am.APIVersion) } @@ -1637,7 +1679,7 @@ func (cg *ConfigGenerator) generateAdditionalScrapeConfigs( var additionalScrapeConfigsYaml []yaml.MapSlice err := yaml.Unmarshal([]byte(additionalScrapeConfigs), &additionalScrapeConfigsYaml) if err != nil { - return nil, errors.Wrap(err, "unmarshalling additional scrape configs failed") + return nil, fmt.Errorf("unmarshalling additional scrape configs failed: %w", err) } if shards == 1 { return additionalScrapeConfigsYaml, nil @@ -1655,12 +1697,12 @@ func (cg *ConfigGenerator) generateAdditionalScrapeConfigs( } values, ok := mapItem.Value.([]interface{}) if !ok { - return nil, errors.Wrap(err, "error parsing relabel configs") + return nil, fmt.Errorf("error parsing relabel configs: %w", err) } for _, value := range values { relabeling, ok := value.(yaml.MapSlice) if !ok { - return nil, errors.Wrap(err, "error parsing relabel config") + return nil, fmt.Errorf("error parsing relabel config: %w", err) } relabelings = append(relabelings, relabeling) } @@ -1869,26 +1911,22 @@ func (cg *ConfigGenerator) generateRemoteWriteConfig( cfg = append(cfg, yaml.MapItem{Key: "proxy_url", Value: spec.ProxyURL}) } - if spec.Sigv4 != nil { - sigV4 := yaml.MapSlice{} - if spec.Sigv4.Region != "" { - sigV4 = append(sigV4, yaml.MapItem{Key: "region", Value: spec.Sigv4.Region}) - } - key := fmt.Sprintf("remoteWrite/%d", i) - if store.SigV4Assets[key].AccessKeyID != "" { - sigV4 = append(sigV4, yaml.MapItem{Key: "access_key", Value: store.SigV4Assets[key].AccessKeyID}) - } - if store.SigV4Assets[key].SecretKeyID != "" { - sigV4 = append(sigV4, yaml.MapItem{Key: "secret_key", Value: store.SigV4Assets[key].SecretKeyID}) - } - if spec.Sigv4.Profile != "" { - sigV4 = append(sigV4, yaml.MapItem{Key: "profile", Value: spec.Sigv4.Profile}) + cfg = cg.WithMinimumVersion("2.26.0").addSigv4ToYaml(cfg, fmt.Sprintf("remoteWrite/%d", i), store, spec.Sigv4) + + if spec.AzureAD != nil { + azureAd := yaml.MapSlice{ + { + Key: "managed_identity", Value: yaml.MapSlice{ + {Key: "client_id", Value: spec.AzureAD.ManagedIdentity.ClientID}, + }, + }, } - if spec.Sigv4.RoleArn != "" { - sigV4 = append(sigV4, yaml.MapItem{Key: "role_arn", Value: spec.Sigv4.RoleArn}) + + if spec.AzureAD.Cloud != nil { + azureAd = append(azureAd, yaml.MapItem{Key: "cloud", Value: spec.AzureAD.Cloud}) } - cfg = cg.WithMinimumVersion("2.26.0").AppendMapItem(cfg, "sigv4", sigV4) + cfg = cg.WithMinimumVersion("2.45.0").AppendMapItem(cfg, "azuread", azureAd) } if spec.QueueConfig != nil { @@ -1988,6 +2026,9 @@ func (cg *ConfigGenerator) appendScrapeLimits(slice yaml.MapSlice) yaml.MapSlice if cpf.LabelValueLengthLimit != nil { slice = cg.WithMinimumVersion("2.45.0").AppendMapItem(slice, "label_value_length_limit", *cpf.LabelValueLengthLimit) } + if cpf.KeepDroppedTargets != nil { + slice = cg.WithMinimumVersion("2.47.0").AppendMapItem(slice, "keep_dropped_targets", *cpf.KeepDroppedTargets) + } return slice } @@ -2042,7 +2083,6 @@ func (cg *ConfigGenerator) appendServiceMonitorConfigs( for _, identifier := range sMonIdentifiers { for i, ep := range serviceMonitors[identifier].Spec.Endpoints { - svcMonitorScrapeConfig := cg.WithKeyVals("service_monitor", identifier).generateServiceMonitorConfig( serviceMonitors[identifier], ep, i, @@ -2170,12 +2210,12 @@ func (cg *ConfigGenerator) GenerateAgentConfiguration( scrapeConfigs = cg.appendProbeConfigs(scrapeConfigs, probes, apiserverConfig, store, shards) scrapeConfigs, err := cg.appendScrapeConfigs(ctx, scrapeConfigs, sCons, store) if err != nil { - return nil, errors.Wrap(err, "generate scrape configs") + return nil, fmt.Errorf("generate scrape configs: %w", err) } scrapeConfigs, err = cg.appendAdditionalScrapeConfigs(scrapeConfigs, additionalScrapeConfigs, shards) if err != nil { - return nil, errors.Wrap(err, "generate additional scrape configs") + return nil, fmt.Errorf("generate additional scrape configs: %w", err) } cfg = append(cfg, yaml.MapItem{ Key: "scrape_configs", @@ -2190,7 +2230,7 @@ func (cg *ConfigGenerator) GenerateAgentConfiguration( if cpf.TracingConfig != nil { tracingcfg, err := cg.generateTracingConfig() if err != nil { - return nil, errors.Wrap(err, "generating tracing configuration failed") + return nil, fmt.Errorf("generating tracing configuration failed: %w", err) } cfg = append(cfg, tracingcfg) @@ -2291,6 +2331,7 @@ func (cg *ConfigGenerator) generateScrapeConfig( cfg = cg.AddLimitsToYAML(cfg, labelLimitKey, sc.Spec.LabelLimit, cpf.EnforcedLabelLimit) cfg = cg.AddLimitsToYAML(cfg, labelNameLengthLimitKey, sc.Spec.LabelNameLengthLimit, cpf.EnforcedLabelNameLengthLimit) cfg = cg.AddLimitsToYAML(cfg, labelValueLengthLimitKey, sc.Spec.LabelValueLengthLimit, cpf.EnforcedLabelValueLengthLimit) + cfg = cg.AddLimitsToYAML(cfg, keepDroppedTargetsKey, sc.Spec.KeepDroppedTargets, cpf.EnforcedKeepDroppedTargets) if cpf.EnforcedBodySizeLimit != "" { cfg = cg.WithMinimumVersion("2.28.0").AppendMapItem(cfg, "body_size_limit", cpf.EnforcedBodySizeLimit) @@ -2380,14 +2421,41 @@ func (cg *ConfigGenerator) generateScrapeConfig( configs[i] = []yaml.MapItem{ { Key: "role", - Value: strings.ToLower(config.Role), + Value: strings.ToLower(string(config.Role)), }, } + + selectors := make([][]yaml.MapItem, len(config.Selectors)) + for i, s := range config.Selectors { + selectors[i] = []yaml.MapItem{ + { + Key: "role", + Value: strings.ToLower(string(s.Role)), + }, + { + Key: "label", + Value: s.Label, + }, + { + Key: "field", + Value: s.Field, + }, + } + } + + if len(selectors) > 0 { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "selectors", + Value: selectors, + }) + } } cfg = append(cfg, yaml.MapItem{ - Key: "kubernetes_sd_configs", + Key: "kubernetes_sd_configs", + Value: configs, }) } + //ConsulSDConfig if len(sc.Spec.ConsulSDConfigs) > 0 { configs := make([][]yaml.MapItem, len(sc.Spec.ConsulSDConfigs)) @@ -2413,7 +2481,7 @@ func (cg *ConfigGenerator) generateScrapeConfig( }) if err != nil { - return cfg, errors.Wrapf(err, "failed to read %s secret %s", config.TokenRef.Name, jobName) + return cfg, fmt.Errorf("failed to read %s secret %s: %w", config.TokenRef.Name, jobName, err) } configs[i] = append(configs[i], yaml.MapItem{ @@ -2522,7 +2590,7 @@ func (cg *ConfigGenerator) generateScrapeConfig( }) if err != nil { - return cfg, errors.Wrapf(err, "failed to read %s secret %s", v.Name, jobName) + return cfg, fmt.Errorf("failed to read %s secret %s: %w", v.Name, jobName, err) } proxyConnectHeader[k] = value @@ -2555,6 +2623,123 @@ func (cg *ConfigGenerator) generateScrapeConfig( }) } + // DNSSDConfig + if len(sc.Spec.DNSSDConfigs) > 0 { + configs := make([][]yaml.MapItem, len(sc.Spec.DNSSDConfigs)) + for i, config := range sc.Spec.DNSSDConfigs { + configs[i] = []yaml.MapItem{ + { + Key: "names", + Value: config.Names, + }, + } + + if config.RefreshInterval != nil { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "refresh_interval", + Value: config.RefreshInterval, + }) + } + + if config.Type != nil { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "type", + Value: config.Type, + }) + } + + if config.Port != nil { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "port", + Value: config.Port, + }) + } + } + cfg = append(cfg, yaml.MapItem{ + Key: "dns_sd_configs", + Value: configs, + }) + } + + // EC2SDConfig + if len(sc.Spec.EC2SDConfigs) > 0 { + configs := make([][]yaml.MapItem, len(sc.Spec.EC2SDConfigs)) + for i, config := range sc.Spec.EC2SDConfigs { + if config.Region != nil { + configs[i] = []yaml.MapItem{ + { + Key: "region", + Value: config.Region, + }, + } + } + + if config.AccessKey != nil && config.SecretKey != nil { + value, err := store.GetKey(ctx, sc.GetNamespace(), monitoringv1.SecretOrConfigMap{ + Secret: config.AccessKey, + }) + + if err != nil { + return cfg, fmt.Errorf("failed to get %s access key %s: %w", config.AccessKey.Name, jobName, err) + } + + configs[i] = append(configs[i], yaml.MapItem{ + Key: "access_key", + Value: value, + }) + + value, err = store.GetKey(ctx, sc.GetNamespace(), monitoringv1.SecretOrConfigMap{ + Secret: config.SecretKey, + }) + + if err != nil { + return cfg, fmt.Errorf("failed to get %s access key %s: %w", config.SecretKey.Name, jobName, err) + } + + configs[i] = append(configs[i], yaml.MapItem{ + Key: "secret_key", + Value: value, + }) + } + + if config.RoleARN != nil { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "role_arn", + Value: config.RoleARN, + }) + } + + if config.RefreshInterval != nil { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "refresh_interval", + Value: config.RefreshInterval, + }) + } + + if config.Port != nil { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "port", + Value: config.Port, + }) + } + + if config.Filters != nil { + configs[i] = append(configs[i], yaml.MapItem{ + Key: "filters", + Value: config.Filters, + }) + } + } + cfg = append(cfg, yaml.MapItem{ + Key: "ec2_sd_configs", + Value: configs, + }) + } + + if sc.Spec.MetricRelabelConfigs != nil { + cfg = append(cfg, yaml.MapItem{Key: "metric_relabel_configs", Value: generateRelabelConfig(labeler.GetRelabelingConfigs(sc.TypeMeta, sc.ObjectMeta, sc.Spec.MetricRelabelConfigs))}) + } + return cfg, nil } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg_test.go index f1680dd9c..febdc604b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/promcfg_test.go @@ -18,7 +18,6 @@ import ( "context" "fmt" "os" - "strings" "testing" "github.com/go-kit/log" @@ -26,12 +25,13 @@ import ( "github.com/go-openapi/swag" "github.com/stretchr/testify/require" "gopkg.in/yaml.v2" + "gotest.tools/v3/golden" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes/fake" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" @@ -106,44 +106,42 @@ func TestGlobalSettings(t *testing.T) { expectedLabelLimit uint64 = 50 expectedLabelNameLengthLimit uint64 = 40 expectedLabelValueLengthLimit uint64 = 30 + expectedkeepDroppedTargets uint64 = 50 ) for _, tc := range []struct { - Scenario string - EvaluationInterval monitoringv1.Duration - ScrapeInterval monitoringv1.Duration - ScrapeTimeout monitoringv1.Duration - ExternalLabels map[string]string - QueryLogFile string - Version string - BodySizeLimit *monitoringv1.ByteSize - SampleLimit *uint64 - TargetLimit *uint64 - LabelLimit *uint64 - LabelNameLengthLimit *uint64 - LabelValueLengthLimit *uint64 - Expected string - ExpectError bool + Scenario string + EvaluationInterval monitoringv1.Duration + ScrapeInterval monitoringv1.Duration + ScrapeTimeout monitoringv1.Duration + ExternalLabels map[string]string + PrometheusExternalLabelName *string + ReplicaExternalLabelName *string + QueryLogFile string + Version string + BodySizeLimit *monitoringv1.ByteSize + SampleLimit *uint64 + TargetLimit *uint64 + LabelLimit *uint64 + LabelNameLengthLimit *uint64 + LabelValueLengthLimit *uint64 + KeepDroppedTargets *uint64 + ExpectError bool + Golden string }{ { Scenario: "valid config", Version: "v2.15.2", ScrapeInterval: "15s", EvaluationInterval: "30s", - Expected: `global: - evaluation_interval: 30s - scrape_interval: 15s - external_labels: - prometheus: / - prometheus_replica: $(POD_NAME) -scrape_configs: [] -`, + Golden: "global_settings_valid_config_v2.15.2.golden", }, { Scenario: "invalid scrape timeout specified when scrape interval specified", Version: "v2.30.0", ScrapeInterval: "30s", ScrapeTimeout: "60s", + Golden: "invalid_scrape_timeout_specified_when_scrape_interval_specified.golden", ExpectError: true, }, { @@ -152,15 +150,7 @@ scrape_configs: [] ScrapeInterval: "60s", ScrapeTimeout: "10s", EvaluationInterval: "30s", - Expected: `global: - evaluation_interval: 30s - scrape_interval: 60s - scrape_timeout: 10s - external_labels: - prometheus: / - prometheus_replica: $(POD_NAME) -scrape_configs: [] -`, + Golden: "valid_scrape_timeout_along_with_valid_scrape_interval_specified.golden", }, { Scenario: "external label specified", @@ -171,16 +161,21 @@ scrape_configs: [] "key1": "value1", "key2": "value2", }, - Expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - key1: value1 - key2: value2 - prometheus: / - prometheus_replica: $(POD_NAME) -scrape_configs: [] -`, + Golden: "external_label_specified.golden", + }, + { + Scenario: "external label specified along with reserved labels", + Version: "v2.45.0", + ScrapeInterval: "30s", + EvaluationInterval: "30s", + ExternalLabels: map[string]string{ + "prometheus_replica": "1", + "prometheus": "prometheus-k8s-1", + "some-other-key": "some-value", + }, + PrometheusExternalLabelName: ptr.To("prometheus"), + ReplicaExternalLabelName: ptr.To("prometheus_replica"), + Golden: "external_label_specified_along_with_reserved_labels.golden", }, { Scenario: "query log file", @@ -188,15 +183,7 @@ scrape_configs: [] ScrapeInterval: "30s", EvaluationInterval: "30s", QueryLogFile: "test.log", - Expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: / - prometheus_replica: $(POD_NAME) - query_log_file: /var/log/prometheus/test.log -scrape_configs: [] -`, + Golden: "query_log_file.golden", }, { Scenario: "valid global limits", @@ -206,17 +193,7 @@ scrape_configs: [] BodySizeLimit: &expectedBodySizeLimit, SampleLimit: &expectedSampleLimit, TargetLimit: &expectedTargetLimit, - Expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: / - prometheus_replica: $(POD_NAME) - body_size_limit: 1000MB - sample_limit: 10000 - target_limit: 1000 -scrape_configs: [] -`, + Golden: "valid_global_limits.golden", }, { Scenario: "valid global config with label limits", @@ -229,20 +206,15 @@ scrape_configs: [] LabelLimit: &expectedLabelLimit, LabelNameLengthLimit: &expectedLabelNameLengthLimit, LabelValueLengthLimit: &expectedLabelValueLengthLimit, - Expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: / - prometheus_replica: $(POD_NAME) - body_size_limit: 1000MB - sample_limit: 10000 - target_limit: 1000 - label_limit: 50 - label_name_length_limit: 40 - label_value_length_limit: 30 -scrape_configs: [] -`, + Golden: "valid_global_config_with_label_limits.golden", + }, + { + Scenario: "valid global config with keep dropped targets", + Version: "v2.47.0", + ScrapeInterval: "30s", + EvaluationInterval: "30s", + KeepDroppedTargets: &expectedkeepDroppedTargets, + Golden: "valid_global_config_with_keep_dropped_targets.golden", }, } { @@ -250,17 +222,20 @@ scrape_configs: [] ObjectMeta: metav1.ObjectMeta{}, Spec: monitoringv1.PrometheusSpec{ CommonPrometheusFields: monitoringv1.CommonPrometheusFields{ - ScrapeInterval: tc.ScrapeInterval, - ScrapeTimeout: tc.ScrapeTimeout, - ExternalLabels: tc.ExternalLabels, - Version: tc.Version, - TracingConfig: nil, - BodySizeLimit: tc.BodySizeLimit, - SampleLimit: tc.SampleLimit, - TargetLimit: tc.TargetLimit, - LabelLimit: tc.LabelLimit, - LabelNameLengthLimit: tc.LabelNameLengthLimit, - LabelValueLengthLimit: tc.LabelValueLengthLimit, + ScrapeInterval: tc.ScrapeInterval, + ScrapeTimeout: tc.ScrapeTimeout, + ExternalLabels: tc.ExternalLabels, + PrometheusExternalLabelName: tc.PrometheusExternalLabelName, + ReplicaExternalLabelName: tc.ReplicaExternalLabelName, + Version: tc.Version, + TracingConfig: nil, + BodySizeLimit: tc.BodySizeLimit, + SampleLimit: tc.SampleLimit, + TargetLimit: tc.TargetLimit, + LabelLimit: tc.LabelLimit, + LabelNameLengthLimit: tc.LabelNameLengthLimit, + LabelValueLengthLimit: tc.LabelValueLengthLimit, + KeepDroppedTargets: tc.KeepDroppedTargets, }, EvaluationInterval: tc.EvaluationInterval, QueryLogFile: tc.QueryLogFile, @@ -295,7 +270,7 @@ scrape_configs: [] require.NoError(t, err) } - require.Equal(t, tc.Expected, string(cfg)) + golden.Assert(t, string(cfg), tc.Golden) }) } } @@ -304,7 +279,7 @@ func TestNamespaceSetCorrectly(t *testing.T) { type testCase struct { ServiceMonitor *monitoringv1.ServiceMonitor IgnoreNamespaceSelectors bool - Expected string + Golden string } testcases := []testCase{ @@ -328,15 +303,7 @@ func TestNamespaceSetCorrectly(t *testing.T) { }, }, IgnoreNamespaceSelectors: false, - Expected: `kubernetes_sd_configs: -- role: endpoints - namespaces: - names: - - test1 - - test2 - attach_metadata: - node: true -`, + Golden: "namespaces_from_MatchNames_are_returned_instead_of_the_current_namespace.golden", }, // Test that 'Any' returns an empty list instead of the current namespace { @@ -355,9 +322,7 @@ func TestNamespaceSetCorrectly(t *testing.T) { }, }, IgnoreNamespaceSelectors: false, - Expected: `kubernetes_sd_configs: -- role: endpoints -`, + Golden: "Any_returns_an_empty_list_instead_of_the_current_namespace.golden", }, // Test that Any takes precedence over MatchNames { @@ -377,9 +342,7 @@ func TestNamespaceSetCorrectly(t *testing.T) { }, }, IgnoreNamespaceSelectors: false, - Expected: `kubernetes_sd_configs: -- role: endpoints -`, + Golden: "Any_takes_precedence_over_MatchNames.golden", }, // Test that IgnoreNamespaceSelectors overrides Any and MatchNames { @@ -399,12 +362,7 @@ func TestNamespaceSetCorrectly(t *testing.T) { }, }, IgnoreNamespaceSelectors: true, - Expected: `kubernetes_sd_configs: -- role: endpoints - namespaces: - names: - - default -`, + Golden: "IgnoreNamespaceSelectors_overrides_Any_and_MatchNames.golden", }, } @@ -431,7 +389,7 @@ func TestNamespaceSetCorrectly(t *testing.T) { c := cg.generateK8SSDConfig(tc.ServiceMonitor.Spec.NamespaceSelector, tc.ServiceMonitor.Namespace, nil, nil, kubernetesSDRoleEndpoint, attachMetaConfig) s, err := yaml.Marshal(yaml.MapSlice{c}) require.NoError(t, err) - require.Equal(t, tc.Expected, string(s)) + golden.Assert(t, string(s), tc.Golden) } } @@ -474,16 +432,7 @@ func TestNamespaceSetCorrectlyForPodMonitor(t *testing.T) { s, err := yaml.Marshal(yaml.MapSlice{c}) require.NoError(t, err) - expected := `kubernetes_sd_configs: -- role: pod - namespaces: - names: - - test - attach_metadata: - node: true -` - - require.Equal(t, expected, string(s)) + golden.Assert(t, string(s), "NamespaceSetCorrectlyForPodMonitor.golden") } func TestProbeStaticTargetsConfigGenerationWithLabelEnforce(t *testing.T) { @@ -547,50 +496,7 @@ func TestProbeStaticTargetsConfigGenerationWithLabelEnforce(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - params: - module: - - http_2xx - static_configs: - - targets: - - prometheus.io - - promcon.io - labels: - namespace: custom - static: label - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - source_labels: - - __address__ - target_label: __param_target - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - - target_label: namespace - replacement: default - metric_relabel_configs: - - regex: noisy_labels.* - action: labeldrop - - target_label: namespace - replacement: default -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden") } func TestProbeStaticTargetsConfigGenerationWithJobName(t *testing.T) { @@ -644,45 +550,7 @@ func TestProbeStaticTargetsConfigGenerationWithJobName(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - params: - module: - - http_2xx - static_configs: - - targets: - - prometheus.io - - promcon.io - labels: - namespace: default - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - target_label: job - replacement: blackbox - - source_labels: - - __address__ - target_label: __param_target - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "ProbeStaticTargetsConfigGenerationWithJobName.golden") } func TestProbeStaticTargetsConfigGenerationWithoutModule(t *testing.T) { @@ -735,42 +603,7 @@ func TestProbeStaticTargetsConfigGenerationWithoutModule(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - static_configs: - - targets: - - prometheus.io - - promcon.io - labels: - namespace: default - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - target_label: job - replacement: blackbox - - source_labels: - - __address__ - target_label: __param_target - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "ProbeStaticTargetsConfigGenerationWithoutModule.golden") } func TestProbeIngressSDConfigGeneration(t *testing.T) { @@ -835,79 +668,12 @@ func TestProbeIngressSDConfigGeneration(t *testing.T) { ) require.NoError(t, err) - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - params: - module: - - http_2xx - kubernetes_sd_configs: - - role: ingress - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_ingress_label_prometheus_io_probe - - __meta_kubernetes_ingress_labelpresent_prometheus_io_probe - regex: (true);true - - source_labels: - - __meta_kubernetes_ingress_scheme - - __address__ - - __meta_kubernetes_ingress_path - separator: ; - regex: (.+);(.+);(.+) - target_label: __param_target - replacement: ${1}://${2}${3} - action: replace - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_ingress_name - target_label: ingress - - source_labels: - - __address__ - separator: ; - regex: (.*) - target_label: __tmp_ingress_address - replacement: $1 - action: replace - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - - target_label: foo - replacement: bar - action: replace - - source_labels: - - __param_target - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "ProbeIngressSDConfigGeneration.golden") } func TestProbeIngressSDConfigGenerationWithShards(t *testing.T) { p := defaultPrometheus() - p.Spec.Shards = pointer.Int32(2) + p.Spec.Shards = ptr.To(int32(2)) cg := mustNewConfigGenerator(t, p) cfg, err := cg.GenerateServerConfiguration( @@ -967,74 +733,7 @@ func TestProbeIngressSDConfigGenerationWithShards(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - params: - module: - - http_2xx - kubernetes_sd_configs: - - role: ingress - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_ingress_label_prometheus_io_probe - - __meta_kubernetes_ingress_labelpresent_prometheus_io_probe - regex: (true);true - - source_labels: - - __meta_kubernetes_ingress_scheme - - __address__ - - __meta_kubernetes_ingress_path - separator: ; - regex: (.+);(.+);(.+) - target_label: __param_target - replacement: ${1}://${2}${3} - action: replace - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_ingress_name - target_label: ingress - - source_labels: - - __address__ - separator: ; - regex: (.*) - target_label: __tmp_ingress_address - replacement: $1 - action: replace - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - - target_label: foo - replacement: bar - action: replace - - source_labels: - - __param_target - target_label: __tmp_hash - modulus: 2 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "ProbeIngressSDConfigGenerationWithShards.golden") } func TestProbeIngressSDConfigGenerationWithLabelEnforce(t *testing.T) { @@ -1099,79 +798,7 @@ func TestProbeIngressSDConfigGenerationWithLabelEnforce(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - params: - module: - - http_2xx - kubernetes_sd_configs: - - role: ingress - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_ingress_label_prometheus_io_probe - - __meta_kubernetes_ingress_labelpresent_prometheus_io_probe - regex: (true);true - - source_labels: - - __meta_kubernetes_ingress_scheme - - __address__ - - __meta_kubernetes_ingress_path - separator: ; - regex: (.+);(.+);(.+) - target_label: __param_target - replacement: ${1}://${2}${3} - action: replace - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_ingress_name - target_label: ingress - - source_labels: - - __address__ - separator: ; - regex: (.*) - target_label: __tmp_ingress_address - replacement: $1 - action: replace - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - - target_label: foo - replacement: bar - action: replace - - target_label: namespace - replacement: default - - source_labels: - - __param_target - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - target_label: namespace - replacement: default -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "ProbeIngressSDConfigGenerationWithLabelEnforce.golden") } func TestK8SSDConfigGeneration(t *testing.T) { @@ -1193,17 +820,12 @@ func TestK8SSDConfigGeneration(t *testing.T) { testcases := []struct { apiserverConfig *monitoringv1.APIServerConfig store *assets.Store - expected string + golden string }{ { nil, nil, - `kubernetes_sd_configs: -- role: endpoints - namespaces: - names: - - test -`, + "K8SSDConfigGenerationFirst.golden", }, { &monitoringv1.APIServerConfig{ @@ -1223,18 +845,7 @@ func TestK8SSDConfigGeneration(t *testing.T) { OAuth2Assets: map[string]assets.OAuth2Credentials{}, TokenAssets: map[string]assets.Token{}, }, - `kubernetes_sd_configs: -- role: endpoints - namespaces: - names: - - test - api_server: example.com - basic_auth: - username: foo - password: bar - bearer_token: bearer_token - bearer_token_file: bearer_token_file -`, + "K8SSDConfigGenerationTwo.golden", }, } @@ -1267,7 +878,7 @@ func TestK8SSDConfigGeneration(t *testing.T) { ) s, err := yaml.Marshal(yaml.MapSlice{c}) require.NoError(t, err) - require.Equal(t, tc.expected, string(s)) + golden.Assert(t, string(s), tc.golden) } } @@ -1305,118 +916,24 @@ func TestAlertmanagerBearerToken(t *testing.T) { nil, ) require.NoError(t, err) - - // If this becomes an endless sink of maintenance, then we should just - // change this to check that just the `bearer_token_file` is set with - // something like json-path. - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - bearer_token_file: /some/file/on/disk - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "AlertmanagerBearerToken.golden") } func TestAlertmanagerBasicAuth(t *testing.T) { for _, tc := range []struct { - name string - version string - expectedConfig string + name string + version string + golden string }{ { name: "Valid Prom Version", version: "2.26.0", - expectedConfig: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - basic_auth: - username: bob - password: alice - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -`, + golden: "AlertmanagerBasicAuth_Valid_Prom_Version.golden", }, { name: "Invalid Prom Version", version: "2.25.0", - expectedConfig: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -`, + golden: "AlertmanagerBasicAuth_Invalid_Prom_Version.golden", }, } { @@ -1487,7 +1004,87 @@ alerting: t.Fatal(err) } - require.Equal(t, tc.expectedConfig, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) + } +} + +func TestAlertmanagerSigv4(t *testing.T) { + for _, tc := range []struct { + name string + version string + golden string + }{ + { + name: "Valid Prom Version", + version: "2.48.0", + golden: "AlertmanagerSigv4_Valid_Prom_Version.golden", + }, + { + name: "Invalid Prom Version", + version: "2.47.0", + golden: "AlertmanagerSigv4_Invalid_Prom_Version.golden", + }, + } { + p := defaultPrometheus() + p.Spec.Version = tc.version + p.Spec.Alerting = &monitoringv1.AlertingSpec{ + Alertmanagers: []monitoringv1.AlertmanagerEndpoints{ + { + Name: "alertmanager-main", + Namespace: "default", + Port: intstr.FromString("web"), + Sigv4: &monitoringv1.Sigv4{ + Profile: "profilename", + RoleArn: "arn:aws:iam::123456789012:instance-profile/prometheus", + AccessKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "sigv4-secret", + }, + Key: "access-key", + }, + SecretKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "sigv4-secret", + }, + Key: "secret-key", + }, + Region: "us-central-0", + }, + }, + }, + } + + cg := mustNewConfigGenerator(t, p) + cfg, err := cg.GenerateServerConfiguration( + context.Background(), + p.Spec.EvaluationInterval, + p.Spec.QueryLogFile, + p.Spec.RuleSelector, + p.Spec.Exemplars, + p.Spec.TSDB, + p.Spec.Alerting, + p.Spec.RemoteRead, + nil, + nil, + nil, + nil, + &assets.Store{ + SigV4Assets: map[string]assets.SigV4Credentials{ + "alertmanager/auth/0": { + AccessKeyID: "access-key", + SecretKeyID: "secret-key", + }, + }, + }, + nil, + nil, + nil, + nil, + ) + if err != nil { + t.Fatal(err) + } + golden.Assert(t, string(cfg), tc.golden) } } @@ -1525,42 +1122,7 @@ func TestAlertmanagerAPIVersion(t *testing.T) { nil, ) require.NoError(t, err) - - // If this becomes an endless sink of maintenance, then we should just - // change this to check that just the `api_version` is set with - // something like json-path. - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - api_version: v2 - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "AlertmanagerAPIVersion.golden") } func TestAlertmanagerTimeoutConfig(t *testing.T) { @@ -1572,7 +1134,7 @@ func TestAlertmanagerTimeoutConfig(t *testing.T) { Namespace: "default", Port: intstr.FromString("web"), APIVersion: "v2", - Timeout: (*monitoringv1.Duration)(pointer.String("60s")), + Timeout: (*monitoringv1.Duration)(ptr.To("60s")), }, }, } @@ -1598,165 +1160,34 @@ func TestAlertmanagerTimeoutConfig(t *testing.T) { nil, ) require.NoError(t, err) - - // If this becomes an endless sink of maintenance, then we should just - // change this to check that just the `api_version` is set with - // something like json-path. - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - timeout: 60s - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - api_version: v2 - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "AlertmanagerTimeoutConfig.golden") } func TestAlertmanagerEnableHttp2(t *testing.T) { - expectedWithHTTP2Unsupported := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - api_version: v2 - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -` - - expectedWithHTTP2Disabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - enable_http2: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - api_version: v2 - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -` - - expectedWithHTTP2Enabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - enable_http2: true - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - api_version: v2 - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -` - for _, tc := range []struct { version string - expected string enableHTTP2 bool + golden string }{ { version: "v2.34.0", enableHTTP2: false, - expected: expectedWithHTTP2Unsupported, + golden: "AlertmanagerEnableHttp2_false_expectedWithHTTP2Unsupported.golden", }, { version: "v2.34.0", enableHTTP2: true, - expected: expectedWithHTTP2Unsupported, + golden: "AlertmanagerEnableHttp2_true_expectedWithHTTP2Unsupported.golden", }, { version: "v2.35.0", enableHTTP2: true, - expected: expectedWithHTTP2Enabled, + golden: "AlertmanagerEnableHttp2_true_expectedWithHTTP2Enabled.golden", }, { version: "v2.35.0", enableHTTP2: false, - expected: expectedWithHTTP2Disabled, + golden: "AlertmanagerEnableHttp2_false_expectedWithHTTP2Enabled.golden", }, } { t.Run(fmt.Sprintf("%s TestAlertmanagerEnableHttp2(%t)", tc.version, tc.enableHTTP2), func(t *testing.T) { @@ -1795,7 +1226,7 @@ alerting: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } @@ -1820,21 +1251,7 @@ func TestAdditionalScrapeConfigs(t *testing.T) { nil, nil, &assets.Store{}, - []byte(`- job_name: prometheus - scrape_interval: 15s - static_configs: - - targets: ['localhost:9090'] -- job_name: gce_app_bar - scrape_interval: 5s - gce_sd_config: - - project: foo - zone: us-central1 - relabel_configs: - - action: keep - source_labels: - - __meta_gce_label_app - regex: my_app -`), + golden.Get(t, "TestAdditionalScrapeConfigsAdditionalScrapeConfig.golden"), nil, nil, nil, @@ -1845,117 +1262,31 @@ func TestAdditionalScrapeConfigs(t *testing.T) { } testCases := []struct { - name string - result string - expected string + name string + result string + golden string }{ { name: "unsharded prometheus", result: getCfg(nil), - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: prometheus - scrape_interval: 15s - static_configs: - - targets: - - localhost:9090 -- job_name: gce_app_bar - scrape_interval: 5s - gce_sd_config: - - project: foo - zone: us-central1 - relabel_configs: - - action: keep - source_labels: - - __meta_gce_label_app - regex: my_app -`, + golden: "AdditionalScrapeConfigs_unsharded_prometheus.golden", }, { name: "one prometheus shard", - result: getCfg(pointer.Int32(1)), - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: prometheus - scrape_interval: 15s - static_configs: - - targets: - - localhost:9090 -- job_name: gce_app_bar - scrape_interval: 5s - gce_sd_config: - - project: foo - zone: us-central1 - relabel_configs: - - action: keep - source_labels: - - __meta_gce_label_app - regex: my_app -`, + result: getCfg(ptr.To(int32(1))), + golden: "AdditionalScrapeConfigs_one_prometheus_shard.golden", }, { name: "sharded prometheus", - result: getCfg(pointer.Int32(3)), - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: prometheus - scrape_interval: 15s - static_configs: - - targets: - - localhost:9090 - relabel_configs: - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 3 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep -- job_name: gce_app_bar - scrape_interval: 5s - gce_sd_config: - - project: foo - zone: us-central1 - relabel_configs: - - action: keep - source_labels: - - __meta_gce_label_app - regex: my_app - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 3 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep -`, + result: getCfg(ptr.To(int32(3))), + golden: "AdditionalScrapeConfigs_sharded prometheus.golden", }, } for _, tt := range testCases { t.Run(tt.name, func(t *testing.T) { - require.Equal(t, tt.result, tt.expected) - }, - ) + golden.Assert(t, tt.result, tt.golden) + }) } } @@ -1987,51 +1318,12 @@ func TestAdditionalAlertRelabelConfigs(t *testing.T) { nil, &assets.Store{}, nil, - []byte(`- action: drop - source_labels: [__meta_kubernetes_node_name] - regex: spot-(.+) - -`), + golden.Get(t, "AdditionalAlertRelabelConfigs.golden"), nil, nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - - action: drop - source_labels: - - __meta_kubernetes_node_name - regex: spot-(.+) - alertmanagers: - - path_prefix: / - scheme: http - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "AdditionalAlertRelabelConfigs_Expected.golden") } func TestNoEnforcedNamespaceLabelServiceMonitor(t *testing.T) { @@ -2100,97 +1392,7 @@ func TestNoEnforcedNamespaceLabelServiceMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/test/0 - honor_labels: true - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_service_label_foo - - __meta_kubernetes_service_labelpresent_foo - regex: (bar);true - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: https-metrics - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: https-metrics - - source_labels: - - __address__ - target_label: __address__ - regex: (.+)(?::d+) - replacement: $1:9537 - action: replace - - target_label: job - replacement: crio - action: replace - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - source_labels: - - __name__ - regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s) - action: drop -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "NoEnforcedNamespaceLabelServiceMonitor_Expected.golden") } func TestServiceMonitorWithEndpointSliceEnable(t *testing.T) { @@ -2262,103 +1464,7 @@ func TestServiceMonitorWithEndpointSliceEnable(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/test/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpointslice - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_service_label_foo - - __meta_kubernetes_service_labelpresent_foo - regex: (bar);true - - action: keep - source_labels: - - __meta_kubernetes_service_label_alpha - - __meta_kubernetes_service_labelpresent_alpha - regex: (beta|gamma);true - - action: keep - source_labels: - - __meta_kubernetes_endpointslice_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpointslice_address_target_kind - - __meta_kubernetes_endpointslice_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpointslice_address_target_kind - - __meta_kubernetes_endpointslice_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __meta_kubernetes_pod_ready - regex: (.*) - replacement: $1 - action: replace - - target_label: ns-key - replacement: default - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - source_labels: - - pod_name - target_label: ns-key - regex: my-job-pod-.+ - action: drop - - target_label: ns-key - replacement: default -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "TestServiceMonitorWithEndpointSliceEnable_Expected.golden") } func TestEnforcedNamespaceLabelPodMonitor(t *testing.T) { @@ -2421,84 +1527,7 @@ func TestEnforcedNamespaceLabelPodMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_pod_label_env - target_label: env - regex: (.+) - replacement: ${1} - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __meta_kubernetes_pod_ready - regex: (.*) - replacement: $1 - action: replace - - target_label: ns-key - replacement: pod-monitor-ns - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - source_labels: - - pod_name - target_label: my-ns - regex: my-job-pod-.+ - action: drop - - target_label: ns-key - replacement: pod-monitor-ns -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "EnforcedNamespaceLabelPodMonitor_Expected.golden") } func TestEnforcedNamespaceLabelOnExcludedPodMonitor(t *testing.T) { @@ -2572,80 +1601,7 @@ func TestEnforcedNamespaceLabelOnExcludedPodMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_pod_label_env - target_label: env - regex: (.+) - replacement: ${1} - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __meta_kubernetes_pod_ready - regex: (.*) - replacement: $1 - action: replace - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - source_labels: - - pod_name - target_label: my-ns - regex: my-job-pod-.+ - action: drop -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden") } func TestEnforcedNamespaceLabelServiceMonitor(t *testing.T) { @@ -2716,103 +1672,7 @@ func TestEnforcedNamespaceLabelServiceMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/test/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_service_label_foo - - __meta_kubernetes_service_labelpresent_foo - regex: (bar);true - - action: keep - source_labels: - - __meta_kubernetes_service_label_alpha - - __meta_kubernetes_service_labelpresent_alpha - regex: (beta|gamma);true - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __meta_kubernetes_pod_ready - regex: (.*) - replacement: $1 - action: replace - - target_label: ns-key - replacement: default - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - source_labels: - - pod_name - target_label: ns-key - regex: my-job-pod-.+ - action: drop - - target_label: ns-key - replacement: default -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "EnforcedNamespaceLabelServiceMonitor_Expected.golden") } func TestEnforcedNamespaceLabelOnExcludedServiceMonitor(t *testing.T) { @@ -2890,94 +1750,7 @@ func TestEnforcedNamespaceLabelOnExcludedServiceMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/service-monitor-ns/servicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - service-monitor-ns - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_service_label_foo - - __meta_kubernetes_service_labelpresent_foo - regex: (bar);true - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __meta_kubernetes_pod_ready - regex: (.*) - replacement: $1 - action: replace - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - source_labels: - - pod_name - target_label: ns-key - regex: my-job-pod-.+ - action: drop -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden") } func TestAdditionalAlertmanagers(t *testing.T) { @@ -3017,41 +1790,7 @@ func TestAdditionalAlertmanagers(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -alerting: - alert_relabel_configs: - - action: labeldrop - regex: prometheus_replica - alertmanagers: - - path_prefix: / - scheme: http - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - relabel_configs: - - action: keep - source_labels: - - __meta_kubernetes_service_name - regex: alertmanager-main - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - static_configs: - - targets: - - localhost -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "TestAdditionalAlertmanagers_Expected.golden") } func TestSettingHonorTimestampsInServiceMonitor(t *testing.T) { @@ -3095,90 +1834,7 @@ func TestSettingHonorTimestampsInServiceMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - honor_timestamps: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_label_env - target_label: env - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "SettingHonorTimestampsInServiceMonitor.golden") } func TestSettingHonorTimestampsInPodMonitor(t *testing.T) { @@ -3222,71 +1878,7 @@ func TestSettingHonorTimestampsInPodMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/default/testpodmonitor1/0 - honor_labels: false - honor_timestamps: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_pod_label_env - target_label: env - regex: (.+) - replacement: ${1} - - target_label: job - replacement: default/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "SettingHonorTimestampsInPodMonitor.golden") } func TestHonorTimestampsOverriding(t *testing.T) { @@ -3331,90 +1923,7 @@ func TestHonorTimestampsOverriding(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - honor_timestamps: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_label_env - target_label: env - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "HonorTimestampsOverriding.golden") } func TestSettingHonorLabels(t *testing.T) { @@ -3461,89 +1970,7 @@ func TestSettingHonorLabels(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: true - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_label_env - target_label: env - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "SettingHonorLabels.golden") } func TestHonorLabelsOverriding(t *testing.T) { @@ -3591,89 +2018,7 @@ func TestHonorLabelsOverriding(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_label_env - target_label: env - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "HonorLabelsOverriding.golden") } func TestTargetLabels(t *testing.T) { @@ -3716,89 +2061,7 @@ func TestTargetLabels(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_label_env - target_label: env - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "TargetLabels.golden") } func TestEndpointOAuth2(t *testing.T) { @@ -3825,25 +2088,13 @@ func TestEndpointOAuth2(t *testing.T) { }, } - expectedCfg := strings.TrimSpace(` -oauth2: - client_id: test_client_id - client_secret: test_client_secret - token_url: http://test.url - scopes: - - scope 1 - - scope 2 - endpoint_params: - param1: value1 - param2: value2`) - testCases := []struct { name string sMons map[string]*monitoringv1.ServiceMonitor pMons map[string]*monitoringv1.PodMonitor probes map[string]*monitoringv1.Probe oauth2Credentials map[string]assets.OAuth2Credentials - expectedCfg string + golden string }{ { name: "service monitor with oauth2", @@ -3872,7 +2123,7 @@ oauth2: ClientSecret: "test_client_secret", }, }, - expectedCfg: expectedCfg, + golden: "service_monitor_with_oauth2.golden", }, { name: "pod monitor with oauth2", @@ -3901,7 +2152,7 @@ oauth2: ClientSecret: "test_client_secret", }, }, - expectedCfg: expectedCfg, + golden: "pod_monitor_with_oauth2.golden", }, { name: "probe monitor with oauth2", @@ -3930,7 +2181,7 @@ oauth2: ClientSecret: "test_client_secret", }, }, - expectedCfg: expectedCfg, + golden: "probe_monitor_with_oauth2.golden", }, } @@ -3964,11 +2215,7 @@ oauth2: nil, ) require.NoError(t, err) - result := string(cfg) - - if !strings.Contains(result, tt.expectedCfg) { - t.Fatalf("expected Prometheus configuration to contain:\n %s\nFull config:\n %s", tt.expectedCfg, result) - } + golden.Assert(t, string(cfg), tt.golden) }) } } @@ -4016,89 +2263,7 @@ func TestPodTargetLabels(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_pod_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_pod_label_env - target_label: env - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "PodTargetLabels.golden") } func TestPodTargetLabelsFromPodMonitor(t *testing.T) { @@ -4144,70 +2309,7 @@ func TestPodTargetLabelsFromPodMonitor(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/default/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_label_example - target_label: example - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_pod_label_env - target_label: env - regex: (.+) - replacement: ${1} - - target_label: job - replacement: default/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "PodTargetLabelsFromPodMonitor.golden") } func TestPodTargetLabelsFromPodMonitorAndGlobal(t *testing.T) { @@ -4254,70 +2356,7 @@ func TestPodTargetLabelsFromPodMonitorAndGlobal(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/default/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_label_local - target_label: local - regex: (.+) - replacement: ${1} - - source_labels: - - __meta_kubernetes_pod_label_global - target_label: global - regex: (.+) - replacement: ${1} - - target_label: job - replacement: default/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "PodTargetLabelsFromPodMonitorAndGlobal.golden") } func TestEmptyEndpointPorts(t *testing.T) { @@ -4362,80 +2401,7 @@ func TestEmptyEndpointPorts(t *testing.T) { nil, ) require.NoError(t, err) - - // If this becomes an endless sink of maintenance, then we should just - // change this to check that just the `bearer_token_file` is set with - // something like json-path. - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/test/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_service_label_foo - - __meta_kubernetes_service_labelpresent_foo - regex: (bar);true - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "EmptyEndpointPorts.golden") } func generateTestConfig(t *testing.T, version string) ([]byte, error) { @@ -4462,7 +2428,7 @@ func generateTestConfig(t *testing.T, version string) ([]byte, error) { "label2": "value2", }, Version: version, - Replicas: func(i int32) *int32 { return &i }(1), + Replicas: ptr.To(int32(1)), ServiceMonitorSelector: &metav1.LabelSelector{ MatchLabels: map[string]string{ "group": "group1", @@ -4930,173 +2896,30 @@ func TestHonorTimestamps(t *testing.T) { } func TestSampleLimits(t *testing.T) { - expectNoLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - sample_limit: %d - metric_relabel_configs: [] -` - for _, tc := range []struct { enforcedLimit int limit int - expected string + golden string }{ { enforcedLimit: -1, limit: -1, - expected: expectNoLimit, + golden: "SampleLimits_NoLimit.golden", }, { enforcedLimit: 1000, limit: -1, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "SampleLimits_Limit-1.golden", }, { enforcedLimit: 1000, limit: 2000, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "SampleLimits_Limit2000.golden", }, { enforcedLimit: 1000, limit: 500, - expected: fmt.Sprintf(expectLimit, 500), + golden: "SampleLimits_Limit500.golden", }, } { t.Run(fmt.Sprintf("enforcedlimit(%d) limit(%d)", tc.enforcedLimit, tc.limit), func(t *testing.T) { @@ -5151,208 +2974,66 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } func TestTargetLimits(t *testing.T) { - expectNoLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - target_limit: %d - metric_relabel_configs: [] -` - for _, tc := range []struct { version string enforcedLimit int limit int expected string + golden string }{ { version: "v2.15.0", enforcedLimit: -1, limit: -1, - expected: expectNoLimit, + golden: "TargetLimits-1_Versionv2.15.0.golden", }, { version: "v2.21.0", enforcedLimit: -1, limit: -1, - expected: expectNoLimit, + golden: "TargetLimits-1_Versionv2.21.0.golden", }, { version: "v2.15.0", enforcedLimit: 1000, limit: -1, - expected: expectNoLimit, + golden: "TargetLimits-1_Versionv2.15.0.golden", }, { version: "v2.21.0", enforcedLimit: 1000, limit: -1, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "TargetLimits-1_Versionv2.21.0_Enforce1000.golden", }, { version: "v2.15.0", enforcedLimit: 1000, limit: 2000, - expected: expectNoLimit, + golden: "TargetLimits2000_Versionv2.15.0_Enforce1000.golden", }, { version: "v2.21.0", enforcedLimit: 1000, limit: 2000, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "TargetLimits2000_Versionv2.21.0_Enforce1000.golden", }, { version: "v2.15.0", enforcedLimit: 1000, limit: 500, - expected: expectNoLimit, + golden: "TargetLimits500_Versionv2.15.0_Enforce1000.golden", }, { version: "v2.21.0", enforcedLimit: 1000, limit: 500, - expected: fmt.Sprintf(expectLimit, 500), + golden: "TargetLimits1000_Versionv2.21.0_Enforce1000.golden", }, } { t.Run(fmt.Sprintf("%s enforcedlimit(%d) limit(%d)", tc.version, tc.enforcedLimit, tc.limit), func(t *testing.T) { @@ -5409,7 +3090,7 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } @@ -5418,7 +3099,7 @@ func TestRemoteReadConfig(t *testing.T) { for _, tc := range []struct { version string remoteRead monitoringv1.RemoteReadSpec - expected string + golden string expectedErr error }{ { @@ -5431,25 +3112,7 @@ func TestRemoteReadConfig(t *testing.T) { EndpointParams: map[string]string{"param": "value"}, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s - oauth2: - client_id: client-id - client_secret: client-secret - token_url: http://token-url - scopes: - - scope1 - endpoint_params: - param: value -`, + golden: "RemoteReadConfig_v2.27.1.golden", }, { version: "v2.26.0", @@ -5461,127 +3124,54 @@ remote_read: EndpointParams: map[string]string{"param": "value"}, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s -`, + golden: "RemoteReadConfig_v2.26.0.golden", }, { version: "v2.25.0", remoteRead: monitoringv1.RemoteReadSpec{ URL: "http://example.com", - FollowRedirects: pointer.Bool(true), + FollowRedirects: ptr.To(true), }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s -`, + golden: "RemoteReadConfig_v2.25.0.golden", }, { version: "v2.26.0", remoteRead: monitoringv1.RemoteReadSpec{ URL: "http://example.com", - FollowRedirects: pointer.Bool(false), - }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s - follow_redirects: false -`, + FollowRedirects: ptr.To(false), + }, + golden: "RemoteReadConfig_v2.26.0_NotFollowRedirects.golden", }, { version: "v2.26.0", remoteRead: monitoringv1.RemoteReadSpec{ URL: "http://example.com", - FilterExternalLabels: pointer.Bool(true), + FilterExternalLabels: ptr.To(true), }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s -`, + golden: "RemoteReadConfig_v2.26.0_FilterExternalLabels.golden", }, { version: "v2.34.0", remoteRead: monitoringv1.RemoteReadSpec{ URL: "http://example.com", }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s -`, + golden: "RemoteReadConfig_v2.34.0.golden", }, { version: "v2.34.0", remoteRead: monitoringv1.RemoteReadSpec{ URL: "http://example.com", - FilterExternalLabels: pointer.Bool(false), - }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s - filter_external_labels: false -`, + FilterExternalLabels: ptr.To(false), + }, + golden: "RemoteReadConfig_v2.34.0_NotFilterExternalLabels.golden", }, { version: "v2.34.0", remoteRead: monitoringv1.RemoteReadSpec{ URL: "http://example.com", - FilterExternalLabels: pointer.Bool(true), - }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s - filter_external_labels: true -`, + FilterExternalLabels: ptr.To(true), + }, + golden: "RemoteReadConfig_v2.34.0_FilterExternalLabels.golden", }, { version: "v2.26.0", @@ -5597,20 +3187,7 @@ remote_read: }, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_read: -- url: http://example.com - remote_timeout: 30s - authorization: - type: Bearer - credentials: secret -`, + golden: "RemoteReadConfig_v2.26.0_AuthorizationSafe.golden", }, } { t.Run(fmt.Sprintf("version=%s", tc.version), func(t *testing.T) { @@ -5655,7 +3232,7 @@ remote_read: return } require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } @@ -5665,7 +3242,7 @@ func TestRemoteWriteConfig(t *testing.T) { for _, tc := range []struct { version string remoteWrite monitoringv1.RemoteWriteSpec - expected string + golden string expectedErr error }{ { @@ -5687,25 +3264,7 @@ func TestRemoteWriteConfig(t *testing.T) { SendInterval: "1m", }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - min_backoff: 1s - max_backoff: 10s -`, + golden: "RemoteWriteConfig_v2.22.0_1.golden", }, { version: "v2.23.0", @@ -5726,28 +3285,7 @@ remote_write: SendInterval: "1m", }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - min_backoff: 1s - max_backoff: 10s - metadata_config: - send: false - send_interval: 1m -`, + golden: "RemoteWriteConfig_v2.23.0_1.golden", }, { version: "v2.23.0", @@ -5767,28 +3305,7 @@ remote_write: SendInterval: "1m", }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - min_backoff: 1s - max_backoff: 10s - metadata_config: - send: false - send_interval: 1m -`, + golden: "RemoteWriteConfig_v2.23.0_2.golden", }, { version: "v2.10.0", @@ -5809,26 +3326,7 @@ remote_write: SendInterval: "1m", }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - max_retries: 3 - min_backoff: 1s - max_backoff: 10s -`, + golden: "RemoteWriteConfig_v2.10.0_1.golden", }, { version: "v2.27.1", @@ -5840,25 +3338,20 @@ remote_write: EndpointParams: map[string]string{"param": "value"}, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - oauth2: - client_id: client-id - client_secret: client-secret - token_url: http://token-url - scopes: - - scope1 - endpoint_params: - param: value -`, + golden: "RemoteWriteConfig_v2.27.1_1.golden", + }, + { + version: "v2.45.0", + remoteWrite: monitoringv1.RemoteWriteSpec{ + URL: "http://example.com", + AzureAD: &monitoringv1.AzureAD{ + Cloud: ptr.To("AzureGovernment"), + ManagedIdentity: monitoringv1.ManagedIdentity{ + ClientID: "client-id", + }, + }, + }, + golden: "RemoteWriteConfig_v2.45.0_1.golden", }, { version: "v2.26.0", @@ -5874,20 +3367,7 @@ remote_write: }, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - authorization: - type: Bearer - credentials: secret -`, + golden: "RemoteWriteConfig_v2.26.0_2.golden", }, { version: "v2.26.0", @@ -5925,34 +3405,7 @@ remote_write: SendInterval: "1m", }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - sigv4: - region: us-central-0 - access_key: access-key - secret_key: secret-key - profile: profilename - role_arn: arn:aws:iam::123456789012:instance-profile/prometheus - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - min_backoff: 1s - max_backoff: 10s - metadata_config: - send: false - send_interval: 1m -`, + golden: "RemoteWriteConfig_3.golden", }, { version: "v2.26.0", @@ -5961,17 +3414,7 @@ remote_write: RemoteTimeout: "1s", Sigv4: nil, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 1s -`, + golden: "RemoteWriteConfig_v2.26.0_3.golden", }, { version: "v2.26.0", @@ -5980,18 +3423,7 @@ remote_write: Sigv4: &monitoringv1.Sigv4{}, RemoteTimeout: "1s", }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 1s - sigv4: {} -`, + golden: "RemoteWriteConfig_v2.26.0_4.golden", }, { version: "v2.30.0", @@ -6009,26 +3441,7 @@ remote_write: RetryOnRateLimit: true, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - min_backoff: 1s - max_backoff: 10s - retry_on_http_429: true -`, + golden: "RemoteWriteConfig_v2.30.0_2.golden", }, { version: "v2.43.0", @@ -6047,27 +3460,7 @@ remote_write: RetryOnRateLimit: true, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - send_native_histograms: true - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - min_backoff: 1s - max_backoff: 10s - retry_on_http_429: true -`, + golden: "RemoteWriteConfig_v2.43.0_2.golden", }, { version: "v2.39.0", @@ -6086,26 +3479,7 @@ remote_write: RetryOnRateLimit: true, }, }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -remote_write: -- url: http://example.com - remote_timeout: 30s - queue_config: - capacity: 1000 - min_shards: 1 - max_shards: 10 - max_samples_per_send: 100 - batch_send_deadline: 20s - min_backoff: 1s - max_backoff: 10s - retry_on_http_429: true -`, + golden: "RemoteWriteConfig_v2.39.0_1.golden", }, } { t.Run(fmt.Sprintf("version=%s", tc.version), func(t *testing.T) { @@ -6160,208 +3534,69 @@ remote_write: return } require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } func TestLabelLimits(t *testing.T) { - expectNoLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - label_limit: %d - metric_relabel_configs: [] -` - for _, tc := range []struct { version string enforcedLabelLimit int labelLimit int - expected string + golden string }{ { version: "v2.26.0", enforcedLabelLimit: -1, labelLimit: -1, - expected: expectNoLimit, + golden: "LabelLimits_NoLimit_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelLimit: -1, labelLimit: -1, - expected: expectNoLimit, + + golden: "LabelLimits_NoLimit_v2.27.0.golden", }, { version: "v2.26.0", enforcedLabelLimit: 1000, labelLimit: -1, - expected: expectNoLimit, + + golden: "LabelLimits_NoLimit_v2.26.0_enforceLimit1000.golden", }, { version: "v2.27.0", enforcedLabelLimit: 1000, labelLimit: -1, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "LabelLimits_NoLimit_v2.27.0_enforceLimit1000.golden", }, { version: "v2.26.0", enforcedLabelLimit: 1000, labelLimit: 2000, - expected: expectNoLimit, + + golden: "LabelLimits_Limit2000_v2.26.0_enforceLimit1000.golden", }, { version: "v2.27.0", enforcedLabelLimit: 1000, labelLimit: 2000, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "LabelLimits_Limit2000_v2.27.0_enforceLimit1000.golden", }, { version: "v2.26.0", enforcedLabelLimit: 1000, labelLimit: 500, - expected: expectNoLimit, + + golden: "LabelLimits_Limit500_v2.26.0_enforceLimit1000.golden", }, { version: "v2.27.0", enforcedLabelLimit: 1000, labelLimit: 500, - expected: fmt.Sprintf(expectLimit, 500), + golden: "LabelLimits_Limit500_v2.27.0_enforceLimit1000.golden", }, } { t.Run(fmt.Sprintf("%s enforcedLabelLimit(%d) labelLimit(%d)", tc.version, tc.enforcedLabelLimit, tc.labelLimit), func(t *testing.T) { @@ -6369,7 +3604,7 @@ scrape_configs: p.Spec.CommonPrometheusFields.Version = tc.version if tc.enforcedLabelLimit >= 0 { - p.Spec.EnforcedLabelLimit = pointer.Uint64(uint64(tc.enforcedLabelLimit)) + p.Spec.EnforcedLabelLimit = ptr.To(uint64(tc.enforcedLabelLimit)) } serviceMonitor := monitoringv1.ServiceMonitor{ @@ -6417,170 +3652,65 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } func TestLabelNameLengthLimits(t *testing.T) { - expectNoLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/default/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: default/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/default/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: default/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - label_name_length_limit: %d - metric_relabel_configs: [] -` - for _, tc := range []struct { version string enforcedLabelNameLengthLimit int labelNameLengthLimit int - expected string + golden string }{ { version: "v2.26.0", enforcedLabelNameLengthLimit: -1, labelNameLengthLimit: -1, - expected: expectNoLimit, + golden: "LabelNameLengthLimits_Limit-1_Enforce-1_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelNameLengthLimit: -1, labelNameLengthLimit: -1, - expected: expectNoLimit, + golden: "LabelNameLengthLimits_Limit-1_Enforce-1_v2.27.0.golden", }, { version: "v2.26.0", enforcedLabelNameLengthLimit: 1000, labelNameLengthLimit: -1, - expected: expectNoLimit, + golden: "LabelNameLengthLimits_Limit-1_Enforc1000_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelNameLengthLimit: 1000, labelNameLengthLimit: -1, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "LabelNameLengthLimits_Limit-1_Enforce1000_v2.27.0.golden", }, { version: "v2.26.0", enforcedLabelNameLengthLimit: 1000, labelNameLengthLimit: 2000, - expected: expectNoLimit, + golden: "LabelNameLengthLimits_Limit2000_Enforce1000_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelNameLengthLimit: 1000, labelNameLengthLimit: 2000, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "LabelNameLengthLimits_Limit2000_Enforce1000_v2.27.0.golden", }, { version: "v2.26.0", enforcedLabelNameLengthLimit: 1000, labelNameLengthLimit: 500, - expected: expectNoLimit, + golden: "LabelNameLengthLimits_Limit500_Enforce1000_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelNameLengthLimit: 1000, labelNameLengthLimit: 500, - expected: fmt.Sprintf(expectLimit, 500), + golden: "LabelNameLengthLimits_Limit500_Enforce1000_v2.27.0.golden", }, } { t.Run(fmt.Sprintf("%s enforcedLabelNameLengthLimit(%d) labelNameLengthLimit(%d)", tc.version, tc.enforcedLabelNameLengthLimit, tc.labelNameLengthLimit), func(t *testing.T) { @@ -6588,7 +3718,7 @@ scrape_configs: p.Spec.CommonPrometheusFields.Version = tc.version if tc.enforcedLabelNameLengthLimit >= 0 { - p.Spec.EnforcedLabelNameLengthLimit = pointer.Uint64(uint64(tc.enforcedLabelNameLengthLimit)) + p.Spec.EnforcedLabelNameLengthLimit = ptr.To(uint64(tc.enforcedLabelNameLengthLimit)) } podMonitor := monitoringv1.PodMonitor{ @@ -6636,140 +3766,65 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } func TestLabelValueLengthLimits(t *testing.T) { - expectNoLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - proxy_url: socks://myproxy:9095 - params: - module: - - http_2xx - static_configs: - - targets: - - prometheus.io - - promcon.io - labels: - namespace: default - static: label - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - source_labels: - - __address__ - target_label: __param_target - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - metric_relabel_configs: [] -` - - expectLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/testprobe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - proxy_url: socks://myproxy:9095 - params: - module: - - http_2xx - label_value_length_limit: %d - static_configs: - - targets: - - prometheus.io - - promcon.io - labels: - namespace: default - static: label - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - source_labels: - - __address__ - target_label: __param_target - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: blackbox.exporter.io - metric_relabel_configs: [] -` - for _, tc := range []struct { version string enforcedLabelValueLengthLimit int labelValueLengthLimit int - expected string + golden string }{ { version: "v2.26.0", enforcedLabelValueLengthLimit: -1, labelValueLengthLimit: -1, - expected: expectNoLimit, + golden: "LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelValueLengthLimit: -1, labelValueLengthLimit: -1, - expected: expectNoLimit, + golden: "LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.27.0.golden", }, { version: "v2.26.0", enforcedLabelValueLengthLimit: 1000, labelValueLengthLimit: -1, - expected: expectNoLimit, + golden: "LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelValueLengthLimit: 1000, labelValueLengthLimit: -1, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.27.0.golden", }, { version: "v2.26.0", enforcedLabelValueLengthLimit: 1000, labelValueLengthLimit: 2000, - expected: expectNoLimit, + golden: "LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelValueLengthLimit: 1000, labelValueLengthLimit: 2000, - expected: fmt.Sprintf(expectLimit, 1000), + golden: "LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.27.0.golden", }, { version: "v2.26.0", enforcedLabelValueLengthLimit: 1000, labelValueLengthLimit: 500, - expected: expectNoLimit, + golden: "LabelValueLengthLimits_Enforce1000_LabelValue500_v2.26.0.golden", }, { version: "v2.27.0", enforcedLabelValueLengthLimit: 1000, labelValueLengthLimit: 500, - expected: fmt.Sprintf(expectLimit, 500), + golden: "LabelValueLengthLimits_Enforce1000_LabelValue500_v2.27.0.golden", }, } { t.Run(fmt.Sprintf("%s enforcedLabelValueLengthLimit(%d) labelValueLengthLimit(%d)", tc.version, tc.enforcedLabelValueLengthLimit, tc.labelValueLengthLimit), func(t *testing.T) { @@ -6777,7 +3832,7 @@ scrape_configs: p.Spec.CommonPrometheusFields.Version = tc.version if tc.enforcedLabelValueLengthLimit >= 0 { - p.Spec.EnforcedLabelValueLengthLimit = pointer.Uint64(uint64(tc.enforcedLabelValueLengthLimit)) + p.Spec.EnforcedLabelValueLengthLimit = ptr.To(uint64(tc.enforcedLabelValueLengthLimit)) } probe := monitoringv1.Probe{ @@ -6837,175 +3892,112 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } -func TestBodySizeLimits(t *testing.T) { - expectNoLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectLimit := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - body_size_limit: %s - metric_relabel_configs: [] -` +func TestKeepDroppedTargets(t *testing.T) { + for _, tc := range []struct { + version string + enforcedKeepDroppedTargets *uint64 + keepDroppedTargets *uint64 + golden string + }{ + { + version: "v2.46.0", + enforcedKeepDroppedTargets: ptr.To(uint64(1000)), + keepDroppedTargets: ptr.To(uint64(50)), + golden: "KeepDroppedTargetsNotAddedInConfig.golden", + }, + { + version: "v2.47.0", + enforcedKeepDroppedTargets: ptr.To(uint64(1000)), + keepDroppedTargets: ptr.To(uint64(2000)), + golden: "KeepDroppedTargetsOverridedWithEnforcedValue.golden", + }, + { + version: "v2.47.0", + enforcedKeepDroppedTargets: ptr.To(uint64(1000)), + keepDroppedTargets: ptr.To(uint64(500)), + golden: "KeepDroppedTargets.golden", + }, + } { + t.Run(fmt.Sprintf("%s enforcedKeepDroppedTargets(%d) keepDroppedTargets(%d)", tc.version, tc.enforcedKeepDroppedTargets, tc.keepDroppedTargets), func(t *testing.T) { + p := defaultPrometheus() + p.Spec.CommonPrometheusFields.Version = tc.version + + p.Spec.EnforcedKeepDroppedTargets = tc.enforcedKeepDroppedTargets + + serviceMonitor := monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testservicemonitor1", + Namespace: "default", + Labels: map[string]string{ + "group": "group1", + }, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{ + { + Port: "web", + Interval: "30s", + }, + }, + }, + } + + serviceMonitor.Spec.KeepDroppedTargets = tc.keepDroppedTargets + + cg := mustNewConfigGenerator(t, p) + cfg, err := cg.GenerateServerConfiguration( + context.Background(), + p.Spec.EvaluationInterval, + p.Spec.QueryLogFile, + p.Spec.RuleSelector, + p.Spec.Exemplars, + p.Spec.TSDB, + p.Spec.Alerting, + p.Spec.RemoteRead, + map[string]*monitoringv1.ServiceMonitor{ + "testservicemonitor1": &serviceMonitor, + }, + nil, + nil, + nil, + &assets.Store{}, + nil, + nil, + nil, + nil, + ) + require.NoError(t, err) + golden.Assert(t, string(cfg), tc.golden) + }) + } +} +func TestBodySizeLimits(t *testing.T) { for _, tc := range []struct { version string enforcedBodySizeLimit monitoringv1.ByteSize - expected string expectedErr error + golden string }{ { version: "v2.27.0", enforcedBodySizeLimit: "1000MB", - expected: expectNoLimit, + golden: "BodySizeLimits_enforce1000MB_v2.27.0.golden", }, { version: "v2.28.0", enforcedBodySizeLimit: "1000MB", - expected: fmt.Sprintf(expectLimit, "1000MB"), + golden: "BodySizeLimits_enforce1000MB_v2.28.0.golden", }, { version: "v2.28.0", enforcedBodySizeLimit: "", - expected: expectNoLimit, + golden: "BodySizeLimits_enforce0MB_v2.28.0.golden", }, } { t.Run(fmt.Sprintf("%s enforcedBodySizeLimit(%s)", tc.version, tc.enforcedBodySizeLimit), func(t *testing.T) { @@ -7063,7 +4055,7 @@ scrape_configs: return } require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } @@ -7117,325 +4109,35 @@ func TestMatchExpressionsServiceMonitor(t *testing.T) { ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/test/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_service_label_alpha - - __meta_kubernetes_service_labelpresent_alpha - regex: (beta|gamma);true - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "MatchExpressionsServiceMonitor.golden") } func TestServiceMonitorEndpointFollowRedirects(t *testing.T) { - expectedWithRedirectsUnsupported := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectedWithRedirectsDisabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - follow_redirects: false - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - expectedWithRedirectsEnabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - follow_redirects: true - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - for _, tc := range []struct { version string expected string + golden string followRedirects bool }{ { version: "v2.25.0", followRedirects: false, - expected: expectedWithRedirectsUnsupported, + golden: "ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.25.0.golden", }, { version: "v2.25.0", followRedirects: true, - expected: expectedWithRedirectsUnsupported, + golden: "ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.25.0.golden", }, { version: "v2.28.0", followRedirects: true, - expected: expectedWithRedirectsEnabled, + golden: "ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.28.0.golden", }, { version: "v2.28.0", followRedirects: false, - expected: expectedWithRedirectsDisabled, + golden: "ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.28.0.golden", }, } { t.Run(fmt.Sprintf("%s TestServiceMonitorEndpointFollowRedirects(%t)", tc.version, tc.followRedirects), func(t *testing.T) { @@ -7484,193 +4186,36 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } func TestPodMonitorEndpointFollowRedirects(t *testing.T) { - expectedWithRedirectsUnsupported := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectedWithRedirectsDisabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - follow_redirects: false - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - expectedWithRedirectsEnabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - follow_redirects: true - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - for _, tc := range []struct { version string - expected string + golden string followRedirects bool }{ { version: "v2.25.0", followRedirects: false, - expected: expectedWithRedirectsUnsupported, + golden: "PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.25.0.golden", }, { version: "v2.25.0", followRedirects: true, - expected: expectedWithRedirectsUnsupported, + golden: "PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.25.0.golden", }, { version: "v2.28.0", followRedirects: true, - expected: expectedWithRedirectsEnabled, + golden: "PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.28.0.golden", }, { version: "v2.28.0", followRedirects: false, - expected: expectedWithRedirectsDisabled, + golden: "PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.28.0.golden", }, } { t.Run(fmt.Sprintf("%s TestServiceMonitorEndpointFollowRedirects(%t)", tc.version, tc.followRedirects), func(t *testing.T) { @@ -7720,250 +4265,36 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } func TestServiceMonitorEndpointEnableHttp2(t *testing.T) { - expectedWithHTTP2Unsupported := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectedWithHTTP2Disabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - enable_http2: false - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - expectedWithHTTP2Enabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/testservicemonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - enable_http2: true - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: web - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - for _, tc := range []struct { version string - expected string + golden string enableHTTP2 bool }{ { version: "v2.34.0", enableHTTP2: false, - expected: expectedWithHTTP2Unsupported, + golden: "ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden", }, { version: "v2.34.0", enableHTTP2: true, - expected: expectedWithHTTP2Unsupported, + golden: "ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden", }, { version: "v2.35.0", enableHTTP2: true, - expected: expectedWithHTTP2Enabled, + golden: "ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden", }, { version: "v2.35.0", enableHTTP2: false, - expected: expectedWithHTTP2Disabled, + golden: "ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden", }, } { t.Run(fmt.Sprintf("%s TestServiceMonitorEndpointEnableHttp2(%t)", tc.version, tc.enableHTTP2), func(t *testing.T) { @@ -8012,7 +4343,7 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } @@ -8059,239 +4390,34 @@ func TestPodMonitorPhaseFilter(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/default/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - default - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: test - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: default/testpodmonitor1 - - target_label: endpoint - replacement: test - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "PodMonitorPhaseFilter.golden") } func TestPodMonitorEndpointEnableHttp2(t *testing.T) { - expectedWithHTTP2Unsupported := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - - expectedWithHTTP2Disabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - enable_http2: false - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - expectedWithHTTP2Enabled := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 - honor_labels: false - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - pod-monitor-ns - scrape_interval: 30s - enable_http2: true - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - action: keep - source_labels: - - __meta_kubernetes_pod_container_port_name - regex: web - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - target_label: job - replacement: pod-monitor-ns/testpodmonitor1 - - target_label: endpoint - replacement: web - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: [] -` - for _, tc := range []struct { version string - expected string + golden string enableHTTP2 bool }{ { version: "v2.34.0", enableHTTP2: false, - expected: expectedWithHTTP2Unsupported, + golden: "PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden", }, { version: "v2.34.0", enableHTTP2: true, - expected: expectedWithHTTP2Unsupported, + golden: "PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden", }, { version: "v2.35.0", enableHTTP2: true, - expected: expectedWithHTTP2Enabled, + golden: "PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden", }, { version: "v2.35.0", enableHTTP2: false, - expected: expectedWithHTTP2Disabled, + golden: "PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden", }, } { t.Run(fmt.Sprintf("%s TestServiceMonitorEndpointEnableHttp2(%t)", tc.version, tc.enableHTTP2), func(t *testing.T) { @@ -8340,60 +4466,36 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } func TestStorageSettingMaxExemplars(t *testing.T) { for _, tc := range []struct { - Scenario string - Version string - Exemplars *monitoringv1.Exemplars - ExpectedConfig string + Scenario string + Version string + Exemplars *monitoringv1.Exemplars + Golden string }{ { Scenario: "Exemplars maxSize is set to 5000000", Exemplars: &monitoringv1.Exemplars{ - MaxSize: pointer.Int64(5000000), + MaxSize: ptr.To(int64(5000000)), }, - ExpectedConfig: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -storage: - exemplars: - max_exemplars: 5000000 -`, + Golden: "StorageSettingMaxExemplars_MaxSize5000000.golden", }, { Scenario: "max_exemplars is not set if version is less than v2.29.0", Version: "v2.28.0", Exemplars: &monitoringv1.Exemplars{ - MaxSize: pointer.Int64(5000000), + MaxSize: ptr.To(int64(5000000)), }, - ExpectedConfig: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -`, + Golden: "StorageSettingMaxExemplars_MaxSizeNotSet_v2.29.0.golden", }, { Scenario: "Exemplars maxSize is not set", - ExpectedConfig: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -`, + Golden: "StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden", }, } { t.Run(fmt.Sprintf("case %s", tc.Scenario), func(t *testing.T) { @@ -8426,29 +4528,22 @@ scrape_configs: [] nil, ) require.NoError(t, err) - require.Equal(t, tc.ExpectedConfig, string(cfg)) + golden.Assert(t, string(cfg), tc.Golden) }) } } func TestTSDBConfig(t *testing.T) { for _, tc := range []struct { - name string - p *monitoringv1.Prometheus - version string - tsdb *monitoringv1.TSDBSpec - expected string + name string + p *monitoringv1.Prometheus + version string + tsdb *monitoringv1.TSDBSpec + golden string }{ { - name: "no TSDB config", - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -`, + name: "no TSDB config", + golden: "no_TSDB_config.golden", }, { name: "TSDB config < v2.39.0", @@ -8456,31 +4551,15 @@ scrape_configs: [] tsdb: &monitoringv1.TSDBSpec{ OutOfOrderTimeWindow: monitoringv1.Duration("10m"), }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -`, + golden: "TSDB_config_less_than_v2.39.0.golden", }, { + name: "TSDB config >= v2.39.0", tsdb: &monitoringv1.TSDBSpec{ OutOfOrderTimeWindow: monitoringv1.Duration("10m"), }, - expected: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -storage: - tsdb: - out_of_order_time_window: 10m -`, + golden: "TSDB_config_greater_than_or_equal_to_v2.39.0.golden", }, } { t.Run(tc.name, func(t *testing.T) { @@ -8513,7 +4592,7 @@ storage: nil, ) require.NoError(t, err) - require.Equal(t, tc.expected, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } @@ -8588,101 +4667,7 @@ func TestGenerateRelabelConfig(t *testing.T) { nil, ) require.NoError(t, err) - - expected := `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: serviceMonitor/default/test/0 - honor_labels: false - kubernetes_sd_configs: - - role: endpoints - namespaces: - names: - - default - scrape_interval: 30s - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - action: keep - source_labels: - - __meta_kubernetes_service_label_foo - - __meta_kubernetes_service_labelpresent_foo - regex: (bar);true - - action: keep - source_labels: - - __meta_kubernetes_endpoint_port_name - regex: https-metrics - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Node;(.*) - replacement: ${1} - target_label: node - - source_labels: - - __meta_kubernetes_endpoint_address_target_kind - - __meta_kubernetes_endpoint_address_target_name - separator: ; - regex: Pod;(.*) - replacement: ${1} - target_label: pod - - source_labels: - - __meta_kubernetes_namespace - target_label: namespace - - source_labels: - - __meta_kubernetes_service_name - target_label: service - - source_labels: - - __meta_kubernetes_pod_name - target_label: pod - - source_labels: - - __meta_kubernetes_pod_container_name - target_label: container - - action: drop - source_labels: - - __meta_kubernetes_pod_phase - regex: (Failed|Succeeded) - - source_labels: - - __meta_kubernetes_service_name - target_label: job - replacement: ${1} - - target_label: endpoint - replacement: https-metrics - - source_labels: - - instance - target_label: instance - action: uppercase - - source_labels: - - __address__ - target_label: __address__ - regex: (.+)(?::d+) - replacement: $1:9537 - action: replace - - target_label: job - replacement: crio - action: replace - - source_labels: - - __address__ - target_label: __tmp_hash - modulus: 1 - action: hashmod - - source_labels: - - __tmp_hash - regex: $(SHARD) - action: keep - metric_relabel_configs: - - source_labels: - - __name__ - regex: container_fs* - action: drop -` - - require.Equal(t, expected, string(cfg)) + golden.Assert(t, string(cfg), "GenerateRelabelConfig.golden") } // When adding new test cases the developer should specify a name, a Probe Spec @@ -8691,29 +4676,19 @@ scrape_configs: // case. func TestProbeSpecConfig(t *testing.T) { for _, tc := range []struct { - name string - patchProm func(*monitoringv1.Prometheus) - pbSpec monitoringv1.ProbeSpec - expectedCfg string + name string + patchProm func(*monitoringv1.Prometheus) + pbSpec monitoringv1.ProbeSpec + golden string }{ { name: "empty_probe", + golden: "ProbeSpecConfig_empty_probe.golden", pbSpec: monitoringv1.ProbeSpec{}, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/probe1 - honor_timestamps: true - metrics_path: "" - metric_relabel_configs: [] -`, - }, - { - name: "prober_spec", + }, + { + name: "prober_spec", + golden: "ProbeSpecConfig_prober_spec.golden", pbSpec: monitoringv1.ProbeSpec{ ProberSpec: monitoringv1.ProberSpec{ Scheme: "http", @@ -8722,23 +4697,10 @@ scrape_configs: ProxyURL: "socks://myproxy:9095", }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/probe1 - honor_timestamps: true - metrics_path: /probe - scheme: http - proxy_url: socks://myproxy:9095 - metric_relabel_configs: [] -`, }, { - name: "targets_static_config", + name: "targets_static_config", + golden: "ProbeSpecConfig_targets_static_config.golden", pbSpec: monitoringv1.ProbeSpec{ Targets: monitoringv1.ProbeTargets{ StaticConfig: &monitoringv1.ProbeTargetStaticConfig{ @@ -8758,61 +4720,13 @@ scrape_configs: }, }, }}, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/probe1 - honor_timestamps: true - metrics_path: "" - static_configs: - - targets: - - prometheus.io - - promcon.io - labels: - namespace: default - static: label - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - source_labels: - - __address__ - target_label: __param_target - - source_labels: - - __param_target - target_label: instance - - target_label: __address__ - replacement: "" - - target_label: foo - replacement: bar - action: replace - metric_relabel_configs: [] -`, - }, - { - name: "module_config", + }, + { + name: "module_config", + golden: "ProbeSpecConfig_module_config.golden", pbSpec: monitoringv1.ProbeSpec{ Module: "http_2xx", }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: probe/default/probe1 - honor_timestamps: true - metrics_path: "" - params: - module: - - http_2xx - metric_relabel_configs: [] -`, }, } { t.Run(tc.name, func(t *testing.T) { @@ -8852,36 +4766,28 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expectedCfg, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } // When adding new test cases the developer should specify a name, a ScrapeConfig Spec -// (scSpec) and an expectedConfig. (Optional) It's also possible to specify a +// (scSpec) and an expected config in golden file (.golden file in testdata folder). (Optional) It's also possible to specify a // function (patchProm) that modifies the default Prometheus CR used if necessary for the test // case. func TestScrapeConfigSpecConfig(t *testing.T) { refreshInterval := monitoringv1.Duration("5m") for _, tc := range []struct { - name string - patchProm func(*monitoringv1.Prometheus) - scSpec monitoringv1alpha1.ScrapeConfigSpec - expectedCfg string + name string + patchProm func(*monitoringv1.Prometheus) + scSpec monitoringv1alpha1.ScrapeConfigSpec + golden string }{ { name: "empty_scrape_config", scSpec: monitoringv1alpha1.ScrapeConfigSpec{}, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 -`, + golden: "ScrapeConfigSpecConfig_Empty.golden", }, { name: "static_config", @@ -8895,20 +4801,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - static_configs: - - targets: - - http://localhost:9100 - labels: - label1: value1 -`, + golden: "ScrapeConfigSpecConfig_Static.golden", }, { name: "file_sd_config", @@ -8920,19 +4813,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - file_sd_configs: - - files: - - /tmp/myfile.json - refresh_interval: 5m -`, + golden: "ScrapeConfigSpecConfig_FileSD.golden", }, { name: "http_sd_config", @@ -8944,53 +4825,50 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - http_sd_configs: - - url: http://localhost:9100/sd.json - refresh_interval: 5m -`, + golden: "ScrapeConfigSpecConfig_HTTPSD.golden", + }, + { + name: "kubernetes_sd_config", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{ + { + Role: "node", + }, + }, + }, + golden: "ScrapeConfigSpecConfig_K8SSD.golden", + }, + { + name: "kubernetes_sd_config_with_selectors", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{ + { + Role: "node", + Selectors: []monitoringv1alpha1.K8SSelectorConfig{ + { + Role: "node", + Label: "type=infra", + Field: "spec.unschedulable=false", + }, + }, + }, + }, + }, + golden: "ScrapeConfigSpecConfig_K8SSD_with_Selectors.golden", }, { name: "metrics_path", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - MetricsPath: pointer.String("/metrics"), + MetricsPath: ptr.To("/metrics"), }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - metrics_path: /metrics -`, + golden: "ScrapeConfigSpecConfig_MetricPath.golden", }, { name: "empty_relabel_config", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ RelabelConfigs: []*monitoringv1.RelabelConfig{}, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name -`, + golden: "ScrapeConfigSpecConfig_EmptyRelabelConfig.golden", }, { name: "non_empty_relabel_config", @@ -9005,57 +4883,21 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - relabel_configs: - - source_labels: - - job - target_label: __tmp_prometheus_job_name - - source_labels: - - __address__ - target_label: __address__ - regex: (.+)(?::d+) - replacement: $1:9537 - action: replace -`, + golden: "ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden", }, { name: "honor_timestamp", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - HonorTimestamps: pointer.Bool(true), + HonorTimestamps: ptr.To(true), }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - honor_timestamps: true -`, + golden: "ScrapeConfigSpecConfig_HonorTimeStamp.golden", }, { name: "honor_labels", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - HonorLabels: pointer.Bool(true), + HonorLabels: ptr.To(true), }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - honor_labels: true -`, + golden: "ScrapeConfigSpecConfig_HonorLabels.golden", }, { name: "basic_auth", @@ -9094,23 +4936,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - basic_auth: - username: scrape-bob - password: scrape-alice - http_sd_configs: - - url: http://localhost:9100/sd.json - basic_auth: - username: http-sd-bob - password: http-sd-alice -`, + golden: "ScrapeConfigSpecConfig_BasicAuth.golden", }, { name: "authorization", @@ -9135,23 +4961,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - authorization: - type: Bearer - credentials: scrape-secret - http_sd_configs: - - url: http://localhost:9100/sd.json - authorization: - type: Bearer - credentials: http-sd-secret -`, + golden: "ScrapeConfigSpecConfig_Authorization.golden", }, { name: "tlsconfig", @@ -9194,118 +5004,83 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - tls_config: - insecure_skip_verify: false - ca_file: /etc/prometheus/certs/secret_default_secret-ca-global_ - cert_file: /etc/prometheus/certs/secret_default_secret-cert_ - key_file: /etc/prometheus/certs/secret_default_secret_key - http_sd_configs: - - url: http://localhost:9100/sd.json - tls_config: - insecure_skip_verify: true - ca_file: /etc/prometheus/certs/secret_default_secret-ca-http_ -`, + golden: "ScrapeConfigSpecConfig_TLSConfig.golden", }, { name: "scheme", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - Scheme: pointer.String("HTTPS"), + Scheme: ptr.To("HTTPS"), }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - scheme: https -`, + golden: "ScrapeConfigSpecConfig_Scheme.golden", }, { name: "limits", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - SampleLimit: pointer.Uint64(10000), - TargetLimit: pointer.Uint64(1000), - LabelLimit: pointer.Uint64(50), - LabelNameLengthLimit: pointer.Uint64(40), - LabelValueLengthLimit: pointer.Uint64(30), - }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - sample_limit: 10000 - target_limit: 1000 - label_limit: 50 - label_name_length_limit: 40 - label_value_length_limit: 30 -`, + SampleLimit: ptr.To(uint64(10000)), + TargetLimit: ptr.To(uint64(1000)), + LabelLimit: ptr.To(uint64(50)), + LabelNameLengthLimit: ptr.To(uint64(40)), + LabelValueLengthLimit: ptr.To(uint64(30)), + }, + golden: "ScrapeConfigSpecConfig_Limits.golden", }, { name: "params", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - MetricsPath: pointer.String("/federate"), + MetricsPath: ptr.To("/federate"), Params: map[string][]string{"match[]": {"{job=\"prometheus\"}", "{__name__=~\"job:.*\"}"}}, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - metrics_path: /federate - params: - match[]: - - '{job="prometheus"}' - - '{__name__=~"job:.*"}' -`, + golden: "ScrapeConfigSpecConfig_Params.golden", }, { name: "scrape_interval", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - ScrapeInterval: (*monitoringv1.Duration)(pointer.String("15s")), + ScrapeInterval: (*monitoringv1.Duration)(ptr.To("15s")), }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - scrape_interval: 15s -`, + golden: "ScrapeConfigSpecConfig_ScrapeInterval.golden", }, { name: "scrape_timeout", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ - ScrapeTimeout: (*monitoringv1.Duration)(pointer.String("10s")), - }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - scrape_timeout: 10s -`, + ScrapeTimeout: (*monitoringv1.Duration)(ptr.To("10s")), + }, + golden: "ScrapeConfigSpecConfig_ScrapeTimeout.golden", + }, + { + name: "non_empty_metric_relabel_config", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + MetricRelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Regex: "noisy_labels.*", + Action: "labeldrop", + }, + }, + }, + golden: "ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden", + }, + { + name: "dns_sd_config-srv-record", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + DNSSDConfigs: []monitoringv1alpha1.DNSSDConfig{ + { + Names: []string{"web.example.com"}, + }, + }, + }, + golden: "ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden", + }, + { + name: "dns_sd_config-a-record", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + DNSSDConfigs: []monitoringv1alpha1.DNSSDConfig{ + { + Names: []string{"node.demo.do.prometheus.io"}, + Type: ptr.To("A"), + Port: ptr.To(9100), + }, + }, + }, + golden: "ScrapeConfigSpecConfig_DNSSD_ARecord.golden", }, } { t.Run(tc.name, func(t *testing.T) { @@ -9360,9 +5135,8 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expectedCfg, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) - } } @@ -9380,10 +5154,10 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) { }, ) for _, tc := range []struct { - name string - patchProm func(*monitoringv1.Prometheus) - scSpec monitoringv1alpha1.ScrapeConfigSpec - expectedCfg string + name string + patchProm func(*monitoringv1.Prometheus) + scSpec monitoringv1alpha1.ScrapeConfigSpec + golden string }{ { name: "consul_scrape_config", @@ -9391,22 +5165,22 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) { ConsulSDConfigs: []monitoringv1alpha1.ConsulSDConfig{ { Server: "localhost", - Datacenter: pointer.String("we1"), - Namespace: pointer.String("observability"), - Partition: pointer.String("1"), - Scheme: pointer.String("https"), + Datacenter: ptr.To("we1"), + Namespace: ptr.To("observability"), + Partition: ptr.To("1"), + Scheme: ptr.To("https"), Services: []string{"prometheus", "alertmanager"}, Tags: []string{"tag1"}, - TagSeparator: pointer.String(";"), + TagSeparator: ptr.To(";"), NodeMeta: map[string]string{ "service": "service_name", "name": "node_name", }, - AllowStale: pointer.Bool(false), - RefreshInterval: (*monitoringv1.Duration)(pointer.String("30s")), - ProxyUrl: pointer.String("http://no-proxy.com"), - NoProxy: pointer.String("0.0.0.0"), - ProxyFromEnvironment: pointer.Bool(true), + AllowStale: ptr.To(false), + RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")), + ProxyUrl: ptr.To("http://no-proxy.com"), + NoProxy: ptr.To("0.0.0.0"), + ProxyFromEnvironment: ptr.To(true), ProxyConnectHeader: map[string]v1.SecretKeySelector{ "header": { LocalObjectReference: v1.LocalObjectReference{ @@ -9415,8 +5189,8 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) { Key: "proxy-header", }, }, - FollowRedirects: pointer.Bool(true), - EnableHttp2: pointer.Bool(true), + FollowRedirects: ptr.To(true), + EnableHttp2: ptr.To(true), TokenRef: &v1.SecretKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: "foo", @@ -9426,40 +5200,7 @@ func TestScrapeConfigSpecConfigWithConsulSD(t *testing.T) { }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - consul_sd_configs: - - server: localhost - token: value - datacenter: we1 - namespace: observability - partition: "1" - scheme: https - services: - - prometheus - - alertmanager - tags: - - tag1 - tag_separator: ; - node_meta: - name: node_name - service: service_name - allow_stale: false - refresh_interval: 30s - proxy_url: http://no-proxy.com - no_proxy: 0.0.0.0 - proxy_from_environment: true - proxy_connect_header: - header: value - follow_redirects: true - enable_http2: true -`, + golden: "ConsulScrapeConfig.golden", }, { name: "consul_scrape_config_basic_auth", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ @@ -9483,20 +5224,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - consul_sd_configs: - - basic_auth: - username: consul-sd-bob - password: consul-sd-alice - server: localhost:8500 -`, + golden: "ConsulScrapeConfigBasicAuth.golden", }, { name: "consul_scrape_config_authorization", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ @@ -9514,20 +5242,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - consul_sd_configs: - - authorization: - type: Bearer - credentials: authorization - server: localhost:8500 -`, + golden: "ConsulScrapeConfigAuthorization.golden", }, { name: "consul_scrape_config_oauth", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ @@ -9559,27 +5274,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - consul_sd_configs: - - oauth2: - client_id: client-id - client_secret: client-secret - token_url: http://test.url - scopes: - - scope 1 - - scope 2 - endpoint_params: - param1: value1 - param2: value2 - server: localhost:8500 -`, + golden: "ConsulScrapeConfigOAuth.golden", }, { name: "consul_scrape_config_tls", scSpec: monitoringv1alpha1.ScrapeConfigSpec{ @@ -9611,22 +5306,7 @@ scrape_configs: }, }, }, - expectedCfg: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: -- job_name: scrapeconfig/default/testscrapeconfig1 - consul_sd_configs: - - tls_config: - insecure_skip_verify: false - ca_file: /etc/prometheus/certs/secret_default_secret-ca-global_ - cert_file: /etc/prometheus/certs/secret_default_secret-cert_ - key_file: /etc/prometheus/certs/secret_default_secret_key - server: localhost:8500 -`, + golden: "ConsulScrapeConfigTLSConfig.golden", }} { t.Run(tc.name, func(t *testing.T) { store := assets.NewStore(c.CoreV1(), c.CoreV1()) @@ -9684,69 +5364,198 @@ scrape_configs: nil, ) require.NoError(t, err) - require.Equal(t, tc.expectedCfg, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } +func TestScrapeConfigSpecConfigWithEC2SD(t *testing.T) { + c := fake.NewSimpleClientset( + &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "aws-access-api", + Namespace: "default", + }, + Data: map[string][]byte{ + "accessKey": []byte("access-key"), + "secretKey": []byte("secret-key"), + }, + }, + ) + for _, tc := range []struct { + name string + scSpec monitoringv1alpha1.ScrapeConfigSpec + golden string + expectedErr bool + }{ + { + name: "ec2_sd_config_valid_with_api_keys", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + AccessKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "aws-access-api", + }, + Key: "accessKey", + }, + SecretKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "aws-access-api", + }, + Key: "secretKey", + }, + RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")), + Port: ptr.To(9100), + }, + }, + }, + golden: "ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden", + }, + { + name: "ec2_sd_config_valid_with_role_arn", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + RoleARN: ptr.To("arn:aws:iam::123456789:role/prometheus-role"), + RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")), + Port: ptr.To(9100), + }, + }, + }, + golden: "ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden", + }, + { + name: "ec2_sd_config_valid_with_filters", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + RoleARN: ptr.To("arn:aws:iam::123456789:role/prometheus-role"), + RefreshInterval: (*monitoringv1.Duration)(ptr.To("30s")), + Port: ptr.To(9100), + Filters: []*monitoringv1alpha1.EC2Filter{ + { + Name: "tag:environment", + Values: []string{"prod"}, + }, + { + Name: "tag:service", + Values: []string{"web", "db"}, + }, + }, + }, + }, + }, + golden: "ScrapeConfigSpecConfig_EC2SDConfigFilters.golden", + }, + { + name: "ec2_sd_config_invalid", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + AccessKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "wrong-secret-name", + }, + Key: "accessKey", + }, + SecretKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "aws-access-api", + }, + Key: "secretKey", + }, + }, + }, + }, + expectedErr: true, + }, + { + name: "ec2_sd_config_empty", + scSpec: monitoringv1alpha1.ScrapeConfigSpec{ + EC2SDConfigs: []monitoringv1alpha1.EC2SDConfig{}, + }, + golden: "ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden", + }, + } { + t.Run(tc.name, func(t *testing.T) { + scs := map[string]*monitoringv1alpha1.ScrapeConfig{ + "sc": { + ObjectMeta: metav1.ObjectMeta{ + Name: "testscrapeconfig1", + Namespace: "default", + }, + Spec: tc.scSpec, + }, + } + + p := defaultPrometheus() + cg := mustNewConfigGenerator(t, p) + cfg, err := cg.GenerateServerConfiguration( + context.Background(), + p.Spec.EvaluationInterval, + p.Spec.QueryLogFile, + nil, + nil, + p.Spec.TSDB, + nil, + nil, + nil, + nil, + nil, + scs, + assets.NewStore(c.CoreV1(), c.CoreV1()), + nil, + nil, + nil, + nil, + ) + if tc.expectedErr { + require.Error(t, err) + return + } + require.NoError(t, err) + golden.Assert(t, string(cfg), tc.golden) + }) + } +} + func TestTracingConfig(t *testing.T) { samplingTwo := resource.MustParse("0.5") testCases := []struct { - tracingConfig *monitoringv1.PrometheusTracingConfig - name string - expectedConfig string - expectedErr bool + tracingConfig *monitoringv1.PrometheusTracingConfig + name string + expectedErr bool + golden string }{ { name: "Config only with endpoint", tracingConfig: &monitoringv1.PrometheusTracingConfig{ Endpoint: "https://otel-collector.default.svc.local:3333", }, - - expectedConfig: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -tracing: - endpoint: https://otel-collector.default.svc.local:3333 -`, + golden: "TracingConfig_Config_only_with_endpoint.golden", expectedErr: false, }, { tracingConfig: &monitoringv1.PrometheusTracingConfig{ - ClientType: pointer.String("grpc"), + ClientType: ptr.To("grpc"), Endpoint: "https://otel-collector.default.svc.local:3333", SamplingFraction: &samplingTwo, Headers: map[string]string{ "custom": "header", }, - Compression: pointer.String("gzip"), - Timeout: (*monitoringv1.Duration)(pointer.String("10s")), - Insecure: pointer.Bool(false), + Compression: ptr.To("gzip"), + Timeout: (*monitoringv1.Duration)(ptr.To("10s")), + Insecure: ptr.To(false), }, name: "Expect valid config", expectedErr: false, - expectedConfig: `global: - evaluation_interval: 30s - scrape_interval: 30s - external_labels: - prometheus: default/test - prometheus_replica: $(POD_NAME) -scrape_configs: [] -tracing: - endpoint: https://otel-collector.default.svc.local:3333 - client_type: grpc - sampling_fraction: 0.5 - insecure: false - headers: - custom: header - compression: gzip - timeout: 10s -`, + golden: "TracingConfig_Expect_valid_config.golden", }, } for _, tc := range testCases { @@ -9781,7 +5590,7 @@ tracing: } else { require.NoError(t, err) } - require.Equal(t, tc.expectedConfig, string(cfg)) + golden.Assert(t, string(cfg), tc.golden) }) } } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector.go index a1fee021d..aa076b224 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector.go @@ -16,6 +16,7 @@ package prometheus import ( "context" + "errors" "fmt" "regexp" "strings" @@ -24,10 +25,10 @@ import ( "github.com/blang/semver/v4" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/relabel" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" @@ -105,7 +106,7 @@ func (rs *ResourceSelector) SelectServiceMonitors(ctx context.Context, listFn Li } }) if err != nil { - return nil, errors.Wrapf(err, "failed to list service monitors in namespace %s", ns) + return nil, fmt.Errorf("failed to list service monitors in namespace %s: %w", ns, err) } } @@ -152,20 +153,14 @@ func (rs *ResourceSelector) SelectServiceMonitors(ctx context.Context, listFn Li break } - for _, rl := range endpoint.RelabelConfigs { - if rl.Action != "" { - if err = validateRelabelConfig(rs.p, *rl); err != nil { - break - } - } + if err = validateRelabelConfigs(rs.p, endpoint.RelabelConfigs); err != nil { + err = fmt.Errorf("relabelConfigs: %w", err) + break } - for _, rl := range endpoint.MetricRelabelConfigs { - if rl.Action != "" { - if err = validateRelabelConfig(rs.p, *rl); err != nil { - break - } - } + if err = validateRelabelConfigs(rs.p, endpoint.MetricRelabelConfigs); err != nil { + err = fmt.Errorf("metricRelabelConfigs: %w", err) + break } } @@ -225,55 +220,75 @@ func validateScrapeIntervalAndTimeout(p monitoringv1.PrometheusInterface, scrape return CompareScrapeTimeoutToScrapeInterval(scrapeTimeout, scrapeInterval) } +func validateRelabelConfigs(p monitoringv1.PrometheusInterface, rcs []*monitoringv1.RelabelConfig) error { + for i, rc := range rcs { + if rc == nil { + return fmt.Errorf("null relabel config") + } + + if err := validateRelabelConfig(p, *rc); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + } + + return nil +} + func validateRelabelConfig(p monitoringv1.PrometheusInterface, rc monitoringv1.RelabelConfig) error { relabelTarget := regexp.MustCompile(`^(?:(?:[a-zA-Z_]|\$(?:\{\w+\}|\w+))+\w*)+$`) promVersion := operator.StringValOrDefault(p.GetCommonPrometheusFields().Version, operator.DefaultPrometheusVersion) + version, err := semver.ParseTolerant(promVersion) if err != nil { - return errors.Wrap(err, "failed to parse Prometheus version") + return fmt.Errorf("failed to parse Prometheus version: %w", err) } + minimumVersionCaseActions := version.GTE(semver.MustParse("2.36.0")) minimumVersionEqualActions := version.GTE(semver.MustParse("2.41.0")) + if rc.Action == "" { + rc.Action = string(relabel.Replace) + } + action := strings.ToLower(rc.Action) - if (rc.Action == string(relabel.Lowercase) || rc.Action == string(relabel.Uppercase)) && !minimumVersionCaseActions { - return errors.Errorf("%s relabel action is only supported from Prometheus version 2.36.0", rc.Action) + if (action == string(relabel.Lowercase) || action == string(relabel.Uppercase)) && !minimumVersionCaseActions { + return fmt.Errorf("%s relabel action is only supported from Prometheus version 2.36.0", rc.Action) } - if (rc.Action == string(relabel.KeepEqual) || rc.Action == string(relabel.DropEqual)) && !minimumVersionEqualActions { - return errors.Errorf("%s relabel action is only supported from Prometheus version 2.41.0", rc.Action) + if (action == string(relabel.KeepEqual) || action == string(relabel.DropEqual)) && !minimumVersionEqualActions { + return fmt.Errorf("%s relabel action is only supported from Prometheus version 2.41.0", rc.Action) } if _, err := relabel.NewRegexp(rc.Regex); err != nil { - return errors.Wrapf(err, "invalid regex %s for relabel configuration", rc.Regex) + return fmt.Errorf("invalid regex %s for relabel configuration: %w", rc.Regex, err) } - if rc.Modulus == 0 && rc.Action == string(relabel.HashMod) { - return errors.Errorf("relabel configuration for hashmod requires non-zero modulus") + if rc.Modulus == 0 && action == string(relabel.HashMod) { + return fmt.Errorf("relabel configuration for hashmod requires non-zero modulus") } - if (rc.Action == string(relabel.Replace) || rc.Action == string(relabel.HashMod) || rc.Action == string(relabel.Lowercase) || rc.Action == string(relabel.Uppercase) || rc.Action == string(relabel.KeepEqual) || rc.Action == string(relabel.DropEqual)) && rc.TargetLabel == "" { - return errors.Errorf("relabel configuration for %s action needs targetLabel value", rc.Action) + if (action == string(relabel.Replace) || action == string(relabel.HashMod) || action == string(relabel.Lowercase) || action == string(relabel.Uppercase) || action == string(relabel.KeepEqual) || action == string(relabel.DropEqual)) && rc.TargetLabel == "" { + return fmt.Errorf("relabel configuration for %s action needs targetLabel value", rc.Action) } - if (rc.Action == string(relabel.Replace) || rc.Action == string(relabel.Lowercase) || rc.Action == string(relabel.Uppercase) || rc.Action == string(relabel.KeepEqual) || rc.Action == string(relabel.DropEqual)) && !relabelTarget.MatchString(rc.TargetLabel) { - return errors.Errorf("%q is invalid 'target_label' for %s action", rc.TargetLabel, rc.Action) + if (action == string(relabel.Replace) || action == string(relabel.Lowercase) || action == string(relabel.Uppercase) || action == string(relabel.KeepEqual) || action == string(relabel.DropEqual)) && !relabelTarget.MatchString(rc.TargetLabel) { + return fmt.Errorf("%q is invalid 'target_label' for %s action", rc.TargetLabel, rc.Action) } - if (rc.Action == string(relabel.Lowercase) || rc.Action == string(relabel.Uppercase) || rc.Action == string(relabel.KeepEqual) || rc.Action == string(relabel.DropEqual)) && !(rc.Replacement == relabel.DefaultRelabelConfig.Replacement || rc.Replacement == "") { - return errors.Errorf("'replacement' can not be set for %s action", rc.Action) + if (action == string(relabel.Lowercase) || action == string(relabel.Uppercase) || action == string(relabel.KeepEqual) || action == string(relabel.DropEqual)) && !(rc.Replacement == relabel.DefaultRelabelConfig.Replacement || rc.Replacement == "") { + return fmt.Errorf("'replacement' can not be set for %s action", rc.Action) } - if rc.Action == string(relabel.LabelMap) { + if action == string(relabel.LabelMap) { if rc.Replacement != "" && !relabelTarget.MatchString(rc.Replacement) { - return errors.Errorf("%q is invalid 'replacement' for %s action", rc.Replacement, rc.Action) + return fmt.Errorf("%q is invalid 'replacement' for %s action", rc.Replacement, rc.Action) } } - if rc.Action == string(relabel.HashMod) && !model.LabelName(rc.TargetLabel).IsValid() { - return errors.Errorf("%q is invalid 'target_label' for %s action", rc.TargetLabel, rc.Action) + if action == string(relabel.HashMod) && !model.LabelName(rc.TargetLabel).IsValid() { + return fmt.Errorf("%q is invalid 'target_label' for %s action", rc.TargetLabel, rc.Action) } - if rc.Action == string(relabel.KeepEqual) || rc.Action == string(relabel.DropEqual) { + if action == string(relabel.KeepEqual) || action == string(relabel.DropEqual) { if !(rc.Regex == "" || rc.Regex == relabel.DefaultRelabelConfig.Regex.String()) || !(rc.Modulus == uint64(0) || rc.Modulus == relabel.DefaultRelabelConfig.Modulus) || @@ -281,11 +296,11 @@ func validateRelabelConfig(p monitoringv1.PrometheusInterface, rc monitoringv1.R rc.Separator == relabel.DefaultRelabelConfig.Separator) || !(rc.Replacement == relabel.DefaultRelabelConfig.Replacement || rc.Replacement == "") { - return errors.Errorf("%s action requires only 'source_labels' and `target_label`, and no other fields", rc.Action) + return fmt.Errorf("%s action requires only 'source_labels' and `target_label`, and no other fields", rc.Action) } } - if rc.Action == string(relabel.LabelDrop) || rc.Action == string(relabel.LabelKeep) { + if action == string(relabel.LabelDrop) || action == string(relabel.LabelKeep) { if len(rc.SourceLabels) != 0 || !(rc.TargetLabel == "" || rc.TargetLabel == relabel.DefaultRelabelConfig.TargetLabel) || @@ -295,7 +310,7 @@ func validateRelabelConfig(p monitoringv1.PrometheusInterface, rc monitoringv1.R rc.Separator == relabel.DefaultRelabelConfig.Separator) || !(rc.Replacement == relabel.DefaultRelabelConfig.Replacement || rc.Replacement == "") { - return errors.Errorf("%s action requires only 'regex', and no other fields", rc.Action) + return fmt.Errorf("%s action requires only 'regex', and no other fields", rc.Action) } } return nil @@ -346,7 +361,7 @@ func (rs *ResourceSelector) SelectPodMonitors(ctx context.Context, listFn ListAl } }) if err != nil { - return nil, errors.Wrapf(err, "failed to list pod monitors in namespace %s", ns) + return nil, fmt.Errorf("failed to list pod monitors in namespace %s: %w", ns, err) } } @@ -358,7 +373,7 @@ func (rs *ResourceSelector) SelectPodMonitors(ctx context.Context, listFn ListAl for i, endpoint := range pm.Spec.PodMetricsEndpoints { pmKey := fmt.Sprintf("podMonitor/%s/%s/%d", pm.GetNamespace(), pm.GetName(), i) - if err = rs.store.AddBearerToken(ctx, pm.GetNamespace(), endpoint.BearerTokenSecret, pmKey); err != nil { + if err = rs.store.AddBearerToken(ctx, pm.GetNamespace(), &endpoint.BearerTokenSecret, pmKey); err != nil { break } @@ -385,20 +400,14 @@ func (rs *ResourceSelector) SelectPodMonitors(ctx context.Context, listFn ListAl break } - for _, rl := range endpoint.RelabelConfigs { - if rl.Action != "" { - if err = validateRelabelConfig(rs.p, *rl); err != nil { - break - } - } + if err = validateRelabelConfigs(rs.p, endpoint.RelabelConfigs); err != nil { + err = fmt.Errorf("relabelConfigs: %w", err) + break } - for _, rl := range endpoint.MetricRelabelConfigs { - if rl.Action != "" { - if err = validateRelabelConfig(rs.p, *rl); err != nil { - break - } - } + if err = validateRelabelConfigs(rs.p, endpoint.MetricRelabelConfigs); err != nil { + err = fmt.Errorf("metricRelabelConfigs: %w", err) + break } } @@ -475,7 +484,7 @@ func (rs *ResourceSelector) SelectProbes(ctx context.Context, listFn ListAllByNa } }) if err != nil { - return nil, errors.Wrapf(err, "failed to list probes in namespace %s", ns) + return nil, fmt.Errorf("failed to list probes in namespace %s: %w", ns, err) } } @@ -488,7 +497,7 @@ func (rs *ResourceSelector) SelectProbes(ctx context.Context, listFn ListAllByNa level.Warn(rs.l).Log( "msg", "skipping probe", "error", err.Error(), - "probe", probe, + "probe", probeName, "namespace", objMeta.GetNamespace(), "prometheus", objMeta.GetName(), ) @@ -500,7 +509,7 @@ func (rs *ResourceSelector) SelectProbes(ctx context.Context, listFn ListAllByNa } pnKey := fmt.Sprintf("probe/%s/%s", probe.GetNamespace(), probe.GetName()) - if err = rs.store.AddBearerToken(ctx, probe.GetNamespace(), probe.Spec.BearerTokenSecret, pnKey); err != nil { + if err = rs.store.AddBearerToken(ctx, probe.GetNamespace(), &probe.Spec.BearerTokenSecret, pnKey); err != nil { rejectFn(probe, err) continue } @@ -532,19 +541,34 @@ func (rs *ResourceSelector) SelectProbes(ctx context.Context, listFn ListAllByNa continue } - for _, rl := range probe.Spec.MetricRelabelConfigs { - if rl.Action != "" { - if err = validateRelabelConfig(rs.p, *rl); err != nil { - rejectFn(probe, err) - continue - } + if err = validateRelabelConfigs(rs.p, probe.Spec.MetricRelabelConfigs); err != nil { + err = fmt.Errorf("metricRelabelConfigs: %w", err) + rejectFn(probe, err) + continue + } + + if probe.Spec.Targets.StaticConfig != nil { + if err = validateRelabelConfigs(rs.p, probe.Spec.Targets.StaticConfig.RelabelConfigs); err != nil { + err = fmt.Errorf("targets.staticConfig.relabelConfigs: %w", err) + rejectFn(probe, err) + continue + } + } + + if probe.Spec.Targets.Ingress != nil { + if err = validateRelabelConfigs(rs.p, probe.Spec.Targets.Ingress.RelabelConfigs); err != nil { + err = fmt.Errorf("targets.ingress.relabelConfigs: %w", err) + rejectFn(probe, err) + continue } } + if err = validateProberURL(probe.Spec.ProberSpec.URL); err != nil { - err := errors.Wrapf(err, "%s url specified in proberSpec is invalid, it should be of the format `hostname` or `hostname:port`", probe.Spec.ProberSpec.URL) + err := fmt.Errorf("%s url specified in proberSpec is invalid, it should be of the format `hostname` or `hostname:port`: %w", probe.Spec.ProberSpec.URL, err) rejectFn(probe, err) continue } + res[probeName] = probe } @@ -566,13 +590,13 @@ func validateProberURL(url string) error { hostPort := strings.Split(url, ":") if !govalidator.IsHost(hostPort[0]) { - return errors.Errorf("invalid host: %q", hostPort[0]) + return fmt.Errorf("invalid host: %q", hostPort[0]) } // handling cases with url specified as host:port if len(hostPort) > 1 { if !govalidator.IsPort(hostPort[1]) { - return errors.Errorf("invalid port: %q", hostPort[1]) + return fmt.Errorf("invalid port: %q", hostPort[1]) } } return nil @@ -622,7 +646,7 @@ func (rs *ResourceSelector) SelectScrapeConfigs(ctx context.Context, listFn List } }) if err != nil { - return nil, errors.Wrapf(err, "failed to list ScrapeConfigs in namespace %s", ns) + return nil, fmt.Errorf("failed to list ScrapeConfigs in namespace %s: %w", ns, err) } } @@ -635,12 +659,17 @@ func (rs *ResourceSelector) SelectScrapeConfigs(ctx context.Context, listFn List level.Warn(rs.l).Log( "msg", "skipping scrapeconfig", "error", err.Error(), - "scrapeconfig", sc, + "scrapeconfig", scName, "namespace", objMeta.GetNamespace(), "prometheus", objMeta.GetName(), ) } + if err = validateRelabelConfigs(rs.p, sc.Spec.RelabelConfigs); err != nil { + rejectFn(sc, fmt.Errorf("relabelConfigs: %w", err)) + continue + } + scKey := fmt.Sprintf("scrapeconfig/%s/%s", sc.GetNamespace(), sc.GetName()) if err = rs.store.AddBasicAuth(ctx, sc.GetNamespace(), sc.Spec.BasicAuth, scKey); err != nil { rejectFn(sc, err) @@ -658,25 +687,6 @@ func (rs *ResourceSelector) SelectScrapeConfigs(ctx context.Context, listFn List continue } - for i, config := range sc.Spec.HTTPSDConfigs { - configKey := fmt.Sprintf("scrapeconfig/%s/%s/httpsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) - if err = rs.store.AddBasicAuth(ctx, sc.GetNamespace(), config.BasicAuth, configKey); err != nil { - rejectFn(sc, err) - continue - } - - configAuthKey := fmt.Sprintf("scrapeconfig/auth/%s/%s/httpsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) - if err = rs.store.AddSafeAuthorizationCredentials(ctx, sc.GetNamespace(), config.Authorization, configAuthKey); err != nil { - rejectFn(sc, err) - continue - } - - if err = rs.store.AddSafeTLSConfig(ctx, sc.GetNamespace(), config.TLSConfig); err != nil { - rejectFn(sc, err) - continue - } - } - var scrapeInterval, scrapeTimeout monitoringv1.Duration = "", "" if sc.Spec.ScrapeInterval != nil { scrapeInterval = *sc.Spec.ScrapeInterval @@ -691,37 +701,34 @@ func (rs *ResourceSelector) SelectScrapeConfigs(ctx context.Context, listFn List continue } - for i, config := range sc.Spec.ConsulSDConfigs { - configKey := fmt.Sprintf("scrapeconfig/%s/%s/consulsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) - if err = rs.store.AddBasicAuth(ctx, sc.GetNamespace(), config.BasicAuth, configKey); err != nil { - rejectFn(sc, err) - continue - } + if err = validateRelabelConfigs(rs.p, sc.Spec.MetricRelabelConfigs); err != nil { + rejectFn(sc, fmt.Errorf("metricRelabelConfigs: %w", err)) + continue + } - configAuthKey := fmt.Sprintf("scrapeconfig/auth/%s/%s/consulsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) - if err = rs.store.AddSafeAuthorizationCredentials(ctx, sc.GetNamespace(), config.Authorization, configAuthKey); err != nil { - rejectFn(sc, err) - continue - } + if err = rs.validateHTTPSDConfigs(ctx, sc); err != nil { + rejectFn(sc, fmt.Errorf("httpSDConfigs: %w", err)) + continue + } - if err = rs.store.AddSafeTLSConfig(ctx, sc.GetNamespace(), config.TLSConfig); err != nil { - rejectFn(sc, err) - continue - } + if err = rs.validateKubernetesSDConfigs(sc); err != nil { + rejectFn(sc, fmt.Errorf("kubernetesSDConfigs: %w", err)) + continue + } - if _, err = rs.store.GetSecretKey(ctx, sc.GetNamespace(), *config.TokenRef); err != nil { - rejectFn(sc, err) - continue - } + if err = rs.validateConsulSDConfigs(ctx, sc); err != nil { + rejectFn(sc, fmt.Errorf("consulSDConfigs: %w", err)) + continue + } - for _, v := range config.ProxyConnectHeader { - _, err := rs.store.GetSecretKey(context.Background(), sc.GetNamespace(), v) + if err = rs.validateDNSSDConfigs(sc); err != nil { + rejectFn(sc, fmt.Errorf("dnsSDConfigs: %w", err)) + continue + } - if err != nil { - rejectFn(sc, err) - continue - } - } + if err = rs.validateEC2SDConfigs(ctx, sc); err != nil { + rejectFn(sc, fmt.Errorf("ec2SDConfigs: %w", err)) + continue } res[scName] = sc @@ -740,3 +747,97 @@ func (rs *ResourceSelector) SelectScrapeConfigs(ctx context.Context, listFn List return res, nil } + +func (rs *ResourceSelector) validateKubernetesSDConfigs(sc *monitoringv1alpha1.ScrapeConfig) error { + for i, config := range sc.Spec.KubernetesSDConfigs { + for _, s := range config.Selectors { + if _, err := fields.ParseSelector(s.Field); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + + if _, err := labels.Parse(s.Label); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + } + } + return nil +} + +func (rs *ResourceSelector) validateConsulSDConfigs(ctx context.Context, sc *monitoringv1alpha1.ScrapeConfig) error { + for i, config := range sc.Spec.ConsulSDConfigs { + configKey := fmt.Sprintf("scrapeconfig/%s/%s/consulsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) + if err := rs.store.AddBasicAuth(ctx, sc.GetNamespace(), config.BasicAuth, configKey); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + + configAuthKey := fmt.Sprintf("scrapeconfig/auth/%s/%s/consulsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) + if err := rs.store.AddSafeAuthorizationCredentials(ctx, sc.GetNamespace(), config.Authorization, configAuthKey); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + + if err := rs.store.AddSafeTLSConfig(ctx, sc.GetNamespace(), config.TLSConfig); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + + if config.TokenRef != nil { + if _, err := rs.store.GetSecretKey(ctx, sc.GetNamespace(), *config.TokenRef); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + } + + for k, v := range config.ProxyConnectHeader { + if _, err := rs.store.GetSecretKey(context.Background(), sc.GetNamespace(), v); err != nil { + return fmt.Errorf("[%d]: header[%s]: %w", i, k, err) + } + } + } + return nil +} + +func (rs *ResourceSelector) validateHTTPSDConfigs(ctx context.Context, sc *monitoringv1alpha1.ScrapeConfig) error { + for i, config := range sc.Spec.HTTPSDConfigs { + configKey := fmt.Sprintf("scrapeconfig/%s/%s/httpsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) + if err := rs.store.AddBasicAuth(ctx, sc.GetNamespace(), config.BasicAuth, configKey); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + + configAuthKey := fmt.Sprintf("scrapeconfig/auth/%s/%s/httpsdconfig/%d", sc.GetNamespace(), sc.GetName(), i) + if err := rs.store.AddSafeAuthorizationCredentials(ctx, sc.GetNamespace(), config.Authorization, configAuthKey); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + + if err := rs.store.AddSafeTLSConfig(ctx, sc.GetNamespace(), config.TLSConfig); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + } + + return nil +} + +func (rs *ResourceSelector) validateDNSSDConfigs(sc *monitoringv1alpha1.ScrapeConfig) error { + for i, config := range sc.Spec.DNSSDConfigs { + if config.Type != nil { + if *config.Type != "SRV" && config.Port == nil { + return fmt.Errorf("[%d]: %s %q", i, "port required for record type", *config.Type) + } + } + } + return nil +} + +func (rs *ResourceSelector) validateEC2SDConfigs(ctx context.Context, sc *monitoringv1alpha1.ScrapeConfig) error { + for i, config := range sc.Spec.EC2SDConfigs { + if config.AccessKey != nil { + if _, err := rs.store.GetSecretKey(ctx, sc.GetNamespace(), *config.AccessKey); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + } + + if config.SecretKey != nil { + if _, err := rs.store.GetSecretKey(ctx, sc.GetNamespace(), *config.SecretKey); err != nil { + return fmt.Errorf("[%d]: %w", i, err) + } + } + } + return nil +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector_test.go index 52dfbd5f5..04c19253a 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/resource_selector_test.go @@ -15,14 +15,32 @@ package prometheus import ( - "fmt" + "context" + "os" "testing" + "github.com/go-kit/log" + "github.com/go-kit/log/level" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/prometheus/model/relabel" + "github.com/stretchr/testify/require" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/kubernetes/fake" + "k8s.io/client-go/tools/cache" + "k8s.io/utils/ptr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" + "github.com/prometheus-operator/prometheus-operator/pkg/assets" + "github.com/prometheus-operator/prometheus-operator/pkg/operator" ) +func newLogger() log.Logger { + return level.NewFilter(log.NewLogfmtLogger(os.Stderr), level.AllowWarn()) +} + func TestValidateRelabelConfig(t *testing.T) { defaultRegexp, err := relabel.DefaultRelabelConfig.Regex.MarshalYAML() if err != nil { @@ -388,7 +406,7 @@ func TestValidateRelabelConfig(t *testing.T) { }, }, } { - t.Run(fmt.Sprintf("case %s", tc.scenario), func(t *testing.T) { + t.Run(tc.scenario, func(t *testing.T) { err := validateRelabelConfig(&tc.prometheus, tc.relabelConfig) if err != nil && !tc.expectedErr { t.Fatalf("expected no error, got: %v", err) @@ -400,77 +418,193 @@ func TestValidateRelabelConfig(t *testing.T) { } } -func TestValidateProberUrl(t *testing.T) { +func TestSelectProbes(t *testing.T) { for _, tc := range []struct { - scenario string - proberSpec monitoringv1.ProberSpec - expectedErr bool + scenario string + updateSpec func(*monitoringv1.ProbeSpec) + selected bool }{ { scenario: "url starting with http", - proberSpec: monitoringv1.ProberSpec{ - URL: "http://blackbox-exporter.example.com", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "http://blackbox-exporter.example.com" }, - expectedErr: true, + selected: false, }, { scenario: "url starting with https", - proberSpec: monitoringv1.ProberSpec{ - URL: "https://blackbox-exporter.example.com", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "https://blackbox-exporter.example.com" }, - expectedErr: true, + selected: false, }, { scenario: "url starting with ftp", - proberSpec: monitoringv1.ProberSpec{ - URL: "ftp://fileserver.com", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "ftp://fileserver.com" }, - expectedErr: true, + selected: false, }, { scenario: "ip address as prober url", - proberSpec: monitoringv1.ProberSpec{ - URL: "192.168.178.3", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "192.168.178.3" }, + selected: true, }, { scenario: "ip address:port as prober url", - proberSpec: monitoringv1.ProberSpec{ - URL: "192.168.178.3:9090", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "192.168.178.3:9090" }, + selected: true, }, { scenario: "dnsname as prober url", - proberSpec: monitoringv1.ProberSpec{ - URL: "blackbox-exporter.example.com", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "blackbox-exporter.example.com" }, + selected: true, }, { scenario: "dnsname:port as prober url", - proberSpec: monitoringv1.ProberSpec{ - URL: "blackbox-exporter.example.com:8080", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "blackbox-exporter.example.com:8080" }, + selected: true, }, { scenario: "hostname as prober url", - proberSpec: monitoringv1.ProberSpec{ - URL: "localhost", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "localhost" }, + selected: true, }, { scenario: "hostname starting with a digit as prober url", - proberSpec: monitoringv1.ProberSpec{ - URL: "12-exporter.example.com", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.ProberSpec.URL = "12-exporter.example.com" + }, + selected: true, + }, + { + scenario: "valid metric relabeling config", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.MetricRelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + selected: true, + }, + { + scenario: "invalid metric relabeling config", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.MetricRelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + }, + { + scenario: "valid static relabeling config", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.Targets.StaticConfig.RelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + selected: true, + }, + { + scenario: "invalid static relabeling config", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.Targets.StaticConfig.RelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + selected: false, + }, + { + scenario: "valid ingress relabeling config", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.Targets.StaticConfig = nil + ps.Targets.Ingress = &monitoringv1.ProbeTargetIngress{ + RelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + } }, + selected: true, + }, + { + scenario: "invalid ingress relabeling config", + updateSpec: func(ps *monitoringv1.ProbeSpec) { + ps.Targets.Ingress = &monitoringv1.ProbeTargetIngress{ + RelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + } + }, + selected: false, }, } { - t.Run(fmt.Sprintf("case %s %s", tc.scenario, tc.proberSpec.URL), func(t *testing.T) { - err := validateProberURL(tc.proberSpec.URL) - if err != nil && !tc.expectedErr { - t.Fatalf("expected no error, got: %v", err) + t.Run(tc.scenario, func(t *testing.T) { + rs := NewResourceSelector( + newLogger(), + &monitoringv1.Prometheus{}, + nil, + nil, + operator.NewMetrics(prometheus.NewPedanticRegistry()), + ) + + probe := &monitoringv1.Probe{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "test", + }, + Spec: monitoringv1.ProbeSpec{ + ProberSpec: monitoringv1.ProberSpec{ + URL: "example.com:80", + }, + Targets: monitoringv1.ProbeTargets{ + StaticConfig: &monitoringv1.ProbeTargetStaticConfig{}, + }, + }, } - if err == nil && tc.expectedErr { - t.Fatalf("expected an error, got nil") + tc.updateSpec(&probe.Spec) + + probes, err := rs.SelectProbes(context.Background(), func(namespace string, selector labels.Selector, appendFn cache.AppendFunc) error { + appendFn(probe) + return nil + }) + + require.NoError(t, err) + if tc.selected { + require.Equal(t, 1, len(probes)) + } else { + require.Equal(t, 0, len(probes)) } }) } @@ -548,7 +682,7 @@ func TestValidateScrapeIntervalAndTimeout(t *testing.T) { expectedErr: true, }, } { - t.Run(fmt.Sprintf("case %s", tc.scenario), func(t *testing.T) { + t.Run(tc.scenario, func(t *testing.T) { for _, endpoint := range tc.smSpec.Endpoints { err := validateScrapeIntervalAndTimeout(&tc.prometheus, endpoint.Interval, endpoint.ScrapeTimeout) t.Logf("err %v", err) @@ -562,3 +696,554 @@ func TestValidateScrapeIntervalAndTimeout(t *testing.T) { }) } } + +func TestSelectServiceMonitors(t *testing.T) { + for _, tc := range []struct { + scenario string + updateSpec func(*monitoringv1.ServiceMonitorSpec) + selected bool + }{ + { + scenario: "valid metric relabeling config", + updateSpec: func(sm *monitoringv1.ServiceMonitorSpec) { + sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{ + MetricRelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: true, + }, + { + scenario: "invalid metric relabeling config", + updateSpec: func(sm *monitoringv1.ServiceMonitorSpec) { + sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{ + MetricRelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: false, + }, + { + scenario: "valid relabeling config", + updateSpec: func(sm *monitoringv1.ServiceMonitorSpec) { + sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{ + RelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: true, + }, + { + scenario: "invalid relabeling config", + updateSpec: func(sm *monitoringv1.ServiceMonitorSpec) { + sm.Endpoints = append(sm.Endpoints, monitoringv1.Endpoint{ + RelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: false, + }, + } { + t.Run(tc.scenario, func(t *testing.T) { + rs := NewResourceSelector( + newLogger(), + &monitoringv1.Prometheus{}, + nil, + nil, + operator.NewMetrics(prometheus.NewPedanticRegistry()), + ) + + sm := &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "test", + }, + Spec: monitoringv1.ServiceMonitorSpec{}, + } + tc.updateSpec(&sm.Spec) + + sms, err := rs.SelectServiceMonitors(context.Background(), func(namespace string, selector labels.Selector, appendFn cache.AppendFunc) error { + appendFn(sm) + return nil + }) + + require.NoError(t, err) + if tc.selected { + require.Equal(t, 1, len(sms)) + } else { + require.Equal(t, 0, len(sms)) + } + }) + } +} + +func TestSelectPodMonitors(t *testing.T) { + for _, tc := range []struct { + scenario string + updateSpec func(*monitoringv1.PodMonitorSpec) + selected bool + }{ + { + scenario: "valid metric relabeling config", + updateSpec: func(pm *monitoringv1.PodMonitorSpec) { + pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{ + MetricRelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: true, + }, + { + scenario: "invalid metric relabeling config", + updateSpec: func(pm *monitoringv1.PodMonitorSpec) { + pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{ + MetricRelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: false, + }, + { + scenario: "valid relabeling config", + updateSpec: func(pm *monitoringv1.PodMonitorSpec) { + pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{ + RelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: true, + }, + { + scenario: "invalid relabeling config", + updateSpec: func(pm *monitoringv1.PodMonitorSpec) { + pm.PodMetricsEndpoints = append(pm.PodMetricsEndpoints, monitoringv1.PodMetricsEndpoint{ + RelabelConfigs: []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + }, + }) + }, + selected: false, + }, + } { + t.Run(tc.scenario, func(t *testing.T) { + rs := NewResourceSelector( + newLogger(), + &monitoringv1.Prometheus{}, + nil, + nil, + operator.NewMetrics(prometheus.NewPedanticRegistry()), + ) + + pm := &monitoringv1.PodMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "test", + }, + } + tc.updateSpec(&pm.Spec) + + sms, err := rs.SelectPodMonitors(context.Background(), func(namespace string, selector labels.Selector, appendFn cache.AppendFunc) error { + appendFn(pm) + return nil + }) + + require.NoError(t, err) + if tc.selected { + require.Equal(t, 1, len(sms)) + } else { + require.Equal(t, 0, len(sms)) + } + }) + } +} + +func TestSelectScrapeConfigs(t *testing.T) { + for _, tc := range []struct { + scenario string + updateSpec func(*monitoringv1alpha1.ScrapeConfigSpec) + selected bool + }{ + { + scenario: "valid relabeling config", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.RelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + selected: true, + }, + { + scenario: "invalid relabeling config", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.RelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + selected: false, + }, + { + scenario: "valid metric relabeling config", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.MetricRelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: "valid", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + selected: true, + }, + { + scenario: "invalid metric relabeling config", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.MetricRelabelConfigs = []*monitoringv1.RelabelConfig{ + { + Action: "Replace", + TargetLabel: " invalid label name", + SourceLabels: []monitoringv1.LabelName{"foo", "bar"}, + }, + } + }, + selected: false, + }, + { + scenario: "HTTP SD config with valid secret ref", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.HTTPSDConfigs = []monitoringv1alpha1.HTTPSDConfig{ + { + URL: "http://example.com", + Authorization: &monitoringv1.SafeAuthorization{ + Credentials: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key1", + }, + }, + }, + } + }, + selected: true, + }, + { + scenario: "HTTP SD config with invalid secret ref", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.HTTPSDConfigs = []monitoringv1alpha1.HTTPSDConfig{ + { + URL: "http://example.com", + Authorization: &monitoringv1.SafeAuthorization{ + Credentials: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "wrong", + }, + Key: "key1", + }, + }, + }, + } + }, + selected: false, + }, + { + scenario: "Kubernetes SD config with invalid label", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.KubernetesSDConfigs = []monitoringv1alpha1.KubernetesSDConfig{ + { + Selectors: []monitoringv1alpha1.K8SSelectorConfig{ + { + Label: "app=example,env!=production,release in (v1, v2", + }, + }, + }, + } + }, + selected: false, + }, + { + scenario: "Kubernetes SD config with invalid field", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.KubernetesSDConfigs = []monitoringv1alpha1.KubernetesSDConfig{ + { + Selectors: []monitoringv1alpha1.K8SSelectorConfig{ + { + Field: "status.phase=Running,metadata.name!=worker,)", + }, + }, + }, + } + }, + selected: false, + }, + { + scenario: "Kubernetes SD config with valid label and field", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.KubernetesSDConfigs = []monitoringv1alpha1.KubernetesSDConfig{ + { + Selectors: []monitoringv1alpha1.K8SSelectorConfig{ + { + Label: "app=example,env!=production,release in (v1, v2)", + Field: "status.phase=Running,metadata.name!=worker", + }, + }, + }, + } + }, + selected: true, + }, + { + scenario: "Consul SD config with valid secret ref", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.ConsulSDConfigs = []monitoringv1alpha1.ConsulSDConfig{ + { + Server: "example.com", + TokenRef: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key1", + }, + }, + } + }, + selected: true, + }, + { + scenario: "Consul SD config with invalid secret ref", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.ConsulSDConfigs = []monitoringv1alpha1.ConsulSDConfig{ + { + Server: "example.com", + TokenRef: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "wrong", + }, + Key: "key1", + }, + }, + } + }, + selected: false, + }, + { + scenario: "Consul SD config with no secret ref provided", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.ConsulSDConfigs = []monitoringv1alpha1.ConsulSDConfig{ + { + Server: "example.com", + }, + } + }, + selected: true, + }, + { + scenario: "DNS SD config with port for type other than SRV record", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.DNSSDConfigs = []monitoringv1alpha1.DNSSDConfig{ + { + Names: []string{"node.demo.do.prometheus.io"}, + Type: ptr.To("A"), + Port: ptr.To(9100), + }, + } + }, + selected: true, + }, + { + scenario: "DNS SD config with no port specified for type other than SRV record", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.DNSSDConfigs = []monitoringv1alpha1.DNSSDConfig{ + { + Names: []string{"node.demo.do.prometheus.io"}, + Type: ptr.To("A"), + }, + } + }, + selected: false, + }, + { + scenario: "EC2 SD config with valid secret ref", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + AccessKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key1", + }, + SecretKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key2", + }, + }, + } + }, + selected: true, + }, + { + scenario: "EC2 SD config with no secret ref provided", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + }, + } + }, + selected: true, + }, + { + scenario: "EC2 SD config with invalid secret ref for accessKey", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + AccessKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "wrong", + }, + Key: "key1", + }, + SecretKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key2", + }, + }, + } + }, + selected: false, + }, + { + scenario: "EC2 SD config with invalid secret ref for secretKey", + updateSpec: func(sc *monitoringv1alpha1.ScrapeConfigSpec) { + sc.EC2SDConfigs = []monitoringv1alpha1.EC2SDConfig{ + { + Region: ptr.To("us-east-1"), + AccessKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "secret", + }, + Key: "key1", + }, + SecretKey: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "wrong", + }, + Key: "key2", + }, + }, + } + }, + selected: false, + }, + } { + t.Run(tc.scenario, func(t *testing.T) { + cs := fake.NewSimpleClientset( + &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "secret", + Namespace: "test", + }, + Data: map[string][]byte{ + "key1": []byte("val1"), + "key2": []byte("val2"), + }, + }, + &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "configmap", + Namespace: "test", + }, + Data: map[string]string{ + "key1": "val1", + }, + }, + ) + + rs := NewResourceSelector( + newLogger(), + &monitoringv1.Prometheus{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "test", + }, + }, + assets.NewStore(cs.CoreV1(), cs.CoreV1()), + nil, + operator.NewMetrics(prometheus.NewPedanticRegistry()), + ) + + sc := &monitoringv1alpha1.ScrapeConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "test", + }, + } + tc.updateSpec(&sc.Spec) + + sms, err := rs.SelectScrapeConfigs(context.Background(), func(namespace string, selector labels.Selector, appendFn cache.AppendFunc) error { + appendFn(sc) + return nil + }) + + require.NoError(t, err) + if tc.selected { + require.Equal(t, 1, len(sms)) + } else { + require.Equal(t, 0, len(sms)) + } + }) + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator.go index 98f8ff401..101e06a3c 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator.go @@ -23,7 +23,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/mitchellh/hashstructure" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" @@ -31,10 +30,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes" "k8s.io/client-go/metadata" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" - "k8s.io/utils/pointer" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" @@ -89,39 +89,35 @@ type Operator struct { config operator.Config endpointSliceSupported bool scrapeConfigSupported bool + canReadStorageClass bool statusReporter prompkg.StatusReporter } // New creates a new controller. -func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometheus.Registerer, scrapeConfigSupported bool) (*Operator, error) { - cfg, err := k8sutil.NewClusterConfig(conf.Host, conf.TLSInsecure, &conf.TLSConfig) +func New(ctx context.Context, restConfig *rest.Config, conf operator.Config, logger log.Logger, r prometheus.Registerer, scrapeConfigSupported bool, canReadStorageClass bool) (*Operator, error) { + client, err := kubernetes.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating cluster config failed") + return nil, fmt.Errorf("instantiating kubernetes client failed: %w", err) } - client, err := kubernetes.NewForConfig(cfg) + mdClient, err := metadata.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") + return nil, fmt.Errorf("instantiating metadata client failed: %w", err) } - mdClient, err := metadata.NewForConfig(cfg) + mclient, err := monitoringclient.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating metadata client failed") - } - - mclient, err := monitoringclient.NewForConfig(cfg) - if err != nil { - return nil, errors.Wrap(err, "instantiating monitoring client failed") + return nil, fmt.Errorf("instantiating monitoring client failed: %w", err) } if _, err := labels.Parse(conf.PromSelector); err != nil { - return nil, errors.Wrap(err, "can not parse prometheus selector value") + return nil, fmt.Errorf("can not parse prometheus selector value: %w", err) } secretListWatchSelector, err := fields.ParseSelector(conf.SecretListWatchSelector) if err != nil { - return nil, errors.Wrap(err, "can not parse secrets selector value") + return nil, fmt.Errorf("can not parse secrets selector value: %w", err) } kubeletObjectName := "" @@ -166,6 +162,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh Help: "Number of node endpoints synchronisation failures", }), scrapeConfigSupported: scrapeConfigSupported, + canReadStorageClass: canReadStorageClass, } c.metrics.MustRegister( c.nodeAddressLookupErrors, @@ -195,7 +192,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.PrometheusName), ) if err != nil { - return nil, errors.Wrap(err, "error creating prometheus informers") + return nil, fmt.Errorf("error creating prometheus informers: %w", err) } var promStores []cache.Store @@ -215,7 +212,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.ServiceMonitorName), ) if err != nil { - return nil, errors.Wrap(err, "error creating servicemonitor informers") + return nil, fmt.Errorf("error creating servicemonitor informers: %w", err) } c.pmonInfs, err = informers.NewInformersForResource( @@ -229,7 +226,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.PodMonitorName), ) if err != nil { - return nil, errors.Wrap(err, "error creating podmonitor informers") + return nil, fmt.Errorf("error creating podmonitor informers: %w", err) } c.probeInfs, err = informers.NewInformersForResource( @@ -243,7 +240,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.ProbeName), ) if err != nil { - return nil, errors.Wrap(err, "error creating probe informers") + return nil, fmt.Errorf("error creating probe informers: %w", err) } if c.scrapeConfigSupported { @@ -258,7 +255,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1alpha1.SchemeGroupVersion.WithResource(monitoringv1alpha1.ScrapeConfigName), ) if err != nil { - return nil, errors.Wrap(err, "error creating scrapeconfigs informers") + return nil, fmt.Errorf("error creating scrapeconfigs informers: %w", err) } } c.ruleInfs, err = informers.NewInformersForResource( @@ -272,7 +269,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.PrometheusRuleName), ) if err != nil { - return nil, errors.Wrap(err, "error creating prometheusrule informers") + return nil, fmt.Errorf("error creating prometheusrule informers: %w", err) } c.cmapInfs, err = informers.NewInformersForResource( @@ -288,7 +285,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh v1.SchemeGroupVersion.WithResource(string(v1.ResourceConfigMaps)), ) if err != nil { - return nil, errors.Wrap(err, "error creating configmap informers") + return nil, fmt.Errorf("error creating configmap informers: %w", err) } c.secrInfs, err = informers.NewInformersForResource( @@ -304,7 +301,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh v1.SchemeGroupVersion.WithResource(string(v1.ResourceSecrets)), ) if err != nil { - return nil, errors.Wrap(err, "error creating secrets informers") + return nil, fmt.Errorf("error creating secrets informers: %w", err) } c.ssetInfs, err = informers.NewInformersForResource( @@ -318,38 +315,45 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh appsv1.SchemeGroupVersion.WithResource("statefulsets"), ) if err != nil { - return nil, errors.Wrap(err, "error creating statefulset informers") - } - - newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) cache.SharedIndexInformer { - // nsResyncPeriod is used to control how often the namespace informer - // should resync. If the unprivileged ListerWatcher is used, then the - // informer must resync more often because it cannot watch for - // namespace changes. - nsResyncPeriod := 15 * time.Second - // If the only namespace is v1.NamespaceAll, then the client must be - // privileged and a regular cache.ListWatch will be used. In this case - // watching works and we do not need to resync so frequently. - if listwatch.IsAllNamespaces(allowList) { - nsResyncPeriod = resyncPeriod - } - nsInf := cache.NewSharedIndexInformer( - o.metrics.NewInstrumentedListerWatcher( - listwatch.NewUnprivilegedNamespaceListWatchFromClient(ctx, o.logger, o.kclient.CoreV1().RESTClient(), allowList, o.config.Namespaces.DenyList, fields.Everything()), - ), - &v1.Namespace{}, nsResyncPeriod, cache.Indexers{}, + return nil, fmt.Errorf("error creating statefulset informers: %w", err) + } + + newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) (cache.SharedIndexInformer, error) { + lw, privileged, err := listwatch.NewNamespaceListWatchFromClient( + ctx, + o.logger, + o.config.KubernetesVersion, + o.kclient.CoreV1(), + o.kclient.AuthorizationV1().SelfSubjectAccessReviews(), + allowList, + o.config.Namespaces.DenyList, ) + if err != nil { + return nil, err + } - return nsInf + level.Debug(c.logger).Log("msg", "creating namespace informer", "privileged", privileged) + return cache.NewSharedIndexInformer( + o.metrics.NewInstrumentedListerWatcher(lw), + &v1.Namespace{}, resyncPeriod, cache.Indexers{}, + ), nil } - c.nsMonInf = newNamespaceInformer(c, c.config.Namespaces.AllowList) + + c.nsMonInf, err = newNamespaceInformer(c, c.config.Namespaces.AllowList) + if err != nil { + return nil, err + } + if listwatch.IdenticalNamespaces(c.config.Namespaces.AllowList, c.config.Namespaces.PrometheusAllowList) { c.nsPromInf = c.nsMonInf } else { - c.nsPromInf = newNamespaceInformer(c, c.config.Namespaces.PrometheusAllowList) + c.nsPromInf, err = newNamespaceInformer(c, c.config.Namespaces.PrometheusAllowList) + if err != nil { + return nil, err + } } - endpointSliceSupported, err := k8sutil.IsAPIGroupVersionResourceSupported(c.kclient.Discovery(), "discovery.k8s.io/v1", "endpointslices") + endpointSliceSupported, err := k8sutil.IsAPIGroupVersionResourceSupported(c.kclient.Discovery(), schema.GroupVersion{Group: "discovery.k8s.io", Version: "v1"}, "endpointslices") if err != nil { level.Warn(c.logger).Log("msg", "failed to check if the API supports the endpointslice resources", "err ", err) } @@ -393,7 +397,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { for _, inf := range infs.informersForResource.GetInformers() { if !operator.WaitForNamedCacheSync(ctx, "prometheus", log.With(c.logger, "informer", infs.name), inf.Informer()) { - return errors.Errorf("failed to sync cache for %s informer", infs.name) + return fmt.Errorf("failed to sync cache for %s informer", infs.name) } } } @@ -406,7 +410,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { {"MonNamespace", c.nsMonInf}, } { if !operator.WaitForNamedCacheSync(ctx, "prometheus", log.With(c.logger, "informer", inf.name), inf.informer) { - return errors.Errorf("failed to sync cache for %s informer", inf.name) + return fmt.Errorf("failed to sync cache for %s informer", inf.name) } } @@ -471,27 +475,6 @@ func (c *Operator) addHandlers() { // Run the controller. func (c *Operator) Run(ctx context.Context) error { - errChan := make(chan error) - go func() { - v, err := c.kclient.Discovery().ServerVersion() - if err != nil { - errChan <- errors.Wrap(err, "communicating with server failed") - return - } - level.Info(c.logger).Log("msg", "connection established", "cluster-version", v) - errChan <- nil - }() - - select { - case err := <-errChan: - if err != nil { - return err - } - level.Info(c.logger).Log("msg", "CRD API endpoints ready") - case <-ctx.Done(): - return nil - } - go c.rr.Run(ctx) defer c.rr.Stop() @@ -589,7 +572,7 @@ func getNodeAddresses(nodes *v1.NodeList) ([]v1.EndpointAddress, []error) { for _, n := range nodes.Items { address, _, err := nodeAddress(n) if err != nil { - errs = append(errs, errors.Wrapf(err, "failed to determine hostname for node (%s)", n.Name)) + errs = append(errs, fmt.Errorf("failed to determine hostname for node (%s): %w", n.Name, err)) continue } addresses = append(addresses, v1.EndpointAddress{ @@ -651,7 +634,7 @@ func (c *Operator) syncNodeEndpoints(ctx context.Context) error { nodes, err := c.kclient.CoreV1().Nodes().List(ctx, metav1.ListOptions{LabelSelector: c.config.KubeletSelector}) if err != nil { - return errors.Wrap(err, "listing nodes failed") + return fmt.Errorf("listing nodes failed: %w", err) } level.Debug(logger).Log("msg", "Nodes retrieved from the Kubernetes API", "num_nodes", len(nodes.Items)) @@ -699,13 +682,13 @@ func (c *Operator) syncNodeEndpoints(ctx context.Context) error { level.Debug(logger).Log("msg", "Updating Kubernetes service", "service", c.kubeletObjectName, "ns", c.kubeletObjectNamespace) err = k8sutil.CreateOrUpdateService(ctx, c.kclient.CoreV1().Services(c.kubeletObjectNamespace), svc) if err != nil { - return errors.Wrap(err, "synchronizing kubelet service object failed") + return fmt.Errorf("synchronizing kubelet service object failed: %w", err) } level.Debug(logger).Log("msg", "Updating Kubernetes endpoint", "endpoint", c.kubeletObjectName, "ns", c.kubeletObjectNamespace) err = k8sutil.CreateOrUpdateEndpoints(ctx, c.kclient.CoreV1().Endpoints(c.kubeletObjectNamespace), eps) if err != nil { - return errors.Wrap(err, "synchronizing kubelet endpoints object failed") + return fmt.Errorf("synchronizing kubelet endpoints object failed: %w", err) } return nil @@ -1175,12 +1158,21 @@ func (c *Operator) sync(ctx context.Context, key string) error { p := pobj.(*monitoringv1.Prometheus) p = p.DeepCopy() if err := k8sutil.AddTypeInformationToObject(p); err != nil { - return errors.Wrap(err, "failed to set Prometheus type information") + return fmt.Errorf("failed to set Prometheus type information: %w", err) } logger := log.With(c.logger, "key", key) logDeprecatedFields(logger, p) + // Check if the Prometheus instance is marked for deletion. + if c.rr.DeletionInProgress(p) { + return nil + } + + if err := operator.CheckStorageClass(ctx, c.canReadStorageClass, c.kclient, p.Spec.Storage); err != nil { + return err + } + if p.Spec.Paused { level.Info(logger).Log("msg", "the resource is paused, not reconciling") return nil @@ -1199,22 +1191,22 @@ func (c *Operator) sync(ctx context.Context, key string) error { } if err := c.createOrUpdateConfigurationSecret(ctx, p, cg, ruleConfigMapNames, assetStore); err != nil { - return errors.Wrap(err, "creating config failed") + return fmt.Errorf("creating config failed: %w", err) } tlsAssets, err := c.createOrUpdateTLSAssetSecrets(ctx, p, assetStore) if err != nil { - return errors.Wrap(err, "creating tls asset secret failed") + return fmt.Errorf("creating tls asset secret failed: %w", err) } if err := c.createOrUpdateWebConfigSecret(ctx, p); err != nil { - return errors.Wrap(err, "synchronizing web config secret failed") + return fmt.Errorf("synchronizing web config secret failed: %w", err) } // Create governing service if it doesn't exist. svcClient := c.kclient.CoreV1().Services(p.Namespace) if err := k8sutil.CreateOrUpdateService(ctx, svcClient, makeStatefulSetService(p, c.config)); err != nil { - return errors.Wrap(err, "synchronizing governing service failed") + return fmt.Errorf("synchronizing governing service failed: %w", err) } ssetClient := c.kclient.AppsV1().StatefulSets(p.Namespace) @@ -1228,7 +1220,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { obj, err := c.ssetInfs.Get(prompkg.KeyToStatefulSetKey(p, key, shard)) exists := !apierrors.IsNotFound(err) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "retrieving statefulset failed") + return fmt.Errorf("retrieving statefulset failed: %w", err) } existingStatefulSet := &appsv1.StatefulSet{} @@ -1271,7 +1263,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { int32(shard), tlsAssets.ShardNames()) if err != nil { - return errors.Wrap(err, "making statefulset failed") + return fmt.Errorf("making statefulset failed: %w", err) } operator.SanitizeSTS(sset) @@ -1279,7 +1271,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Debug(logger).Log("msg", "no current statefulset found") level.Debug(logger).Log("msg", "creating statefulset") if _, err := ssetClient.Create(ctx, sset, metav1.CreateOptions{}); err != nil { - return errors.Wrap(err, "creating statefulset failed") + return fmt.Errorf("creating statefulset failed: %w", err) } continue } @@ -1311,13 +1303,13 @@ func (c *Operator) sync(ctx context.Context, key string) error { propagationPolicy := metav1.DeletePropagationForeground if err := ssetClient.Delete(ctx, sset.GetName(), metav1.DeleteOptions{PropagationPolicy: &propagationPolicy}); err != nil { - return errors.Wrap(err, "failed to delete StatefulSet to avoid forbidden action") + return fmt.Errorf("failed to delete StatefulSet to avoid forbidden action: %w", err) } continue } if err != nil { - return errors.Wrap(err, "updating StatefulSet failed") + return fmt.Errorf("updating StatefulSet failed: %w", err) } } @@ -1345,7 +1337,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { } }) if err != nil { - return errors.Wrap(err, "listing StatefulSet resources failed") + return fmt.Errorf("listing StatefulSet resources failed: %w", err) } return nil @@ -1369,12 +1361,13 @@ func (c *Operator) UpdateStatus(ctx context.Context, key string) error { pStatus, err := c.statusReporter.Process(ctx, p, key) if err != nil { - return errors.Wrap(err, "failed to get prometheus status") + return fmt.Errorf("failed to get prometheus status: %w", err) } p.Status = *pStatus - if _, err = c.mclient.MonitoringV1().Prometheuses(p.Namespace).UpdateStatus(ctx, p, metav1.UpdateOptions{}); err != nil { - return errors.Wrap(err, "failed to update prometheus status subresource") + + if _, err = c.mclient.MonitoringV1().Prometheuses(p.Namespace).ApplyStatus(ctx, prompkg.ApplyConfigurationFromPrometheus(p), metav1.ApplyOptions{FieldManager: operator.PrometheusOperatorFieldManager, Force: true}); err != nil { + return fmt.Errorf("failed to apply prometheus status subresource: %w", err) } return nil @@ -1406,7 +1399,8 @@ func logDeprecatedFields(logger log.Logger, p *monitoringv1.Prometheus) { } } - if p.Spec.ServiceMonitorSelector == nil && p.Spec.PodMonitorSelector == nil && p.Spec.ProbeSelector == nil { + if p.Spec.ServiceMonitorSelector == nil && p.Spec.PodMonitorSelector == nil && p.Spec.ProbeSelector == nil && p.Spec.ScrapeConfigSelector == nil { + level.Warn(logger).Log("msg", "neither serviceMonitorSelector nor podMonitorSelector, nor probeSelector specified. Custom configuration is deprecated, use additionalScrapeConfigs instead") } } @@ -1417,6 +1411,11 @@ func createSSetInputHash(p monitoringv1.Prometheus, c operator.Config, ruleConfi http2 = p.Spec.Web.WebConfigFileFields.HTTPConfig.HTTP2 } + // The controller should ignore any changes to RevisionHistoryLimit field because + // it may be modified by external actors. + // See https://github.com/prometheus-operator/prometheus-operator/issues/5712 + ssSpec.RevisionHistoryLimit = nil + hash, err := hashstructure.Hash(struct { PrometheusLabels map[string]string PrometheusAnnotations map[string]string @@ -1439,7 +1438,7 @@ func createSSetInputHash(p monitoringv1.Prometheus, c operator.Config, ruleConfi nil, ) if err != nil { - return "", errors.Wrap(err, "failed to calculate combined hash") + return "", fmt.Errorf("failed to calculate combined hash: %w", err) } return fmt.Sprintf("%d", hash), nil @@ -1454,47 +1453,24 @@ func ListOptions(name string) metav1.ListOptions { } } -func (c *Operator) loadConfigFromSecret(sks *v1.SecretKeySelector, s *v1.SecretList) ([]byte, error) { - if sks == nil { - return nil, nil - } - - for _, secret := range s.Items { - if secret.Name == sks.Name { - if c, ok := secret.Data[sks.Key]; ok { - return c, nil - } - - return nil, fmt.Errorf("key %v could not be found in secret %v", sks.Key, sks.Name) - } - } - - if !pointer.BoolDeref(sks.Optional, true) { - return nil, fmt.Errorf("secret %v could not be found", sks.Name) - } - - level.Debug(c.logger).Log("msg", fmt.Sprintf("secret %v could not be found", sks.Name)) - return nil, nil -} - func (c *Operator) createOrUpdateConfigurationSecret(ctx context.Context, p *monitoringv1.Prometheus, cg *prompkg.ConfigGenerator, ruleConfigMapNames []string, store *assets.Store) error { // If no service or pod monitor selectors are configured, the user wants to // manage configuration themselves. Do create an empty Secret if it doesn't // exist. if p.Spec.ServiceMonitorSelector == nil && p.Spec.PodMonitorSelector == nil && - p.Spec.ProbeSelector == nil { + p.Spec.ProbeSelector == nil && p.Spec.ScrapeConfigSelector == nil { level.Debug(c.logger).Log("msg", "neither ServiceMonitor nor PodMonitor, nor Probe selector specified, leaving configuration unmanaged", "prometheus", p.Name, "namespace", p.Namespace) // make an empty secret s, err := prompkg.MakeConfigurationSecret(p, c.config, nil) if err != nil { - return errors.Wrap(err, "generating empty config secret failed") + return fmt.Errorf("generating empty config secret failed: %w", err) } sClient := c.kclient.CoreV1().Secrets(p.Namespace) _, err = sClient.Get(ctx, s.Name, metav1.GetOptions{}) if apierrors.IsNotFound(err) { if _, err := c.kclient.CoreV1().Secrets(p.Namespace).Create(ctx, s, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) { - return errors.Wrap(err, "creating empty config file failed") + return fmt.Errorf("creating empty config file failed: %w", err) } } if !apierrors.IsNotFound(err) && err != nil { @@ -1508,33 +1484,27 @@ func (c *Operator) createOrUpdateConfigurationSecret(ctx context.Context, p *mon smons, err := resourceSelector.SelectServiceMonitors(ctx, c.smonInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting ServiceMonitors failed") + return fmt.Errorf("selecting ServiceMonitors failed: %w", err) } pmons, err := resourceSelector.SelectPodMonitors(ctx, c.pmonInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting PodMonitors failed") + return fmt.Errorf("selecting PodMonitors failed: %w", err) } bmons, err := resourceSelector.SelectProbes(ctx, c.probeInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting Probes failed") + return fmt.Errorf("selecting Probes failed: %w", err) } var scrapeConfigs map[string]*monitoringv1alpha1.ScrapeConfig if c.sconInfs != nil { scrapeConfigs, err = resourceSelector.SelectScrapeConfigs(ctx, c.sconInfs.ListAllByNamespace) if err != nil { - return errors.Wrap(err, "selecting ScrapeConfigs failed") + return fmt.Errorf("selecting ScrapeConfigs failed: %w", err) } } - sClient := c.kclient.CoreV1().Secrets(p.Namespace) - SecretsInPromNS, err := sClient.List(ctx, metav1.ListOptions{}) - if err != nil { - return err - } - if err := prompkg.AddRemoteReadsToStore(ctx, store, p.GetNamespace(), p.Spec.RemoteRead); err != nil { return err } @@ -1548,27 +1518,23 @@ func (c *Operator) createOrUpdateConfigurationSecret(ctx context.Context, p *mon } if p.Spec.Alerting != nil { - for i, am := range p.Spec.Alerting.Alertmanagers { - if err := store.AddBasicAuth(ctx, p.GetNamespace(), am.BasicAuth, fmt.Sprintf("alertmanager/auth/%d", i)); err != nil { - return errors.Wrapf(err, "alerting") - } - if err := store.AddSafeAuthorizationCredentials(ctx, p.GetNamespace(), am.Authorization, fmt.Sprintf("alertmanager/auth/%d", i)); err != nil { - return errors.Wrapf(err, "alerting") - } + if err := prompkg.AddAlertmanagerEndpointsToStore(ctx, store, p.GetNamespace(), p.Spec.Alerting.Alertmanagers); err != nil { + return err } } - additionalScrapeConfigs, err := c.loadConfigFromSecret(p.Spec.AdditionalScrapeConfigs, SecretsInPromNS) + sClient := c.kclient.CoreV1().Secrets(p.Namespace) + additionalScrapeConfigs, err := k8sutil.LoadSecretRef(ctx, c.logger, sClient, p.Spec.AdditionalScrapeConfigs) if err != nil { - return errors.Wrap(err, "loading additional scrape configs from Secret failed") + return fmt.Errorf("loading additional scrape configs from Secret failed: %w", err) } - additionalAlertRelabelConfigs, err := c.loadConfigFromSecret(p.Spec.AdditionalAlertRelabelConfigs, SecretsInPromNS) + additionalAlertRelabelConfigs, err := k8sutil.LoadSecretRef(ctx, c.logger, sClient, p.Spec.AdditionalAlertRelabelConfigs) if err != nil { - return errors.Wrap(err, "loading additional alert relabel configs from Secret failed") + return fmt.Errorf("loading additional alert relabel configs from Secret failed: %w", err) } - additionalAlertManagerConfigs, err := c.loadConfigFromSecret(p.Spec.AdditionalAlertManagerConfigs, SecretsInPromNS) + additionalAlertManagerConfigs, err := k8sutil.LoadSecretRef(ctx, c.logger, sClient, p.Spec.AdditionalAlertManagerConfigs) if err != nil { - return errors.Wrap(err, "loading additional alert manager configs from Secret failed") + return fmt.Errorf("loading additional alert manager configs from Secret failed: %w", err) } // Update secret based on the most recent configuration. @@ -1592,13 +1558,13 @@ func (c *Operator) createOrUpdateConfigurationSecret(ctx context.Context, p *mon ruleConfigMapNames, ) if err != nil { - return errors.Wrap(err, "generating config failed") + return fmt.Errorf("generating config failed: %w", err) } // Compress config to avoid 1mb secret limit for a while s, err := prompkg.MakeConfigurationSecret(p, c.config, conf) if err != nil { - return errors.Wrap(err, "creating compressed secret failed") + return fmt.Errorf("creating compressed secret failed: %w", err) } level.Debug(c.logger).Log("msg", "updating Prometheus configuration secret") @@ -1618,7 +1584,7 @@ func (c *Operator) createOrUpdateTLSAssetSecrets(ctx context.Context, p *monitor sClient := c.kclient.CoreV1().Secrets(p.Namespace) if err := sSecret.StoreSecrets(ctx, sClient); err != nil { - return nil, errors.Wrapf(err, "failed to create TLS assets secret for Prometheus") + return nil, fmt.Errorf("failed to create TLS assets secret for Prometheus: %w", err) } level.Debug(c.logger).Log("msg", "tls-asset secret: stored") @@ -1640,7 +1606,7 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, p *monitor fields, ) if err != nil { - return errors.Wrap(err, "failed to initialize web config") + return fmt.Errorf("failed to initialize web config: %w", err) } secretClient := c.kclient.CoreV1().Secrets(p.Namespace) @@ -1656,7 +1622,7 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, p *monitor secretLabels := c.config.Labels.Merge(prompkg.ManagedByOperatorLabels) if err := webConfig.CreateOrUpdateWebConfigSecret(ctx, secretClient, secretAnnotations, secretLabels, ownerReference); err != nil { - return errors.Wrap(err, "failed to reconcile web config secret") + return fmt.Errorf("failed to reconcile web config secret: %w", err) } return nil diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator_test.go index 274977161..25cc3222f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/operator_test.go @@ -23,6 +23,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" "github.com/prometheus-operator/prometheus-operator/pkg/operator" @@ -229,7 +230,7 @@ func TestCreateStatefulSetInputHash(t *testing.T) { t.Fatal("expected two Prometheus CRDs to produce the same hash but got different hash") } - p2Hash, err = createSSetInputHash(tc.a, c, []string{}, nil, appsv1.StatefulSetSpec{Replicas: func(i int32) *int32 { return &i }(2)}) + p2Hash, err = createSSetInputHash(tc.a, c, []string{}, nil, appsv1.StatefulSetSpec{Replicas: ptr.To(int32(2))}) if err != nil { t.Fatal(err) } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/rules.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/rules.go index 2b8efd4f1..013a0ca8d 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/rules.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/rules.go @@ -24,7 +24,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -71,12 +70,12 @@ func (c *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, p *monitori promRuleSelector, err := operator.NewPrometheusRuleSelector(operator.PrometheusFormat, promVersion, p.Spec.RuleSelector, nsLabeler, c.ruleInfs, logger) if err != nil { - return nil, errors.Wrap(err, "initializing PrometheusRules failed") + return nil, fmt.Errorf("initializing PrometheusRules failed: %w", err) } newRules, rejected, err := promRuleSelector.Select(namespaces) if err != nil { - return nil, errors.Wrap(err, "selecting PrometheusRules failed") + return nil, fmt.Errorf("selecting PrometheusRules failed: %w", err) } if pKey, ok := c.accessor.MetaNamespaceKey(p); ok { @@ -113,7 +112,7 @@ func (c *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, p *monitori newConfigMaps, err := makeRulesConfigMaps(p, newRules) if err != nil { - return nil, errors.Wrap(err, "failed to make rules ConfigMaps") + return nil, fmt.Errorf("failed to make rules ConfigMaps: %w", err) } newConfigMapNames := []string{} @@ -130,7 +129,7 @@ func (c *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, p *monitori for _, cm := range newConfigMaps { _, err = cClient.Create(ctx, &cm, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to create ConfigMap '%v'", cm.Name) + return nil, fmt.Errorf("failed to create ConfigMap '%v': %w", cm.Name, err) } } return newConfigMapNames, nil @@ -141,7 +140,7 @@ func (c *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, p *monitori for _, cm := range currentConfigMaps { err := cClient.Delete(ctx, cm.Name, metav1.DeleteOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to delete current ConfigMap '%v'", cm.Name) + return nil, fmt.Errorf("failed to delete current ConfigMap '%v': %w", cm.Name, err) } } @@ -153,7 +152,7 @@ func (c *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, p *monitori for _, cm := range newConfigMaps { _, err = cClient.Create(ctx, &cm, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to create new ConfigMap '%v'", cm.Name) + return nil, fmt.Errorf("failed to create new ConfigMap '%v': %w", cm.Name, err) } } @@ -173,7 +172,7 @@ func (c *Operator) selectRuleNamespaces(p *monitoringv1.Prometheus) ([]string, e } else { ruleNamespaceSelector, err := metav1.LabelSelectorAsSelector(p.Spec.RuleNamespaceSelector) if err != nil { - return namespaces, errors.Wrap(err, "convert rule namespace label selector to selector") + return namespaces, fmt.Errorf("convert rule namespace label selector to selector: %w", err) } namespaces, err = operator.ListMatchingNamespaces(ruleNamespaceSelector, c.nsMonInf) @@ -204,7 +203,7 @@ func makeRulesConfigMaps(p *monitoringv1.Prometheus, ruleFiles map[string]string //check if none of the rule files is too large for a single ConfigMap for filename, file := range ruleFiles { if len(file) > maxConfigMapDataSize { - return nil, errors.Errorf( + return nil, fmt.Errorf( "rule file '%v' is too large for a single Kubernetes ConfigMap", filename, ) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset.go index adcb35a31..c1e6bbd61 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset.go @@ -21,7 +21,6 @@ import ( "strings" "github.com/blang/semver/v4" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -126,7 +125,7 @@ func makeStatefulSet( p.SetCommonPrometheusFields(cpf) spec, err := makeStatefulSetSpec(baseImage, tag, sha, retention, retentionSize, rules, query, allowOverlappingBlocks, enableAdminAPI, queryLogFile, thanos, disableCompaction, p, config, cg, shard, ruleConfigMapNames, tlsAssetSecrets) if err != nil { - return nil, errors.Wrap(err, "make StatefulSet spec") + return nil, fmt.Errorf("make StatefulSet spec: %w", err) } boolTrue := true @@ -430,7 +429,7 @@ func makeStatefulSetSpec( initContainers, err := k8sutil.MergePatchContainers(operatorInitContainers, cpf.InitContainers) if err != nil { - return nil, errors.Wrap(err, "failed to merge init containers spec") + return nil, fmt.Errorf("failed to merge init containers spec: %w", err) } containerArgs, err := operator.BuildArgs(promArgs, cpf.AdditionalArgs) @@ -484,7 +483,7 @@ func makeStatefulSetSpec( containers, err := k8sutil.MergePatchContainers(operatorContainers, cpf.Containers) if err != nil { - return nil, errors.Wrap(err, "failed to merge containers spec") + return nil, fmt.Errorf("failed to merge containers spec: %w", err) } // PodManagementPolicy is set to Parallel to mitigate issues in kubernetes: https://github.com/kubernetes/kubernetes/issues/60164 @@ -659,7 +658,7 @@ func createThanosContainer( operator.StringPtrValOrDefault(thanos.SHA, ""), ) if err != nil { - return nil, errors.Wrap(err, "failed to build image path") + return nil, fmt.Errorf("failed to build image path: %w", err) } var grpcBindAddress, httpBindAddress string @@ -789,7 +788,7 @@ func createThanosContainer( thanosVersion, err := semver.ParseTolerant(operator.StringPtrValOrDefault(thanos.Version, operator.DefaultThanosVersion)) if err != nil { - return nil, errors.Wrap(err, "failed to parse Thanos version") + return nil, fmt.Errorf("failed to parse Thanos version: %w", err) } if thanos.GetConfigTimeout != "" && thanosVersion.GTE(semver.MustParse("0.29.0")) { diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset_test.go index f8a21adcd..897ecfbac 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/server/statefulset_test.go @@ -31,7 +31,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" "github.com/prometheus-operator/prometheus-operator/pkg/operator" @@ -2609,8 +2609,6 @@ func TestThanosAdditionalArgsDuplicate(t *testing.T) { } func TestPrometheusQuerySpec(t *testing.T) { - durationPtr := func(s string) *monitoringv1.Duration { d := monitoringv1.Duration(s); return &d } - for _, tc := range []struct { name string @@ -2628,10 +2626,10 @@ func TestPrometheusQuerySpec(t *testing.T) { }, { name: "all values provided", - lookbackDelta: pointer.String("2m"), - maxConcurrency: pointer.Int32(10), - maxSamples: pointer.Int32(10000), - timeout: durationPtr("1m"), + lookbackDelta: ptr.To("2m"), + maxConcurrency: ptr.To(int32(10)), + maxSamples: ptr.To(int32(10000)), + timeout: ptr.To(monitoringv1.Duration("1m")), expected: []string{ "--query.lookback-delta=2m", @@ -2642,10 +2640,10 @@ func TestPrometheusQuerySpec(t *testing.T) { }, { name: "zero values are skipped", - lookbackDelta: pointer.String("2m"), - maxConcurrency: pointer.Int32(0), - maxSamples: pointer.Int32(0), - timeout: durationPtr("1m"), + lookbackDelta: ptr.To("2m"), + maxConcurrency: ptr.To(int32(0)), + maxSamples: ptr.To(int32(0)), + timeout: ptr.To(monitoringv1.Duration("1m")), expected: []string{ "--query.lookback-delta=2m", @@ -2654,10 +2652,10 @@ func TestPrometheusQuerySpec(t *testing.T) { }, { name: "max samples skipped if version < 2.5", - lookbackDelta: pointer.String("2m"), - maxConcurrency: pointer.Int32(10), - maxSamples: pointer.Int32(10000), - timeout: durationPtr("1m"), + lookbackDelta: ptr.To("2m"), + maxConcurrency: ptr.To(int32(10)), + maxSamples: ptr.To(int32(10000)), + timeout: ptr.To(monitoringv1.Duration("1m")), version: "v2.4.0", expected: []string{ @@ -2668,10 +2666,10 @@ func TestPrometheusQuerySpec(t *testing.T) { }, { name: "max samples not skipped if version > 2.5", - lookbackDelta: pointer.String("2m"), - maxConcurrency: pointer.Int32(10), - maxSamples: pointer.Int32(10000), - timeout: durationPtr("1m"), + lookbackDelta: ptr.To("2m"), + maxConcurrency: ptr.To(int32(10)), + maxSamples: ptr.To(int32(10000)), + timeout: ptr.To(monitoringv1.Duration("1m")), version: "v2.5.0", expected: []string{ @@ -2754,7 +2752,7 @@ func TestSecurityContextCapabilities(t *testing.T) { name: "Thanos sidecar with object storage", spec: monitoringv1.PrometheusSpec{ Thanos: &monitoringv1.ThanosSpec{ - ObjectStorageConfigFile: func(s string) *string { return &s }("/etc/thanos.cfg"), + ObjectStorageConfigFile: ptr.To("/etc/thanos.cfg"), }, }, }, diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/statefulset.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/statefulset.go index 99769662a..163437ad2 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/statefulset.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/statefulset.go @@ -22,11 +22,10 @@ import ( "path/filepath" "strings" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" @@ -82,20 +81,20 @@ func shardsNumber( ) int32 { cpf := p.GetCommonPrometheusFields() - if pointer.Int32Deref(cpf.Shards, 1) <= 1 { + if ptr.Deref(cpf.Shards, 1) <= 1 { return 1 } return *cpf.Shards } -// ReplicasNumberPtr returns a pointer to the normalized number of replicas. +// ReplicasNumberPtr returns a ptr to the normalized number of replicas. func ReplicasNumberPtr( p monitoringv1.PrometheusInterface, ) *int32 { cpf := p.GetCommonPrometheusFields() - replicas := pointer.Int32Deref(cpf.Replicas, 1) + replicas := ptr.Deref(cpf.Replicas, 1) if replicas < 0 { replicas = 1 } @@ -114,7 +113,7 @@ func prometheusNameByShard(p monitoringv1.PrometheusInterface, shard int32) stri func compress(data []byte) ([]byte, error) { var buf bytes.Buffer if err := operator.GzipConfig(&buf, data); err != nil { - return nil, errors.Wrap(err, "failed to gzip config") + return nil, fmt.Errorf("failed to gzip config: %w", err) } return buf.Bytes(), nil @@ -135,8 +134,8 @@ func MakeConfigurationSecret(p monitoringv1.PrometheusInterface, config operator Labels: config.Labels.Merge(ManagedByOperatorLabels), OwnerReferences: []metav1.OwnerReference{{ APIVersion: typeMeta.APIVersion, - BlockOwnerDeletion: pointer.Bool(true), - Controller: pointer.Bool(true), + BlockOwnerDeletion: ptr.To(true), + Controller: ptr.To(true), Kind: typeMeta.Kind, Name: objMeta.GetName(), UID: objMeta.GetUID(), @@ -418,15 +417,11 @@ func BuildPodMetadata(cpf monitoringv1.CommonPrometheusFields, cg *ConfigGenerat } if cpf.PodMetadata != nil { - if cpf.PodMetadata.Labels != nil { - for k, v := range cpf.PodMetadata.Labels { - podLabels[k] = v - } + for k, v := range cpf.PodMetadata.Labels { + podLabels[k] = v } - if cpf.PodMetadata.Annotations != nil { - for k, v := range cpf.PodMetadata.Annotations { - podAnnotations[k] = v - } + for k, v := range cpf.PodMetadata.Annotations { + podAnnotations[k] = v } } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/store.go b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/store.go index 864d2d31a..347ea19c5 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/store.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/store.go @@ -18,8 +18,6 @@ import ( "context" "fmt" - "github.com/pkg/errors" - monv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" "github.com/prometheus-operator/prometheus-operator/pkg/assets" ) @@ -28,23 +26,23 @@ func AddRemoteWritesToStore(ctx context.Context, store *assets.Store, namespace for i, remote := range remotes { if err := ValidateRemoteWriteSpec(remote); err != nil { - return errors.Wrapf(err, "remote write %d", i) + return fmt.Errorf("remote write %d: %w", i, err) } key := fmt.Sprintf("remoteWrite/%d", i) if err := store.AddBasicAuth(ctx, namespace, remote.BasicAuth, key); err != nil { - return errors.Wrapf(err, "remote write %d", i) + return fmt.Errorf("remote write %d: %w", i, err) } if err := store.AddOAuth2(ctx, namespace, remote.OAuth2, key); err != nil { - return errors.Wrapf(err, "remote write %d", i) + return fmt.Errorf("remote write %d: %w", i, err) } if err := store.AddTLSConfig(ctx, namespace, remote.TLSConfig); err != nil { - return errors.Wrapf(err, "remote write %d", i) + return fmt.Errorf("remote write %d: %w", i, err) } if err := store.AddAuthorizationCredentials(ctx, namespace, remote.Authorization, fmt.Sprintf("remoteWrite/auth/%d", i)); err != nil { - return errors.Wrapf(err, "remote write %d", i) + return fmt.Errorf("remote write %d: %w", i, err) } if err := store.AddSigV4(ctx, namespace, remote.Sigv4, key); err != nil { - return errors.Wrapf(err, "remote write %d", i) + return fmt.Errorf("remote write %d: %w", i, err) } } return nil @@ -54,18 +52,37 @@ func AddRemoteReadsToStore(ctx context.Context, store *assets.Store, namespace s for i, remote := range remotes { if err := store.AddBasicAuth(ctx, namespace, remote.BasicAuth, fmt.Sprintf("remoteRead/%d", i)); err != nil { - return errors.Wrapf(err, "remote read %d", i) + return fmt.Errorf("remote read %d: %w", i, err) } if err := store.AddOAuth2(ctx, namespace, remote.OAuth2, fmt.Sprintf("remoteRead/%d", i)); err != nil { - return errors.Wrapf(err, "remote read %d", i) + return fmt.Errorf("remote read %d: %w", i, err) } if err := store.AddTLSConfig(ctx, namespace, remote.TLSConfig); err != nil { - return errors.Wrapf(err, "remote read %d", i) + return fmt.Errorf("remote read %d: %w", i, err) } if err := store.AddAuthorizationCredentials(ctx, namespace, remote.Authorization, fmt.Sprintf("remoteRead/auth/%d", i)); err != nil { - return errors.Wrapf(err, "remote read %d", i) + return fmt.Errorf("remote read %d: %w", i, err) + } + } + return nil +} + +func AddAlertmanagerEndpointsToStore(ctx context.Context, store *assets.Store, namespace string, ams []monv1.AlertmanagerEndpoints) error { + for i, am := range ams { + if err := ValidateAlertmanagerEndpoints(am); err != nil { + return fmt.Errorf("alertmanager %d: %w", i, err) + } + if err := store.AddBasicAuth(ctx, namespace, am.BasicAuth, fmt.Sprintf("alertmanager/auth/%d", i)); err != nil { + return fmt.Errorf("alertmanager %d: %w", i, err) + } + if err := store.AddSafeAuthorizationCredentials(ctx, namespace, am.Authorization, fmt.Sprintf("alertmanager/auth/%d", i)); err != nil { + return fmt.Errorf("alertmanager %d: %w", i, err) + } + if err := store.AddSigV4(ctx, namespace, am.Sigv4, fmt.Sprintf("alertmanager/auth/%d", i)); err != nil { + return fmt.Errorf("alertmanager %d: %w", i, err) } } + return nil } @@ -75,10 +92,10 @@ func AddAPIServerConfigToStore(ctx context.Context, store *assets.Store, namespa } if err := store.AddBasicAuth(ctx, namespace, config.BasicAuth, "apiserver"); err != nil { - return errors.Wrap(err, "apiserver config") + return fmt.Errorf("apiserver config: %w", err) } if err := store.AddAuthorizationCredentials(ctx, namespace, config.Authorization, "apiserver/auth"); err != nil { - return errors.Wrapf(err, "apiserver config") + return fmt.Errorf("apiserver config: %w", err) } return nil } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs.golden new file mode 100644 index 000000000..60b4d8a8a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs.golden @@ -0,0 +1,3 @@ +- action: drop + source_labels: [__meta_kubernetes_node_name] + regex: spot-(.+) \ No newline at end of file diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden new file mode 100644 index 000000000..f911f9fbc --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalAlertRelabelConfigs_Expected.golden @@ -0,0 +1,32 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + - action: drop + source_labels: + - __meta_kubernetes_node_name + regex: spot-(.+) + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden new file mode 100644 index 000000000..655983886 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_one_prometheus_shard.golden @@ -0,0 +1,22 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: prometheus + scrape_interval: 15s + static_configs: + - targets: + - localhost:9090 +- job_name: gce_app_bar + scrape_interval: 5s + gce_sd_config: + - project: foo + zone: us-central1 + relabel_configs: + - action: keep + source_labels: + - __meta_gce_label_app + regex: my_app diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden new file mode 100644 index 000000000..6c04f9e54 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_sharded prometheus.golden @@ -0,0 +1,41 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: prometheus + scrape_interval: 15s + static_configs: + - targets: + - localhost:9090 + relabel_configs: + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 3 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep +- job_name: gce_app_bar + scrape_interval: 5s + gce_sd_config: + - project: foo + zone: us-central1 + relabel_configs: + - action: keep + source_labels: + - __meta_gce_label_app + regex: my_app + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 3 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden new file mode 100644 index 000000000..655983886 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AdditionalScrapeConfigs_unsharded_prometheus.golden @@ -0,0 +1,22 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: prometheus + scrape_interval: 15s + static_configs: + - targets: + - localhost:9090 +- job_name: gce_app_bar + scrape_interval: 5s + gce_sd_config: + - project: foo + zone: us-central1 + relabel_configs: + - action: keep + source_labels: + - __meta_gce_label_app + regex: my_app diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerAPIVersion.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerAPIVersion.golden new file mode 100644 index 000000000..34cce4dca --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerAPIVersion.golden @@ -0,0 +1,29 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + api_version: v2 + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Invalid_Prom_Version.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Invalid_Prom_Version.golden new file mode 100644 index 000000000..9d4483a37 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Invalid_Prom_Version.golden @@ -0,0 +1,28 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Valid_Prom_Version.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Valid_Prom_Version.golden new file mode 100644 index 000000000..60c6f7d8c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBasicAuth_Valid_Prom_Version.golden @@ -0,0 +1,31 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + basic_auth: + username: bob + password: alice + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBearerToken.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBearerToken.golden new file mode 100644 index 000000000..285cfd385 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerBearerToken.golden @@ -0,0 +1,29 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + bearer_token_file: /some/file/on/disk + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Enabled.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Enabled.golden new file mode 100644 index 000000000..e1eff754f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Enabled.golden @@ -0,0 +1,30 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + enable_http2: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + api_version: v2 + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Unsupported.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Unsupported.golden new file mode 100644 index 000000000..34cce4dca --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_false_expectedWithHTTP2Unsupported.golden @@ -0,0 +1,29 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + api_version: v2 + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Enabled.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Enabled.golden new file mode 100644 index 000000000..fe59a5a88 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Enabled.golden @@ -0,0 +1,30 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + enable_http2: true + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + api_version: v2 + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Unsupported.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Unsupported.golden new file mode 100644 index 000000000..34cce4dca --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerEnableHttp2_true_expectedWithHTTP2Unsupported.golden @@ -0,0 +1,29 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + api_version: v2 + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Invalid_Prom_Version.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Invalid_Prom_Version.golden new file mode 100644 index 000000000..9d4483a37 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Invalid_Prom_Version.golden @@ -0,0 +1,28 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Valid_Prom_Version.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Valid_Prom_Version.golden new file mode 100644 index 000000000..c66088a0b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerSigv4_Valid_Prom_Version.golden @@ -0,0 +1,34 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + sigv4: + region: us-central-0 + access_key: access-key + secret_key: secret-key + profile: profilename + role_arn: arn:aws:iam::123456789012:instance-profile/prometheus + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden new file mode 100644 index 000000000..277991d81 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/AlertmanagerTimeoutConfig.golden @@ -0,0 +1,30 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + timeout: 60s + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + api_version: v2 + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_returns_an_empty_list_instead_of_the_current_namespace.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_returns_an_empty_list_instead_of_the_current_namespace.golden new file mode 100644 index 000000000..b429bcf34 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_returns_an_empty_list_instead_of_the_current_namespace.golden @@ -0,0 +1,2 @@ +kubernetes_sd_configs: +- role: endpoints diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_takes_precedence_over_MatchNames.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_takes_precedence_over_MatchNames.golden new file mode 100644 index 000000000..b429bcf34 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/Any_takes_precedence_over_MatchNames.golden @@ -0,0 +1,2 @@ +kubernetes_sd_configs: +- role: endpoints diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce0MB_v2.28.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce0MB_v2.28.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce0MB_v2.28.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.27.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.27.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.28.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.28.0.golden new file mode 100644 index 000000000..9f528fd91 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/BodySizeLimits_enforce1000MB_v2.28.0.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + body_size_limit: 1000MB + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfig.golden new file mode 100644 index 000000000..31cbf9bb9 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfig.golden @@ -0,0 +1,33 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + consul_sd_configs: + - server: localhost + token: value + datacenter: we1 + namespace: observability + partition: "1" + scheme: https + services: + - prometheus + - alertmanager + tags: + - tag1 + tag_separator: ; + node_meta: + name: node_name + service: service_name + allow_stale: false + refresh_interval: 30s + proxy_url: http://no-proxy.com + no_proxy: 0.0.0.0 + proxy_from_environment: true + proxy_connect_header: + header: value + follow_redirects: true + enable_http2: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden new file mode 100644 index 000000000..fea79c480 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigAuthorization.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + consul_sd_configs: + - authorization: + type: Bearer + credentials: authorization + server: localhost:8500 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden new file mode 100644 index 000000000..f2ec02a72 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigBasicAuth.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + consul_sd_configs: + - basic_auth: + username: consul-sd-bob + password: consul-sd-alice + server: localhost:8500 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden new file mode 100644 index 000000000..739952dbd --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigOAuth.golden @@ -0,0 +1,20 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + consul_sd_configs: + - oauth2: + client_id: client-id + client_secret: client-secret + token_url: http://test.url + scopes: + - scope 1 + - scope 2 + endpoint_params: + param1: value1 + param2: value2 + server: localhost:8500 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden new file mode 100644 index 000000000..1b4723122 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ConsulScrapeConfigTLSConfig.golden @@ -0,0 +1,15 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + consul_sd_configs: + - tls_config: + insecure_skip_verify: false + ca_file: /etc/prometheus/certs/secret_default_secret-ca-global_ + cert_file: /etc/prometheus/certs/secret_default_secret-cert_ + key_file: /etc/prometheus/certs/secret_default_secret_key + server: localhost:8500 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EmptyEndpointPorts.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EmptyEndpointPorts.golden new file mode 100644 index 000000000..7b6a69436 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EmptyEndpointPorts.golden @@ -0,0 +1,67 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/test/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_service_label_foo + - __meta_kubernetes_service_labelpresent_foo + regex: (bar);true + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden new file mode 100644 index 000000000..3dd5579fa --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedPodMonitor_Expected.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_pod_label_env + target_label: env + regex: (.+) + replacement: ${1} + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __meta_kubernetes_pod_ready + regex: (.*) + replacement: $1 + action: replace + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - source_labels: + - pod_name + target_label: my-ns + regex: my-job-pod-.+ + action: drop diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden new file mode 100644 index 000000000..765c23c33 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelOnExcludedServiceMonitor_Expected.golden @@ -0,0 +1,84 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/service-monitor-ns/servicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - service-monitor-ns + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_service_label_foo + - __meta_kubernetes_service_labelpresent_foo + regex: (bar);true + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __meta_kubernetes_pod_ready + regex: (.*) + replacement: $1 + action: replace + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - source_labels: + - pod_name + target_label: ns-key + regex: my-job-pod-.+ + action: drop diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden new file mode 100644 index 000000000..07e687e46 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelPodMonitor_Expected.golden @@ -0,0 +1,74 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_pod_label_env + target_label: env + regex: (.+) + replacement: ${1} + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __meta_kubernetes_pod_ready + regex: (.*) + replacement: $1 + action: replace + - target_label: ns-key + replacement: pod-monitor-ns + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - source_labels: + - pod_name + target_label: my-ns + regex: my-job-pod-.+ + action: drop + - target_label: ns-key + replacement: pod-monitor-ns diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden new file mode 100644 index 000000000..51d4562d2 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/EnforcedNamespaceLabelServiceMonitor_Expected.golden @@ -0,0 +1,93 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/test/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_service_label_foo + - __meta_kubernetes_service_labelpresent_foo + regex: (bar);true + - action: keep + source_labels: + - __meta_kubernetes_service_label_alpha + - __meta_kubernetes_service_labelpresent_alpha + regex: (beta|gamma);true + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __meta_kubernetes_pod_ready + regex: (.*) + replacement: $1 + action: replace + - target_label: ns-key + replacement: default + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - source_labels: + - pod_name + target_label: ns-key + regex: my-job-pod-.+ + action: drop + - target_label: ns-key + replacement: default diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/GenerateRelabelConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/GenerateRelabelConfig.golden new file mode 100644 index 000000000..798efb30c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/GenerateRelabelConfig.golden @@ -0,0 +1,91 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/test/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_service_label_foo + - __meta_kubernetes_service_labelpresent_foo + regex: (bar);true + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: https-metrics + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: https-metrics + - source_labels: + - instance + target_label: instance + action: uppercase + - source_labels: + - __address__ + target_label: __address__ + regex: (.+)(?::d+) + replacement: $1:9537 + action: replace + - target_label: job + replacement: crio + action: replace + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - source_labels: + - __name__ + regex: container_fs* + action: drop diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorLabelsOverriding.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorLabelsOverriding.golden new file mode 100644 index 000000000..c3e670d34 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorLabelsOverriding.golden @@ -0,0 +1,79 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_label_env + target_label: env + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorTimestampsOverriding.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorTimestampsOverriding.golden new file mode 100644 index 000000000..666602000 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/HonorTimestampsOverriding.golden @@ -0,0 +1,80 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + honor_timestamps: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_label_env + target_label: env + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/IgnoreNamespaceSelectors_overrides_Any_and_MatchNames.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/IgnoreNamespaceSelectors_overrides_Any_and_MatchNames.golden new file mode 100644 index 000000000..410e4d426 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/IgnoreNamespaceSelectors_overrides_Any_and_MatchNames.golden @@ -0,0 +1,5 @@ +kubernetes_sd_configs: +- role: endpoints + namespaces: + names: + - default diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationFirst.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationFirst.golden new file mode 100644 index 000000000..042c26e12 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationFirst.golden @@ -0,0 +1,5 @@ +kubernetes_sd_configs: +- role: endpoints + namespaces: + names: + - test diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationTwo.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationTwo.golden new file mode 100644 index 000000000..e5c657a4f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/K8SSDConfigGenerationTwo.golden @@ -0,0 +1,11 @@ +kubernetes_sd_configs: +- role: endpoints + namespaces: + names: + - test + api_server: example.com + basic_auth: + username: foo + password: bar + bearer_token: bearer_token + bearer_token_file: bearer_token_file diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargets.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargets.golden new file mode 100644 index 000000000..ec9f7bd21 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargets.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + keep_dropped_targets: 500 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsNotAddedInConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsNotAddedInConfig.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsNotAddedInConfig.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsOverridedWithEnforcedValue.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsOverridedWithEnforcedValue.golden new file mode 100644 index 000000000..f6812d90d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/KeepDroppedTargetsOverridedWithEnforcedValue.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + keep_dropped_targets: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.26.0_enforceLimit1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.26.0_enforceLimit1000.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.26.0_enforceLimit1000.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.27.0_enforceLimit1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.27.0_enforceLimit1000.golden new file mode 100644 index 000000000..084dee67d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit2000_v2.27.0_enforceLimit1000.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + label_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.26.0_enforceLimit1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.26.0_enforceLimit1000.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.26.0_enforceLimit1000.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.27.0_enforceLimit1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.27.0_enforceLimit1000.golden new file mode 100644 index 000000000..bfef0bfaa --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_Limit500_v2.27.0_enforceLimit1000.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + label_limit: 500 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0_enforceLimit1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0_enforceLimit1000.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.26.0_enforceLimit1000.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0_enforceLimit1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0_enforceLimit1000.golden new file mode 100644 index 000000000..084dee67d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelLimits_NoLimit_v2.27.0_enforceLimit1000.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + label_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforc1000_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforc1000_v2.26.0.golden new file mode 100644 index 000000000..e3ac2f086 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforc1000_v2.26.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.26.0.golden new file mode 100644 index 000000000..e3ac2f086 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.26.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.27.0.golden new file mode 100644 index 000000000..e3ac2f086 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce-1_v2.27.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce1000_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce1000_v2.27.0.golden new file mode 100644 index 000000000..909c6b485 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit-1_Enforce1000_v2.27.0.golden @@ -0,0 +1,51 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + label_name_length_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.26.0.golden new file mode 100644 index 000000000..e3ac2f086 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.26.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.27.0.golden new file mode 100644 index 000000000..909c6b485 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit2000_Enforce1000_v2.27.0.golden @@ -0,0 +1,51 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + label_name_length_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.26.0.golden new file mode 100644 index 000000000..e3ac2f086 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.26.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.27.0.golden new file mode 100644 index 000000000..b1a2af439 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelNameLengthLimits_Limit500_Enforce1000_v2.27.0.golden @@ -0,0 +1,51 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + label_name_length_limit: 500 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.26.0.golden new file mode 100644 index 000000000..7f7fdabff --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.26.0.golden @@ -0,0 +1,44 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.27.0.golden new file mode 100644 index 000000000..7f7fdabff --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce-1_LabelValue-1_v2.27.0.golden @@ -0,0 +1,44 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.26.0.golden new file mode 100644 index 000000000..7f7fdabff --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.26.0.golden @@ -0,0 +1,44 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.27.0.golden new file mode 100644 index 000000000..f37f93d1a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue-1_v2.27.0.golden @@ -0,0 +1,45 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + label_value_length_limit: 1000 + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.26.0.golden new file mode 100644 index 000000000..7f7fdabff --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.26.0.golden @@ -0,0 +1,44 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.27.0.golden new file mode 100644 index 000000000..f37f93d1a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue2000_v2.27.0.golden @@ -0,0 +1,45 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + label_value_length_limit: 1000 + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.26.0.golden new file mode 100644 index 000000000..7f7fdabff --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.26.0.golden @@ -0,0 +1,44 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.27.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.27.0.golden new file mode 100644 index 000000000..6359d5b12 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/LabelValueLengthLimits_Enforce1000_LabelValue500_v2.27.0.golden @@ -0,0 +1,45 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + params: + module: + - http_2xx + label_value_length_limit: 500 + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden new file mode 100644 index 000000000..0892b6a61 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/MatchExpressionsServiceMonitor.golden @@ -0,0 +1,74 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/test/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_service_label_alpha + - __meta_kubernetes_service_labelpresent_alpha + regex: (beta|gamma);true + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NamespaceSetCorrectlyForPodMonitor.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NamespaceSetCorrectlyForPodMonitor.golden new file mode 100644 index 000000000..95995f3a6 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NamespaceSetCorrectlyForPodMonitor.golden @@ -0,0 +1,7 @@ +kubernetes_sd_configs: +- role: pod + namespaces: + names: + - test + attach_metadata: + node: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden new file mode 100644 index 000000000..71f3738e3 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/NoEnforcedNamespaceLabelServiceMonitor_Expected.golden @@ -0,0 +1,87 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/test/0 + honor_labels: true + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_service_label_foo + - __meta_kubernetes_service_labelpresent_foo + regex: (bar);true + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: https-metrics + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: https-metrics + - source_labels: + - __address__ + target_label: __address__ + regex: (.+)(?::d+) + replacement: $1:9537 + action: replace + - target_label: job + replacement: crio + action: replace + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - source_labels: + - __name__ + regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s) + action: drop diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden new file mode 100644 index 000000000..9062e1a25 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden new file mode 100644 index 000000000..d72a6a78f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden @@ -0,0 +1,51 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + enable_http2: false + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden new file mode 100644 index 000000000..9062e1a25 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden new file mode 100644 index 000000000..ffec6c465 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden @@ -0,0 +1,51 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + enable_http2: true + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.25.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.25.0.golden new file mode 100644 index 000000000..9062e1a25 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.25.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.28.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.28.0.golden new file mode 100644 index 000000000..0fcece7ac --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsFalse_v2.28.0.golden @@ -0,0 +1,51 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + follow_redirects: false + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.25.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.25.0.golden new file mode 100644 index 000000000..9062e1a25 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.25.0.golden @@ -0,0 +1,50 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.28.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.28.0.golden new file mode 100644 index 000000000..2c0efaf18 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorEndpointFollowRedirects_FollowRedirectsTrue_v2.28.0.golden @@ -0,0 +1,51 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/pod-monitor-ns/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - pod-monitor-ns + scrape_interval: 30s + follow_redirects: true + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: pod-monitor-ns/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden new file mode 100644 index 000000000..abfa2d8de --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodMonitorPhaseFilter.golden @@ -0,0 +1,45 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: test + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: test + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabels.golden new file mode 100644 index 000000000..06c190d14 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabels.golden @@ -0,0 +1,79 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_pod_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_pod_label_env + target_label: env + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden new file mode 100644 index 000000000..0058c1b45 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitor.golden @@ -0,0 +1,60 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_pod_label_env + target_label: env + regex: (.+) + replacement: ${1} + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden new file mode 100644 index 000000000..aad3439df --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/PodTargetLabelsFromPodMonitorAndGlobal.golden @@ -0,0 +1,60 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_label_local + target_label: local + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_pod_label_global + target_label: global + regex: (.+) + replacement: ${1} + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden new file mode 100644 index 000000000..9ac241717 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGeneration.golden @@ -0,0 +1,65 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + params: + module: + - http_2xx + kubernetes_sd_configs: + - role: ingress + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_ingress_label_prometheus_io_probe + - __meta_kubernetes_ingress_labelpresent_prometheus_io_probe + regex: (true);true + - source_labels: + - __meta_kubernetes_ingress_scheme + - __address__ + - __meta_kubernetes_ingress_path + separator: ; + regex: (.+);(.+);(.+) + target_label: __param_target + replacement: ${1}://${2}${3} + action: replace + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_ingress_name + target_label: ingress + - source_labels: + - __address__ + separator: ; + regex: (.*) + target_label: __tmp_ingress_address + replacement: $1 + action: replace + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - target_label: foo + replacement: bar + action: replace + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden new file mode 100644 index 000000000..fa861a892 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithLabelEnforce.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + params: + module: + - http_2xx + kubernetes_sd_configs: + - role: ingress + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_ingress_label_prometheus_io_probe + - __meta_kubernetes_ingress_labelpresent_prometheus_io_probe + regex: (true);true + - source_labels: + - __meta_kubernetes_ingress_scheme + - __address__ + - __meta_kubernetes_ingress_path + separator: ; + regex: (.+);(.+);(.+) + target_label: __param_target + replacement: ${1}://${2}${3} + action: replace + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_ingress_name + target_label: ingress + - source_labels: + - __address__ + separator: ; + regex: (.*) + target_label: __tmp_ingress_address + replacement: $1 + action: replace + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - target_label: foo + replacement: bar + action: replace + - target_label: namespace + replacement: default + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - target_label: namespace + replacement: default diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden new file mode 100644 index 000000000..7da8bb723 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeIngressSDConfigGenerationWithShards.golden @@ -0,0 +1,65 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + params: + module: + - http_2xx + kubernetes_sd_configs: + - role: ingress + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_ingress_label_prometheus_io_probe + - __meta_kubernetes_ingress_labelpresent_prometheus_io_probe + regex: (true);true + - source_labels: + - __meta_kubernetes_ingress_scheme + - __address__ + - __meta_kubernetes_ingress_path + separator: ; + regex: (.+);(.+);(.+) + target_label: __param_target + replacement: ${1}://${2}${3} + action: replace + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_ingress_name + target_label: ingress + - source_labels: + - __address__ + separator: ; + regex: (.*) + target_label: __tmp_ingress_address + replacement: $1 + action: replace + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - target_label: foo + replacement: bar + action: replace + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 2 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden new file mode 100644 index 000000000..cceb7ce58 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_empty_probe.golden @@ -0,0 +1,24 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/probe1 + honor_timestamps: true + metrics_path: "" + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden new file mode 100644 index 000000000..49c9b06d4 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_module_config.golden @@ -0,0 +1,27 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/probe1 + honor_timestamps: true + metrics_path: "" + params: + module: + - http_2xx + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden new file mode 100644 index 000000000..beb1ed944 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_prober_spec.golden @@ -0,0 +1,26 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/probe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + proxy_url: socks://myproxy:9095 + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden new file mode 100644 index 000000000..a55234546 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeSpecConfig_targets_static_config.golden @@ -0,0 +1,42 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/probe1 + honor_timestamps: true + metrics_path: "" + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: "" + - target_label: foo + replacement: bar + action: replace + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden new file mode 100644 index 000000000..b23d031e5 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithJobName.golden @@ -0,0 +1,44 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + params: + module: + - http_2xx + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - target_label: job + replacement: blackbox + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden new file mode 100644 index 000000000..bde554558 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithLabelEnforce.golden @@ -0,0 +1,49 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + params: + module: + - http_2xx + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: custom + static: label + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - target_label: namespace + replacement: default + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - regex: noisy_labels.* + action: labeldrop + - target_label: namespace + replacement: default diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden new file mode 100644 index 000000000..e09870d74 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ProbeStaticTargetsConfigGenerationWithoutModule.golden @@ -0,0 +1,41 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: /probe + scheme: http + static_configs: + - targets: + - prometheus.io + - promcon.io + labels: + namespace: default + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - target_label: job + replacement: blackbox + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: blackbox.exporter.io + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.25.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.25.0.golden new file mode 100644 index 000000000..4e2ac4aee --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.25.0.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0.golden new file mode 100644 index 000000000..4e2ac4aee --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_AuthorizationSafe.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_AuthorizationSafe.golden new file mode 100644 index 000000000..a51b16a63 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_AuthorizationSafe.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s + authorization: + type: Bearer + credentials: secret diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_FilterExternalLabels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_FilterExternalLabels.golden new file mode 100644 index 000000000..4e2ac4aee --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_FilterExternalLabels.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_NotFollowRedirects.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_NotFollowRedirects.golden new file mode 100644 index 000000000..0eed3aac6 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.26.0_NotFollowRedirects.golden @@ -0,0 +1,11 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s + follow_redirects: false diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.27.1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.27.1.golden new file mode 100644 index 000000000..522404fc1 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.27.1.golden @@ -0,0 +1,18 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s + oauth2: + client_id: client-id + client_secret: client-secret + token_url: http://token-url + scopes: + - scope1 + endpoint_params: + param: value diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0.golden new file mode 100644 index 000000000..4e2ac4aee --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_FilterExternalLabels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_FilterExternalLabels.golden new file mode 100644 index 000000000..dffdf55a3 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_FilterExternalLabels.golden @@ -0,0 +1,11 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s + filter_external_labels: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_NotFilterExternalLabels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_NotFilterExternalLabels.golden new file mode 100644 index 000000000..5d6a38fc8 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteReadConfig_v2.34.0_NotFilterExternalLabels.golden @@ -0,0 +1,11 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_read: +- url: http://example.com + remote_timeout: 30s + filter_external_labels: false diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_3.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_3.golden new file mode 100644 index 000000000..87576323b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_3.golden @@ -0,0 +1,27 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + sigv4: + region: us-central-0 + access_key: access-key + secret_key: secret-key + profile: profilename + role_arn: arn:aws:iam::123456789012:instance-profile/prometheus + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + min_backoff: 1s + max_backoff: 10s + metadata_config: + send: false + send_interval: 1m diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.10.0_1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.10.0_1.golden new file mode 100644 index 000000000..b33b21910 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.10.0_1.golden @@ -0,0 +1,19 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + max_retries: 3 + min_backoff: 1s + max_backoff: 10s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.22.0_1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.22.0_1.golden new file mode 100644 index 000000000..9d9af231d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.22.0_1.golden @@ -0,0 +1,18 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + min_backoff: 1s + max_backoff: 10s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_1.golden new file mode 100644 index 000000000..cfe0a1f34 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_1.golden @@ -0,0 +1,21 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + min_backoff: 1s + max_backoff: 10s + metadata_config: + send: false + send_interval: 1m diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_2.golden new file mode 100644 index 000000000..cfe0a1f34 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.23.0_2.golden @@ -0,0 +1,21 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + min_backoff: 1s + max_backoff: 10s + metadata_config: + send: false + send_interval: 1m diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_2.golden new file mode 100644 index 000000000..30ff9e832 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_2.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + authorization: + type: Bearer + credentials: secret diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_3.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_3.golden new file mode 100644 index 000000000..465aac2c6 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_3.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 1s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_4.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_4.golden new file mode 100644 index 000000000..9537e6536 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.26.0_4.golden @@ -0,0 +1,11 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 1s + sigv4: {} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.27.1_1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.27.1_1.golden new file mode 100644 index 000000000..d22d222fe --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.27.1_1.golden @@ -0,0 +1,18 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + oauth2: + client_id: client-id + client_secret: client-secret + token_url: http://token-url + scopes: + - scope1 + endpoint_params: + param: value diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.30.0_2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.30.0_2.golden new file mode 100644 index 000000000..05cf1cb78 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.30.0_2.golden @@ -0,0 +1,19 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + min_backoff: 1s + max_backoff: 10s + retry_on_http_429: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.39.0_1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.39.0_1.golden new file mode 100644 index 000000000..05cf1cb78 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.39.0_1.golden @@ -0,0 +1,19 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + min_backoff: 1s + max_backoff: 10s + retry_on_http_429: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.43.0_2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.43.0_2.golden new file mode 100644 index 000000000..1dde1442f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.43.0_2.golden @@ -0,0 +1,20 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + send_native_histograms: true + queue_config: + capacity: 1000 + min_shards: 1 + max_shards: 10 + max_samples_per_send: 100 + batch_send_deadline: 20s + min_backoff: 1s + max_backoff: 10s + retry_on_http_429: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.45.0_1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.45.0_1.golden new file mode 100644 index 000000000..166368c3e --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/RemoteWriteConfig_v2.45.0_1.golden @@ -0,0 +1,14 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +remote_write: +- url: http://example.com + remote_timeout: 30s + azuread: + managed_identity: + client_id: client-id + cloud: AzureGovernment diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit-1.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit-1.golden new file mode 100644 index 000000000..aa2e5e02f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit-1.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + sample_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit2000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit2000.golden new file mode 100644 index 000000000..aa2e5e02f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit2000.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + sample_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit500.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit500.golden new file mode 100644 index 000000000..c6e90ee52 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_Limit500.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + sample_limit: 500 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_NoLimit.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_NoLimit.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SampleLimits_NoLimit.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden new file mode 100644 index 000000000..5fccb5ea1 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Authorization.golden @@ -0,0 +1,16 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + authorization: + type: Bearer + credentials: scrape-secret + http_sd_configs: + - url: http://localhost:9100/sd.json + authorization: + type: Bearer + credentials: http-sd-secret diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden new file mode 100644 index 000000000..8da1aa7c1 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_BasicAuth.golden @@ -0,0 +1,16 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + basic_auth: + username: scrape-bob + password: scrape-alice + http_sd_configs: + - url: http://localhost:9100/sd.json + basic_auth: + username: http-sd-bob + password: http-sd-alice diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden new file mode 100644 index 000000000..f3ffeeba9 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_ARecord.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + dns_sd_configs: + - names: + - node.demo.do.prometheus.io + type: A + port: 9100 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden new file mode 100644 index 000000000..faf811fb7 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_DNSSD_SRVRecord.golden @@ -0,0 +1,11 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + dns_sd_configs: + - names: + - web.example.com diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden new file mode 100644 index 000000000..de46df185 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigEmpty.golden @@ -0,0 +1,8 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigFilters.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigFilters.golden new file mode 100644 index 000000000..357769fc9 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigFilters.golden @@ -0,0 +1,21 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + ec2_sd_configs: + - region: us-east-1 + role_arn: arn:aws:iam::123456789:role/prometheus-role + refresh_interval: 30s + port: 9100 + filters: + - name: tag:environment + values: + - prod + - name: tag:service + values: + - web + - db diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden new file mode 100644 index 000000000..4d7ec8e0d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidAPIKeys.golden @@ -0,0 +1,14 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + ec2_sd_configs: + - region: us-east-1 + access_key: access-key + secret_key: secret-key + refresh_interval: 30s + port: 9100 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden new file mode 100644 index 000000000..1630c3ef4 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EC2SDConfigValidRoleARN.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + ec2_sd_configs: + - region: us-east-1 + role_arn: arn:aws:iam::123456789:role/prometheus-role + refresh_interval: 30s + port: 9100 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden new file mode 100644 index 000000000..de46df185 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Empty.golden @@ -0,0 +1,8 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden new file mode 100644 index 000000000..c97ea652c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_EmptyRelabelConfig.golden @@ -0,0 +1,12 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden new file mode 100644 index 000000000..68353ed29 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_FileSD.golden @@ -0,0 +1,12 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + file_sd_configs: + - files: + - /tmp/myfile.json + refresh_interval: 5m diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden new file mode 100644 index 000000000..16c5dc531 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HTTPSD.golden @@ -0,0 +1,11 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + http_sd_configs: + - url: http://localhost:9100/sd.json + refresh_interval: 5m diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden new file mode 100644 index 000000000..6aa36801b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorLabels.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + honor_labels: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden new file mode 100644 index 000000000..d9eac5482 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_HonorTimeStamp.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + honor_timestamps: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden new file mode 100644 index 000000000..c3c1da518 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + kubernetes_sd_configs: + - role: node diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Selectors.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Selectors.golden new file mode 100644 index 000000000..601a5ecf0 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_K8SSD_with_Selectors.golden @@ -0,0 +1,14 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + kubernetes_sd_configs: + - role: node + selectors: + - role: node + label: type=infra + field: spec.unschedulable=false diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden new file mode 100644 index 000000000..5540ba7a8 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Limits.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + sample_limit: 10000 + target_limit: 1000 + label_limit: 50 + label_name_length_limit: 40 + label_value_length_limit: 30 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden new file mode 100644 index 000000000..06b73ccf3 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_MetricPath.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + metrics_path: /metrics diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden new file mode 100644 index 000000000..a55c92b98 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyMetricRelabelConfig.golden @@ -0,0 +1,11 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + metric_relabel_configs: + - regex: noisy_labels.* + action: labeldrop diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden new file mode 100644 index 000000000..16b74540d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_NonEmptyRelabelConfig.golden @@ -0,0 +1,18 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __address__ + regex: (.+)(?::d+) + replacement: $1:9537 + action: replace diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden new file mode 100644 index 000000000..60714f4b0 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Params.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + metrics_path: /federate + params: + match[]: + - '{job="prometheus"}' + - '{__name__=~"job:.*"}' diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden new file mode 100644 index 000000000..618342ae0 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Scheme.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + scheme: https diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden new file mode 100644 index 000000000..86639ad89 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeInterval.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + scrape_interval: 15s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden new file mode 100644 index 000000000..fae453676 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_ScrapeTimeout.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + scrape_timeout: 10s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden new file mode 100644 index 000000000..024d92f6d --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_Static.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + static_configs: + - targets: + - http://localhost:9100 + labels: + label1: value1 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden new file mode 100644 index 000000000..caed31bc7 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ScrapeConfigSpecConfig_TLSConfig.golden @@ -0,0 +1,18 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: scrapeconfig/default/testscrapeconfig1 + tls_config: + insecure_skip_verify: false + ca_file: /etc/prometheus/certs/secret_default_secret-ca-global_ + cert_file: /etc/prometheus/certs/secret_default_secret-cert_ + key_file: /etc/prometheus/certs/secret_default_secret_key + http_sd_configs: + - url: http://localhost:9100/sd.json + tls_config: + insecure_skip_verify: true + ca_file: /etc/prometheus/certs/secret_default_secret-ca-http_ diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.34.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden new file mode 100644 index 000000000..e6c17c56f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2False_v2.35.0.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + enable_http2: false + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.34.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden new file mode 100644 index 000000000..6c1ce303b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointEnableHttp2_EnableHTTP2True_v2.35.0.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + enable_http2: true + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.25.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.25.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.25.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.28.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.28.0.golden new file mode 100644 index 000000000..f09ce5fb7 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectFalse_v2.28.0.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + follow_redirects: false + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.25.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.25.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.25.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.28.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.28.0.golden new file mode 100644 index 000000000..0a0ebccdc --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/ServiceMonitorEndpointFollowRedirects_FollowRedirectTrue_v2.28.0.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + follow_redirects: true + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorLabels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorLabels.golden new file mode 100644 index 000000000..9e0e7502b --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorLabels.golden @@ -0,0 +1,79 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: true + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_label_env + target_label: env + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden new file mode 100644 index 000000000..e0ed29a92 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInPodMonitor.golden @@ -0,0 +1,61 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + honor_timestamps: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_pod_label_env + target_label: env + regex: (.+) + replacement: ${1} + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden new file mode 100644 index 000000000..666602000 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/SettingHonorTimestampsInServiceMonitor.golden @@ -0,0 +1,80 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + honor_timestamps: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_label_env + target_label: env + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden new file mode 100644 index 000000000..64aef4eed --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSize5000000.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +storage: + exemplars: + max_exemplars: 5000000 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden new file mode 100644 index 000000000..3e7a5bdbe --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSetAtAll.golden @@ -0,0 +1,7 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSet_v2.29.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSet_v2.29.0.golden new file mode 100644 index 000000000..3e7a5bdbe --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/StorageSettingMaxExemplars_MaxSizeNotSet_v2.29.0.golden @@ -0,0 +1,7 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden new file mode 100644 index 000000000..87262f49a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_greater_than_or_equal_to_v2.39.0.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +storage: + tsdb: + out_of_order_time_window: 10m diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_less_than_v2.39.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_less_than_v2.39.0.golden new file mode 100644 index 000000000..3e7a5bdbe --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TSDB_config_less_than_v2.39.0.golden @@ -0,0 +1,7 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLabels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLabels.golden new file mode 100644 index 000000000..c3e670d34 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLabels.golden @@ -0,0 +1,79 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_label_example + target_label: example + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_label_env + target_label: env + regex: (.+) + replacement: ${1} + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.15.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.15.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.15.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0_Enforce1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0_Enforce1000.golden new file mode 100644 index 000000000..75f2a026f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits-1_Versionv2.21.0_Enforce1000.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + target_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits1000_Versionv2.21.0_Enforce1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits1000_Versionv2.21.0_Enforce1000.golden new file mode 100644 index 000000000..8f1319cec --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits1000_Versionv2.21.0_Enforce1000.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + target_limit: 500 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.15.0_Enforce1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.15.0_Enforce1000.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.15.0_Enforce1000.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.21.0_Enforce1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.21.0_Enforce1000.golden new file mode 100644 index 000000000..75f2a026f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits2000_Versionv2.21.0_Enforce1000.golden @@ -0,0 +1,70 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + target_limit: 1000 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits500_Versionv2.15.0_Enforce1000.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits500_Versionv2.15.0_Enforce1000.golden new file mode 100644 index 000000000..b55535533 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TargetLimits500_Versionv2.15.0_Enforce1000.golden @@ -0,0 +1,69 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden new file mode 100644 index 000000000..e1061ec52 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalAlertmanagers_Expected.golden @@ -0,0 +1,31 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +alerting: + alert_relabel_configs: + - action: labeldrop + regex: prometheus_replica + alertmanagers: + - path_prefix: / + scheme: http + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + relabel_configs: + - action: keep + source_labels: + - __meta_kubernetes_service_name + regex: alertmanager-main + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - static_configs: + - targets: + - localhost diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalScrapeConfigsAdditionalScrapeConfig.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalScrapeConfigsAdditionalScrapeConfig.golden new file mode 100644 index 000000000..a6f624760 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestAdditionalScrapeConfigsAdditionalScrapeConfig.golden @@ -0,0 +1,14 @@ +- job_name: prometheus + scrape_interval: 15s + static_configs: + - targets: ["localhost:9090"] +- job_name: gce_app_bar + scrape_interval: 5s + gce_sd_config: + - project: foo + zone: us-central1 + relabel_configs: + - action: keep + source_labels: + - __meta_gce_label_app + regex: my_app diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden new file mode 100644 index 000000000..e513e68ec --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TestServiceMonitorWithEndpointSliceEnable_Expected.golden @@ -0,0 +1,93 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/test/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpointslice + namespaces: + names: + - default + scrape_interval: 30s + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_service_label_foo + - __meta_kubernetes_service_labelpresent_foo + regex: (bar);true + - action: keep + source_labels: + - __meta_kubernetes_service_label_alpha + - __meta_kubernetes_service_labelpresent_alpha + regex: (beta|gamma);true + - action: keep + source_labels: + - __meta_kubernetes_endpointslice_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpointslice_address_target_kind + - __meta_kubernetes_endpointslice_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpointslice_address_target_kind + - __meta_kubernetes_endpointslice_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __meta_kubernetes_pod_ready + regex: (.*) + replacement: $1 + action: replace + - target_label: ns-key + replacement: default + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: + - source_labels: + - pod_name + target_label: ns-key + regex: my-job-pod-.+ + action: drop + - target_label: ns-key + replacement: default diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden new file mode 100644 index 000000000..391d7d4b3 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Config_only_with_endpoint.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +tracing: + endpoint: https://otel-collector.default.svc.local:3333 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden new file mode 100644 index 000000000..92540e39a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/TracingConfig_Expect_valid_config.golden @@ -0,0 +1,16 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] +tracing: + endpoint: https://otel-collector.default.svc.local:3333 + client_type: grpc + sampling_fraction: 0.5 + insecure: false + headers: + custom: header + compression: gzip + timeout: 10s diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified.golden new file mode 100644 index 000000000..04c22cbfc --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified.golden @@ -0,0 +1,9 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + key1: value1 + key2: value2 + prometheus: / + prometheus_replica: $(POD_NAME) +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified_along_with_reserved_labels.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified_along_with_reserved_labels.golden new file mode 100644 index 000000000..5484be5fd --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/external_label_specified_along_with_reserved_labels.golden @@ -0,0 +1,8 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: / + prometheus_replica: $(POD_NAME) + some-other-key: some-value +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/global_settings_valid_config_v2.15.2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/global_settings_valid_config_v2.15.2.golden new file mode 100644 index 000000000..981b67dbb --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/global_settings_valid_config_v2.15.2.golden @@ -0,0 +1,7 @@ +global: + evaluation_interval: 30s + scrape_interval: 15s + external_labels: + prometheus: / + prometheus_replica: $(POD_NAME) +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/invalid_scrape_timeout_specified_when_scrape_interval_specified.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/invalid_scrape_timeout_specified_when_scrape_interval_specified.golden new file mode 100644 index 000000000..e69de29bb diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/namespaces_from_MatchNames_are_returned_instead_of_the_current_namespace.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/namespaces_from_MatchNames_are_returned_instead_of_the_current_namespace.golden new file mode 100644 index 000000000..ea7fedf06 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/namespaces_from_MatchNames_are_returned_instead_of_the_current_namespace.golden @@ -0,0 +1,8 @@ +kubernetes_sd_configs: +- role: endpoints + namespaces: + names: + - test1 + - test2 + attach_metadata: + node: true diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/no_TSDB_config.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/no_TSDB_config.golden new file mode 100644 index 000000000..3e7a5bdbe --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/no_TSDB_config.golden @@ -0,0 +1,7 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden new file mode 100644 index 000000000..918c6ddfc --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/pod_monitor_with_oauth2.golden @@ -0,0 +1,59 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: podMonitor/default/testpodmonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: pod + namespaces: + names: + - default + oauth2: + client_id: test_client_id + client_secret: test_client_secret + token_url: http://test.url + scopes: + - scope 1 + - scope 2 + endpoint_params: + param1: value1 + param2: value2 + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - action: keep + source_labels: + - __meta_kubernetes_pod_container_port_name + regex: web + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - target_label: job + replacement: default/testpodmonitor1 + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden new file mode 100644 index 000000000..94b8e4b7f --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/probe_monitor_with_oauth2.golden @@ -0,0 +1,47 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: probe/default/testprobe1 + honor_timestamps: true + metrics_path: "" + static_configs: + - targets: + - 127.0.0.1 + labels: + namespace: default + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - source_labels: + - __address__ + target_label: __param_target + - source_labels: + - __param_target + target_label: instance + - target_label: __address__ + replacement: "" + - source_labels: + - __param_target + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + oauth2: + client_id: test_client_id + client_secret: test_client_secret + token_url: http://test.url + scopes: + - scope 1 + - scope 2 + endpoint_params: + param1: value1 + param2: value2 + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/query_log_file.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/query_log_file.golden new file mode 100644 index 000000000..8704b4b9a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/query_log_file.golden @@ -0,0 +1,8 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: / + prometheus_replica: $(POD_NAME) + query_log_file: /var/log/prometheus/test.log +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/service_monitor_with_oauth2.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/service_monitor_with_oauth2.golden new file mode 100644 index 000000000..b91564f0c --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/service_monitor_with_oauth2.golden @@ -0,0 +1,78 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: default/test + prometheus_replica: $(POD_NAME) +scrape_configs: +- job_name: serviceMonitor/default/testservicemonitor1/0 + honor_labels: false + kubernetes_sd_configs: + - role: endpoints + namespaces: + names: + - default + oauth2: + client_id: test_client_id + client_secret: test_client_secret + token_url: http://test.url + scopes: + - scope 1 + - scope 2 + endpoint_params: + param1: value1 + param2: value2 + relabel_configs: + - source_labels: + - job + target_label: __tmp_prometheus_job_name + - action: keep + source_labels: + - __meta_kubernetes_endpoint_port_name + regex: web + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Node;(.*) + replacement: ${1} + target_label: node + - source_labels: + - __meta_kubernetes_endpoint_address_target_kind + - __meta_kubernetes_endpoint_address_target_name + separator: ; + regex: Pod;(.*) + replacement: ${1} + target_label: pod + - source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - source_labels: + - __meta_kubernetes_pod_container_name + target_label: container + - action: drop + source_labels: + - __meta_kubernetes_pod_phase + regex: (Failed|Succeeded) + - source_labels: + - __meta_kubernetes_service_name + target_label: job + replacement: ${1} + - target_label: endpoint + replacement: web + - source_labels: + - __address__ + target_label: __tmp_hash + modulus: 1 + action: hashmod + - source_labels: + - __tmp_hash + regex: $(SHARD) + action: keep + metric_relabel_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_keep_dropped_targets.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_keep_dropped_targets.golden new file mode 100644 index 000000000..099f09f37 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_keep_dropped_targets.golden @@ -0,0 +1,8 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: / + prometheus_replica: $(POD_NAME) + keep_dropped_targets: 50 +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_label_limits.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_label_limits.golden new file mode 100644 index 000000000..eb3957f10 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_config_with_label_limits.golden @@ -0,0 +1,13 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: / + prometheus_replica: $(POD_NAME) + body_size_limit: 1000MB + sample_limit: 10000 + target_limit: 1000 + label_limit: 50 + label_name_length_limit: 40 + label_value_length_limit: 30 +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_limits.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_limits.golden new file mode 100644 index 000000000..3c6a6e827 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_global_limits.golden @@ -0,0 +1,10 @@ +global: + evaluation_interval: 30s + scrape_interval: 30s + external_labels: + prometheus: / + prometheus_replica: $(POD_NAME) + body_size_limit: 1000MB + sample_limit: 10000 + target_limit: 1000 +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_scrape_timeout_along_with_valid_scrape_interval_specified.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_scrape_timeout_along_with_valid_scrape_interval_specified.golden new file mode 100644 index 000000000..bdca569c9 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/prometheus/testdata/valid_scrape_timeout_along_with_valid_scrape_interval_specified.golden @@ -0,0 +1,8 @@ +global: + evaluation_interval: 30s + scrape_interval: 60s + scrape_timeout: 10s + external_labels: + prometheus: / + prometheus_replica: $(POD_NAME) +scrape_configs: [] diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/operator.go b/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/operator.go index c55c6e23a..53570cbb6 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/operator.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/operator.go @@ -23,7 +23,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/mitchellh/hashstructure" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" @@ -31,11 +30,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/kubernetes" "k8s.io/client-go/metadata" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + monitoringv1ac "github.com/prometheus-operator/prometheus-operator/pkg/client/applyconfiguration/monitoring/v1" monitoringclient "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned" "github.com/prometheus-operator/prometheus-operator/pkg/informers" "github.com/prometheus-operator/prometheus-operator/pkg/k8sutil" @@ -67,14 +69,16 @@ type Operator struct { nsThanosRulerInf cache.SharedIndexInformer nsRuleInf cache.SharedIndexInformer - metrics *operator.Metrics - reconciliations *operator.ReconciliationTracker + metrics *operator.Metrics + reconciliations *operator.ReconciliationTracker + canReadStorageClass bool config Config } // Config defines configuration parameters for the Operator. type Config struct { + KubernetesVersion version.Info ReloaderConfig operator.ContainerConfig ThanosDefaultBaseImage string Namespaces operator.Namespaces @@ -87,43 +91,40 @@ type Config struct { } // New creates a new controller. -func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometheus.Registerer) (*Operator, error) { - cfg, err := k8sutil.NewClusterConfig(conf.Host, conf.TLSInsecure, &conf.TLSConfig) +func New(ctx context.Context, restConfig *rest.Config, conf operator.Config, logger log.Logger, r prometheus.Registerer, canReadStorageClass bool) (*Operator, error) { + client, err := kubernetes.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating cluster config failed") + return nil, fmt.Errorf("instantiating kubernetes client failed: %w", err) } - client, err := kubernetes.NewForConfig(cfg) + mdClient, err := metadata.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") + return nil, fmt.Errorf("instantiating metadata client failed: %w", err) } - mdClient, err := metadata.NewForConfig(cfg) + mclient, err := monitoringclient.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating metadata client failed") - } - - mclient, err := monitoringclient.NewForConfig(cfg) - if err != nil { - return nil, errors.Wrap(err, "instantiating monitoring client failed") + return nil, fmt.Errorf("instantiating monitoring client failed: %w", err) } if _, err := labels.Parse(conf.ThanosRulerSelector); err != nil { - return nil, errors.Wrap(err, "can not parse thanos ruler selector value") + return nil, fmt.Errorf("can not parse thanos ruler selector value: %w", err) } // All the metrics exposed by the controller get the controller="thanos" label. r = prometheus.WrapRegistererWith(prometheus.Labels{"controller": "thanos"}, r) o := &Operator{ - kclient: client, - mdClient: mdClient, - mclient: mclient, - logger: logger, - accessor: operator.NewAccessor(logger), - metrics: operator.NewMetrics(r), - reconciliations: &operator.ReconciliationTracker{}, + kclient: client, + mdClient: mdClient, + mclient: mclient, + logger: logger, + accessor: operator.NewAccessor(logger), + metrics: operator.NewMetrics(r), + reconciliations: &operator.ReconciliationTracker{}, + canReadStorageClass: canReadStorageClass, config: Config{ + KubernetesVersion: conf.KubernetesVersion, ReloaderConfig: conf.ReloaderConfig, ThanosDefaultBaseImage: conf.ThanosDefaultBaseImage, Namespaces: conf.Namespaces, @@ -157,7 +158,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh v1.SchemeGroupVersion.WithResource(string(v1.ResourceConfigMaps)), ) if err != nil { - return nil, errors.Wrap(err, "error creating configmap informers") + return nil, fmt.Errorf("error creating configmap informers: %w", err) } o.thanosRulerInfs, err = informers.NewInformersForResource( @@ -173,7 +174,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.ThanosRulerName), ) if err != nil { - return nil, errors.Wrap(err, "error creating thanosruler informers") + return nil, fmt.Errorf("error creating thanosruler informers: %w", err) } var thanosStores []cache.Store @@ -193,7 +194,7 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.PrometheusRuleName), ) if err != nil { - return nil, errors.Wrap(err, "error creating prometheusrule informers") + return nil, fmt.Errorf("error creating prometheusrule informers: %w", err) } o.ssetInfs, err = informers.NewInformersForResource( @@ -207,35 +208,43 @@ func New(ctx context.Context, conf operator.Config, logger log.Logger, r prometh appsv1.SchemeGroupVersion.WithResource("statefulsets"), ) if err != nil { - return nil, errors.Wrap(err, "error creating statefulset informers") - } - - newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) cache.SharedIndexInformer { - // nsResyncPeriod is used to control how often the namespace informer - // should resync. If the unprivileged ListerWatcher is used, then the - // informer must resync more often because it cannot watch for - // namespace changes. - nsResyncPeriod := 15 * time.Second - // If the only namespace is v1.NamespaceAll, then the client must be - // privileged and a regular cache.ListWatch will be used. In this case - // watching works and we do not need to resync so frequently. - if listwatch.IsAllNamespaces(allowList) { - nsResyncPeriod = resyncPeriod + return nil, fmt.Errorf("error creating statefulset informers: %w", err) + } + + newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) (cache.SharedIndexInformer, error) { + lw, privileged, err := listwatch.NewNamespaceListWatchFromClient( + ctx, + o.logger, + o.config.KubernetesVersion, + o.kclient.CoreV1(), + o.kclient.AuthorizationV1().SelfSubjectAccessReviews(), + allowList, + o.config.Namespaces.DenyList) + if err != nil { + return nil, err } - nsInf := cache.NewSharedIndexInformer( - o.metrics.NewInstrumentedListerWatcher( - listwatch.NewUnprivilegedNamespaceListWatchFromClient(ctx, o.logger, o.kclient.CoreV1().RESTClient(), allowList, o.config.Namespaces.DenyList, fields.Everything()), - ), - &v1.Namespace{}, nsResyncPeriod, cache.Indexers{}, - ) - return nsInf + level.Debug(o.logger).Log("msg", "creating namespace informer", "privileged", privileged) + return cache.NewSharedIndexInformer( + o.metrics.NewInstrumentedListerWatcher(lw), + &v1.Namespace{}, + resyncPeriod, + cache.Indexers{}, + ), nil } - o.nsRuleInf = newNamespaceInformer(o, o.config.Namespaces.AllowList) + + o.nsRuleInf, err = newNamespaceInformer(o, o.config.Namespaces.AllowList) + if err != nil { + return nil, err + } + if listwatch.IdenticalNamespaces(o.config.Namespaces.AllowList, o.config.Namespaces.ThanosRulerAllowList) { o.nsThanosRulerInf = o.nsRuleInf } else { - o.nsThanosRulerInf = newNamespaceInformer(o, o.config.Namespaces.ThanosRulerAllowList) + o.nsThanosRulerInf, err = newNamespaceInformer(o, o.config.Namespaces.ThanosRulerAllowList) + if err != nil { + return nil, err + } } return o, nil @@ -254,7 +263,7 @@ func (o *Operator) waitForCacheSync(ctx context.Context) error { } { for _, inf := range infs.informersForResource.GetInformers() { if !operator.WaitForNamedCacheSync(ctx, "thanos", log.With(o.logger, "informer", infs.name), inf.Informer()) { - return errors.Errorf("failed to sync cache for %s informer", infs.name) + return fmt.Errorf("failed to sync cache for %s informer", infs.name) } } } @@ -267,7 +276,7 @@ func (o *Operator) waitForCacheSync(ctx context.Context) error { {"RuleNamespace", o.nsRuleInf}, } { if !operator.WaitForNamedCacheSync(ctx, "thanos", log.With(o.logger, "informer", inf.name), inf.informer) { - return errors.Errorf("failed to sync cache for %s informer", inf.name) + return fmt.Errorf("failed to sync cache for %s informer", inf.name) } } @@ -303,27 +312,6 @@ func (o *Operator) addHandlers() { // Run the controller. func (o *Operator) Run(ctx context.Context) error { - errChan := make(chan error) - go func() { - v, err := o.kclient.Discovery().ServerVersion() - if err != nil { - errChan <- errors.Wrap(err, "communicating with server failed") - return - } - level.Info(o.logger).Log("msg", "connection established", "cluster-version", v) - errChan <- nil - }() - - select { - case err := <-errChan: - if err != nil { - return err - } - level.Info(o.logger).Log("msg", "CRD API endpoints ready") - case <-ctx.Done(): - return nil - } - go o.rr.Run(ctx) defer o.rr.Stop() @@ -541,7 +529,12 @@ func (o *Operator) sync(ctx context.Context, key string) error { tr := trobj.(*monitoringv1.ThanosRuler) tr = tr.DeepCopy() if err := k8sutil.AddTypeInformationToObject(tr); err != nil { - return errors.Wrap(err, "failed to set ThanosRuler type information") + return fmt.Errorf("failed to set ThanosRuler type information: %w", err) + } + + // Check if the Thanos instance is marked for deletion. + if o.rr.DeletionInProgress(tr) { + return nil } if tr.Spec.Paused { @@ -551,6 +544,10 @@ func (o *Operator) sync(ctx context.Context, key string) error { logger := log.With(o.logger, "key", key) level.Info(logger).Log("msg", "sync thanos-ruler") + if err := operator.CheckStorageClass(ctx, o.canReadStorageClass, o.kclient, tr.Spec.Storage); err != nil { + return err + } + ruleConfigMapNames, err := o.createOrUpdateRuleConfigMaps(ctx, tr) if err != nil { return err @@ -559,7 +556,7 @@ func (o *Operator) sync(ctx context.Context, key string) error { // Create governing service if it doesn't exist. svcClient := o.kclient.CoreV1().Services(tr.Namespace) if err = k8sutil.CreateOrUpdateService(ctx, svcClient, makeStatefulSetService(tr, o.config)); err != nil { - return errors.Wrap(err, "synchronizing governing service failed") + return fmt.Errorf("synchronizing governing service failed: %w", err) } // Ensure we have a StatefulSet running Thanos deployed. @@ -572,12 +569,12 @@ func (o *Operator) sync(ctx context.Context, key string) error { ssetClient := o.kclient.AppsV1().StatefulSets(tr.Namespace) sset, err := makeStatefulSet(tr, o.config, ruleConfigMapNames, "") if err != nil { - return errors.Wrap(err, "making thanos statefulset config failed") + return fmt.Errorf("making thanos statefulset config failed: %w", err) } operator.SanitizeSTS(sset) if _, err := ssetClient.Create(ctx, sset, metav1.CreateOptions{}); err != nil { - return errors.Wrap(err, "creating thanos statefulset failed") + return fmt.Errorf("creating thanos statefulset failed: %w", err) } return nil @@ -594,7 +591,7 @@ func (o *Operator) sync(ctx context.Context, key string) error { sset, err := makeStatefulSet(tr, o.config, ruleConfigMapNames, newSSetInputHash) if err != nil { - return errors.Wrap(err, "making the statefulset, to update, failed") + return fmt.Errorf("failed to generate statefulset: %w", err) } operator.SanitizeSTS(sset) @@ -620,13 +617,13 @@ func (o *Operator) sync(ctx context.Context, key string) error { level.Info(logger).Log("msg", "recreating ThanosRuler StatefulSet because the update operation wasn't possible", "reason", strings.Join(failMsg, ", ")) propagationPolicy := metav1.DeletePropagationForeground if err := ssetClient.Delete(ctx, sset.GetName(), metav1.DeleteOptions{PropagationPolicy: &propagationPolicy}); err != nil { - return errors.Wrap(err, "failed to delete StatefulSet to avoid forbidden action") + return fmt.Errorf("failed to delete StatefulSet to avoid forbidden action: %w", err) } return nil } if err != nil { - return errors.Wrap(err, "updating StatefulSet failed") + return fmt.Errorf("updating StatefulSet failed: %w", err) } return nil @@ -641,7 +638,7 @@ func (o *Operator) getThanosRulerFromKey(key string) (*monitoringv1.ThanosRuler, level.Info(o.logger).Log("msg", "ThanosRuler not found", "key", key) return nil, nil } - return nil, errors.Wrap(err, "failed to retrieve ThanosRuler from informer") + return nil, fmt.Errorf("failed to retrieve ThanosRuler from informer: %w", err) } return obj.(*monitoringv1.ThanosRuler).DeepCopy(), nil @@ -649,7 +646,7 @@ func (o *Operator) getThanosRulerFromKey(key string) (*monitoringv1.ThanosRuler, // getStatefulSetFromThanosRulerKey returns a copy of the StatefulSet object // corresponding to the ThanosRuler object identified by key. -// If the object is not found, it returns a nil pointer. +// If the object is not found, it returns a nil pointer without error. func (o *Operator) getStatefulSetFromThanosRulerKey(key string) (*appsv1.StatefulSet, error) { ssetName := thanosKeyToStatefulSetKey(key) @@ -659,7 +656,7 @@ func (o *Operator) getStatefulSetFromThanosRulerKey(key string) (*appsv1.Statefu level.Info(o.logger).Log("msg", "StatefulSet not found", "key", ssetName) return nil, nil } - return nil, errors.Wrap(err, "failed to retrieve StatefulSet from informer") + return nil, fmt.Errorf("failed to retrieve StatefulSet from informer: %w", err) } return obj.(*appsv1.StatefulSet).DeepCopy(), nil @@ -678,46 +675,56 @@ func (o *Operator) UpdateStatus(ctx context.Context, key string) error { sset, err := o.getStatefulSetFromThanosRulerKey(key) if err != nil { - return errors.Wrap(err, "failed to get StatefulSet") + return fmt.Errorf("failed to get StatefulSet: %w", err) } - if sset == nil || o.rr.DeletionInProgress(sset) { + if sset != nil && o.rr.DeletionInProgress(sset) { return nil } stsReporter, err := operator.NewStatefulSetReporter(ctx, o.kclient, sset) if err != nil { - return errors.Wrap(err, "failed to retrieve statefulset state") + return fmt.Errorf("failed to retrieve statefulset state: %w", err) } availableCondition := stsReporter.Update(tr) reconciledCondition := o.reconciliations.GetCondition(key, tr.Generation) tr.Status.Conditions = operator.UpdateConditions(tr.Status.Conditions, availableCondition, reconciledCondition) - tr.Status.Paused = tr.Spec.Paused - if _, err = o.mclient.MonitoringV1().ThanosRulers(tr.Namespace).UpdateStatus(ctx, tr, metav1.UpdateOptions{}); err != nil { - return errors.Wrap(err, "failed to update status subresource") + if _, err = o.mclient.MonitoringV1().ThanosRulers(tr.Namespace).ApplyStatus(ctx, applyConfigurationFromThanosRuler(tr), metav1.ApplyOptions{FieldManager: operator.PrometheusOperatorFieldManager, Force: true}); err != nil { + return fmt.Errorf("failed to apply status subresource: %w", err) } return nil } -func createSSetInputHash(tr monitoringv1.ThanosRuler, c Config, ruleConfigMapNames []string, ss interface{}) (string, error) { +func createSSetInputHash(tr monitoringv1.ThanosRuler, c Config, ruleConfigMapNames []string, ss appsv1.StatefulSetSpec) (string, error) { + + // The controller should ignore any changes to RevisionHistoryLimit field because + // it may be modified by external actors. + // See https://github.com/prometheus-operator/prometheus-operator/issues/5712 + ss.RevisionHistoryLimit = nil + hash, err := hashstructure.Hash(struct { - TR monitoringv1.ThanosRuler - C Config - S interface{} - R []string `hash:"set"` - }{tr, c, ss, ruleConfigMapNames}, + ThanosRulerLabels map[string]string + ThanosRulerAnnotations map[string]string + ThanosRulerGeneration int64 + Config Config + StatefulSetSpec appsv1.StatefulSetSpec + RuleConfigMaps []string `hash:"set"` + }{ + ThanosRulerLabels: tr.Labels, + ThanosRulerAnnotations: tr.Annotations, + ThanosRulerGeneration: tr.Generation, + Config: c, + StatefulSetSpec: ss, + RuleConfigMaps: ruleConfigMapNames, + }, nil, ) if err != nil { - return "", errors.Wrap( - err, - "failed to calculate combined hash of ThanosRuler StatefulSet, ThanosRuler CRD, config and"+ - " rule ConfigMap names", - ) + return "", fmt.Errorf("failed to calculate combined hash: %w", err) } return fmt.Sprintf("%d", hash), nil @@ -773,7 +780,7 @@ func (o *Operator) enqueueForNamespace(store cache.Store, nsName string) { ruleNSSelector, err := metav1.LabelSelectorAsSelector(tr.Spec.RuleNamespaceSelector) if err != nil { level.Error(o.logger).Log( - "err", errors.Wrap(err, "failed to convert RuleNamespaceSelector"), + "err", fmt.Errorf("failed to convert RuleNamespaceSelector: %w", err), "name", tr.Name, "namespace", tr.Namespace, "selector", tr.Spec.RuleNamespaceSelector, @@ -793,3 +800,26 @@ func (o *Operator) enqueueForNamespace(store cache.Store, nsName string) { ) } } + +func applyConfigurationFromThanosRuler(a *monitoringv1.ThanosRuler) *monitoringv1ac.ThanosRulerApplyConfiguration { + trac := monitoringv1ac.ThanosRulerStatus(). + WithPaused(a.Status.Paused). + WithReplicas(a.Status.Replicas). + WithAvailableReplicas(a.Status.AvailableReplicas). + WithUpdatedReplicas(a.Status.UpdatedReplicas). + WithUnavailableReplicas(a.Status.UnavailableReplicas) + + for _, condition := range a.Status.Conditions { + trac.WithConditions( + monitoringv1ac.Condition(). + WithType(condition.Type). + WithStatus(condition.Status). + WithLastTransitionTime(condition.LastTransitionTime). + WithReason(condition.Reason). + WithMessage(condition.Message). + WithObservedGeneration(condition.ObservedGeneration), + ) + } + + return monitoringv1ac.ThanosRuler(a.Name, a.Namespace).WithStatus(trac) +} diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/rules.go b/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/rules.go index 42a15929f..0bb0b0910 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/rules.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/rules.go @@ -24,7 +24,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -72,12 +71,12 @@ func (o *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, t *monitori promRuleSelector, err := operator.NewPrometheusRuleSelector(operator.ThanosFormat, thanosVersion, t.Spec.RuleSelector, nsLabeler, o.ruleInfs, logger) if err != nil { - return nil, errors.Wrap(err, "initializing PrometheusRules failed") + return nil, fmt.Errorf("initializing PrometheusRules failed: %w", err) } newRules, rejected, err := promRuleSelector.Select(namespaces) if err != nil { - return nil, errors.Wrap(err, "selecting PrometheusRules failed") + return nil, fmt.Errorf("selecting PrometheusRules failed: %w", err) } if tKey, ok := o.accessor.MetaNamespaceKey(t); ok { @@ -114,7 +113,7 @@ func (o *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, t *monitori newConfigMaps, err := makeRulesConfigMaps(t, newRules) if err != nil { - return nil, errors.Wrap(err, "failed to make rules ConfigMaps") + return nil, fmt.Errorf("failed to make rules ConfigMaps: %w", err) } newConfigMapNames := []string{} @@ -131,7 +130,7 @@ func (o *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, t *monitori for _, cm := range newConfigMaps { _, err = cClient.Create(ctx, &cm, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to create ConfigMap '%v'", cm.Name) + return nil, fmt.Errorf("failed to create ConfigMap '%v': %w", cm.Name, err) } } return newConfigMapNames, nil @@ -142,7 +141,7 @@ func (o *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, t *monitori for _, cm := range currentConfigMaps { err := cClient.Delete(ctx, cm.Name, metav1.DeleteOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to delete current ConfigMap '%v'", cm.Name) + return nil, fmt.Errorf("failed to delete current ConfigMap '%v': %w", cm.Name, err) } } @@ -154,7 +153,7 @@ func (o *Operator) createOrUpdateRuleConfigMaps(ctx context.Context, t *monitori for _, cm := range newConfigMaps { _, err = cClient.Create(ctx, &cm, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to create new ConfigMap '%v'", cm.Name) + return nil, fmt.Errorf("failed to create new ConfigMap '%v': %w", cm.Name, err) } } @@ -174,7 +173,7 @@ func (o *Operator) selectRuleNamespaces(p *monitoringv1.ThanosRuler) ([]string, } else { ruleNamespaceSelector, err := metav1.LabelSelectorAsSelector(p.Spec.RuleNamespaceSelector) if err != nil { - return namespaces, errors.Wrap(err, "convert rule namespace label selector to selector") + return namespaces, fmt.Errorf("convert rule namespace label selector to selector: %w", err) } namespaces, err = operator.ListMatchingNamespaces(ruleNamespaceSelector, o.nsRuleInf) @@ -205,7 +204,7 @@ func makeRulesConfigMaps(t *monitoringv1.ThanosRuler, ruleFiles map[string]strin //check if none of the rule files is too large for a single ConfigMap for filename, file := range ruleFiles { if len(file) > maxConfigMapDataSize { - return nil, errors.Errorf( + return nil, fmt.Errorf( "rule file '%v' is too large for a single Kubernetes ConfigMap", filename, ) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/statefulset.go b/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/statefulset.go index ce83d4e4c..c937587b9 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/statefulset.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/thanos/statefulset.go @@ -15,13 +15,13 @@ package thanos import ( + "errors" "fmt" "net/url" "path" "strings" "github.com/blang/semver/v4" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -159,7 +159,7 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig thanosVersion := operator.StringValOrDefault(tr.Spec.Version, operator.DefaultThanosVersion) if _, err := semver.ParseTolerant(thanosVersion); err != nil { - return nil, errors.Wrap(err, "failed to parse Thanos version") + return nil, fmt.Errorf("failed to parse Thanos version: %w", err) } @@ -171,7 +171,7 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig "", ) if err != nil { - return nil, errors.Wrap(err, "failed to build image path") + return nil, fmt.Errorf("failed to build image path: %w", err) } trCLIArgs := []monitoringv1.Argument{ @@ -343,15 +343,11 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig podAnnotations := map[string]string{} podLabels := map[string]string{} if tr.Spec.PodMetadata != nil { - if tr.Spec.PodMetadata.Labels != nil { - for k, v := range tr.Spec.PodMetadata.Labels { - podLabels[k] = v - } + for k, v := range tr.Spec.PodMetadata.Labels { + podLabels[k] = v } - if tr.Spec.PodMetadata.Annotations != nil { - for k, v := range tr.Spec.PodMetadata.Annotations { - podAnnotations[k] = v - } + for k, v := range tr.Spec.PodMetadata.Annotations { + podAnnotations[k] = v } } // In cases where an existing selector label is modified, or a new one is added, new sts cannot match existing pods. @@ -426,7 +422,7 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig containers, err := k8sutil.MergePatchContainers(operatorContainers, tr.Spec.Containers) if err != nil { - return nil, errors.Wrap(err, "failed to merge containers spec") + return nil, fmt.Errorf("failed to merge containers spec: %w", err) } terminationGracePeriod := int64(120) diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/config_test.go b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/config_test.go index 36c28b4d3..e1145aa60 100644 --- a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/config_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/config_test.go @@ -20,6 +20,7 @@ import ( "testing" "github.com/kylelemons/godebug/pretty" + "gotest.tools/v3/golden" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" @@ -34,12 +35,12 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) { tc := []struct { name string webConfigFileFields monitoringv1.WebConfigFileFields - expectedData string + golden string }{ { name: "tls config not defined", webConfigFileFields: monitoringv1.WebConfigFileFields{}, - expectedData: "", + golden: "tls_config_not_defined.golden", }, { name: "minimal TLS config with certificate from secret", @@ -61,10 +62,7 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) { }, }, }, - expectedData: `tls_server_config: - cert_file: /web_certs_path_prefix/secret/test-secret-cert/tls.crt - key_file: /web_certs_path_prefix/secret/test-secret-key/tls.key -`, + golden: "minimal_TLS_config_with_certificate_from_secret.golden", }, { name: "minimal TLS config with certificate from configmap", @@ -86,10 +84,7 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) { }, }, }, - expectedData: `tls_server_config: - cert_file: /web_certs_path_prefix/configmap/test-configmap-cert/tls.crt - key_file: /web_certs_path_prefix/secret/test-secret-key/tls.key -`, + golden: "minimal_TLS_config_with_certificate_from_configmap.golden", }, { name: "minimal TLS config with client CA from configmap", @@ -119,11 +114,7 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) { }, }, }, - expectedData: `tls_server_config: - cert_file: /web_certs_path_prefix/configmap/test-configmap-cert/tls.crt - key_file: /web_certs_path_prefix/secret/test-secret-key/tls.key - client_ca_file: /web_certs_path_prefix/configmap/test-configmap-ca/tls.client_ca -`, + golden: "minimal_TLS_config_with_client_CA_from configmap.golden", }, { name: "TLS config with all parameters from secrets", @@ -159,21 +150,7 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) { CurvePreferences: []string{"curve-1", "curve-2"}, }, }, - expectedData: `tls_server_config: - cert_file: /web_certs_path_prefix/secret/test-secret-cert/tls.crt - key_file: /web_certs_path_prefix/secret/test-secret-key/tls.keySecret - client_auth_type: RequireAnyClientCert - client_ca_file: /web_certs_path_prefix/secret/test-secret-ca/tls.ca - min_version: TLS11 - max_version: TLS13 - cipher_suites: - - cipher-1 - - cipher-2 - prefer_server_cipher_suites: false - curve_preferences: - - curve-1 - - curve-2 -`, + golden: "TLS_config_with_all_parameters_from secrets.golden", }, { name: "HTTP config with all parameters", @@ -189,15 +166,7 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) { }, }, }, - expectedData: `http_server_config: - http2: false - headers: - Content-Security-Policy: test - Strict-Transport-Security: test - X-Content-Type-Options: nosniff - X-Frame-Options: sameorigin - X-XSS-Protection: test -`, + golden: "HTTP_config_with_all_parameters.golden", }, } @@ -221,9 +190,7 @@ func TestCreateOrUpdateWebConfigSecret(t *testing.T) { t.Fatal(err) } - if tt.expectedData != string(secret.Data["web-config.yaml"]) { - t.Fatalf("Got %s\nwant %s\n", secret.Data["web-config.yaml"], tt.expectedData) - } + golden.Assert(t, string(secret.Data["web-config.yaml"]), tt.golden) }) } } diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/HTTP_config_with_all_parameters.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/HTTP_config_with_all_parameters.golden new file mode 100644 index 000000000..f9a2191c4 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/HTTP_config_with_all_parameters.golden @@ -0,0 +1,8 @@ +http_server_config: + http2: false + headers: + Content-Security-Policy: test + Strict-Transport-Security: test + X-Content-Type-Options: nosniff + X-Frame-Options: sameorigin + X-XSS-Protection: test diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/TLS_config_with_all_parameters_from secrets.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/TLS_config_with_all_parameters_from secrets.golden new file mode 100644 index 000000000..01d7e829a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/TLS_config_with_all_parameters_from secrets.golden @@ -0,0 +1,14 @@ +tls_server_config: + cert_file: /web_certs_path_prefix/secret/test-secret-cert/tls.crt + key_file: /web_certs_path_prefix/secret/test-secret-key/tls.keySecret + client_auth_type: RequireAnyClientCert + client_ca_file: /web_certs_path_prefix/secret/test-secret-ca/tls.ca + min_version: TLS11 + max_version: TLS13 + cipher_suites: + - cipher-1 + - cipher-2 + prefer_server_cipher_suites: false + curve_preferences: + - curve-1 + - curve-2 diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_configmap.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_configmap.golden new file mode 100644 index 000000000..9e1010b9a --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_configmap.golden @@ -0,0 +1,3 @@ +tls_server_config: + cert_file: /web_certs_path_prefix/configmap/test-configmap-cert/tls.crt + key_file: /web_certs_path_prefix/secret/test-secret-key/tls.key diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_secret.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_secret.golden new file mode 100644 index 000000000..6ec4e9bab --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_certificate_from_secret.golden @@ -0,0 +1,3 @@ +tls_server_config: + cert_file: /web_certs_path_prefix/secret/test-secret-cert/tls.crt + key_file: /web_certs_path_prefix/secret/test-secret-key/tls.key diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_client_CA_from configmap.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_client_CA_from configmap.golden new file mode 100644 index 000000000..7d61b6e13 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/minimal_TLS_config_with_client_CA_from configmap.golden @@ -0,0 +1,4 @@ +tls_server_config: + cert_file: /web_certs_path_prefix/configmap/test-configmap-cert/tls.crt + key_file: /web_certs_path_prefix/secret/test-secret-key/tls.key + client_ca_file: /web_certs_path_prefix/configmap/test-configmap-ca/tls.client_ca diff --git a/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/tls_config_not_defined.golden b/otelcollector/otel-allocator/prometheus-operator/pkg/webconfig/testdata/tls_config_not_defined.golden new file mode 100644 index 000000000..e69de29bb diff --git a/otelcollector/otel-allocator/prometheus-operator/scripts/generate/append-operator-version.sh b/otelcollector/otel-allocator/prometheus-operator/scripts/generate/append-operator-version.sh new file mode 100644 index 000000000..467c5fabd --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/scripts/generate/append-operator-version.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +if [[ "$OSTYPE" == "darwin"* ]]; then + find example/prometheus-operator-crd/ -name '*.yaml' -exec sed -i '' -e "/^ controller-gen.kubebuilder.io.version.*/a\\ + operator.prometheus.io/version: $VERSION" {} + +else + find example/prometheus-operator-crd/ -name '*.yaml' -exec sed -i "/^ controller-gen.kubebuilder.io.version.*/a\\ operator.prometheus.io/version: $VERSION" {} + +fi diff --git a/otelcollector/otel-allocator/prometheus-operator/scripts/go.mod b/otelcollector/otel-allocator/prometheus-operator/scripts/go.mod index 0eb892209..bdc2eba3e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/scripts/go.mod +++ b/otelcollector/otel-allocator/prometheus-operator/scripts/go.mod @@ -1,6 +1,6 @@ module github.com/prometheus-operator/prometheus-operator/tooling -go 1.20 +go 1.21 require ( github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20220618162802-424739b250f5 @@ -234,10 +234,10 @@ require ( golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.10.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.9.2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/otelcollector/otel-allocator/prometheus-operator/scripts/go.sum b/otelcollector/otel-allocator/prometheus-operator/scripts/go.sum index a42fd907e..582195a56 100644 --- a/otelcollector/otel-allocator/prometheus-operator/scripts/go.sum +++ b/otelcollector/otel-allocator/prometheus-operator/scripts/go.sum @@ -358,6 +358,7 @@ github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/ github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -408,6 +409,7 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= @@ -420,6 +422,7 @@ github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlN github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= @@ -603,6 +606,7 @@ github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3 github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -702,6 +706,7 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -831,6 +836,7 @@ github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3L github.com/nunnatsa/ginkgolinter v0.12.0 h1:seZo112n+lt0gdLJ/Jh70mzvrqbABWFpXd1bZTLTByM= github.com/nunnatsa/ginkgolinter v0.12.0/go.mod h1:dJIGXYXbkBswqa/pIzG0QlVTTDSBMxDoCFwhsl4Uras= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= @@ -841,9 +847,12 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= +github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= @@ -936,6 +945,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -1098,6 +1108,7 @@ github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGj gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= +go-simpler.org/assert v0.5.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= @@ -1121,6 +1132,7 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1268,8 +1280,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1399,8 +1411,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1421,8 +1433,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/otelcollector/otel-allocator/prometheus-operator/scripts/run-external.sh b/otelcollector/otel-allocator/prometheus-operator/scripts/run-external.sh index 79821ab62..3067956c2 100755 --- a/otelcollector/otel-allocator/prometheus-operator/scripts/run-external.sh +++ b/otelcollector/otel-allocator/prometheus-operator/scripts/run-external.sh @@ -13,6 +13,7 @@ declare SHOW_USAGE=false declare SKIP_OPERATOR_RUN_CHECK=false declare USE_DEFAULT_CONTEXT=false declare API_SERVER="" +declare IMPERSONATE_USER="${IMPERSONATE_USER:-}" # tmp operator files that needs to be cleaned up declare -r CA_FILE="tmp/CA_FILE" @@ -131,6 +132,7 @@ run_operator() { echo "──────────────────────────────────────────────────────────────────" run ./operator \ + --as="$IMPERSONATE_USER" \ --apiserver="$API_SERVER" \ --ca-file="$CA_FILE" \ --cert-file="$CERT_FILE" \ diff --git a/otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile new file mode 100644 index 000000000..ee23b99df --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile @@ -0,0 +1,40 @@ +FROM golang:1.14 as builder + +ENV JSONNET_VERSION v0.15.0 +# This corresponds to v2.16.0, but needs to be written as commit hash due to golang 1.13 issues +ENV PROMTOOL_VERSION b90be6f32a33c03163d700e1452b54454ddce0ec +ENV GOLANGCILINT_VERSION v1.23.6 +ENV JB_VERSION v0.3.1 +ENV GO_BINDATA_VERSION v3.1.3 + +RUN apt-get update -y && apt-get install -y g++ make git && \ + rm -rf /var/lib/apt/lists/* +RUN curl -Lso - https://github.com/google/jsonnet/archive/${JSONNET_VERSION}.tar.gz | \ + tar xfz - -C /tmp && \ + cd /tmp/jsonnet-${JSONNET_VERSION#v} && \ + make && mv jsonnetfmt /usr/local/bin && \ + rm -rf /tmp/jsonnet-${JSONNET_VERSION#v} + +RUN GO111MODULE=on go get github.com/google/go-jsonnet/cmd/jsonnet@${JSONNET_VERSION} +RUN GO111MODULE=on go get github.com/prometheus/prometheus/cmd/promtool@${PROMTOOL_VERSION} +RUN GO111MODULE=on go get github.com/golangci/golangci-lint/cmd/golangci-lint@${GOLANGCILINT_VERSION} +RUN GO111MODULE=on go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb@${JB_VERSION} +RUN go get github.com/brancz/gojsontoyaml +RUN go get github.com/campoy/embedmd +RUN GO111MODULE=on go get github.com/go-bindata/go-bindata/v3/go-bindata@${GO_BINDATA_VERSION} + +# Add po-lint +WORKDIR /go/src/github.com/prometheus-operator/prometheus-operator +COPY . . +RUN GO111MODULE=on make po-lint && chmod +x po-lint && mv po-lint /go/bin/ + +FROM golang:1.14 +RUN apt-get update -y && apt-get install -y make git jq gawk python-yaml && \ + rm -rf /var/lib/apt/lists/* +COPY --from=builder /usr/local/bin/jsonnetfmt /usr/local/bin/jsonnetfmt +COPY --from=builder /go/bin/* /go/bin/ + +RUN mkdir -p /go/src/github.com/prometheus-operator/prometheus-operator /.cache && \ + chmod -R 777 /go /.cache + +WORKDIR /go/src/github.com/prometheus-operator/prometheus-operator diff --git a/otelcollector/otel-allocator/prometheus-operator/scripts/update-golden-files.sh b/otelcollector/otel-allocator/prometheus-operator/scripts/update-golden-files.sh new file mode 100644 index 000000000..029245d44 --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/scripts/update-golden-files.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# This script updates the golden files for unit tests that import the 'gotest.tools/v3/golden' dependency in a Go project. +# It lists all packages in the project, checks for the dependency in test imports, and runs unit tests with '-update' to update golden files. + +dependency="gotest.tools/v3/golden" + +# List all packages in the project +packages=$(go list ./...) + +# Loop through each package and check if it imports the specific dependency +for pkg in $packages; do + # Use 'go list' with 'XTestImports' template to get the imports from test binaries + imports=$(go list -f '{{join .TestImports "\n"}}{{"\n"}}{{join .XTestImports "\n"}}' "$pkg") + + # Check if the dependency is in the imports + if echo "$imports" | grep -q "$dependency"; then + # If the dependency is found, run the unit tests updating the golden files + go test "$pkg" -update -timeout 30s + fi +done diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_instance_namespaces_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_instance_namespaces_test.go index 8d2ae7cbc..56209226c 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_instance_namespaces_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_instance_namespaces_test.go @@ -45,7 +45,17 @@ func testAlertmanagerInstanceNamespacesAllNs(t *testing.T) { nonInstanceNs := framework.CreateNamespace(context.Background(), t, testCtx) framework.SetupPrometheusRBACGlobal(context.Background(), t, testCtx, instanceNs) - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), operatorNs, nil, nil, nil, []string{instanceNs}, false, true, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + operatorNs, + nil, + nil, + nil, + []string{instanceNs}, + false, + true, // clusterrole + true, + ) if err != nil { t.Fatal(err) } @@ -84,7 +94,17 @@ func testAlertmanagerInstanceNamespacesDenyNs(t *testing.T) { instanceNs := framework.CreateNamespace(context.Background(), t, testCtx) framework.SetupPrometheusRBACGlobal(context.Background(), t, testCtx, instanceNs) - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), operatorNs, nil, []string{instanceNs}, nil, []string{instanceNs}, false, true, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + operatorNs, + nil, + []string{instanceNs}, + nil, + []string{instanceNs}, + false, + true, //clusterrole + true, + ) if err != nil { t.Fatal(err) } @@ -93,6 +113,9 @@ func testAlertmanagerInstanceNamespacesDenyNs(t *testing.T) { if _, err := framework.CreateAlertmanagerAndWaitUntilReady(context.Background(), am); err != nil { t.Fatal(err) } + + //TODO(simonpasquier): deploy an AlertmanagerConfig object in the + //"instance" ns which should not be reconciled. } func testAlertmanagerInstanceNamespacesAllowList(t *testing.T) { @@ -128,7 +151,17 @@ func testAlertmanagerInstanceNamespacesAllowList(t *testing.T) { } // Configure the operator to watch also a non-existing namespace (e.g. "notfound"). - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), operatorNs, []string{"notfound", allowedNs}, nil, nil, []string{"notfound", instanceNs}, false, true, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + operatorNs, + []string{"notfound", allowedNs}, + nil, + nil, + []string{"notfound", instanceNs}, + false, + true, // clusterrole + true, + ) if err != nil { t.Fatal(err) } @@ -214,28 +247,24 @@ func testAlertmanagerInstanceNamespacesAllowList(t *testing.T) { t.Fatalf("failed to wait for alertmanager config: %v", err) } - // FIXME(simonpasquier): the unprivileged namespace lister/watcher - // isn't notified of updates properly so the code below fails. - // Uncomment the test once the lister/watcher is fixed. - // // Remove the selecting label on the "allowed" namespace and check that // the alertmanager configuration is updated. // See https://github.com/prometheus-operator/prometheus-operator/issues/3847 - //if err := framework.RemoveLabelsFromNamespace(allowedNs, "monitored"); err != nil { - // t.Fatal(err) - //} - - //err = framework.PollAlertmanagerConfiguration(instanceNs, "instance", - // func(config string) error { - // if strings.Contains(config, "void") { - // return fmt.Errorf("expected generated configuration to not contain %q but got %q", "void", config) - // } - - // return nil - // }, - //) - - //if err != nil { - // t.Fatalf("failed to wait for alertmanager config: %v", err) - //} + if err := framework.RemoveLabelsFromNamespace(context.Background(), allowedNs, "monitored"); err != nil { + t.Fatal(err) + } + + err = framework.PollAlertmanagerConfiguration(context.Background(), instanceNs, "instance", + func(config string) error { + if strings.Contains(config, "void") { + return fmt.Errorf("expected generated configuration to not contain %q but got %q", "void", config) + } + + return nil + }, + ) + + if err != nil { + t.Fatalf("failed to wait for alertmanager config: %v", err) + } } diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_test.go index 297401a06..047965683 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/alertmanager_test.go @@ -18,6 +18,7 @@ import ( "bytes" "context" "crypto/tls" + "errors" "fmt" "net/http" "reflect" @@ -27,7 +28,7 @@ import ( "time" "github.com/google/go-cmp/cmp" - "github.com/pkg/errors" + "github.com/stretchr/testify/require" "golang.org/x/net/http2" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" @@ -39,7 +40,7 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" certutil "k8s.io/client-go/util/cert" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" @@ -68,6 +69,70 @@ func testAMCreateDeleteCluster(t *testing.T) { } } +func testAlertmanagerWithStatefulsetCreationFailure(t *testing.T) { + // Don't run Alertmanager tests in parallel. See + // https://github.com/prometheus/alertmanager/issues/1835 for details. + ctx := context.Background() + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + + ns := framework.CreateNamespace(context.Background(), t, testCtx) + framework.SetupPrometheusRBAC(context.Background(), t, testCtx, ns) + + a := framework.MakeBasicAlertmanager(ns, "test", 1) + // Invalid spec which prevents the creation of the statefulset + a.Spec.Web = &monitoringv1.AlertmanagerWebSpec{ + WebConfigFileFields: monitoringv1.WebConfigFileFields{ + TLSConfig: &monitoringv1.WebTLSConfig{ + Cert: monitoringv1.SecretOrConfigMap{ + ConfigMap: &v1.ConfigMapKeySelector{}, + Secret: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "tls-cert", + }, + Key: "tls.crt", + }, + }, + KeySecret: v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "tls-cert", + }, + Key: "tls.key", + }, + }, + }, + } + _, err := framework.MonClientV1.Alertmanagers(a.Namespace).Create(ctx, a, metav1.CreateOptions{}) + require.NoError(t, err) + + var loopError error + err = wait.PollUntilContextTimeout(ctx, time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) { + current, err := framework.MonClientV1.Alertmanagers(ns).Get(ctx, "test", metav1.GetOptions{}) + if err != nil { + loopError = fmt.Errorf("failed to get object: %w", err) + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err != nil { + loopError = err + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Available, monitoringv1.ConditionFalse); err != nil { + loopError = err + return false, nil + } + + return true, nil + }) + + if err != nil { + t.Fatalf("%v: %v", err, loopError) + } + + require.NoError(t, framework.DeleteAlertmanagerAndWaitUntilGone(context.Background(), ns, "test")) +} + func testAMScaling(t *testing.T) { // Don't run Alertmanager tests in parallel. See // https://github.com/prometheus/alertmanager/issues/1835 for details. @@ -182,6 +247,50 @@ func testAMStorageUpdate(t *testing.T) { if err != nil { t.Fatal(err) } + + // Invalid storageclass e2e test + + _, err = framework.PatchAlertmanager( + context.Background(), + am.Name, + am.Namespace, + monitoringv1.AlertmanagerSpec{ + Storage: &monitoringv1.StorageSpec{ + VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{ + Spec: v1.PersistentVolumeClaimSpec{ + StorageClassName: ptr.To("unknown-storage-class"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse("200Mi"), + }, + }, + }, + }, + }, + }, + ) + if err != nil { + t.Fatal(err) + } + + var loopError error + err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) { + current, err := framework.MonClientV1.Alertmanagers(ns).Get(ctx, name, metav1.GetOptions{}) + if err != nil { + loopError = fmt.Errorf("failed to get object: %w", err) + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err == nil { + return true, nil + } + + return false, nil + }) + + if err != nil { + t.Fatalf("%v: %v", err, loopError) + } } func testAMExposingWithKubernetesAPI(t *testing.T) { @@ -333,7 +442,7 @@ func testAMClusterGossipSilences(t *testing.T) { } if *silences[0].ID != silID { - return false, errors.Errorf("expected silence id on alertmanager %v to match id of created silence '%v' but got %v", i, silID, *silences[0].ID) + return false, fmt.Errorf("expected silence id on alertmanager %v to match id of created silence '%v' but got %v", i, silID, *silences[0].ID) } return true, nil }) @@ -365,9 +474,9 @@ route: group_wait: 30s group_interval: 5m repeat_interval: 12h - receiver: 'webhook' + receiver: 'firstConfigWebHook' receivers: -- name: 'webhook' +- name: 'firstConfigWebHook' webhook_configs: - url: 'http://firstConfigWebHook:30500/' ` @@ -379,9 +488,9 @@ route: group_wait: 30s group_interval: 5m repeat_interval: 12h - receiver: 'webhook' + receiver: 'secondConfigWebHook' receivers: -- name: 'webhook' +- name: 'secondConfigWebHook' webhook_configs: - url: 'http://secondConfigWebHook:30500/' ` @@ -461,7 +570,7 @@ An Alert test firstExpectedString := "firstConfigWebHook" if err := framework.WaitForAlertmanagerConfigToContainString(context.Background(), ns, alertmanager.Name, firstExpectedString); err != nil { - t.Fatal(errors.Wrap(err, "failed to wait for first expected config")) + t.Fatal(fmt.Errorf("failed to wait for first expected config: %w", err)) } cfg.Data["alertmanager.yaml"] = []byte(secondConfig) @@ -472,7 +581,7 @@ An Alert test secondExpectedString := "secondConfigWebHook" if err := framework.WaitForAlertmanagerConfigToContainString(context.Background(), ns, alertmanager.Name, secondExpectedString); err != nil { - t.Fatal(errors.Wrap(err, "failed to wait for second expected config")) + t.Fatal(fmt.Errorf("failed to wait for second expected config: %w", err)) } priorToReloadTime := time.Now() @@ -482,7 +591,7 @@ An Alert test } if err := framework.WaitForAlertmanagerConfigToBeReloaded(context.Background(), ns, alertmanager.Name, priorToReloadTime); err != nil { - t.Fatal(errors.Wrap(err, "failed to wait for additional configMaps reload")) + t.Fatal(fmt.Errorf("failed to wait for additional configMaps reload: %w", err)) } priorToReloadTime = time.Now() @@ -492,7 +601,7 @@ An Alert test } if err := framework.WaitForAlertmanagerConfigToBeReloaded(context.Background(), ns, alertmanager.Name, priorToReloadTime); err != nil { - t.Fatal(errors.Wrap(err, "failed to wait for additional secrets reload")) + t.Fatal(fmt.Errorf("failed to wait for additional secrets reload: %w", err)) } } @@ -514,9 +623,9 @@ route: group_wait: 30s group_interval: 5m repeat_interval: 12h - receiver: 'webhook' + receiver: 'firstConfigWebHook' receivers: -- name: 'webhook' +- name: 'firstConfigWebHook' webhook_configs: - url: 'http://firstConfigWebHook:30500/' ` @@ -575,7 +684,7 @@ An Alert test } if err := framework.WaitForAlertmanagerConfigToBeReloaded(context.Background(), ns, alertmanager.Name, priorToReloadTime); err != nil { - t.Fatal(errors.Wrap(err, "failed to wait for additional secrets reload")) + t.Fatal(fmt.Errorf("failed to wait for additional secrets reload: %w", err)) } } @@ -715,7 +824,7 @@ inhibit_rules: close(done) select { case err := <-errc: - t.Fatal(errors.Wrapf(err, "sending alert to alertmanager %v", replica)) + t.Fatal(fmt.Errorf("sending alert to alertmanager %v: %w", replica, err)) default: return } @@ -894,10 +1003,10 @@ func testAlertmanagerConfigCRD(t *testing.T) { // create 2 namespaces: // // 1. "ns" ns: - // - hosts the Alertmanager CR which which should be reconciled + // - hosts the Alertmanager CR which should be reconciled // // 2. "configNs" ns: - // - hosts the AlertmanagerConfig CRs which which should be reconciled + // - hosts the AlertmanagerConfig CRs which should be reconciled // thanks to the label monitored: "true" which is removed in the second // part of the test ns := framework.CreateNamespace(context.Background(), t, testCtx) @@ -972,6 +1081,19 @@ func testAlertmanagerConfigCRD(t *testing.T) { t.Fatal(err) } + webexAPIToken := "super-secret-token" + webexAPITokenSecret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "webex-api-token", + }, + Data: map[string][]byte{ + "api-token": []byte(webexAPIToken), + }, + } + if _, err := framework.KubeClient.CoreV1().Secrets(configNs).Create(context.Background(), webexAPITokenSecret, metav1.CreateOptions{}); err != nil { + t.Fatal(err) + } + // A valid AlertmanagerConfig resource with many receivers. configCR := &monitoringv1alpha1.AlertmanagerConfig{ ObjectMeta: metav1.ObjectMeta{ @@ -1060,6 +1182,9 @@ func testAlertmanagerConfigCRD(t *testing.T) { {Key: "Subject", Value: "subject"}, {Key: "Comment", Value: "comment"}, }, + // HTML field with an empty string must appear as-is in the generated configuration. + // See https://github.com/prometheus-operator/prometheus-operator/issues/5421 + HTML: ptr.To(""), }}, VictorOpsConfigs: []monitoringv1alpha1.VictorOpsConfig{{ APIKey: &v1.SecretKeySelector{ @@ -1094,7 +1219,6 @@ func testAlertmanagerConfigCRD(t *testing.T) { }, ChatID: 12345, }}, - SNSConfigs: []monitoringv1alpha1.SNSConfig{ { ApiURL: "https://sns.us-east-2.amazonaws.com", @@ -1116,6 +1240,28 @@ func testAlertmanagerConfigCRD(t *testing.T) { TopicARN: "test-topicARN", }, }, + WebexConfigs: []monitoringv1alpha1.WebexConfig{{ + APIURL: func() *monitoringv1alpha1.URL { + res := monitoringv1alpha1.URL("https://webex.api.url") + return &res + }(), + RoomID: "testingRoomID", + Message: func() *string { + res := "testingMessage" + return &res + }(), + HTTPConfig: &monitoringv1alpha1.HTTPConfig{ + Authorization: &monitoringv1.SafeAuthorization{ + Type: "Bearer", + Credentials: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "webex-api-token", + }, + Key: "api-token", + }, + }, + }, + }}, }}, }, } @@ -1356,7 +1502,7 @@ func testAlertmanagerConfigCRD(t *testing.T) { err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) { cfgSecret, err := framework.KubeClient.CoreV1().Secrets(ns).Get(ctx, amConfigSecretName, metav1.GetOptions{}) if err != nil { - lastErr = errors.Wrap(err, "failed to get generated configuration secret") + lastErr = fmt.Errorf("failed to get generated configuration secret: %w", err) return false, nil } @@ -1444,6 +1590,7 @@ receivers: headers: Comment: comment Subject: subject + html: "" pushover_configs: - user_key: 1234abc token: 1234abc @@ -1461,6 +1608,14 @@ receivers: - api_url: https://telegram.api.url bot_token: bipbop chat_id: 12345 + webex_configs: + - http_config: + authorization: + type: Bearer + credentials: super-secret-token + api_url: https://webex.api.url + message: testingMessage + room_id: testingRoomID - name: %s/e2e-test-amconfig-sub-routes/e2e webhook_configs: - url: http://test.url @@ -1485,7 +1640,7 @@ templates: [] t.Fatal(err) } if diff := cmp.Diff(uncompressed, expected); diff != "" { - lastErr = errors.Errorf("got(-), want(+):\n%s", diff) + lastErr = fmt.Errorf("got(-), want(+):\n%s", diff) return false, nil } @@ -1506,7 +1661,7 @@ templates: [] err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) { cfgSecret, err := framework.KubeClient.CoreV1().Secrets(ns).Get(ctx, amConfigSecretName, metav1.GetOptions{}) if err != nil { - lastErr = errors.Wrap(err, "failed to get generated configuration secret") + lastErr = fmt.Errorf("failed to get generated configuration secret: %w", err) return false, nil } @@ -1537,7 +1692,7 @@ templates: [] t.Fatal(err) } if diff := cmp.Diff(uncompressed, expected); diff != "" { - lastErr = errors.Errorf("got(-), want(+):\n%s", diff) + lastErr = fmt.Errorf("got(-), want(+):\n%s", diff) return false, nil } @@ -1614,7 +1769,7 @@ inhibit_rules: t.Fatal(err) } if diff := cmp.Diff(uncompressed, yamlConfig); diff != "" { - lastErr = errors.Errorf("got(-), want(+):\n%s", diff) + lastErr = fmt.Errorf("got(-), want(+):\n%s", diff) return false, nil } @@ -1644,27 +1799,27 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) { Name: alertmanagerConfig.Name, Global: &monitoringv1.AlertmanagerGlobalConfig{ SMTPConfig: &monitoringv1.GlobalSMTPConfig{ - From: pointer.String("from"), + From: ptr.To("from"), SmartHost: &monitoringv1.HostPort{ Host: "smtp.example.org", Port: "587", }, - Hello: pointer.String("smtp.example.org"), - AuthUsername: pointer.String("dev@smtp.example.org"), + Hello: ptr.To("smtp.example.org"), + AuthUsername: ptr.To("dev@smtp.example.org"), AuthPassword: &v1.SecretKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: "smtp-auth", }, Key: "password", }, - AuthIdentity: pointer.String("dev@smtp.example.org"), + AuthIdentity: ptr.To("dev@smtp.example.org"), AuthSecret: &v1.SecretKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: "smtp-auth", }, Key: "secret", }, - RequireTLS: pointer.Bool(true), + RequireTLS: ptr.To(true), }, ResolveTimeout: "30s", HTTPConfig: &monitoringv1.HTTPConfig{ @@ -1689,7 +1844,7 @@ func testUserDefinedAlertmanagerConfigFromCustomResource(t *testing.T) { "some": "value", }, }, - FollowRedirects: pointer.Bool(true), + FollowRedirects: ptr.To(true), }, }, Templates: []monitoringv1.SecretOrConfigMap{ @@ -1841,7 +1996,7 @@ templates: } if diff := cmp.Diff(uncompressed, yamlConfig); diff != "" { - lastErr = errors.Errorf("got(-), want(+):\n%s", diff) + lastErr = fmt.Errorf("got(-), want(+):\n%s", diff) return false, nil } @@ -1979,7 +2134,7 @@ func testAMRollbackManualChanges(t *testing.T) { t.Fatal(err) } - sset.Spec.Replicas = pointer.Int32(0) + sset.Spec.Replicas = ptr.To(int32(0)) sset, err = ssetClient.Update(context.Background(), sset, metav1.UpdateOptions{}) if err != nil { t.Fatal(err) @@ -2419,3 +2574,152 @@ func testAlertmanagerCRDValidation(t *testing.T) { }) } } + +func testAlertmanagerConfigMatcherStrategy(t *testing.T) { + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + ns := framework.CreateNamespace(context.Background(), t, testCtx) + framework.SetupPrometheusRBAC(context.Background(), t, testCtx, ns) + + amName := "amconfigmatcherstrategy" + alertmanager := framework.MakeBasicAlertmanager(ns, amName, 1) + alertmanager.Spec.AlertmanagerConfigSelector = &metav1.LabelSelector{} + alertmanager, err := framework.CreateAlertmanagerAndWaitUntilReady(context.Background(), alertmanager) + if err != nil { + t.Fatal(err) + } + + amcfgV1alpha1 := &monitoringv1alpha1.AlertmanagerConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "amcfg-v1alpha1", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "webhook", + Matchers: []monitoringv1alpha1.Matcher{{ + Name: "test", + Value: "test", + }}, + }, + Receivers: []monitoringv1alpha1.Receiver{{ + Name: "webhook", + }}, + }, + } + if _, err := framework.MonClientV1alpha1.AlertmanagerConfigs(alertmanager.Namespace).Create(context.Background(), amcfgV1alpha1, metav1.CreateOptions{}); err != nil { + t.Fatalf("failed to create v1alpha1 AlertmanagerConfig object: %v", err) + } + + // Wait for the change above to take effect. + var lastErr error + amConfigSecretName := fmt.Sprintf("alertmanager-%s-generated", alertmanager.Name) + err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) { + cfgSecret, err := framework.KubeClient.CoreV1().Secrets(ns).Get(ctx, amConfigSecretName, metav1.GetOptions{}) + if err != nil { + lastErr = fmt.Errorf("failed to get generated configuration secret: %w", err) + return false, nil + } + + if cfgSecret.Data["alertmanager.yaml.gz"] == nil { + lastErr = errors.New("'alertmanager.yaml.gz' key is missing in generated configuration secret") + return false, nil + } + + uncompressed, err := operator.GunzipConfig(cfgSecret.Data["alertmanager.yaml.gz"]) + if err != nil { + t.Fatal(err) + } + expected := fmt.Sprintf(`global: + resolve_timeout: 5m +route: + receiver: "null" + group_by: + - job + routes: + - receiver: %s/amcfg-v1alpha1/webhook + match: + test: test + matchers: + - namespace="%s" + continue: true + - receiver: "null" + match: + alertname: DeadMansSwitch + group_wait: 30s + group_interval: 5m + repeat_interval: 12h +receivers: +- name: "null" +- name: %s/amcfg-v1alpha1/webhook +templates: [] +`, ns, ns, ns) + if diff := cmp.Diff(uncompressed, expected); diff != "" { + lastErr = fmt.Errorf("got(-), want(+):\n%s", diff) + return false, nil + } + + return true, nil + }) + if err != nil { + t.Fatalf("waiting for generated alertmanager configuration: %v: %v", err, lastErr) + } + + _, err = framework.PatchAlertmanagerAndWaitUntilReady(context.Background(), alertmanager.Name, alertmanager.Namespace, monitoringv1.AlertmanagerSpec{AlertmanagerConfigMatcherStrategy: monitoringv1.AlertmanagerConfigMatcherStrategy{Type: "None"}}) + if err != nil { + t.Fatal(err) + } + + // Wait for the change above to take effect. + err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) { + cfgSecret, err := framework.KubeClient.CoreV1().Secrets(ns).Get(ctx, amConfigSecretName, metav1.GetOptions{}) + if err != nil { + lastErr = fmt.Errorf("failed to get generated configuration secret: %w", err) + return false, nil + } + + if cfgSecret.Data["alertmanager.yaml.gz"] == nil { + lastErr = errors.New("'alertmanager.yaml.gz' key is missing in generated configuration secret") + return false, nil + } + + uncompressed, err := operator.GunzipConfig(cfgSecret.Data["alertmanager.yaml.gz"]) + if err != nil { + t.Fatal(err) + } + expected := fmt.Sprintf(`global: + resolve_timeout: 5m +route: + receiver: "null" + group_by: + - job + routes: + - receiver: %s/amcfg-v1alpha1/webhook + match: + test: test + continue: true + - receiver: "null" + match: + alertname: DeadMansSwitch + group_wait: 30s + group_interval: 5m + repeat_interval: 12h +receivers: +- name: "null" +- name: %s/amcfg-v1alpha1/webhook +templates: [] +`, ns, ns) + if diff := cmp.Diff(uncompressed, expected); diff != "" { + lastErr = fmt.Errorf("got(-), want(+):\n%s", diff) + return false, nil + } + + return true, nil + }) + if err != nil { + t.Fatalf("waiting for generated alertmanager configuration: %v: %v", err, lastErr) + } + + if err := framework.DeleteAlertmanagerAndWaitUntilGone(context.Background(), ns, amName); err != nil { + t.Fatal(err) + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/config_reloader_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/config_reloader_test.go new file mode 100644 index 000000000..a5a7c68eb --- /dev/null +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/config_reloader_test.go @@ -0,0 +1,94 @@ +// Copyright 2023 The prometheus-operator Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package e2e + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + operatorFramework "github.com/prometheus-operator/prometheus-operator/test/framework" +) + +func testConfigReloaderResources(t *testing.T) { + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + + ns := framework.CreateNamespace(context.Background(), t, testCtx) + framework.SetupPrometheusRBACGlobal(context.Background(), t, testCtx, ns) + + // Start Prometheus operator with the default resource requirements for the + // config reloader. + _, err := framework.CreateOrUpdatePrometheusOperatorWithOpts( + context.Background(), + operatorFramework.PrometheusOperatorOpts{ + Namespace: ns, + AllowedNamespaces: []string{ns}, + }, + ) + require.NoError(t, err) + + p := framework.MakeBasicPrometheus(ns, "instance", "instance", 1) + p, err = framework.CreatePrometheusAndWaitUntilReady(context.Background(), ns, p) + require.NoError(t, err) + + // Update the Prometheus operator deployment with new resource requirements + // for the config reloader. + var ( + cpuRequest = resource.MustParse("14m") + cpuLimit = resource.MustParse("14m") + memRequest = resource.MustParse("61Mi") + memLimit = resource.MustParse("62Mi") + ) + _, err = framework.CreateOrUpdatePrometheusOperatorWithOpts( + context.Background(), + operatorFramework.PrometheusOperatorOpts{ + Namespace: ns, + AllowedNamespaces: []string{ns}, + AdditionalArgs: []string{ + "--config-reloader-cpu-limit=" + cpuLimit.String(), + "--config-reloader-cpu-request=" + cpuRequest.String(), + "--config-reloader-memory-limit=" + memLimit.String(), + "--config-reloader-memory-request=" + memRequest.String(), + }, + }, + ) + require.NoError(t, err) + + sts, err := framework.KubeClient.AppsV1().StatefulSets(p.Namespace).Get(context.Background(), "prometheus-"+p.Name, metav1.GetOptions{}) + require.NoError(t, err) + + var resources []corev1.ResourceRequirements + var containers []corev1.Container + containers = append(containers, sts.Spec.Template.Spec.Containers...) + containers = append(containers, sts.Spec.Template.Spec.InitContainers...) + for _, c := range containers { + if c.Name == "config-reloader" || c.Name == "init-config-reloader" { + resources = append(resources, c.Resources) + } + } + require.Equal(t, 2, len(resources)) + + for _, r := range resources { + require.True(t, cpuLimit.Equal(r.Limits[corev1.ResourceCPU]), "expected %s, got %s", cpuLimit, r.Limits[corev1.ResourceCPU]) + require.True(t, cpuRequest.Equal(r.Requests[corev1.ResourceCPU]), "expected %s, got %s", cpuRequest, r.Requests[corev1.ResourceCPU]) + require.True(t, memLimit.Equal(r.Limits[corev1.ResourceMemory]), "expected %s, got %s", memLimit, r.Limits[corev1.ResourceMemory]) + require.True(t, memRequest.Equal(r.Requests[corev1.ResourceMemory]), "expected %s, got %s", memRequest, r.Requests[corev1.ResourceMemory]) + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/denylist_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/denylist_test.go index 078bcef36..0169e7c38 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/denylist_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/denylist_test.go @@ -16,10 +16,10 @@ package e2e import ( "context" + "fmt" "testing" "github.com/gogo/protobuf/proto" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" api_errors "k8s.io/apimachinery/pkg/api/errors" @@ -133,7 +133,7 @@ func testDenyServiceMonitor(t *testing.T) { svc := framework.MakePrometheusService("denied", "denied", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), denied, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -155,7 +155,7 @@ func testDenyServiceMonitor(t *testing.T) { svc := framework.MakePrometheusService("allowed", "allowed", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), allowed, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/main_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/main_test.go index e8e6a5c17..a00196c49 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/main_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/main_test.go @@ -67,6 +67,18 @@ func skipOperatorUpgradeTests(t *testing.T) { } } +func skipPromVersionUpgradeTests(t *testing.T) { + if os.Getenv("EXCLUDE_PROMETHEUS_UPGRADE_TESTS") != "" { + t.Skip("Skipping Prometheus Version upgrade tests") + } +} + +func skipAllNSTests(t *testing.T) { + if os.Getenv("EXCLUDE_ALL_NS_TESTS") != "" { + t.Skip("Skipping AllNS upgrade tests") + } +} + // feature gated tests need to be explicitly included // not currently in use // @@ -160,6 +172,8 @@ func TestMain(m *testing.M) { // TestAllNS tests the Prometheus Operator watching all namespaces in a // Kubernetes cluster. func TestAllNS(t *testing.T) { + skipAllNSTests(t) + testCtx := framework.NewTestCtx(t) defer testCtx.Cleanup(t) @@ -218,8 +232,10 @@ func TestAllNS(t *testing.T) { func testAllNSAlertmanager(t *testing.T) { skipAlertmanagerTests(t) testFuncs := map[string]func(t *testing.T){ + "AlertmanagerConfigMatcherStrategy": testAlertmanagerConfigMatcherStrategy, "AlertmanagerCRD": testAlertmanagerCRDValidation, "AMCreateDeleteCluster": testAMCreateDeleteCluster, + "AMWithStatefulsetCreationFailure": testAlertmanagerWithStatefulsetCreationFailure, "AMScaling": testAMScaling, "AMVersionMigration": testAMVersionMigration, "AMStorageUpdate": testAMStorageUpdate, @@ -253,7 +269,6 @@ func testAllNSPrometheus(t *testing.T) { "PromCreateDeleteCluster": testPromCreateDeleteCluster, "PromScaleUpDownCluster": testPromScaleUpDownCluster, "PromNoServiceMonitorSelector": testPromNoServiceMonitorSelector, - "PromVersionMigration": testPromVersionMigration, "PromResourceUpdate": testPromResourceUpdate, "PromStorageLabelsAnnotations": testPromStorageLabelsAnnotations, "PromStorageUpdate": testPromStorageUpdate, @@ -297,6 +312,9 @@ func testAllNSPrometheus(t *testing.T) { "CreatePrometheusAgent": testCreatePrometheusAgent, "PrometheusAgentAndServerNameColision": testAgentAndServerNameColision, "ScrapeConfigKubeNode": testScrapeConfigKubernetesNodeRole, + "ScrapeConfigDNSSD": testScrapeConfigDNSSDConfig, + "PrometheusWithStatefulsetCreationFailure": testPrometheusWithStatefulsetCreationFailure, + "PrometheusAgentCheckStorageClass": testAgentCheckStorageClass, } for name, f := range testFuncs { @@ -308,11 +326,13 @@ func testAllNSThanosRuler(t *testing.T) { skipThanosRulerTests(t) testFuncs := map[string]func(t *testing.T){ "ThanosRulerCreateDeleteCluster": testThanosRulerCreateDeleteCluster, + "ThanosRulerWithStatefulsetCreationFailure": testThanosRulerWithStatefulsetCreationFailure, "ThanosRulerPrometheusRuleInDifferentNamespace": testThanosRulerPrometheusRuleInDifferentNamespace, "ThanosRulerPreserveUserAddedMetadata": testTRPreserveUserAddedMetadata, "ThanosRulerMinReadySeconds": testTRMinReadySeconds, "ThanosRulerAlertmanagerConfig": testTRAlertmanagerConfig, "ThanosRulerQueryConfig": testTRQueryConfig, + "ThanosRulerCheckStorageClass": testTRCheckStorageClass, } for name, f := range testFuncs { t.Run(name, f) @@ -350,11 +370,12 @@ func TestDenylist(t *testing.T) { func TestPromInstanceNs(t *testing.T) { skipPrometheusTests(t) testFuncs := map[string]func(t *testing.T){ - "AllNs": testPrometheusInstanceNamespacesAllNs, - "AllowList": testPrometheusInstanceNamespacesAllowList, - "DenyList": testPrometheusInstanceNamespacesDenyList, - "NamespaceNotFound": testPrometheusInstanceNamespacesNamespaceNotFound, - "ScrapeConfigLifecycle": testScrapeConfigLifecycle, + "AllNs": testPrometheusInstanceNamespacesAllNs, + "AllowList": testPrometheusInstanceNamespacesAllowList, + "DenyList": testPrometheusInstanceNamespacesDenyList, + "NamespaceNotFound": testPrometheusInstanceNamespacesNamespaceNotFound, + "ScrapeConfigLifecycle": testScrapeConfigLifecycle, + "ConfigReloaderResources": testConfigReloaderResources, } for name, f := range testFuncs { @@ -393,6 +414,27 @@ const ( prometheusOperatorServiceName = "prometheus-operator" ) +// TestPrometheusVersionUpgrade tests that all Prometheus versions in the compatibility matrix can be upgraded +func TestPrometheusVersionUpgrade(t *testing.T) { + skipPromVersionUpgradeTests(t) + + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + + ns := framework.CreateNamespace(context.Background(), t, testCtx) + + finalizers, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), ns, nil, nil, nil, nil, true, true, true) + if err != nil { + t.Fatal(err) + } + + for _, f := range finalizers { + testCtx.AddFinalizerFn(f) + } + + t.Run("PromVersionMigration", testPromVersionMigration) +} + func testServerTLS(ctx context.Context, namespace string) func(t *testing.T) { return func(t *testing.T) { skipPrometheusTests(t) diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_instance_namespaces_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_instance_namespaces_test.go index 28d056656..3419124d7 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_instance_namespaces_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_instance_namespaces_test.go @@ -16,9 +16,9 @@ package e2e import ( "context" + "fmt" "testing" - "github.com/pkg/errors" v1 "k8s.io/api/core/v1" api_errors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -33,7 +33,17 @@ func testPrometheusInstanceNamespacesAllNs(t *testing.T) { nonInstanceNs := framework.CreateNamespace(context.Background(), t, testCtx) framework.SetupPrometheusRBACGlobal(context.Background(), t, testCtx, instanceNs) - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), operatorNs, nil, nil, []string{instanceNs}, nil, false, true, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + operatorNs, + nil, + nil, + []string{instanceNs}, + nil, + false, + true, // clusterrole + true, + ) if err != nil { t.Fatal(err) } @@ -92,7 +102,17 @@ func testPrometheusInstanceNamespacesDenyList(t *testing.T) { } } - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), operatorNs, nil, []string{deniedNs, instanceNs}, []string{instanceNs}, nil, false, true, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + operatorNs, + nil, + []string{deniedNs, instanceNs}, + []string{instanceNs}, + nil, + false, + true, // clusterrole + true, + ) if err != nil { t.Fatal(err) } @@ -118,7 +138,7 @@ func testPrometheusInstanceNamespacesDenyList(t *testing.T) { svc := framework.MakeEchoService("denied", "monitored", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), deniedNs, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -163,7 +183,7 @@ func testPrometheusInstanceNamespacesDenyList(t *testing.T) { svc := framework.MakePrometheusService("instance", "monitored", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), instanceNs, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -215,7 +235,16 @@ func testPrometheusInstanceNamespacesAllowList(t *testing.T) { } } - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), operatorNs, []string{allowedNs}, nil, []string{instanceNs}, nil, false, false, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + operatorNs, + []string{allowedNs}, + nil, + []string{instanceNs}, + nil, + false, + false, // not clusterrole + true) if err != nil { t.Fatal(err) } @@ -257,7 +286,7 @@ func testPrometheusInstanceNamespacesAllowList(t *testing.T) { svc := framework.MakePrometheusService("instance", "monitored", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), instanceNs, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -281,7 +310,7 @@ func testPrometheusInstanceNamespacesAllowList(t *testing.T) { svc := framework.MakeEchoService("allowed", "monitored", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), allowedNs, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -295,20 +324,16 @@ func testPrometheusInstanceNamespacesAllowList(t *testing.T) { t.Fatal(err) } - // FIXME(simonpasquier): the unprivileged namespace lister/watcher - // isn't notified of updates properly so the code below fails. - // Uncomment the test once the lister/watcher is fixed. - // // Remove the selecting label on the "allowed" namespace and check that // the target is removed. // See https://github.com/prometheus-operator/prometheus-operator/issues/3847 - //if err := testFramework.RemoveLabelsFromNamespace(framework.KubeClient, allowedNs, "monitored"); err != nil { - // t.Fatal(err) - //} + if err := framework.RemoveLabelsFromNamespace(context.Background(), allowedNs, "monitored"); err != nil { + t.Fatal(err) + } - //if err := framework.WaitForActiveTargets(instanceNs, "prometheus-instance", 0); err != nil { - // t.Fatal(err) - //} + if err := framework.WaitForActiveTargets(context.Background(), instanceNs, "prometheus-instance", 0); err != nil { + t.Fatal(err) + } } // this is not ideal, as we cannot really find out if prometheus operator did not reconcile the denied prometheus. @@ -369,7 +394,17 @@ func testPrometheusInstanceNamespacesNamespaceNotFound(t *testing.T) { } // Configure the operator to watch also a non-existing namespace (e.g. "notfound"). - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), operatorNs, []string{"notfound", allowedNs}, nil, []string{"notfound", instanceNs}, nil, false, true, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + operatorNs, + []string{"notfound", allowedNs}, + nil, + []string{"notfound", instanceNs}, + nil, + false, + true, // clusterrole + true, + ) if err != nil { t.Fatal(err) } @@ -401,7 +436,7 @@ func testPrometheusInstanceNamespacesNamespaceNotFound(t *testing.T) { svc := framework.MakePrometheusService("instance", "monitored", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), instanceNs, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -420,7 +455,7 @@ func testPrometheusInstanceNamespacesNamespaceNotFound(t *testing.T) { svc := framework.MakeEchoService("allowed", "monitored", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), allowedNs, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_test.go index 071385ecd..80d0fee16 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheus_test.go @@ -32,7 +32,6 @@ import ( "time" "github.com/kylelemons/godebug/pretty" - "github.com/pkg/errors" "github.com/stretchr/testify/require" "golang.org/x/net/http2" "google.golang.org/protobuf/proto" @@ -44,7 +43,7 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" certutil "k8s.io/client-go/util/cert" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" @@ -301,7 +300,7 @@ func createK8sAppMonitoring(name, ns string, prwtc testFramework.PromRemoteWrite } if _, err = framework.MonClientV1.ServiceMonitors(ns).Create(context.Background(), sm, metav1.CreateOptions{}); err != nil { - return nil, prometheusRecieverSvc, errors.Wrap(err, "creating ServiceMonitor failed") + return nil, prometheusRecieverSvc, fmt.Errorf("creating ServiceMonitor failed: %w", err) } // Create prometheus receiver for remote writes @@ -870,7 +869,6 @@ func testPromNoServiceMonitorSelector(t *testing.T) { } func testPromVersionMigration(t *testing.T) { - t.Parallel() testCtx := framework.NewTestCtx(t) defer testCtx.Cleanup(t) ns := framework.CreateNamespace(context.Background(), t, testCtx) @@ -1036,10 +1034,10 @@ func testPromStorageLabelsAnnotations(t *testing.T) { for _, vct := range sts.Items[0].Spec.VolumeClaimTemplates { if vct.Name == "prometheus-"+name+"-db" { if val := vct.Labels["test-label"]; val != "foo" { - return false, errors.Errorf("incorrect volume claim label on sts, want: %v, got: %v", "foo", val) + return false, fmt.Errorf("incorrect volume claim label on sts, want: %v, got: %v", "foo", val) } if val := vct.Annotations["test-annotation"]; val != "bar" { - return false, errors.Errorf("incorrect volume claim annotation on sts, want: %v, got: %v", "bar", val) + return false, fmt.Errorf("incorrect volume claim annotation on sts, want: %v, got: %v", "bar", val) } return true, nil } @@ -1114,6 +1112,52 @@ func testPromStorageUpdate(t *testing.T) { if err != nil { t.Fatal(err) } + + // Invalid storageclass e2e test + + _, err = framework.PatchPrometheus( + context.Background(), + p.Name, + ns, + monitoringv1.PrometheusSpec{ + CommonPrometheusFields: monitoringv1.CommonPrometheusFields{ + Storage: &monitoringv1.StorageSpec{ + VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{ + Spec: v1.PersistentVolumeClaimSpec{ + StorageClassName: ptr.To("unknown-storage-class"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse("200Mi"), + }, + }, + }, + }, + }, + }, + }, + ) + if err != nil { + t.Fatal(err) + } + + var loopError error + err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) { + current, err := framework.MonClientV1.Prometheuses(ns).Get(ctx, p.Name, metav1.GetOptions{}) + if err != nil { + loopError = fmt.Errorf("failed to get object: %w", err) + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err == nil { + return true, nil + } + + return false, nil + }) + + if err != nil { + t.Fatalf("%v: %v", err, loopError) + } } func testPromReloadConfig(t *testing.T) { @@ -1195,7 +1239,7 @@ scrape_configs: cfg, err := framework.KubeClient.CoreV1().Secrets(ns).Get(context.Background(), cfg.Name, metav1.GetOptions{}) if err != nil { - t.Fatal(errors.Wrap(err, "could not retrieve previous secret")) + t.Fatal(fmt.Errorf("could not retrieve previous secret: %w", err)) } cfg.Data["prometheus.yaml.gz"] = secondConfigCompressed @@ -1254,7 +1298,7 @@ func testPromAdditionalScrapeConfig(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -1312,7 +1356,7 @@ func testPromAdditionalAlertManagerConfig(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -1341,7 +1385,7 @@ func testPromAdditionalAlertManagerConfig(t *testing.T) { }) if err != nil { - t.Fatal(errors.Wrap(err, "validating Prometheus Alertmanager configuration failed")) + t.Fatal(fmt.Errorf("validating Prometheus Alertmanager configuration failed: %w", err)) } } @@ -1370,7 +1414,7 @@ func testPromReloadRules(t *testing.T) { pSVC := framework.MakePrometheusService(p.Name, "not-relevant", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, pSVC); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -1428,7 +1472,7 @@ func testPromMultiplePrometheusRulesSameNS(t *testing.T) { pSVC := framework.MakePrometheusService(p.Name, "not-relevant", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, pSVC); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -1484,7 +1528,7 @@ func testPromMultiplePrometheusRulesDifferentNS(t *testing.T) { pSVC := framework.MakePrometheusService(p.Name, "not-relevant", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), rootNS, pSVC); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -1555,7 +1599,7 @@ func testPromRulesExceedingConfigMapLimit(t *testing.T) { pSVC := framework.MakePrometheusService(p.Name, "not-relevant", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, pSVC); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -1834,7 +1878,7 @@ func testPromOnlyUpdatedOnRelevantChanges(t *testing.T) { pSVC := framework.MakePrometheusService(prometheus.Name, name, v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, pSVC); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -1851,7 +1895,7 @@ func testPromOnlyUpdatedOnRelevantChanges(t *testing.T) { err = framework.WaitForDiscoveryWorking(context.Background(), ns, pSVC.Name, prometheus.Name) if err != nil { - t.Fatal(errors.Wrap(err, "validating Prometheus target discovery failed")) + t.Fatal(fmt.Errorf("validating Prometheus target discovery failed: %w", err)) } if err := framework.DeletePrometheusAndWaitUntilGone(context.Background(), ns, name); err != nil { @@ -2125,7 +2169,7 @@ func testPromDiscovery(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2137,7 +2181,7 @@ func testPromDiscovery(t *testing.T) { err = framework.WaitForDiscoveryWorking(context.Background(), ns, svc.Name, prometheusName) if err != nil { - t.Fatal(errors.Wrap(err, "validating Prometheus target discovery failed")) + t.Fatal(fmt.Errorf("validating Prometheus target discovery failed: %w", err)) } } @@ -2218,7 +2262,7 @@ func testShardingProvisioning(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2289,7 +2333,7 @@ func testResharding(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2374,7 +2418,7 @@ func testPromAlertmanagerDiscovery(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2394,12 +2438,12 @@ func testPromAlertmanagerDiscovery(t *testing.T) { } if _, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, amsvc); err != nil { - t.Fatal(errors.Wrap(err, "creating Alertmanager service failed")) + t.Fatal(fmt.Errorf("creating Alertmanager service failed: %w", err)) } err = wait.PollUntilContextTimeout(context.Background(), time.Second, 18*time.Minute, false, isAlertmanagerDiscoveryWorking(ns, svc.Name, alertmanagerName)) if err != nil { - t.Fatal(errors.Wrap(err, "validating Prometheus Alertmanager discovery failed")) + t.Fatal(fmt.Errorf("validating Prometheus Alertmanager discovery failed: %w", err)) } } @@ -2472,7 +2516,7 @@ func testPromDiscoverTargetPort(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2484,7 +2528,7 @@ func testPromDiscoverTargetPort(t *testing.T) { err = framework.WaitForDiscoveryWorking(context.Background(), ns, svc.Name, prometheusName) if err != nil { - t.Fatal(errors.Wrap(err, "validating Prometheus target discovery failed")) + t.Fatal(fmt.Errorf("validating Prometheus target discovery failed: %w", err)) } } @@ -2528,7 +2572,7 @@ func testPromOpMatchPromAndServMonInDiffNSs(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), prometheusNSName, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2688,7 +2732,7 @@ func testPromGetAuthSecret(t *testing.T) { }, serviceMonitor: func() *monitoringv1.ServiceMonitor { sm := framework.MakeBasicServiceMonitor(name) - sm.Spec.Endpoints[0].BearerTokenSecret = v1.SecretKeySelector{ + sm.Spec.Endpoints[0].BearerTokenSecret = &v1.SecretKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: name, }, @@ -2843,7 +2887,7 @@ func testOperatorNSScope(t *testing.T) { pSVC := framework.MakePrometheusService(p.Name, "not-relevant", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), mainNS, pSVC); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2914,7 +2958,7 @@ func testOperatorNSScope(t *testing.T) { pSVC := framework.MakePrometheusService(p.Name, "not-relevant", v1.ServiceTypeClusterIP) if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), prometheusNS, pSVC); err != nil { - t.Fatal(errors.Wrap(err, "creating Prometheus service failed")) + t.Fatal(fmt.Errorf("creating Prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -2980,7 +3024,7 @@ func testPromArbitraryFSAcc(t *testing.T) { }, endpoint: monitoringv1.Endpoint{ Port: "web", - BearerTokenSecret: v1.SecretKeySelector{ + BearerTokenSecret: &v1.SecretKeySelector{ LocalObjectReference: v1.LocalObjectReference{ Name: name, }, @@ -3433,7 +3477,7 @@ func testPromStaticProbe(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -4113,7 +4157,7 @@ func testPromEnforcedNamespaceLabel(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { ctx.AddFinalizerFn(finalizerFn) } @@ -4125,7 +4169,7 @@ func testPromEnforcedNamespaceLabel(t *testing.T) { err = framework.WaitForDiscoveryWorking(context.Background(), ns, svc.Name, prometheusName) if err != nil { - t.Fatal(errors.Wrap(err, "validating Prometheus target discovery failed")) + t.Fatal(fmt.Errorf("validating Prometheus target discovery failed: %w", err)) } // Check that the namespace label is enforced to the correct value. @@ -4138,7 +4182,7 @@ func testPromEnforcedNamespaceLabel(t *testing.T) { loopErr = nil res, err := framework.PrometheusQuery(ns, svc.Name, "http", "prometheus_build_info") if err != nil { - loopErr = errors.Wrap(err, "failed to query Prometheus") + loopErr = fmt.Errorf("failed to query Prometheus: %w", err) return false, nil } @@ -4265,7 +4309,7 @@ func testPromNamespaceEnforcementExclusion(t *testing.T) { } if finalizerFn, err := framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc); err != nil { - t.Fatal(errors.Wrap(err, "creating prometheus service failed")) + t.Fatal(fmt.Errorf("creating prometheus service failed: %w", err)) } else { ctx.AddFinalizerFn(finalizerFn) } @@ -4277,7 +4321,7 @@ func testPromNamespaceEnforcementExclusion(t *testing.T) { err = framework.WaitForDiscoveryWorking(context.Background(), ns, svc.Name, prometheusName) if err != nil { - t.Fatal(errors.Wrap(err, "validating Prometheus target discovery failed")) + t.Fatal(fmt.Errorf("validating Prometheus target discovery failed: %w", err)) } // Check that the namespace label isn't enforced. @@ -4290,7 +4334,7 @@ func testPromNamespaceEnforcementExclusion(t *testing.T) { loopErr = nil res, err := framework.PrometheusQuery(ns, svc.Name, "http", "prometheus_build_info") if err != nil { - loopErr = errors.Wrap(err, "failed to query Prometheus") + loopErr = fmt.Errorf("failed to query Prometheus: %w", err) return false, nil } @@ -4567,7 +4611,7 @@ func testPrometheusCRDValidation(t *testing.T) { }, }, Query: &monitoringv1.QuerySpec{ - MaxConcurrency: pointer.Int32(100), + MaxConcurrency: ptr.To(int32(100)), }, }, }, @@ -4585,7 +4629,7 @@ func testPrometheusCRDValidation(t *testing.T) { }, }, Query: &monitoringv1.QuerySpec{ - MaxConcurrency: pointer.Int32(0), + MaxConcurrency: ptr.To(int32(0)), }, }, expectedError: true, @@ -4774,7 +4818,7 @@ func testPromUnavailableConditionStatus(t *testing.T) { } if cond.Status != monitoringv1.ConditionFalse { - pollErr = errors.Errorf( + pollErr = fmt.Errorf( "expected Available condition to be 'False', got %q (reason %s, %q)", cond.Status, cond.Reason, @@ -4784,7 +4828,7 @@ func testPromUnavailableConditionStatus(t *testing.T) { } if cond.Reason != "NoPodReady" { - pollErr = errors.Errorf( + pollErr = fmt.Errorf( "expected Available condition's reason to be 'NoPodReady', got %s (message %q)", cond.Reason, cond.Message, @@ -4795,7 +4839,7 @@ func testPromUnavailableConditionStatus(t *testing.T) { return true, nil } - pollErr = errors.Errorf("failed to find Available condition in status subresource") + pollErr = fmt.Errorf("failed to find Available condition in status subresource") return false, nil }) @@ -4850,7 +4894,7 @@ func testPromDegradedConditionStatus(t *testing.T) { } if cond.Status != monitoringv1.ConditionDegraded { - pollErr = errors.Errorf( + pollErr = fmt.Errorf( "expected Available condition to be 'Degraded', got %q (reason %s, %q)", cond.Status, cond.Reason, @@ -4860,7 +4904,7 @@ func testPromDegradedConditionStatus(t *testing.T) { } if cond.Reason != "SomePodsNotReady" { - pollErr = errors.Errorf( + pollErr = fmt.Errorf( "expected Available condition's reason to be 'SomePodsNotReady', got %s (message %q)", cond.Reason, cond.Message, @@ -4869,7 +4913,7 @@ func testPromDegradedConditionStatus(t *testing.T) { } if !strings.Contains(cond.Message, "bad-image") { - pollErr = errors.Errorf( + pollErr = fmt.Errorf( "expected Available condition's message to contain 'bad-image', got %q", cond.Message, ) @@ -4879,7 +4923,7 @@ func testPromDegradedConditionStatus(t *testing.T) { return true, nil } - pollErr = errors.Errorf("failed to find Available condition in status subresource") + pollErr = fmt.Errorf("failed to find Available condition in status subresource") return false, nil }) @@ -4935,6 +4979,68 @@ func testPromStrategicMergePatch(t *testing.T) { } } +func testPrometheusWithStatefulsetCreationFailure(t *testing.T) { + ctx := context.Background() + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + + ns := framework.CreateNamespace(context.Background(), t, testCtx) + framework.SetupPrometheusRBAC(context.Background(), t, testCtx, ns) + + p := framework.MakeBasicPrometheus(ns, "test", "", 1) + // Invalid spec which prevents the creation of the statefulset + p.Spec.Web = &monitoringv1.PrometheusWebSpec{ + WebConfigFileFields: monitoringv1.WebConfigFileFields{ + TLSConfig: &monitoringv1.WebTLSConfig{ + Cert: monitoringv1.SecretOrConfigMap{ + ConfigMap: &v1.ConfigMapKeySelector{}, + Secret: &v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "tls-cert", + }, + Key: "tls.crt", + }, + }, + KeySecret: v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{ + Name: "tls-cert", + }, + Key: "tls.key", + }, + }, + }, + } + _, err := framework.MonClientV1.Prometheuses(p.Namespace).Create(ctx, p, metav1.CreateOptions{}) + require.NoError(t, err) + + var loopError error + err = wait.PollUntilContextTimeout(ctx, time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) { + current, err := framework.MonClientV1.Prometheuses(ns).Get(ctx, "test", metav1.GetOptions{}) + if err != nil { + loopError = fmt.Errorf("failed to get object: %w", err) + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err != nil { + loopError = err + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Available, monitoringv1.ConditionFalse); err != nil { + loopError = err + return false, nil + } + + return true, nil + }) + + if err != nil { + t.Fatalf("%v: %v", err, loopError) + } + + require.NoError(t, framework.DeletePrometheusAndWaitUntilGone(context.Background(), ns, "test")) +} + func isAlertmanagerDiscoveryWorking(ns, promSVCName, alertmanagerName string) func(ctx context.Context) (bool, error) { return func(ctx context.Context) (bool, error) { pods, err := framework.KubeClient.CoreV1().Pods(ns).List(ctx, alertmanager.ListOptions(alertmanagerName)) diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheusagent_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheusagent_test.go index 74bf4c7d2..339cee6f1 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheusagent_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/prometheusagent_test.go @@ -16,7 +16,18 @@ package e2e import ( "context" + "fmt" "testing" + "time" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/utils/ptr" + + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" ) func testCreatePrometheusAgent(t *testing.T) { @@ -69,3 +80,67 @@ func testAgentAndServerNameColision(t *testing.T) { } } + +func testAgentCheckStorageClass(t *testing.T) { + t.Parallel() + ctx := context.Background() + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + + ns := framework.CreateNamespace(ctx, t, testCtx) + framework.SetupPrometheusRBAC(ctx, t, testCtx, ns) + name := "test" + + prometheusAgentCRD := framework.MakeBasicPrometheusAgent(ns, name, name, 1) + + prometheusAgentCRD, err := framework.CreatePrometheusAgentAndWaitUntilReady(ctx, ns, prometheusAgentCRD) + if err != nil { + t.Fatal(err) + } + + // Invalid storageclass e2e test + + _, err = framework.PatchPrometheusAgent( + context.Background(), + prometheusAgentCRD.Name, + ns, + monitoringv1alpha1.PrometheusAgentSpec{ + CommonPrometheusFields: monitoringv1.CommonPrometheusFields{ + Storage: &monitoringv1.StorageSpec{ + VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{ + Spec: v1.PersistentVolumeClaimSpec{ + StorageClassName: ptr.To("unknown-storage-class"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse("200Mi"), + }, + }, + }, + }, + }, + }, + }, + ) + if err != nil { + t.Fatal(err) + } + + var loopError error + err = wait.PollUntilContextTimeout(ctx, 5*time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) { + current, err := framework.MonClientV1alpha1.PrometheusAgents(ns).Get(ctx, name, metav1.GetOptions{}) + if err != nil { + loopError = fmt.Errorf("failed to get object: %w", err) + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err == nil { + return true, nil + } + + return false, nil + }) + + if err != nil { + t.Fatalf("%v: %v", err, loopError) + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/scrapeconfig_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/scrapeconfig_test.go index 146161fa5..d74b32e1e 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/scrapeconfig_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/scrapeconfig_test.go @@ -24,7 +24,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" @@ -90,7 +90,22 @@ func testScrapeConfigCreation(t *testing.T) { spec: monitoringv1alpha1.ScrapeConfigSpec{ KubernetesSDConfigs: []monitoringv1alpha1.KubernetesSDConfig{ { - Role: "Node", + Role: monitoringv1alpha1.K8SRole("Node"), + }, + }, + }, + }, + { + name: "dns-sd-config", + spec: monitoringv1alpha1.ScrapeConfigSpec{ + DNSSDConfigs: []monitoringv1alpha1.DNSSDConfig{ + { + Names: []string{ + "demo.do.prometheus.io", + }, + RefreshInterval: &fiveMins, + Type: ptr.To("A"), + Port: ptr.To(9090), }, }, }, @@ -147,7 +162,17 @@ func testScrapeConfigLifecycle(t *testing.T) { ns := framework.CreateNamespace(context.Background(), t, testCtx) framework.SetupPrometheusRBAC(context.Background(), t, testCtx, ns) - _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), ns, []string{ns}, nil, []string{ns}, nil, false, true, true) + _, err := framework.CreateOrUpdatePrometheusOperator( + context.Background(), + ns, + []string{ns}, + nil, + []string{ns}, + nil, + false, + true, // clusterrole + true, + ) require.NoError(t, err) p := framework.MakeBasicPrometheus(ns, "prom", "group", 1) @@ -241,8 +266,6 @@ func testPromOperatorStartsWithoutScrapeConfigCRD(t *testing.T) { // testScrapeConfigKubernetesNodeRole tests whether Kubernetes node monitoring works as expected func testScrapeConfigKubernetesNodeRole(t *testing.T) { - skipPrometheusTests(t) - testCtx := framework.NewTestCtx(t) defer testCtx.Cleanup(t) ns := framework.CreateNamespace(context.Background(), t, testCtx) @@ -270,7 +293,7 @@ func testScrapeConfigKubernetesNodeRole(t *testing.T) { createMTLSSecret(t, secretName, ns) sc := framework.MakeBasicScrapeConfig(ns, "scrape-config") - sc.Spec.Scheme = pointer.String("HTTPS") + sc.Spec.Scheme = ptr.To("HTTPS") sc.Spec.Authorization = &monitoringv1.SafeAuthorization{ Credentials: &v1.SecretKeySelector{ LocalObjectReference: v1.LocalObjectReference{ @@ -308,7 +331,51 @@ func testScrapeConfigKubernetesNodeRole(t *testing.T) { sc.Spec.KubernetesSDConfigs = []monitoringv1alpha1.KubernetesSDConfig{ { - Role: "Node", + Role: monitoringv1alpha1.K8SRole("Node"), + }, + } + _, err = framework.CreateScrapeConfig(context.Background(), ns, sc) + require.NoError(t, err) + + // Check that the targets appear in Prometheus and does proper scrapping + if err := framework.WaitForHealthyTargets(context.Background(), ns, "prometheus-operated", 1); err != nil { + t.Fatal(err) + } + + // Remove the ScrapeConfig + err = framework.DeleteScrapeConfig(context.Background(), ns, "scrape-config") + require.NoError(t, err) + + // Check that the targets disappeared in Prometheus + err = framework.WaitForActiveTargets(context.Background(), ns, "prometheus-operated", 0) + require.NoError(t, err) +} + +// testScrapeConfigDNSSDConfig tests whether DNS SD based monitoring works as expected +func testScrapeConfigDNSSDConfig(t *testing.T) { + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + ns := framework.CreateNamespace(context.Background(), t, testCtx) + framework.SetupPrometheusRBAC(context.Background(), t, testCtx, ns) + + _, err := framework.CreateOrUpdatePrometheusOperator(context.Background(), ns, []string{ns}, nil, []string{ns}, nil, false, true, true) + require.NoError(t, err) + + p := framework.MakeBasicPrometheus(ns, "prom", "group", 1) + p.Spec.ScrapeConfigSelector = &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "role": "scrapeconfig", + }, + } + _, err = framework.CreatePrometheusAndWaitUntilReady(context.Background(), ns, p) + require.NoError(t, err) + + sc := framework.MakeBasicScrapeConfig(ns, "scrape-config") + sc.Spec.DNSSDConfigs = []monitoringv1alpha1.DNSSDConfig{ + { + Names: []string{"node.demo.do.prometheus.io"}, + Type: ptr.To("A"), + Port: ptr.To(9100), }, } _, err = framework.CreateScrapeConfig(context.Background(), ns, sc) diff --git a/otelcollector/otel-allocator/prometheus-operator/test/e2e/thanosruler_test.go b/otelcollector/otel-allocator/prometheus-operator/test/e2e/thanosruler_test.go index 0547073e5..e97e89efb 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/e2e/thanosruler_test.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/e2e/thanosruler_test.go @@ -20,11 +20,15 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/utils/ptr" + + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" ) func testThanosRulerCreateDeleteCluster(t *testing.T) { @@ -45,6 +49,50 @@ func testThanosRulerCreateDeleteCluster(t *testing.T) { } } +func testThanosRulerWithStatefulsetCreationFailure(t *testing.T) { + ctx := context.Background() + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + + ns := framework.CreateNamespace(ctx, t, testCtx) + framework.SetupPrometheusRBAC(ctx, t, testCtx, ns) + + tr := framework.MakeBasicThanosRuler("test", 1, "") + // Empty queryEndpoints and queryConfigFile prevent the controller from + // creating the statefulset. + tr.Spec.QueryEndpoints = []string{} + + _, err := framework.MonClientV1.ThanosRulers(ns).Create(ctx, tr, metav1.CreateOptions{}) + require.NoError(t, err) + + var loopError error + err = wait.PollUntilContextTimeout(ctx, time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) { + current, err := framework.MonClientV1.ThanosRulers(ns).Get(ctx, "test", metav1.GetOptions{}) + if err != nil { + loopError = fmt.Errorf("failed to get object: %w", err) + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err != nil { + loopError = err + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Available, monitoringv1.ConditionFalse); err != nil { + loopError = err + return false, nil + } + + return true, nil + }) + + if err != nil { + t.Fatalf("%v: %v", err, loopError) + } + + require.NoError(t, framework.DeleteThanosRulerAndWaitUntilGone(ctx, ns, "test")) +} + func testThanosRulerPrometheusRuleInDifferentNamespace(t *testing.T) { testCtx := framework.NewTestCtx(t) defer testCtx.Cleanup(t) @@ -278,19 +326,19 @@ func testTRAlertmanagerConfig(t *testing.T) { // Create Alertmanager resource and service alertmanager, err := framework.CreateAlertmanagerAndWaitUntilReady(context.Background(), framework.MakeBasicAlertmanager(ns, name, 1)) - assert.NoError(t, err) + require.NoError(t, err) amSVC := framework.MakeAlertmanagerService(alertmanager.Name, group, v1.ServiceTypeClusterIP) _, err = framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, amSVC) - assert.NoError(t, err) + require.NoError(t, err) // Create a Prometheus resource because Thanos ruler needs a query API. prometheus, err := framework.CreatePrometheusAndWaitUntilReady(context.Background(), ns, framework.MakeBasicPrometheus(ns, name, name, 1)) - assert.NoError(t, err) + require.NoError(t, err) svc := framework.MakePrometheusService(prometheus.Name, name, v1.ServiceTypeClusterIP) _, err = framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc) - assert.NoError(t, err) + require.NoError(t, err) // Create Secret with Alermanager config, trAmConfigSecret := &v1.Secret{ @@ -308,7 +356,7 @@ alertmanagers: }, } _, err = framework.KubeClient.CoreV1().Secrets(ns).Create(context.Background(), trAmConfigSecret, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Create Thanos ruler resource and service thanos := framework.MakeBasicThanosRuler(name, 1, fmt.Sprintf("http://%s:%d/", svc.Name, svc.Spec.Ports[0].Port)) @@ -321,17 +369,17 @@ alertmanagers: } _, err = framework.CreateThanosRulerAndWaitUntilReady(context.Background(), ns, thanos) - assert.NoError(t, err) + require.NoError(t, err) _, err = framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, framework.MakeThanosRulerService(thanos.Name, group, v1.ServiceTypeClusterIP)) - assert.NoError(t, err) + require.NoError(t, err) // Create firing rule _, err = framework.MakeAndCreateFiringRule(context.Background(), ns, "rule1", testAlert) - assert.NoError(t, err) + require.NoError(t, err) err = framework.WaitForAlertmanagerFiringAlert(context.Background(), ns, amSVC.Name, testAlert) - assert.NoError(t, err) + require.NoError(t, err) } // Tests Thanos ruler query Config @@ -354,11 +402,11 @@ func testTRQueryConfig(t *testing.T) { // Create a Prometheus resource because Thanos ruler needs a query API. prometheus, err := framework.CreatePrometheusAndWaitUntilReady(context.Background(), ns, framework.MakeBasicPrometheus(ns, name, name, 1)) - assert.NoError(t, err) + require.NoError(t, err) promSVC := framework.MakePrometheusService(prometheus.Name, name, v1.ServiceTypeClusterIP) _, err = framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, promSVC) - assert.NoError(t, err) + require.NoError(t, err) // Create Secret with query config, trQueryConfSecret := &v1.Secret{ @@ -374,7 +422,7 @@ func testTRQueryConfig(t *testing.T) { }, } _, err = framework.KubeClient.CoreV1().Secrets(ns).Create(context.Background(), trQueryConfSecret, metav1.CreateOptions{}) - assert.NoError(t, err) + require.NoError(t, err) // Create Thanos ruler resource and service // setting queryEndpoint to "" as it will be ignored because we set QueryConfig @@ -388,17 +436,78 @@ func testTRQueryConfig(t *testing.T) { } _, err = framework.CreateThanosRulerAndWaitUntilReady(context.Background(), ns, thanos) - assert.NoError(t, err) + require.NoError(t, err) svc := framework.MakeThanosRulerService(thanos.Name, group, v1.ServiceTypeClusterIP) _, err = framework.CreateOrUpdateServiceAndWaitUntilReady(context.Background(), ns, svc) - assert.NoError(t, err) + require.NoError(t, err) // Create firing rule _, err = framework.MakeAndCreateFiringRule(context.Background(), ns, "rule1", testAlert) - assert.NoError(t, err) + require.NoError(t, err) if err := framework.WaitForThanosFiringAlert(context.Background(), ns, svc.Name, testAlert); err != nil { t.Fatal(err) } } + +func testTRCheckStorageClass(t *testing.T) { + t.Parallel() + ctx := context.Background() + testCtx := framework.NewTestCtx(t) + defer testCtx.Cleanup(t) + + ns := framework.CreateNamespace(ctx, t, testCtx) + framework.SetupPrometheusRBAC(ctx, t, testCtx, ns) + + tr := framework.MakeBasicThanosRuler("test", 1, "http://test.example.com") + + tr, err := framework.CreateThanosRulerAndWaitUntilReady(ctx, ns, tr) + if err != nil { + t.Fatal(err) + } + + // Invalid storageclass e2e test + + _, err = framework.PatchThanosRuler( + context.Background(), + tr.Name, + ns, + monitoringv1.ThanosRulerSpec{ + Storage: &monitoringv1.StorageSpec{ + VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{ + Spec: v1.PersistentVolumeClaimSpec{ + StorageClassName: ptr.To("unknown-storage-class"), + Resources: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse("200Mi"), + }, + }, + }, + }, + }, + }, + ) + if err != nil { + t.Fatal(err) + } + + var loopError error + err = wait.PollUntilContextTimeout(ctx, 5*time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) { + current, err := framework.MonClientV1.ThanosRulers(ns).Get(ctx, tr.Name, metav1.GetOptions{}) + if err != nil { + loopError = fmt.Errorf("failed to get object: %w", err) + return false, nil + } + + if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err == nil { + return true, nil + } + + return false, nil + }) + + if err != nil { + t.Fatalf("%v: %v", err, loopError) + } +} diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/admission_webhooks.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/admission_webhooks.go index db6f5033a..7df68463b 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/admission_webhooks.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/admission_webhooks.go @@ -16,8 +16,8 @@ package framework import ( "context" + "fmt" - "github.com/pkg/errors" v1 "k8s.io/api/admissionregistration/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,7 +27,7 @@ import ( func (f *Framework) createOrUpdateMutatingHook(ctx context.Context, certBytes []byte, namespace, source string) (FinalizerFn, error) { hook, err := parseMutatingHookYaml(source) if err != nil { - return nil, errors.Wrap(err, "Failed parsing mutating webhook") + return nil, fmt.Errorf("Failed parsing mutating webhook: %w", err) } hook.Webhooks[0].ClientConfig.Service.Namespace = namespace @@ -35,14 +35,14 @@ func (f *Framework) createOrUpdateMutatingHook(ctx context.Context, certBytes [] h, err := f.KubeClient.AdmissionregistrationV1().MutatingWebhookConfigurations().Get(ctx, hook.Name, metav1.GetOptions{}) if err != nil && !apierrors.IsNotFound(err) { - return nil, errors.Wrapf(err, "failed to get mutating webhook %s", hook.Name) + return nil, fmt.Errorf("failed to get mutating webhook %s: %w", hook.Name, err) } if apierrors.IsNotFound(err) { // MutatingWebhookConfiguration doesn't exists -> Create _, err = f.KubeClient.AdmissionregistrationV1().MutatingWebhookConfigurations().Create(ctx, hook, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to create mutating webhook %s", hook.Name) + return nil, fmt.Errorf("failed to create mutating webhook %s: %w", hook.Name, err) } } else { // must set this field from existing MutatingWebhookConfiguration to prevent update fail @@ -51,7 +51,7 @@ func (f *Framework) createOrUpdateMutatingHook(ctx context.Context, certBytes [] // MutatingWebhookConfiguration already exists -> Update _, err = f.KubeClient.AdmissionregistrationV1().MutatingWebhookConfigurations().Update(ctx, hook, metav1.UpdateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to update mutating webhook %s", hook.Name) + return nil, fmt.Errorf("failed to update mutating webhook %s: %w", hook.Name, err) } } @@ -63,7 +63,7 @@ func (f *Framework) createOrUpdateMutatingHook(ctx context.Context, certBytes [] func (f *Framework) createOrUpdateValidatingHook(ctx context.Context, certBytes []byte, namespace, source string) (FinalizerFn, error) { hook, err := parseValidatingHookYaml(source) if err != nil { - return nil, errors.Wrap(err, "Failed parsing validating webhook") + return nil, fmt.Errorf("Failed parsing validating webhook: %w", err) } hook.Webhooks[0].ClientConfig.Service.Namespace = namespace @@ -71,14 +71,14 @@ func (f *Framework) createOrUpdateValidatingHook(ctx context.Context, certBytes h, err := f.KubeClient.AdmissionregistrationV1().ValidatingWebhookConfigurations().Get(ctx, hook.Name, metav1.GetOptions{}) if err != nil && !apierrors.IsNotFound(err) { - return nil, errors.Wrapf(err, "failed to get validating webhook %s", hook.Name) + return nil, fmt.Errorf("failed to get validating webhook %s: %w", hook.Name, err) } if apierrors.IsNotFound(err) { // ValidatingWebhookConfiguration doesn't exists -> Create _, err = f.KubeClient.AdmissionregistrationV1().ValidatingWebhookConfigurations().Create(ctx, hook, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to create validating webhook %s", hook.Name) + return nil, fmt.Errorf("failed to create validating webhook %s: %w", hook.Name, err) } } else { // must set this field from existing ValidatingWebhookConfiguration to prevent update fail @@ -87,7 +87,7 @@ func (f *Framework) createOrUpdateValidatingHook(ctx context.Context, certBytes // ValidatingWebhookConfiguration already exists -> Update _, err = f.KubeClient.AdmissionregistrationV1().ValidatingWebhookConfigurations().Update(ctx, hook, metav1.UpdateOptions{}) if err != nil { - return nil, errors.Wrapf(err, "failed to update validating webhook %s", hook.Name) + return nil, fmt.Errorf("failed to update validating webhook %s: %w", hook.Name, err) } } @@ -112,7 +112,7 @@ func parseValidatingHookYaml(source string) (*v1.ValidatingWebhookConfiguration, resource := v1.ValidatingWebhookConfiguration{} if err := yaml.NewYAMLOrJSONDecoder(manifest, 100).Decode(&resource); err != nil { - return nil, errors.Wrapf(err, "failed to decode file %s", source) + return nil, fmt.Errorf("failed to decode file %s: %w", source, err) } return &resource, nil @@ -126,7 +126,7 @@ func parseMutatingHookYaml(source string) (*v1.MutatingWebhookConfiguration, err resource := v1.MutatingWebhookConfiguration{} if err := yaml.NewYAMLOrJSONDecoder(manifest, 100).Decode(&resource); err != nil { - return nil, errors.Wrapf(err, "failed to decode file %s", source) + return nil, fmt.Errorf("failed to decode file %s: %w", source, err) } return &resource, nil diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/alertmanager.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/alertmanager.go index d13721771..66d0689f8 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/alertmanager.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/alertmanager.go @@ -24,18 +24,18 @@ import ( "strings" "time" - "github.com/pkg/errors" "github.com/prometheus/alertmanager/api/v2/client/silence" "github.com/prometheus/alertmanager/api/v2/models" v1 "k8s.io/api/core/v1" extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager" "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" @@ -83,7 +83,7 @@ func (f *Framework) CreateAlertmanagerConfig(ctx context.Context, ns, name strin } subRouteJSON, err := json.Marshal(subRoute) if err != nil { - return nil, errors.Wrap(err, "failed to marshal subroute") + return nil, fmt.Errorf("failed to marshal subroute: %w", err) } amConfig := &monitoringv1alpha1.AlertmanagerConfig{ @@ -186,17 +186,17 @@ func (f *Framework) CreateAlertmanagerAndWaitUntilReady(ctx context.Context, a * amConfigSecretName := fmt.Sprintf("alertmanager-%s", a.Name) s, err := f.AlertmanagerConfigSecret(a.Namespace, amConfigSecretName) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("making alertmanager config secret %v failed", amConfigSecretName)) + return nil, fmt.Errorf("making alertmanager config secret %v failed: %w", amConfigSecretName, err) } _, err = f.KubeClient.CoreV1().Secrets(a.Namespace).Create(ctx, s, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("creating alertmanager config secret %v failed", s.Name)) + return nil, fmt.Errorf("creating alertmanager config secret %v failed: %w", s.Name, err) } a, err = f.MonClientV1.Alertmanagers(a.Namespace).Create(ctx, a, metav1.CreateOptions{}) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("creating alertmanager %v failed", a.Name)) + return nil, fmt.Errorf("creating alertmanager %v failed: %w", a.Name, err) } return a, f.WaitForAlertmanagerReady(ctx, a) @@ -223,7 +223,7 @@ func (f *Framework) WaitForAlertmanagerReady(ctx context.Context, a *monitoringv }, 5*time.Minute, ); err != nil { - return errors.Wrapf(err, "alertmanager %v/%v failed to become available", a.Namespace, a.Name) + return fmt.Errorf("alertmanager %v/%v failed to become available: %w", a.Namespace, a.Name, err) } // Check that all pods report the expected number of peers. @@ -232,11 +232,9 @@ func (f *Framework) WaitForAlertmanagerReady(ctx context.Context, a *monitoringv for i := 0; i < replicas; i++ { name := fmt.Sprintf("alertmanager-%v-%v", a.Name, strconv.Itoa(i)) if err := f.WaitForAlertmanagerPodInitialized(ctx, a.Namespace, name, replicas, a.Spec.ForceEnableClusterMode, isAMHTTPS); err != nil { - return errors.Wrap(err, - fmt.Sprintf( - "failed to wait for an Alertmanager cluster (%s) with %d instances to become ready", - name, replicas, - ), + return fmt.Errorf( + "failed to wait for an Alertmanager cluster (%s) with %d instances to become ready: %w", + name, replicas, err, ) } } @@ -247,7 +245,7 @@ func (f *Framework) WaitForAlertmanagerReady(ctx context.Context, a *monitoringv func (f *Framework) PatchAlertmanagerAndWaitUntilReady(ctx context.Context, name, ns string, spec monitoringv1.AlertmanagerSpec) (*monitoringv1.Alertmanager, error) { a, err := f.PatchAlertmanager(ctx, name, ns, spec) if err != nil { - return nil, errors.Wrapf(err, "failed to patch Alertmanager %s/%s", ns, name) + return nil, fmt.Errorf("failed to patch Alertmanager %s/%s: %w", ns, name, err) } err = f.WaitForAlertmanagerReady(ctx, a) @@ -269,7 +267,7 @@ func (f *Framework) PatchAlertmanager(ctx context.Context, name, ns string, spec }, ) if err != nil { - return nil, errors.Wrap(err, "failed to marshal Alertmanager spec") + return nil, fmt.Errorf("failed to marshal Alertmanager spec: %w", err) } p, err := f.MonClientV1.Alertmanagers(ns).Patch( @@ -278,7 +276,7 @@ func (f *Framework) PatchAlertmanager(ctx context.Context, name, ns string, spec types.ApplyPatchType, b, metav1.PatchOptions{ - Force: pointer.Bool(true), + Force: ptr.To(true), FieldManager: "e2e-test", }, ) @@ -296,7 +294,7 @@ func (f *Framework) ScaleAlertmanagerAndWaitUntilReady(ctx context.Context, name name, ns, monitoringv1.AlertmanagerSpec{ - Replicas: pointer.Int32(replicas), + Replicas: ptr.To(replicas), }, ) } @@ -304,11 +302,11 @@ func (f *Framework) ScaleAlertmanagerAndWaitUntilReady(ctx context.Context, name func (f *Framework) DeleteAlertmanagerAndWaitUntilGone(ctx context.Context, ns, name string) error { _, err := f.MonClientV1.Alertmanagers(ns).Get(ctx, name, metav1.GetOptions{}) if err != nil { - return errors.Wrap(err, fmt.Sprintf("requesting Alertmanager tpr %v failed", name)) + return fmt.Errorf("requesting Alertmanager tpr %v failed: %w", name, err) } if err := f.MonClientV1.Alertmanagers(ns).Delete(ctx, name, metav1.DeleteOptions{}); err != nil { - return errors.Wrap(err, fmt.Sprintf("deleting Alertmanager tpr %v failed", name)) + return fmt.Errorf("deleting Alertmanager tpr %v failed: %w", name, err) } if err := f.WaitForPodsReady( @@ -318,10 +316,15 @@ func (f *Framework) DeleteAlertmanagerAndWaitUntilGone(ctx context.Context, ns, 0, alertmanager.ListOptions(name), ); err != nil { - return errors.Wrap(err, fmt.Sprintf("waiting for Alertmanager tpr (%s) to vanish timed out", name)) + return fmt.Errorf("waiting for Alertmanager tpr (%s) to vanish timed out: %w", name, err) } - return f.KubeClient.CoreV1().Secrets(ns).Delete(ctx, fmt.Sprintf("alertmanager-%s", name), metav1.DeleteOptions{}) + err = f.KubeClient.CoreV1().Secrets(ns).Delete(ctx, fmt.Sprintf("alertmanager-%s", name), metav1.DeleteOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + return fmt.Errorf("failed to delete Alertmanager secret: %w", err) + } + + return nil } func (f *Framework) WaitForAlertmanagerPodInitialized(ctx context.Context, ns, name string, amountPeers int, forceEnableClusterMode, https bool) error { @@ -463,7 +466,7 @@ func (f *Framework) WaitForAlertmanagerFiringAlert(ctx context.Context, ns, svcN } if err := json.NewDecoder(bytes.NewBuffer(resp)).Decode(&alerts); err != nil { - return false, errors.Wrap(err, "failed to decode alerts from Alertmanager API") + return false, fmt.Errorf("failed to decode alerts from Alertmanager API: %w", err) } if len(alerts) != 1 { @@ -471,7 +474,7 @@ func (f *Framework) WaitForAlertmanagerFiringAlert(ctx context.Context, ns, svcN } for _, alert := range alerts { - if alert.Labels["alertname"] == alertName && alert.Status.State != pointer.String("firing") { + if alert.Labels["alertname"] == alertName && alert.Status.State != ptr.To("firing") { return true, nil } } @@ -499,7 +502,6 @@ func (f *Framework) PollAlertmanagerConfiguration(ctx context.Context, ns, amNam var pollError error err := wait.PollUntilContextTimeout(ctx, 10*time.Second, time.Minute*5, false, func(ctx context.Context) (bool, error) { amStatus, err := f.GetAlertmanagerPodStatus(ctx, ns, "alertmanager-"+amName+"-0", false) - if err != nil { pollError = fmt.Errorf("failed to query Alertmanager: %s", err) return false, nil diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/crd.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/crd.go index f313c3108..2b1ba5273 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/crd.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/crd.go @@ -16,12 +16,12 @@ package framework import ( "context" + "fmt" "io" "net/http" "strings" "time" - "github.com/pkg/errors" v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -36,7 +36,7 @@ import ( func (f *Framework) GetCRD(ctx context.Context, name string) (*v1.CustomResourceDefinition, error) { crd, err := f.APIServerClient.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, name, metav1.GetOptions{}) if err != nil { - return nil, errors.Wrapf(err, "unable to get CRD with name %v", name) + return nil, fmt.Errorf("unable to get CRD with name %v: %w", name, err) } return crd, nil } @@ -45,7 +45,7 @@ func (f *Framework) GetCRD(ctx context.Context, name string) (*v1.CustomResource func (f *Framework) ListCRDs(ctx context.Context) (*v1.CustomResourceDefinitionList, error) { crds, err := f.APIServerClient.ApiextensionsV1().CustomResourceDefinitions().List(ctx, metav1.ListOptions{}) if err != nil { - return nil, errors.Wrap(err, "unable to list CRDs") + return nil, fmt.Errorf("unable to list CRDs: %w", err) } return crds, nil } @@ -54,14 +54,14 @@ func (f *Framework) ListCRDs(ctx context.Context) (*v1.CustomResourceDefinitionL func (f *Framework) CreateOrUpdateCRD(ctx context.Context, crd *v1.CustomResourceDefinition) error { c, err := f.APIServerClient.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, crd.Name, metav1.GetOptions{}) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "getting CRD: %s", crd.Spec.Names.Kind) + return fmt.Errorf("getting CRD %s: %w", crd.Spec.Names.Kind, err) } if apierrors.IsNotFound(err) { // CRD doesn't exists -> Create _, err := f.APIServerClient.ApiextensionsV1().CustomResourceDefinitions().Create(ctx, crd, metav1.CreateOptions{}) if err != nil { - return errors.Wrapf(err, "create CRD: %s", crd.Spec.Names.Kind) + return fmt.Errorf("create CRD %s: %w", crd.Spec.Names.Kind, err) } } else { // must set this field from existing CRD to prevent update fail @@ -70,7 +70,7 @@ func (f *Framework) CreateOrUpdateCRD(ctx context.Context, crd *v1.CustomResourc // CRD already exists -> Update _, err := f.APIServerClient.ApiextensionsV1().CustomResourceDefinitions().Update(ctx, crd, metav1.UpdateOptions{}) if err != nil { - return errors.Wrapf(err, "update CRD: %s", crd.Spec.Names.Kind) + return fmt.Errorf("update CRD %s: %w", crd.Spec.Names.Kind, err) } } return nil @@ -79,7 +79,7 @@ func (f *Framework) CreateOrUpdateCRD(ctx context.Context, crd *v1.CustomResourc func (f *Framework) DeleteCRD(ctx context.Context, name string) error { err := f.APIServerClient.ApiextensionsV1().CustomResourceDefinitions().Delete(ctx, name, metav1.DeleteOptions{}) if err != nil { - return errors.Wrapf(err, "unable to delete CRD with name %v", name) + return fmt.Errorf("unable to delete CRD with name %v: %w", name, err) } return nil @@ -89,18 +89,18 @@ func (f *Framework) DeleteCRD(ctx context.Context, name string) error { func (f *Framework) MakeCRD(source string) (*v1.CustomResourceDefinition, error) { manifest, err := SourceToIOReader(source) if err != nil { - return nil, errors.Wrapf(err, "get manifest from source: %s", source) + return nil, fmt.Errorf("get manifest from source %s: %w", source, err) } content, err := io.ReadAll(manifest) if err != nil { - return nil, errors.Wrap(err, "get manifest content") + return nil, fmt.Errorf("get manifest content: %w", err) } crd := v1.CustomResourceDefinition{} err = yaml.Unmarshal(content, &crd) if err != nil { - return nil, errors.Wrapf(err, "unmarshal CRD asset file: %s", source) + return nil, fmt.Errorf("unmarshal CRD asset file %s: %w", source, err) } return &crd, nil @@ -116,12 +116,15 @@ func WaitForCRDReady(listFunc func(opts metav1.ListOptions) (runtime.Object, err return false, nil } } - return false, errors.Wrap(err, "failed to list CRD") + return false, fmt.Errorf("failed to list CRD: %w", err) } return true, nil }) - return errors.Wrap(err, "timed out waiting for Custom Resource") + if err != nil { + return fmt.Errorf("timed out waiting for Custom Resource: %w", err) + } + return nil } // CreateCRDAndWaitUntilReady creates a Custom Resource Definition from yaml @@ -133,7 +136,7 @@ func (f *Framework) CreateOrUpdateCRDAndWaitUntilReady(ctx context.Context, crdN crd, err := f.MakeCRD(assetPath) if err != nil { - return errors.Wrapf(err, "create CRD: %s from manifest: %s", crdName, assetPath) + return fmt.Errorf("create CRD: %s from manifest: %s: %w", crdName, assetPath, err) } crd.ObjectMeta.Name = crd.Spec.Names.Plural + "." + group @@ -141,12 +144,12 @@ func (f *Framework) CreateOrUpdateCRDAndWaitUntilReady(ctx context.Context, crdN err = f.CreateOrUpdateCRD(ctx, crd) if err != nil { - return errors.Wrapf(err, "create CRD %s on the apiserver", crdName) + return fmt.Errorf("create CRD %s on the apiserver: %w", crdName, err) } err = WaitForCRDReady(listFunc) if err != nil { - return errors.Wrapf(err, "%s CRD not ready", crdName) + return fmt.Errorf("%s CRD not ready: %w", crdName, err) } return nil diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/framework.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/framework.go index e9bc2f17e..76b23bb65 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/framework.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/framework.go @@ -25,7 +25,6 @@ import ( "github.com/blang/semver/v4" "github.com/gogo/protobuf/proto" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" @@ -40,6 +39,7 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" certutil "k8s.io/client-go/util/cert" + "k8s.io/utils/ptr" "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" @@ -80,37 +80,37 @@ type Framework struct { func New(kubeconfig, opImage, exampleDir, resourcesDir string, operatorVersion semver.Version) (*Framework, error) { config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) if err != nil { - return nil, errors.Wrap(err, "build config from flags failed") + return nil, fmt.Errorf("build config from flags failed: %w", err) } cli, err := kubernetes.NewForConfig(config) if err != nil { - return nil, errors.Wrap(err, "creating new kube-client failed") + return nil, fmt.Errorf("creating new kube-client failed: %w", err) } apiCli, err := apiclient.NewForConfig(config) if err != nil { - return nil, errors.Wrap(err, "creating new kube-client failed") + return nil, fmt.Errorf("creating new kube-client failed: %w", err) } httpc := cli.CoreV1().RESTClient().(*rest.RESTClient).Client if err != nil { - return nil, errors.Wrap(err, "creating http-client failed") + return nil, fmt.Errorf("creating http-client failed: %w", err) } mClientV1, err := v1monitoringclient.NewForConfig(config) if err != nil { - return nil, errors.Wrap(err, "creating v1 monitoring client failed") + return nil, fmt.Errorf("creating v1 monitoring client failed: %w", err) } mClientv1alpha1, err := v1alpha1monitoringclient.NewForConfig(config) if err != nil { - return nil, errors.Wrap(err, "creating v1alpha1 monitoring client failed") + return nil, fmt.Errorf("creating v1alpha1 monitoring client failed: %w", err) } mClientv1beta1, err := v1beta1monitoringclient.NewForConfig(config) if err != nil { - return nil, errors.Wrap(err, "creating v1beta1 monitoring client failed") + return nil, fmt.Errorf("creating v1beta1 monitoring client failed: %w", err) } f := &Framework{ @@ -194,49 +194,92 @@ func (f *Framework) MakeEchoDeployment(group string) *appsv1.Deployment { } } -// CreateOrUpdatePrometheusOperator creates or updates a Prometheus Operator Kubernetes Deployment -// inside the specified namespace using the specified operator image. Semver is used -// to control the installation for different version of Prometheus Operator. In addition -// one can specify the namespaces to watch, which defaults to all namespaces. -// Returns the CA, which can bs used to access the operator over TLS -func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns string, namespaceAllowlist, - namespaceDenylist, prometheusInstanceNamespaces, alertmanagerInstanceNamespaces []string, - createResourceAdmissionHooks, createClusterRoleBindings, createScrapeConfigCrd bool) ([]FinalizerFn, error) { +type PrometheusOperatorOpts struct { + Namespace string + AllowedNamespaces []string + DeniedNamespaces []string + PrometheusNamespaces []string + AlertmanagerNamespaces []string + EnableAdmissionWebhook bool + ClusterRoleBindings bool + EnableScrapeConfigs bool + AdditionalArgs []string +} + +func (f *Framework) CreateOrUpdatePrometheusOperator( + ctx context.Context, + namespace string, + namespaceAllowlist, + namespaceDenylist, + prometheusInstanceNamespaces, + alertmanagerInstanceNamespaces []string, + createResourceAdmissionHooks, + createClusterRoleBindings, + createScrapeConfigCrd bool, +) ([]FinalizerFn, error) { + return f.CreateOrUpdatePrometheusOperatorWithOpts( + ctx, + PrometheusOperatorOpts{ + Namespace: namespace, + AllowedNamespaces: namespaceAllowlist, + DeniedNamespaces: namespaceDenylist, + PrometheusNamespaces: prometheusInstanceNamespaces, + AlertmanagerNamespaces: alertmanagerInstanceNamespaces, + EnableAdmissionWebhook: createResourceAdmissionHooks, + ClusterRoleBindings: createClusterRoleBindings, + EnableScrapeConfigs: createScrapeConfigCrd, + }, + ) +} + +// CreateOrUpdatePrometheusOperatorWithOpts creates or updates a Prometheus +// Operator Kubernetes Deployment inside the specified namespace using the +// specified operator image. Semver is used to control the installation for +// different versions of Prometheus Operator. In addition one can specify the +// namespaces to watch, which defaults to all namespaces. It returns a slice +// of functions to tear down the deployment. +func (f *Framework) CreateOrUpdatePrometheusOperatorWithOpts( + ctx context.Context, + opts PrometheusOperatorOpts, +) ([]FinalizerFn, error) { var finalizers []FinalizerFn _, err := f.createOrUpdateServiceAccount( ctx, - ns, + opts.Namespace, fmt.Sprintf("%s/rbac/prometheus-operator/prometheus-operator-service-account.yaml", f.exampleDir), ) if err != nil { - return nil, errors.Wrap(err, "failed to create or update prometheus operator service account") + return nil, fmt.Errorf("failed to create or update prometheus operator service account: %w", err) } clusterRole, err := f.CreateOrUpdateClusterRole(ctx, fmt.Sprintf("%s/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml", f.exampleDir)) if err != nil { - return nil, errors.Wrap(err, "failed to create or update prometheus cluster role") + return nil, fmt.Errorf("failed to create or update prometheus cluster role: %w", err) } // Add CRD rbac rules clusterRole.Rules = append(clusterRole.Rules, CRDCreateRule, CRDMonitoringRule) if err := f.UpdateClusterRole(ctx, clusterRole); err != nil { - return nil, errors.Wrap(err, "failed to update prometheus cluster role") + return nil, fmt.Errorf("failed to update prometheus cluster role: %w", err) } - if createClusterRoleBindings { - if _, err := f.createOrUpdateClusterRoleBinding(ctx, ns, fmt.Sprintf("%s/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml", f.exampleDir)); err != nil { - return nil, errors.Wrap(err, "failed to create or update prometheus cluster role binding") + if opts.ClusterRoleBindings { + // Grant permissions on all namespaces. + if _, err := f.createOrUpdateClusterRoleBinding(ctx, opts.Namespace, fmt.Sprintf("%s/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml", f.exampleDir)); err != nil { + return nil, fmt.Errorf("failed to create or update prometheus cluster role binding: %w", err) } } else { - namespaces := namespaceAllowlist - namespaces = append(namespaces, prometheusInstanceNamespaces...) - namespaces = append(namespaces, alertmanagerInstanceNamespaces...) + // Grant permissions on specific namespaces. + var namespaces []string + namespaces = append(namespaces, opts.AllowedNamespaces...) + namespaces = append(namespaces, opts.PrometheusNamespaces...) + namespaces = append(namespaces, opts.AlertmanagerNamespaces...) for _, n := range namespaces { - if _, err := f.CreateOrUpdateRoleBindingForSubjectNamespace(ctx, n, ns, fmt.Sprintf("%s/prometheus-operator-role-binding.yaml", f.resourcesDir)); err != nil { - return nil, errors.Wrap(err, "failed to create or update prometheus operator role binding") + if _, err := f.CreateOrUpdateRoleBindingForSubjectNamespace(ctx, n, opts.Namespace, fmt.Sprintf("%s/prometheus-operator-role-binding.yaml", f.resourcesDir)); err != nil { + return nil, fmt.Errorf("failed to create or update prometheus operator role binding: %w", err) } } } @@ -245,88 +288,88 @@ func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns str return f.MonClientV1.Alertmanagers(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize Alertmanager CRD") + return nil, fmt.Errorf("initialize Alertmanager CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1.PodMonitorName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1.PodMonitors(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize PodMonitor CRD") + return nil, fmt.Errorf("initialize PodMonitor CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1.ProbeName, func(opts metav1.ListOptions) (object runtime.Object, err error) { return f.MonClientV1.Probes(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize Probe CRD") + return nil, fmt.Errorf("initialize Probe CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1.PrometheusName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1.Prometheuses(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize Prometheus CRD") + return nil, fmt.Errorf("initialize Prometheus CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1.PrometheusRuleName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1.PrometheusRules(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize PrometheusRule CRD") + return nil, fmt.Errorf("initialize PrometheusRule CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1.ServiceMonitorName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1.ServiceMonitors(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize ServiceMonitor CRD") + return nil, fmt.Errorf("initialize ServiceMonitor CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1.ThanosRulerName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1.ThanosRulers(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize ThanosRuler CRD") + return nil, fmt.Errorf("initialize ThanosRuler CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1alpha1.AlertmanagerConfigName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1alpha1.AlertmanagerConfigs(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize AlertmanagerConfig v1alpha1 CRD") + return nil, fmt.Errorf("initialize AlertmanagerConfig v1alpha1 CRD: %w", err) } err = WaitForCRDReady(func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1beta1.AlertmanagerConfigs(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "wait for AlertmanagerConfig v1beta1 CRD") + return nil, fmt.Errorf("wait for AlertmanagerConfig v1beta1 CRD: %w", err) } err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1alpha1.PrometheusAgentName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1alpha1.PrometheusAgents(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize PrometheusAgent v1alpha1 CRD") + return nil, fmt.Errorf("initialize PrometheusAgent v1alpha1 CRD: %w", err) } - if createScrapeConfigCrd { + if opts.EnableScrapeConfigs { err = f.CreateOrUpdateCRDAndWaitUntilReady(ctx, monitoringv1alpha1.ScrapeConfigName, func(opts metav1.ListOptions) (runtime.Object, error) { return f.MonClientV1alpha1.ScrapeConfigs(v1.NamespaceAll).List(ctx, opts) }) if err != nil { - return nil, errors.Wrap(err, "initialize ScrapeConfig v1alpha1 CRD") + return nil, fmt.Errorf("initialize ScrapeConfig v1alpha1 CRD: %w", err) } } - certBytes, keyBytes, err := certutil.GenerateSelfSignedCertKey(fmt.Sprintf("%s.%s.svc", prometheusOperatorServiceDeploymentName, ns), nil, nil) + certBytes, keyBytes, err := certutil.GenerateSelfSignedCertKey(fmt.Sprintf("%s.%s.svc", prometheusOperatorServiceDeploymentName, opts.Namespace), nil, nil) if err != nil { - return nil, errors.Wrap(err, "failed to generate certificate and key") + return nil, fmt.Errorf("failed to generate certificate and key: %w", err) } - if err := f.CreateOrUpdateSecretWithCert(ctx, certBytes, keyBytes, ns, prometheusOperatorCertsSecretName); err != nil { - return nil, errors.Wrap(err, "failed to create or update prometheus-operator TLS secret") + if err := f.CreateOrUpdateSecretWithCert(ctx, certBytes, keyBytes, opts.Namespace, prometheusOperatorCertsSecretName); err != nil { + return nil, fmt.Errorf("failed to create or update prometheus-operator TLS secret: %w", err) } deploy, err := MakeDeployment(fmt.Sprintf("%s/rbac/prometheus-operator/prometheus-operator-deployment.yaml", f.exampleDir)) @@ -334,7 +377,7 @@ func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns str return nil, err } - // Make sure only one version of prometheus operator when update + // Make sure only that only one instance of the Prometheus operator is running during update. deploy.Spec.Strategy.Type = appsv1.RecreateDeploymentStrategyType deploy.Spec.Template.Spec.Containers[0].Args = append(deploy.Spec.Template.Spec.Containers[0].Args, "--log-level=debug") @@ -345,7 +388,7 @@ func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns str deploy.Spec.Template.Spec.Containers[0].Image = f.opImage repoAndTag := strings.Split(f.opImage, ":") if len(repoAndTag) != 2 { - return nil, errors.Errorf( + return nil, fmt.Errorf( "expected operator image '%v' split by colon to result in two substrings but got '%v'", f.opImage, repoAndTag, @@ -362,31 +405,30 @@ func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns str webhookServerImage = "quay.io/prometheus-operator/admission-webhook:" + repoAndTag[1] } - deploy.Spec.Template.Spec.Containers[0].Args = append(deploy.Spec.Template.Spec.Containers[0].Args, "--log-level=all") deploy.Name = prometheusOperatorServiceDeploymentName - for _, ns := range namespaceAllowlist { + for _, ns := range opts.AllowedNamespaces { deploy.Spec.Template.Spec.Containers[0].Args = append( deploy.Spec.Template.Spec.Containers[0].Args, fmt.Sprintf("--namespaces=%v", ns), ) } - for _, ns := range namespaceDenylist { + for _, ns := range opts.DeniedNamespaces { deploy.Spec.Template.Spec.Containers[0].Args = append( deploy.Spec.Template.Spec.Containers[0].Args, fmt.Sprintf("--deny-namespaces=%v", ns), ) } - for _, ns := range prometheusInstanceNamespaces { + for _, ns := range opts.PrometheusNamespaces { deploy.Spec.Template.Spec.Containers[0].Args = append( deploy.Spec.Template.Spec.Containers[0].Args, fmt.Sprintf("--prometheus-instance-namespaces=%v", ns), ) } - for _, ns := range alertmanagerInstanceNamespaces { + for _, ns := range opts.AlertmanagerNamespaces { deploy.Spec.Template.Spec.Containers[0].Args = append( deploy.Spec.Template.Spec.Containers[0].Args, fmt.Sprintf("--alertmanager-instance-namespaces=%v", ns), @@ -404,7 +446,7 @@ func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns str // The addition of rule admission webhooks requires TLS, so enable it and // switch to a more common https port - if createResourceAdmissionHooks { + if opts.EnableAdmissionWebhook { deploy.Spec.Template.Spec.Containers[0].Args = append( deploy.Spec.Template.Spec.Containers[0].Args, "--web.enable-tls=true", @@ -412,51 +454,56 @@ func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns str ) } - err = f.CreateOrUpdateDeploymentAndWaitUntilReady(ctx, ns, deploy) + deploy.Spec.Template.Spec.Containers[0].Args = append( + deploy.Spec.Template.Spec.Containers[0].Args, + opts.AdditionalArgs..., + ) + + err = f.CreateOrUpdateDeploymentAndWaitUntilReady(ctx, opts.Namespace, deploy) if err != nil { return nil, err } service, err := MakeService(fmt.Sprintf("%s/rbac/prometheus-operator/prometheus-operator-service.yaml", f.exampleDir)) if err != nil { - return finalizers, errors.Wrap(err, "cannot parse service file") + return finalizers, fmt.Errorf("cannot parse service file: %w", err) } - service.Namespace = ns + service.Namespace = opts.Namespace service.Spec.ClusterIP = "" service.Spec.Ports = []v1.ServicePort{{Name: "https", Port: 443, TargetPort: intstr.FromInt(8443)}} - if _, err := f.CreateOrUpdateServiceAndWaitUntilReady(ctx, ns, service); err != nil { - return finalizers, errors.Wrap(err, "failed to create or update prometheus operator service") + if _, err := f.CreateOrUpdateServiceAndWaitUntilReady(ctx, opts.Namespace, service); err != nil { + return finalizers, fmt.Errorf("failed to create or update prometheus operator service: %w", err) } - if createResourceAdmissionHooks { - webhookService, b, err := f.CreateOrUpdateAdmissionWebhookServer(ctx, ns, webhookServerImage) + if opts.EnableAdmissionWebhook { + webhookService, b, err := f.CreateOrUpdateAdmissionWebhookServer(ctx, opts.Namespace, webhookServerImage) if err != nil { - return nil, errors.Wrap(err, "failed to create webhook server") + return nil, fmt.Errorf("failed to create webhook server: %w", err) } - finalizer, err := f.createOrUpdateMutatingHook(ctx, b, ns, fmt.Sprintf("%s/prometheus-operator-mutatingwebhook.yaml", f.resourcesDir)) + finalizer, err := f.createOrUpdateMutatingHook(ctx, b, opts.Namespace, fmt.Sprintf("%s/prometheus-operator-mutatingwebhook.yaml", f.resourcesDir)) if err != nil { - return nil, errors.Wrap(err, "failed to create or update mutating webhook for PrometheusRule objects") + return nil, fmt.Errorf("failed to create or update mutating webhook for PrometheusRule objects: %w", err) } finalizers = append(finalizers, finalizer) - finalizer, err = f.createOrUpdateValidatingHook(ctx, b, ns, fmt.Sprintf("%s/prometheus-operator-validatingwebhook.yaml", f.resourcesDir)) + finalizer, err = f.createOrUpdateValidatingHook(ctx, b, opts.Namespace, fmt.Sprintf("%s/prometheus-operator-validatingwebhook.yaml", f.resourcesDir)) if err != nil { - return nil, errors.Wrap(err, "failed to create or update validating webhook for PrometheusRule objects") + return nil, fmt.Errorf("failed to create or update validating webhook for PrometheusRule objects: %w", err) } finalizers = append(finalizers, finalizer) - finalizer, err = f.createOrUpdateValidatingHook(ctx, b, ns, fmt.Sprintf("%s/alertmanager-config-validating-webhook.yaml", f.resourcesDir)) + finalizer, err = f.createOrUpdateValidatingHook(ctx, b, opts.Namespace, fmt.Sprintf("%s/alertmanager-config-validating-webhook.yaml", f.resourcesDir)) if err != nil { - return nil, errors.Wrap(err, "failed to create or update validating webhook for AlertManagerConfig objects") + return nil, fmt.Errorf("failed to create or update validating webhook for AlertManagerConfig objects: %w", err) } finalizers = append(finalizers, finalizer) finalizer, err = f.configureAlertmanagerConfigConversion(ctx, webhookService, b) if err != nil { - return nil, errors.Wrap(err, "failed to configure conversion webhook for AlertManagerConfig objects") + return nil, fmt.Errorf("failed to configure conversion webhook for AlertManagerConfig objects: %w", err) } finalizers = append(finalizers, finalizer) } @@ -469,108 +516,108 @@ func (f *Framework) CreateOrUpdatePrometheusOperator(ctx context.Context, ns str func (f *Framework) DeletePrometheusOperatorClusterResource(ctx context.Context) error { err := f.DeleteClusterRole(ctx, fmt.Sprintf("%s/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml", f.exampleDir)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete prometheus cluster role") + return fmt.Errorf("failed to delete prometheus cluster role: %w", err) } group := monitoring.GroupName alertmanagerCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1.AlertmanagerName)) if err != nil { - return errors.Wrap(err, "failed to make alertmanager CRD") + return fmt.Errorf("failed to make alertmanager CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", alertmanagerCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete alertmanager CRD") + return fmt.Errorf("failed to delete alertmanager CRD: %w", err) } podMonitorCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1.PodMonitorName)) if err != nil { - return errors.Wrap(err, "failed to make podMonitor CRD") + return fmt.Errorf("failed to make podMonitor CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", podMonitorCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete podMonitor CRD") + return fmt.Errorf("failed to delete podMonitor CRD: %w", err) } probeCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1.ProbeName)) if err != nil { - return errors.Wrap(err, "failed to make probe CRD") + return fmt.Errorf("failed to make probe CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", probeCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete probe CRD") + return fmt.Errorf("failed to delete probe CRD: %w", err) } prometheusCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1.PrometheusName)) if err != nil { - return errors.Wrap(err, "failed to make prometheus CRD") + return fmt.Errorf("failed to make prometheus CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", prometheusCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete prometheus CRD") + return fmt.Errorf("failed to delete prometheus CRD: %w", err) } prometheusRuleCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1.PrometheusRuleName)) if err != nil { - return errors.Wrap(err, "failed to make prometheusRule CRD") + return fmt.Errorf("failed to make prometheusRule CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", prometheusRuleCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete prometheusRule CRD") + return fmt.Errorf("failed to delete prometheusRule CRD: %w", err) } serviceMonitorCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1.ServiceMonitorName)) if err != nil { - return errors.Wrap(err, "failed to make serviceMonitor CRD") + return fmt.Errorf("failed to make serviceMonitor CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", serviceMonitorCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete serviceMonitor CRD") + return fmt.Errorf("failed to delete serviceMonitor CRD: %w", err) } thanosRulerCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1.ThanosRulerName)) if err != nil { - return errors.Wrap(err, "failed to make thanosRuler CRD") + return fmt.Errorf("failed to make thanosRuler CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", thanosRulerCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete thanosRuler CRD") + return fmt.Errorf("failed to delete thanosRuler CRD: %w", err) } alertmanagerConfigCRD, err := f.MakeCRD(fmt.Sprintf("%s/prometheus-operator-crd/%s_%s.yaml", f.exampleDir, group, monitoringv1alpha1.AlertmanagerConfigName)) if err != nil { - return errors.Wrap(err, "failed to make alertmanagerConfig CRD") + return fmt.Errorf("failed to make alertmanagerConfig CRD: %w", err) } err = f.DeleteCRD(ctx, fmt.Sprintf("%s.%s", alertmanagerConfigCRD.Name, group)) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete alertmanagerConfig CRD") + return fmt.Errorf("failed to delete alertmanagerConfig CRD: %w", err) } operatorMutatingHook, err := parseMutatingHookYaml(fmt.Sprintf("%s/prometheus-operator-mutatingwebhook.yaml", f.resourcesDir)) if err != nil { - return errors.Wrap(err, "failed to parse operator mutatingwebhook") + return fmt.Errorf("failed to parse operator mutatingwebhook: %w", err) } err = f.deleteMutatingWebhook(ctx, operatorMutatingHook.Name) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete operator mutatingwebhook") + return fmt.Errorf("failed to delete operator mutatingwebhook: %w", err) } operatorValidatingHook, err := parseValidatingHookYaml(fmt.Sprintf("%s/prometheus-operator-validatingwebhook.yaml", f.resourcesDir)) if err != nil { - return errors.Wrap(err, "failed to parse operator validatingwebhook") + return fmt.Errorf("failed to parse operator validatingwebhook: %w", err) } err = f.deleteValidatingWebhook(ctx, operatorValidatingHook.Name) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete operator mutatingwebhook") + return fmt.Errorf("failed to delete operator mutatingwebhook: %w", err) } AlertmanagerConfigValidatingHook, err := parseValidatingHookYaml(fmt.Sprintf("%s/alertmanager-config-validating-webhook.yaml", f.resourcesDir)) if err != nil { - return errors.Wrap(err, "failed to parse alertmanager config mutatingwebhook") + return fmt.Errorf("failed to parse alertmanager config mutatingwebhook: %w", err) } err = f.deleteValidatingWebhook(ctx, AlertmanagerConfigValidatingHook.Name) if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete alertmanager config mutatingwebhook") + return fmt.Errorf("failed to delete alertmanager config mutatingwebhook: %w", err) } return nil @@ -581,7 +628,7 @@ func (f *Framework) SetupPrometheusRBAC(ctx context.Context, t *testing.T, testC t.Fatalf("failed to create or update prometheus cluster role: %v", err) } if finalizerFn, err := f.createOrUpdateServiceAccount(ctx, ns, fmt.Sprintf("%s/rbac/prometheus/prometheus-service-account.yaml", f.exampleDir)); err != nil { - t.Fatal(errors.Wrap(err, "failed to create or update prometheus service account")) + t.Fatal(fmt.Errorf("failed to create or update prometheus service account: %w", err)) } else { if testCtx != nil { testCtx.AddFinalizerFn(finalizerFn) @@ -590,7 +637,7 @@ func (f *Framework) SetupPrometheusRBAC(ctx context.Context, t *testing.T, testC } if finalizerFn, err := f.CreateOrUpdateRoleBinding(ctx, ns, fmt.Sprintf("%s/prometheus-role-binding.yml", f.resourcesDir)); err != nil { - t.Fatal(errors.Wrap(err, "failed to create prometheus role binding")) + t.Fatal(fmt.Errorf("failed to create prometheus role binding: %w", err)) } else { if testCtx != nil { testCtx.AddFinalizerFn(finalizerFn) @@ -603,13 +650,13 @@ func (f *Framework) SetupPrometheusRBACGlobal(ctx context.Context, t *testing.T, t.Fatalf("failed to create or update prometheus cluster role: %v", err) } if finalizerFn, err := f.createOrUpdateServiceAccount(ctx, ns, "../../example/rbac/prometheus/prometheus-service-account.yaml"); err != nil { - t.Fatal(errors.Wrap(err, "failed to create or update prometheus service account")) + t.Fatal(fmt.Errorf("failed to create or update prometheus service account: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } if finalizerFn, err := f.createOrUpdateClusterRoleBinding(ctx, ns, "../../example/rbac/prometheus/prometheus-cluster-role-binding.yaml"); err != nil && !apierrors.IsAlreadyExists(err) { - t.Fatal(errors.Wrap(err, "failed to create or update prometheus cluster role binding")) + t.Fatal(fmt.Errorf("failed to create or update prometheus cluster role binding: %w", err)) } else { testCtx.AddFinalizerFn(finalizerFn) } @@ -698,11 +745,11 @@ func (f *Framework) CreateOrUpdateAdmissionWebhookServer( nil, ) if err != nil { - return nil, nil, errors.Wrap(err, "failed to generate certificate and key") + return nil, nil, fmt.Errorf("failed to generate certificate and key: %w", err) } if err := f.CreateOrUpdateSecretWithCert(ctx, certBytes, keyBytes, namespace, standaloneAdmissionHookSecretName); err != nil { - return nil, nil, errors.Wrap(err, "failed to create or update admission webhook secret") + return nil, nil, fmt.Errorf("failed to create or update admission webhook secret: %w", err) } deploy, err := MakeDeployment(fmt.Sprintf("%s/admission-webhook/deployment.yaml", f.exampleDir)) @@ -712,7 +759,7 @@ func (f *Framework) CreateOrUpdateAdmissionWebhookServer( // Deploy only 1 replica because the end-to-end environment (single node // cluster) can't satisfy the anti-affinity rules. - deploy.Spec.Replicas = func(i int32) *int32 { return &i }(1) + deploy.Spec.Replicas = ptr.To(int32(1)) deploy.Spec.Template.Spec.Affinity = nil deploy.Spec.Strategy = appsv1.DeploymentStrategy{} @@ -723,7 +770,7 @@ func (f *Framework) CreateOrUpdateAdmissionWebhookServer( deploy.Spec.Template.Spec.Containers[0].Image = image repoAndTag := strings.Split(image, ":") if len(repoAndTag) != 2 { - return nil, nil, errors.Errorf( + return nil, nil, fmt.Errorf( "expected image '%v' split by colon to result in two substrings but got '%v'", image, repoAndTag, @@ -743,12 +790,12 @@ func (f *Framework) CreateOrUpdateAdmissionWebhookServer( service, err := MakeService(fmt.Sprintf("%s/admission-webhook/service.yaml", f.exampleDir)) if err != nil { - return nil, nil, errors.Wrap(err, "cannot parse service file") + return nil, nil, fmt.Errorf("cannot parse service file: %w", err) } service.Namespace = namespace if _, err := f.CreateOrUpdateServiceAndWaitUntilReady(ctx, namespace, service); err != nil { - return nil, nil, errors.Wrap(err, "failed to create or update admission webhook server service") + return nil, nil, fmt.Errorf("failed to create or update admission webhook server service: %w", err) } return service, certBytes, nil diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheus.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheus.go index 22aa2a0ea..e0451bf17 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheus.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheus.go @@ -33,6 +33,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/utils/ptr" "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" @@ -226,8 +227,9 @@ func (f *Framework) MakeBasicServiceMonitor(name string) *monitoringv1.ServiceMo }, Endpoints: []monitoringv1.Endpoint{ { - Port: "web", - Interval: "30s", + Port: "web", + Interval: "30s", + BearerTokenSecret: &v1.SecretKeySelector{}, }, }, }, @@ -324,7 +326,7 @@ func (f *Framework) ScalePrometheusAndWaitUntilReady(ctx context.Context, name, ns, monitoringv1.PrometheusSpec{ CommonPrometheusFields: monitoringv1.CommonPrometheusFields{ - Replicas: func(i int32) *int32 { return &i }(replicas), + Replicas: ptr.To(int32(replicas)), }, }, ) @@ -350,7 +352,7 @@ func (f *Framework) PatchPrometheus(ctx context.Context, name, ns string, spec m types.ApplyPatchType, b, metav1.PatchOptions{ - Force: func(b bool) *bool { return &b }(true), + Force: ptr.To(true), FieldManager: "e2e-test", }, ) diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheusagent.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheusagent.go index 96682a5a0..a8fbbe81d 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheusagent.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/prometheusagent.go @@ -16,6 +16,7 @@ package framework import ( "context" + "encoding/json" "fmt" "time" @@ -23,11 +24,15 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/ptr" + "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" "github.com/prometheus-operator/prometheus-operator/pkg/operator" - "github.com/prometheus-operator/prometheus-operator/pkg/prometheus/agent" + prometheusagent "github.com/prometheus-operator/prometheus-operator/pkg/prometheus/agent" ) func (f *Framework) MakeBasicPrometheusAgent(ns, name, group string, replicas int32) *monitoringv1alpha1.PrometheusAgent { @@ -128,3 +133,35 @@ func (f *Framework) DeletePrometheusAgentAndWaitUntilGone(ctx context.Context, n return nil } + +func (f *Framework) PatchPrometheusAgent(ctx context.Context, name, ns string, spec monitoringv1alpha1.PrometheusAgentSpec) (*monitoringv1alpha1.PrometheusAgent, error) { + b, err := json.Marshal( + &monitoringv1alpha1.PrometheusAgent{ + TypeMeta: metav1.TypeMeta{ + Kind: monitoringv1alpha1.PrometheusAgentsKind, + APIVersion: schema.GroupVersion{Group: monitoring.GroupName, Version: monitoringv1alpha1.Version}.String(), + }, + Spec: spec, + }, + ) + if err != nil { + return nil, fmt.Errorf(err.Error(), "failed to marshal PrometheusAgent spec") + } + + p, err := f.MonClientV1alpha1.PrometheusAgents(ns).Patch( + ctx, + name, + types.ApplyPatchType, + b, + metav1.PatchOptions{ + Force: ptr.To(true), + FieldManager: "e2e-test", + }, + ) + + if err != nil { + return nil, err + } + + return p, nil +} diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/role_binding.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/role_binding.go index 27310bd67..1468a3030 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/role_binding.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/role_binding.go @@ -16,6 +16,7 @@ package framework import ( "context" + "fmt" rbacv1 "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -24,63 +25,40 @@ import ( ) func (f *Framework) CreateOrUpdateRoleBinding(ctx context.Context, ns string, relativePath string) (FinalizerFn, error) { - finalizerFn := func() error { return f.DeleteRoleBinding(ctx, ns, relativePath) } - roleBinding, err := f.parseRoleBindingYaml(relativePath) - if err != nil { - return finalizerFn, err - } - - _, err = f.KubeClient.RbacV1().RoleBindings(ns).Get(ctx, roleBinding.Name, metav1.GetOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - return finalizerFn, err - } - - if apierrors.IsNotFound(err) { - // RoleBinding doesn't exists -> Create - _, err = f.KubeClient.RbacV1().RoleBindings(ns).Create(ctx, roleBinding, metav1.CreateOptions{}) - if err != nil { - return finalizerFn, err - } - } else { - // RoleBinding already exists -> Update - _, err = f.KubeClient.RbacV1().RoleBindings(ns).Update(ctx, roleBinding, metav1.UpdateOptions{}) - if err != nil { - return finalizerFn, err - } - } - - return finalizerFn, err + return f.CreateOrUpdateRoleBindingForSubjectNamespace(ctx, ns, "", relativePath) } func (f *Framework) CreateOrUpdateRoleBindingForSubjectNamespace(ctx context.Context, ns, subjectNs string, source string) (FinalizerFn, error) { finalizerFn := func() error { return f.DeleteRoleBinding(ctx, ns, source) } - roleBinding, err := f.parseRoleBindingYaml(source) - for i := range roleBinding.Subjects { - roleBinding.Subjects[i].Namespace = subjectNs + roleBinding, err := f.parseRoleBindingYaml(source) + if err != nil { + return nil, fmt.Errorf("failed to parse role binding manifest: %w", err) } - if err != nil { - return finalizerFn, err + if subjectNs != "" { + for i := range roleBinding.Subjects { + roleBinding.Subjects[i].Namespace = subjectNs + } } _, err = f.KubeClient.RbacV1().RoleBindings(ns).Get(ctx, roleBinding.Name, metav1.GetOptions{}) if err != nil && !apierrors.IsNotFound(err) { - return finalizerFn, err + return nil, fmt.Errorf("failed to get role binding: %w", err) } if apierrors.IsNotFound(err) { - // RoleBinding already exists -> Update - _, err = f.KubeClient.RbacV1().RoleBindings(ns).Update(ctx, roleBinding, metav1.UpdateOptions{}) - if err != nil { - return finalizerFn, err - } - } else { - // RoleBinding doesn't exists -> Create _, err = f.KubeClient.RbacV1().RoleBindings(ns).Create(ctx, roleBinding, metav1.CreateOptions{}) if err != nil { - return finalizerFn, err + return nil, fmt.Errorf("failed to create role binding: %w", err) } + + return finalizerFn, nil + } + + _, err = f.KubeClient.RbacV1().RoleBindings(ns).Update(ctx, roleBinding, metav1.UpdateOptions{}) + if err != nil { + return nil, fmt.Errorf("failed to update role binding: %w", err) } return finalizerFn, nil diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/status.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/status.go index e13425f26..4994f9ae4 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/status.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/status.go @@ -16,6 +16,7 @@ package framework import ( "context" + "fmt" "time" "github.com/pkg/errors" @@ -31,11 +32,27 @@ type resourceStatus struct { conditions []monitoringv1.Condition } +func (f *Framework) AssertCondition(conds []monitoringv1.Condition, expectedType monitoringv1.ConditionType, expectedStatus monitoringv1.ConditionStatus) error { + for _, c := range conds { + if c.Type != expectedType { + continue + } + + if c.Status != expectedStatus { + return fmt.Errorf("expected condition %q to be %q but got %q", c.Type, expectedStatus, c.Status) + } + + return nil + } + + return fmt.Errorf("condition %q not found", expectedType) +} + // WaitForResourceAvailable waits for a monitoring resource to report itself as being reconciled & available. // If the resource isn't available within the given timeout, it returns an error. func (f *Framework) WaitForResourceAvailable(ctx context.Context, getResourceStatus func(context.Context) (resourceStatus, error), timeout time.Duration) error { var pollErr error - if err := wait.PollUntilContextTimeout(ctx, time.Second, timeout, false, func(ctx context.Context) (bool, error) { + if err := wait.PollUntilContextTimeout(ctx, 5*time.Second, timeout, false, func(ctx context.Context) (bool, error) { var status resourceStatus status, pollErr = getResourceStatus(ctx) if pollErr != nil { diff --git a/otelcollector/otel-allocator/prometheus-operator/test/framework/thanosruler.go b/otelcollector/otel-allocator/prometheus-operator/test/framework/thanosruler.go index 3a9d2d6a9..d7defb96f 100644 --- a/otelcollector/otel-allocator/prometheus-operator/test/framework/thanosruler.go +++ b/otelcollector/otel-allocator/prometheus-operator/test/framework/thanosruler.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/utils/ptr" "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" @@ -94,7 +95,7 @@ func (f *Framework) PatchThanosRuler(ctx context.Context, name, ns string, spec types.ApplyPatchType, b, metav1.PatchOptions{ - Force: func(b bool) *bool { return &b }(true), + Force: ptr.To(true), FieldManager: "e2e-test", }, ) From 6da0fe5b68cf6aa3534aab0008bf22847a786eaa Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 15:12:54 -0800 Subject: [PATCH 02/21] upgrade ta-0.90.0 --- otelcollector/otel-allocator/Dockerfile | 2 +- otelcollector/otel-allocator/README.md | 37 +- .../allocation/allocatortest.go | 15 +- .../allocation/consistent_hashing.go | 5 +- .../allocation/consistent_hashing_test.go | 41 +- .../allocation/least_weighted.go | 50 ++- .../allocation/least_weighted_test.go | 48 +++ otelcollector/otel-allocator/config/config.go | 125 +++--- .../otel-allocator/config/config_test.go | 34 +- otelcollector/otel-allocator/config/flags.go | 70 ++++ .../otel-allocator/config/flags_test.go | 97 +++++ otelcollector/otel-allocator/go.mod | 153 ++++---- otelcollector/otel-allocator/go.sum | 357 +++++++++--------- otelcollector/otel-allocator/main.go | 101 ++--- .../.vs/prometheus-operator/v16/.suo | Bin 0 -> 7168 bytes .../prometheus-operator/.vs/slnx.sqlite | Bin 0 -> 122880 bytes .../otel-allocator/server/bench_test.go | 2 +- otelcollector/otel-allocator/server/server.go | 22 +- .../otel-allocator/server/server_test.go | 82 +++- .../otel-allocator/target/discovery.go | 30 +- .../otel-allocator/target/discovery_test.go | 76 ++-- otelcollector/otel-allocator/watcher/file.go | 10 +- .../otel-allocator/watcher/promOperator.go | 81 +++- .../watcher/promOperator_test.go | 86 ++++- 24 files changed, 1052 insertions(+), 472 deletions(-) create mode 100644 otelcollector/otel-allocator/config/flags.go create mode 100644 otelcollector/otel-allocator/config/flags_test.go create mode 100644 otelcollector/otel-allocator/prometheus-operator/.vs/prometheus-operator/v16/.suo create mode 100644 otelcollector/otel-allocator/prometheus-operator/.vs/slnx.sqlite diff --git a/otelcollector/otel-allocator/Dockerfile b/otelcollector/otel-allocator/Dockerfile index 72c453b0e..8b76d4dfa 100644 --- a/otelcollector/otel-allocator/Dockerfile +++ b/otelcollector/otel-allocator/Dockerfile @@ -1,5 +1,5 @@ # Build the otel-allocator binary -FROM mcr.microsoft.com/oss/go/microsoft/golang:1.20 as builder +FROM mcr.microsoft.com/oss/go/microsoft/golang:1.21 as builder WORKDIR /app # Copy prometheus-operator repo files diff --git a/otelcollector/otel-allocator/README.md b/otelcollector/otel-allocator/README.md index a5014811b..0f4419e8e 100644 --- a/otelcollector/otel-allocator/README.md +++ b/otelcollector/otel-allocator/README.md @@ -11,11 +11,44 @@ The TA serves two functions: ## Even Distribution of Prometheus Targets -The Target Allocator's first job is to discover targets to scrape and collectors to allocate targets to. Then it can distribute the targets it discovers among the collectors. This means that the OTel Collectors collect the metrics instead of a Prometheus [scraper](https://uzxmx.github.io/prometheus-scrape-internals.html). Metrics are ingested by the OTel Collectors by way of the [Prometheus Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/prometheusreceiver/README.md). +The Target Allocator’s first job is to discover targets to scrape and OTel Collectors to allocate targets to. Then it can distribute the targets it discovers among the Collectors. The Collectors in turn query the Target Allocator for Metrics endpoints to scrape, and then the Collectors’ [Prometheus Receivers](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/prometheusreceiver/README.md) scrape the Metrics targets. + +This means that the OTel Collectors collect the metrics instead of a Prometheus [scraper](https://uzxmx.github.io/prometheus-scrape-internals.html). + + +```mermaid +sequenceDiagram + participant Target Allocator + participant Metrics Targets + participant OTel Collectors + Target Allocator ->>Metrics Targets: 1. Discover Metrics targets + Target Allocator ->>OTel Collectors: 2. Discover available Collectors + Target Allocator ->>Target Allocator: 3. Assign Metrics targets + OTel Collectors ->>Target Allocator: 4. Query TA for Metrics endpoints scrape + OTel Collectors ->>Metrics Targets: 5. Scrape Metrics target +``` ## Discovery of Prometheus Custom Resources -The Target Allocator also provides for the discovery of [Prometheus Operator CRs](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md), namely the [ServiceMonitor and PodMonitor](https://github.com/open-telemetry/opentelemetry-operator/tree/main/cmd/otel-allocator#target-allocator). The ServiceMonitor and the PodMonitor don’t do any scraping themselves; their purpose is to inform the Target Allocator (or Prometheus) to add a new job to their scrape configuration. These metrics are then ingested by way of the Prometheus Receiver on the OpenTelemetry Collector. +The Target Allocator also provides for the discovery of [Prometheus Operator CRs](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md), namely the [ServiceMonitor and PodMonitor](https://github.com/open-telemetry/opentelemetry-operator/tree/main/cmd/otel-allocator#target-allocator). The ServiceMonitors and the PodMonitors purpose is to inform the Target Allocator (or PrometheusOperator) to add a new job to their scrape configuration. The Target Allocator then provides the jobs to the OTel Collector [Prometheus Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/prometheusreceiver/README.md). + +```mermaid +flowchart RL + pm(PodMonitor) + sm(ServiceMonitor) + ta(Target Allocator) + oc1(OTel Collector) + oc2(OTel Collector) + oc3(OTel Collector) + ta --> pm + ta --> sm + oc1 --> ta + oc2 --> ta + oc3 --> ta + sm ~~~|"1. Discover Prometheus Operator CRs"| sm + ta ~~~|"2. Add job to TA scrape configuration"| ta + oc3 ~~~|"3. Add job to OTel Collector scrape configuration"| oc3 +``` Even though Prometheus is not required to be installed in your Kubernetes cluster to use the Target Allocator for Prometheus CR discovery, the TA does require that the ServiceMonitor and PodMonitor be installed. These CRs are bundled with Prometheus Operator; however, they can be installed standalone as well. diff --git a/otelcollector/otel-allocator/allocation/allocatortest.go b/otelcollector/otel-allocator/allocation/allocatortest.go index 0cc4ccc41..88312a80a 100644 --- a/otelcollector/otel-allocator/allocation/allocatortest.go +++ b/otelcollector/otel-allocator/allocation/allocatortest.go @@ -39,7 +39,7 @@ func MakeNNewTargets(n int, numCollectors int, startingIndex int) map[string]*ta "i": model.LabelValue(strconv.Itoa(i)), "total": model.LabelValue(strconv.Itoa(n + startingIndex)), } - newTarget := target.NewItem(fmt.Sprintf("test-job-%d", i), "test-url", label, collector) + newTarget := target.NewItem(fmt.Sprintf("test-job-%d", i), fmt.Sprintf("test-url-%d", i), label, collector) toReturn[newTarget.Hash()] = newTarget } return toReturn @@ -56,3 +56,16 @@ func MakeNCollectors(n int, startingIndex int) map[string]*Collector { } return toReturn } + +func MakeNNewTargetsWithEmptyCollectors(n int, startingIndex int) map[string]*target.Item { + toReturn := map[string]*target.Item{} + for i := startingIndex; i < n+startingIndex; i++ { + label := model.LabelSet{ + "i": model.LabelValue(strconv.Itoa(i)), + "total": model.LabelValue(strconv.Itoa(n + startingIndex)), + } + newTarget := target.NewItem(fmt.Sprintf("test-job-%d", i), fmt.Sprintf("test-url-%d", i), label, "") + toReturn[newTarget.Hash()] = newTarget + } + return toReturn +} diff --git a/otelcollector/otel-allocator/allocation/consistent_hashing.go b/otelcollector/otel-allocator/allocation/consistent_hashing.go index cec3312ae..d98aca72f 100644 --- a/otelcollector/otel-allocator/allocation/consistent_hashing.go +++ b/otelcollector/otel-allocator/allocation/consistent_hashing.go @@ -15,6 +15,7 @@ package allocation import ( + "strings" "sync" "github.com/buraksezer/consistent" @@ -111,7 +112,7 @@ func (c *consistentHashingAllocator) addTargetToTargetItems(tg *target.Item) { delete(c.targetItemsPerJobPerCollector[tg.CollectorName][tg.JobName], tg.Hash()) TargetsPerCollector.WithLabelValues(previousColName.String(), consistentHashingStrategyName).Set(float64(c.collectors[previousColName.String()].NumTargets)) } - colOwner := c.consistentHasher.LocateKey([]byte(tg.Hash())) + colOwner := c.consistentHasher.LocateKey([]byte(strings.Join(tg.TargetURL, ""))) tg.CollectorName = colOwner.String() c.targetItems[tg.Hash()] = tg c.addCollectorTargetItemMapping(tg) @@ -214,7 +215,7 @@ func (c *consistentHashingAllocator) SetTargets(targets map[string]*target.Item) // Check for deletions if len(targetsDiffEmptyCollectorSet.Removals()) > 0 { c.log.Info("Targets removed, Removing targets from the targetItems set") - for k, _ := range targetsDiffEmptyCollectorSet.Removals() { + for k := range targetsDiffEmptyCollectorSet.Removals() { // Delete item from target items delete(c.targetItems, k) } diff --git a/otelcollector/otel-allocator/allocation/consistent_hashing_test.go b/otelcollector/otel-allocator/allocation/consistent_hashing_test.go index 7fcbf8891..bbd429520 100644 --- a/otelcollector/otel-allocator/allocation/consistent_hashing_test.go +++ b/otelcollector/otel-allocator/allocation/consistent_hashing_test.go @@ -28,7 +28,7 @@ func TestCanSetSingleTarget(t *testing.T) { actualTargetItems := c.TargetItems() assert.Len(t, actualTargetItems, 1) for _, item := range actualTargetItems { - assert.Equal(t, "collector-2", item.CollectorName) + assert.Equal(t, "collector-0", item.CollectorName) } } @@ -103,3 +103,42 @@ func TestNumRemapped(t *testing.T) { } assert.InDelta(t, numItems/numFinalCols, countRemapped, expectedDelta) } + +func TestTargetsWithNoCollectorsConsistentHashing(t *testing.T) { + + c := newConsistentHashingAllocator(logger) + + // Adding 10 new targets + numItems := 10 + c.SetTargets(MakeNNewTargetsWithEmptyCollectors(numItems, 0)) + actualTargetItems := c.TargetItems() + assert.Len(t, actualTargetItems, numItems) + + // Adding 5 new targets, and removing the old 10 targets + numItemsUpdate := 5 + c.SetTargets(MakeNNewTargetsWithEmptyCollectors(numItemsUpdate, 10)) + actualTargetItemsUpdated := c.TargetItems() + assert.Len(t, actualTargetItemsUpdated, numItemsUpdate) + + // Adding 5 new targets, and one existing target + numItemsUpdate = 6 + c.SetTargets(MakeNNewTargetsWithEmptyCollectors(numItemsUpdate, 14)) + actualTargetItemsUpdated = c.TargetItems() + assert.Len(t, actualTargetItemsUpdated, numItemsUpdate) + + // Adding collectors to test allocation + numCols := 2 + cols := MakeNCollectors(2, 0) + c.SetCollectors(cols) + var expectedPerCollector = float64(numItemsUpdate / numCols) + expectedDelta := (expectedPerCollector * 1.5) - expectedPerCollector + // Checking to see that there is no change to number of targets + actualTargetItems = c.TargetItems() + assert.Len(t, actualTargetItems, numItemsUpdate) + // Checking to see collectors are added correctly + actualCollectors := c.Collectors() + assert.Len(t, actualCollectors, numCols) + for _, col := range actualCollectors { + assert.InDelta(t, col.NumTargets, expectedPerCollector, expectedDelta) + } +} diff --git a/otelcollector/otel-allocator/allocation/least_weighted.go b/otelcollector/otel-allocator/allocation/least_weighted.go index 012d9bbfa..6ae9c5eb2 100644 --- a/otelcollector/otel-allocator/allocation/least_weighted.go +++ b/otelcollector/otel-allocator/allocation/least_weighted.go @@ -29,9 +29,9 @@ var _ Allocator = &leastWeightedAllocator{} const leastWeightedStrategyName = "least-weighted" /* - Load balancer will serve on an HTTP server exposing /jobs//targets + Target Allocator will serve on an HTTP server exposing /jobs//targets The targets are allocated using the least connection method - Load balancer will need information about the collectors in order to set the URLs + Target Allocator will need information about the collectors in order to set the URLs Keep a Map of what each collector currently holds and update it based on new scrape target updates */ @@ -183,10 +183,21 @@ func (allocator *leastWeightedAllocator) handleCollectors(diff diff.Changes[*Col delete(allocator.targetItemsPerJobPerCollector, k.Name) TargetsPerCollector.WithLabelValues(k.Name, leastWeightedStrategyName).Set(0) } + + // If previously there were no collector instances present, allocate the previous set of saved targets to the new collectors + allocateTargets := false + if len(allocator.collectors) == 0 && len(allocator.targetItems) > 0 { + allocateTargets = true + } // Insert the new collectors for _, i := range diff.Additions() { allocator.collectors[i.Name] = NewCollector(i.Name) } + if allocateTargets { + for _, item := range allocator.targetItems { + allocator.addTargetToTargetItems(item) + } + } // Re-Allocate targets of the removed collectors for _, item := range allocator.targetItems { @@ -212,7 +223,40 @@ func (allocator *leastWeightedAllocator) SetTargets(targets map[string]*target.I defer allocator.m.Unlock() if len(allocator.collectors) == 0 { - allocator.log.Info("No collector instances present, cannot set targets") + allocator.log.Info("No collector instances present, saving targets to allocate to collector(s)") + // If there were no targets discovered previously, assign this as the new set of target items + if len(allocator.targetItems) == 0 { + allocator.log.Info("Not discovered any targets previously, saving targets found to the targetItems set") + for k, item := range targets { + allocator.targetItems[k] = item + } + } else { + // If there were previously discovered targets, add or remove accordingly + targetsDiffEmptyCollectorSet := diff.Maps(allocator.targetItems, targets) + + // Check for additions + if len(targetsDiffEmptyCollectorSet.Additions()) > 0 { + allocator.log.Info("New targets discovered, adding new targets to the targetItems set") + for k, item := range targetsDiffEmptyCollectorSet.Additions() { + // Do nothing if the item is already there + if _, ok := allocator.targetItems[k]; ok { + continue + } else { + // Add item to item pool + allocator.targetItems[k] = item + } + } + } + + // Check for deletions + if len(targetsDiffEmptyCollectorSet.Removals()) > 0 { + allocator.log.Info("Targets removed, Removing targets from the targetItems set") + for k := range targetsDiffEmptyCollectorSet.Removals() { + // Delete item from target items + delete(allocator.targetItems, k) + } + } + } return } // Check for target changes diff --git a/otelcollector/otel-allocator/allocation/least_weighted_test.go b/otelcollector/otel-allocator/allocation/least_weighted_test.go index 90df0b39b..417c0e5ed 100644 --- a/otelcollector/otel-allocator/allocation/least_weighted_test.go +++ b/otelcollector/otel-allocator/allocation/least_weighted_test.go @@ -256,3 +256,51 @@ func TestCollectorBalanceWhenAddingAndRemovingAtRandom(t *testing.T) { assert.InDelta(t, i.NumTargets, count, math.Round(percent)) } } + +func TestTargetsWithNoCollectorsLeastWeighted(t *testing.T) { + s, _ := New("least-weighted", logger) + + // Adding 10 new targets + numItems := 10 + initTargets := MakeNNewTargetsWithEmptyCollectors(numItems, 0) + s.SetTargets(initTargets) + actualTargetItems := s.TargetItems() + assert.Len(t, actualTargetItems, numItems) + + // Adding 5 new targets, and removing the old 10 targets + numItemsUpdate := 5 + newTargets := MakeNNewTargetsWithEmptyCollectors(numItemsUpdate, 10) + s.SetTargets(newTargets) + actualTargetItems = s.TargetItems() + assert.Len(t, actualTargetItems, numItemsUpdate) + + // Adding 5 new targets, and one existing target + numItemsUpdate = 6 + newTargets = MakeNNewTargetsWithEmptyCollectors(numItemsUpdate, 14) + s.SetTargets(newTargets) + actualTargetItems = s.TargetItems() + assert.Len(t, actualTargetItems, numItemsUpdate) + + // Adding collectors to test allocation + numCols := 2 + cols := MakeNCollectors(2, 0) + s.SetCollectors(cols) + + // Checking to see that there is no change to number of targets + actualTargetItems = s.TargetItems() + assert.Len(t, actualTargetItems, numItemsUpdate) + // Checking to see collectors are added correctly + actualCollectors := s.Collectors() + assert.Len(t, actualCollectors, numCols) + + // Divisor needed to get 15% + divisor := 6.7 + targetItemLen := len(actualTargetItems) + count := targetItemLen / len(actualCollectors) + percent := float64(targetItemLen) / divisor + + // Check to see targets are allocated with the expected delta + for _, i := range actualCollectors { + assert.InDelta(t, i.NumTargets, count, math.Round(percent)) + } +} diff --git a/otelcollector/otel-allocator/config/config.go b/otelcollector/otel-allocator/config/config.go index 4828722bc..386b0edd2 100644 --- a/otelcollector/otel-allocator/config/config.go +++ b/otelcollector/otel-allocator/config/config.go @@ -16,11 +16,9 @@ package config import ( "errors" - "flag" "fmt" "io/fs" "os" - "path/filepath" "time" "github.com/go-logr/logr" @@ -31,7 +29,6 @@ import ( "gopkg.in/yaml.v2" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/util/homedir" "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/log/zap" @@ -42,8 +39,13 @@ const DefaultConfigFilePath string = "/conf/targetallocator.yaml" const DefaultCRScrapeInterval model.Duration = model.Duration(time.Second * 30) type Config struct { + ListenAddr string `yaml:"listen_addr,omitempty"` + KubeConfigFilePath string `yaml:"kube_config_file_path,omitempty"` + ClusterConfig *rest.Config `yaml:"-"` + RootLogger logr.Logger `yaml:"-"` + ReloadConfig bool `yaml:"-"` LabelSelector map[string]string `yaml:"label_selector,omitempty"` - Config *promconfig.Config `yaml:"config"` + PromConfig *promconfig.Config `yaml:"config"` AllocationStrategy *string `yaml:"allocation_strategy,omitempty"` FilterStrategy *string `yaml:"filter_strategy,omitempty"` PrometheusCR PrometheusCRConfig `yaml:"prometheus_cr,omitempty"` @@ -52,6 +54,7 @@ type Config struct { } type PrometheusCRConfig struct { + Enabled bool `yaml:"enabled,omitempty"` ScrapeInterval model.Duration `yaml:"scrape_interval,omitempty"` } @@ -69,26 +72,51 @@ func (c Config) GetTargetsFilterStrategy() string { return "" } -type PrometheusCRWatcherConfig struct { - Enabled *bool +func LoadFromFile(file string, target *Config) error { + return unmarshal(target, file) } -type CLIConfig struct { - ListenAddr *string - ConfigFilePath *string - ClusterConfig *rest.Config - // KubeConfigFilePath empty if in cluster configuration is in use - KubeConfigFilePath string - RootLogger logr.Logger - PromCRWatcherConf PrometheusCRWatcherConfig -} +func LoadFromCLI(target *Config, flagSet *pflag.FlagSet) error { + var err error + // set the rest of the config attributes based on command-line flag values + target.RootLogger = zap.New(zap.UseFlagOptions(&zapCmdLineOpts)) + klog.SetLogger(target.RootLogger) + ctrl.SetLogger(target.RootLogger) + + target.KubeConfigFilePath, err = getKubeConfigFilePath(flagSet) + if err != nil { + return err + } + clusterConfig, err := clientcmd.BuildConfigFromFlags("", target.KubeConfigFilePath) + if err != nil { + pathError := &fs.PathError{} + if ok := errors.As(err, &pathError); !ok { + return err + } + clusterConfig, err = rest.InClusterConfig() + if err != nil { + return err + } + target.KubeConfigFilePath = "" + } + target.ClusterConfig = clusterConfig + + target.ListenAddr, err = getListenAddr(flagSet) + if err != nil { + return err + } + + target.PrometheusCR.Enabled, err = getPrometheusCREnabled(flagSet) + if err != nil { + return err + } -func Load(file string) (Config, error) { - cfg := createDefaultConfig() - if err := unmarshal(&cfg, file); err != nil { - return Config{}, err + target.ReloadConfig, err = getConfigReloadEnabled(flagSet) + if err != nil { + return err } - return cfg, nil + + return nil } func unmarshal(cfg *Config, configFile string) error { @@ -103,7 +131,7 @@ func unmarshal(cfg *Config, configFile string) error { return nil } -func createDefaultConfig() Config { +func CreateDefaultConfig() Config { return Config{ PrometheusCR: PrometheusCRConfig{ ScrapeInterval: DefaultCRScrapeInterval, @@ -111,44 +139,39 @@ func createDefaultConfig() Config { } } -func ParseCLI() (CLIConfig, error) { - opts := zap.Options{} - opts.BindFlags(flag.CommandLine) - cLIConf := CLIConfig{ - ListenAddr: pflag.String("listen-addr", ":8080", "The address where this service serves."), - ConfigFilePath: pflag.String("config-file", DefaultConfigFilePath, "The path to the config file."), - PromCRWatcherConf: PrometheusCRWatcherConfig{ - Enabled: pflag.Bool("enable-prometheus-cr-watcher", false, "Enable Prometheus CRs as target sources"), - }, +func Load() (*Config, string, error) { + var err error + + flagSet := getFlagSet(pflag.ExitOnError) + err = flagSet.Parse(os.Args) + if err != nil { + return nil, "", err } - kubeconfigPath := pflag.String("kubeconfig-path", filepath.Join(homedir.HomeDir(), ".kube", "config"), "absolute path to the KubeconfigPath file") - pflag.Parse() - cLIConf.RootLogger = zap.New(zap.UseFlagOptions(&opts)) - klog.SetLogger(cLIConf.RootLogger) - ctrl.SetLogger(cLIConf.RootLogger) + config := CreateDefaultConfig() - clusterConfig, err := clientcmd.BuildConfigFromFlags("", *kubeconfigPath) - cLIConf.KubeConfigFilePath = *kubeconfigPath + // load the config from the config file + configFilePath, err := getConfigFilePath(flagSet) if err != nil { - pathError := &fs.PathError{} - if ok := errors.As(err, &pathError); !ok { - return CLIConfig{}, err - } - clusterConfig, err = rest.InClusterConfig() - if err != nil { - return CLIConfig{}, err - } - cLIConf.KubeConfigFilePath = "" // reset as we use in cluster configuration + return nil, "", err + } + err = LoadFromFile(configFilePath, &config) + if err != nil { + return nil, "", err } - cLIConf.ClusterConfig = clusterConfig - return cLIConf, nil + + err = LoadFromCLI(&config, flagSet) + if err != nil { + return nil, "", err + } + + return &config, configFilePath, nil } // ValidateConfig validates the cli and file configs together. -func ValidateConfig(config *Config, cliConfig *CLIConfig) error { - scrapeConfigsPresent := (config.Config != nil && len(config.Config.ScrapeConfigs) > 0) - if !(*cliConfig.PromCRWatcherConf.Enabled || scrapeConfigsPresent) { +func ValidateConfig(config *Config) error { + scrapeConfigsPresent := (config.PromConfig != nil && len(config.PromConfig.ScrapeConfigs) > 0) + if !(config.PrometheusCR.Enabled || scrapeConfigsPresent) { return fmt.Errorf("at least one scrape config must be defined, or Prometheus CR watching must be enabled") } return nil diff --git a/otelcollector/otel-allocator/config/config_test.go b/otelcollector/otel-allocator/config/config_test.go index 91f0d63b7..89f6307d8 100644 --- a/otelcollector/otel-allocator/config/config_test.go +++ b/otelcollector/otel-allocator/config/config_test.go @@ -51,7 +51,7 @@ func TestLoad(t *testing.T) { PrometheusCR: PrometheusCRConfig{ ScrapeInterval: model.Duration(time.Second * 60), }, - Config: &promconfig.Config{ + PromConfig: &promconfig.Config{ GlobalConfig: promconfig.GlobalConfig{ ScrapeInterval: model.Duration(60 * time.Second), ScrapeTimeout: model.Duration(10 * time.Second), @@ -99,7 +99,7 @@ func TestLoad(t *testing.T) { args: args{ file: "./testdata/no_config.yaml", }, - want: createDefaultConfig(), + want: CreateDefaultConfig(), wantErr: assert.NoError, }, { @@ -115,7 +115,7 @@ func TestLoad(t *testing.T) { PrometheusCR: PrometheusCRConfig{ ScrapeInterval: DefaultCRScrapeInterval, }, - Config: &promconfig.Config{ + PromConfig: &promconfig.Config{ GlobalConfig: promconfig.GlobalConfig{ ScrapeInterval: model.Duration(60 * time.Second), ScrapeTimeout: model.Duration(10 * time.Second), @@ -163,7 +163,8 @@ func TestLoad(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Load(tt.args.file) + got := CreateDefaultConfig() + err := LoadFromFile(tt.args.file, &got) if !tt.wantErr(t, err, fmt.Sprintf("Load(%v)", tt.args.file)) { return } @@ -173,45 +174,38 @@ func TestLoad(t *testing.T) { } func TestValidateConfig(t *testing.T) { - enabled := true - disabled := false testCases := []struct { name string - cliConfig CLIConfig fileConfig Config expectedErr error }{ { name: "promCR enabled, no Prometheus config", - cliConfig: CLIConfig{PromCRWatcherConf: PrometheusCRWatcherConfig{Enabled: &enabled}}, - fileConfig: Config{Config: nil}, + fileConfig: Config{PromConfig: nil, PrometheusCR: PrometheusCRConfig{Enabled: true}}, expectedErr: nil, }, { name: "promCR disabled, no Prometheus config", - cliConfig: CLIConfig{PromCRWatcherConf: PrometheusCRWatcherConfig{Enabled: &disabled}}, - fileConfig: Config{Config: nil}, + fileConfig: Config{PromConfig: nil}, expectedErr: fmt.Errorf("at least one scrape config must be defined, or Prometheus CR watching must be enabled"), }, { name: "promCR disabled, Prometheus config present, no scrapeConfigs", - cliConfig: CLIConfig{PromCRWatcherConf: PrometheusCRWatcherConfig{Enabled: &disabled}}, - fileConfig: Config{Config: &promconfig.Config{}}, + fileConfig: Config{PromConfig: &promconfig.Config{}}, expectedErr: fmt.Errorf("at least one scrape config must be defined, or Prometheus CR watching must be enabled"), }, { - name: "promCR disabled, Prometheus config present, scrapeConfigs present", - cliConfig: CLIConfig{PromCRWatcherConf: PrometheusCRWatcherConfig{Enabled: &disabled}}, + name: "promCR disabled, Prometheus config present, scrapeConfigs present", fileConfig: Config{ - Config: &promconfig.Config{ScrapeConfigs: []*promconfig.ScrapeConfig{{}}}, + PromConfig: &promconfig.Config{ScrapeConfigs: []*promconfig.ScrapeConfig{{}}}, }, expectedErr: nil, }, { - name: "promCR enabled, Prometheus config present, scrapeConfigs present", - cliConfig: CLIConfig{PromCRWatcherConf: PrometheusCRWatcherConfig{Enabled: &enabled}}, + name: "promCR enabled, Prometheus config present, scrapeConfigs present", fileConfig: Config{ - Config: &promconfig.Config{ScrapeConfigs: []*promconfig.ScrapeConfig{{}}}, + PromConfig: &promconfig.Config{ScrapeConfigs: []*promconfig.ScrapeConfig{{}}}, + PrometheusCR: PrometheusCRConfig{Enabled: true}, }, expectedErr: nil, }, @@ -219,7 +213,7 @@ func TestValidateConfig(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - err := ValidateConfig(&tc.fileConfig, &tc.cliConfig) + err := ValidateConfig(&tc.fileConfig) assert.Equal(t, tc.expectedErr, err) }) } diff --git a/otelcollector/otel-allocator/config/flags.go b/otelcollector/otel-allocator/config/flags.go new file mode 100644 index 000000000..152dbc803 --- /dev/null +++ b/otelcollector/otel-allocator/config/flags.go @@ -0,0 +1,70 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "flag" + "path/filepath" + + "github.com/spf13/pflag" + "k8s.io/client-go/util/homedir" + "sigs.k8s.io/controller-runtime/pkg/log/zap" +) + +// Flag names. +const ( + targetAllocatorName = "target-allocator" + configFilePathFlagName = "config-file" + listenAddrFlagName = "listen-addr" + prometheusCREnabledFlagName = "enable-prometheus-cr-watcher" + kubeConfigPathFlagName = "kubeconfig-path" + reloadConfigFlagName = "reload-config" +) + +// We can't bind this flag to our FlagSet, so we need to handle it separately. +var zapCmdLineOpts zap.Options + +func getFlagSet(errorHandling pflag.ErrorHandling) *pflag.FlagSet { + flagSet := pflag.NewFlagSet(targetAllocatorName, errorHandling) + flagSet.String(configFilePathFlagName, DefaultConfigFilePath, "The path to the config file.") + flagSet.String(listenAddrFlagName, ":8080", "The address where this service serves.") + flagSet.Bool(prometheusCREnabledFlagName, false, "Enable Prometheus CRs as target sources") + flagSet.String(kubeConfigPathFlagName, filepath.Join(homedir.HomeDir(), ".kube", "config"), "absolute path to the KubeconfigPath file") + flagSet.Bool(reloadConfigFlagName, false, "Enable automatic configuration reloading. This functionality is deprecated and will be removed in a future release.") + zapFlagSet := flag.NewFlagSet("", flag.ErrorHandling(errorHandling)) + zapCmdLineOpts.BindFlags(zapFlagSet) + flagSet.AddGoFlagSet(zapFlagSet) + return flagSet +} + +func getConfigFilePath(flagSet *pflag.FlagSet) (string, error) { + return flagSet.GetString(configFilePathFlagName) +} + +func getKubeConfigFilePath(flagSet *pflag.FlagSet) (string, error) { + return flagSet.GetString(kubeConfigPathFlagName) +} + +func getListenAddr(flagSet *pflag.FlagSet) (string, error) { + return flagSet.GetString(listenAddrFlagName) +} + +func getPrometheusCREnabled(flagSet *pflag.FlagSet) (bool, error) { + return flagSet.GetBool(prometheusCREnabledFlagName) +} + +func getConfigReloadEnabled(flagSet *pflag.FlagSet) (bool, error) { + return flagSet.GetBool(reloadConfigFlagName) +} diff --git a/otelcollector/otel-allocator/config/flags_test.go b/otelcollector/otel-allocator/config/flags_test.go new file mode 100644 index 000000000..9d50212a2 --- /dev/null +++ b/otelcollector/otel-allocator/config/flags_test.go @@ -0,0 +1,97 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "path/filepath" + "testing" + + "github.com/spf13/pflag" + "github.com/stretchr/testify/assert" +) + +func TestGetFlagSet(t *testing.T) { + fs := getFlagSet(pflag.ExitOnError) + + // Check if each flag exists + assert.NotNil(t, fs.Lookup(configFilePathFlagName), "Flag %s not found", configFilePathFlagName) + assert.NotNil(t, fs.Lookup(listenAddrFlagName), "Flag %s not found", listenAddrFlagName) + assert.NotNil(t, fs.Lookup(prometheusCREnabledFlagName), "Flag %s not found", prometheusCREnabledFlagName) + assert.NotNil(t, fs.Lookup(kubeConfigPathFlagName), "Flag %s not found", kubeConfigPathFlagName) +} + +func TestFlagGetters(t *testing.T) { + tests := []struct { + name string + flagArgs []string + expectedValue interface{} + expectedErr bool + getterFunc func(*pflag.FlagSet) (interface{}, error) + }{ + { + name: "GetConfigFilePath", + flagArgs: []string{"--" + configFilePathFlagName, "/path/to/config"}, + expectedValue: "/path/to/config", + getterFunc: func(fs *pflag.FlagSet) (interface{}, error) { return getConfigFilePath(fs) }, + }, + { + name: "GetKubeConfigFilePath", + flagArgs: []string{"--" + kubeConfigPathFlagName, filepath.Join("~", ".kube", "config")}, + expectedValue: filepath.Join("~", ".kube", "config"), + getterFunc: func(fs *pflag.FlagSet) (interface{}, error) { return getKubeConfigFilePath(fs) }, + }, + { + name: "GetListenAddr", + flagArgs: []string{"--" + listenAddrFlagName, ":8081"}, + expectedValue: ":8081", + getterFunc: func(fs *pflag.FlagSet) (interface{}, error) { return getListenAddr(fs) }, + }, + { + name: "GetPrometheusCREnabled", + flagArgs: []string{"--" + prometheusCREnabledFlagName, "true"}, + expectedValue: true, + getterFunc: func(fs *pflag.FlagSet) (interface{}, error) { return getPrometheusCREnabled(fs) }, + }, + { + name: "GetConfigReloadEnabled", + flagArgs: []string{"--" + reloadConfigFlagName, "true"}, + expectedValue: true, + getterFunc: func(fs *pflag.FlagSet) (interface{}, error) { return getConfigReloadEnabled(fs) }, + }, + { + name: "InvalidFlag", + flagArgs: []string{"--invalid-flag", "value"}, + expectedErr: true, + getterFunc: func(fs *pflag.FlagSet) (interface{}, error) { return getConfigFilePath(fs) }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fs := getFlagSet(pflag.ContinueOnError) + err := fs.Parse(tt.flagArgs) + + // If an error is expected during parsing, we check it here. + if tt.expectedErr { + assert.Error(t, err) + return + } + + got, err := tt.getterFunc(fs) + assert.NoError(t, err) + assert.Equal(t, tt.expectedValue, got) + }) + } +} diff --git a/otelcollector/otel-allocator/go.mod b/otelcollector/otel-allocator/go.mod index 4f6215d1f..92b14fc7e 100644 --- a/otelcollector/otel-allocator/go.mod +++ b/otelcollector/otel-allocator/go.mod @@ -1,6 +1,8 @@ module github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator -go 1.20 +go 1.21 + +toolchain go1.21.3 replace github.com/prometheus-operator/prometheus-operator => ./prometheus-operator @@ -11,51 +13,44 @@ replace github.com/prometheus-operator/prometheus-operator/pkg/client => ./prome require ( github.com/buraksezer/consistent v0.10.0 github.com/cespare/xxhash/v2 v2.2.0 - github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 - github.com/fsnotify/fsnotify v1.6.0 + github.com/fsnotify/fsnotify v1.7.0 github.com/ghodss/yaml v1.0.0 github.com/gin-gonic/gin v1.9.1 github.com/go-kit/log v0.2.1 - github.com/go-logr/logr v1.2.4 + github.com/go-logr/logr v1.3.0 github.com/json-iterator/go v1.1.12 github.com/oklog/run v1.1.0 - github.com/prometheus-operator/prometheus-operator v0.67.1 - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.67.1 - github.com/prometheus-operator/prometheus-operator/pkg/client v0.67.1 - github.com/prometheus/client_golang v1.16.0 - github.com/prometheus/common v0.44.0 - github.com/prometheus/prometheus v0.47.0 + github.com/prometheus-operator/prometheus-operator v0.69.1 + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1 + github.com/prometheus-operator/prometheus-operator/pkg/client v0.69.1 + github.com/prometheus/client_golang v1.17.0 + github.com/prometheus/common v0.45.0 + github.com/prometheus/prometheus v0.48.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.28.2 - k8s.io/apimachinery v0.28.2 - k8s.io/client-go v0.28.2 - k8s.io/klog/v2 v2.100.1 - sigs.k8s.io/controller-runtime v0.16.2 + gopkg.in/yaml.v3 v3.0.1 + k8s.io/api v0.28.4 + k8s.io/apimachinery v0.28.4 + k8s.io/client-go v0.28.4 + k8s.io/klog/v2 v2.110.1 + sigs.k8s.io/controller-runtime v0.16.3 ) require ( - cloud.google.com/go/compute v1.22.0 // indirect + cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.44.302 // indirect + github.com/aws/aws-sdk-go v1.45.25 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/bytedance/sonic v1.9.1 // indirect @@ -63,18 +58,19 @@ require ( github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.99.0 // indirect - github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.4+incompatible // indirect + github.com/digitalocean/godo v1.104.1 // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/efficientgo/core v1.0.0-rc.2 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/envoyproxy/go-control-plane v0.11.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/evanphx/json-patch/v5 v5.7.0 // indirect github.com/fatih/color v1.15.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect @@ -98,22 +94,22 @@ require ( github.com/go-zookeeper/zk v1.0.3 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gophercloud/gophercloud v1.5.0 // indirect + github.com/gophercloud/gophercloud v1.7.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/hashicorp/consul/api v1.22.0 // indirect + github.com/hashicorp/consul/api v1.25.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -123,27 +119,27 @@ require ( github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/golang-lru v0.6.0 // indirect - github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e // indirect + github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.0.0 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.4.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.8 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.1.9 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/compress v1.17.1 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/linode/linodego v1.19.0 // indirect + github.com/linode/linodego v1.23.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a // indirect - github.com/miekg/dns v1.1.55 // indirect + github.com/miekg/dns v1.1.56 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -154,60 +150,59 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/ovh/go-ovh v1.4.1 // indirect + github.com/ovh/go-ovh v1.4.3 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus-community/prom-label-proxy v0.7.0 // indirect - github.com/prometheus/alertmanager v0.25.1 // indirect - github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/alertmanager v0.26.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 // indirect + github.com/prometheus/procfs v0.11.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect go.mongodb.org/mongo-driver v1.12.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.25.0 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.13.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/mod v0.13.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.11.0 // indirect + golang.org/x/tools v0.14.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/api v0.132.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 // indirect - google.golang.org/grpc v1.56.2 // indirect + google.golang.org/api v0.147.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c // indirect + google.golang.org/grpc v1.58.3 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.28.0 // indirect - k8s.io/component-base v0.28.1 // indirect - k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect - k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect + k8s.io/apiextensions-apiserver v0.28.3 // indirect + k8s.io/component-base v0.28.3 // indirect + k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) // A exclude directive is needed for k8s.io/client-go because Cortex (which diff --git a/otelcollector/otel-allocator/go.sum b/otelcollector/otel-allocator/go.sum index c0c24377b..bd66fd31e 100644 --- a/otelcollector/otel-allocator/go.sum +++ b/otelcollector/otel-allocator/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.22.0 h1:cB8R6FtUtT1TYGl5R3xuxnW6OUIc/DrT2aiR16TTG7Y= -cloud.google.com/go/compute v1.22.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -35,37 +35,26 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2/go.mod h1:FbdwsQ2EzwvXxOPcMFYO8ogEc9uMMIj3YkmCdXdAFmk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0/go.mod h1:243D9iHbcQXoFUtgHJwL7gl2zx1aDuDMjvBZVGr2uW0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -81,7 +70,6 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= @@ -92,10 +80,11 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.302 h1:ST3ko6GrJKn3Xi+nAvxjG3uk/V1pW8KC52WLeIxqqNk= -github.com/aws/aws-sdk-go v1.44.302/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4= +github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -122,15 +111,8 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -139,13 +121,16 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= -github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= +github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= +github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= -github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -154,13 +139,11 @@ github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/efficientgo/core v1.0.0-rc.2 h1:7j62qHLnrZqO3V3UA0AqOGd5d5aXV3AX6m/NZBHp78I= github.com/efficientgo/core v1.0.0-rc.2/go.mod h1:FfGdkzWarkuzOlY04VY+bGfb1lWrjaL6x/GLcQ4vJps= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -168,16 +151,17 @@ github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBF github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc= +github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -199,10 +183,10 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= @@ -247,6 +231,7 @@ github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU= github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -257,6 +242,7 @@ github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPr github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -288,9 +274,8 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -328,6 +313,7 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -341,8 +327,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -357,30 +344,31 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= +github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= -github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= +github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.22.0 h1:ydEvDooB/A0c/xpsBd8GSt7P2/zYPBui4KrNip0xGjE= -github.com/hashicorp/consul/api v1.22.0/go.mod h1:zHpYgZ7TeYqS6zaszjwSt128OwESRpnhU9aGa6ue3Eg= -github.com/hashicorp/consul/sdk v0.14.0 h1:Hly+BMNMssVzoWddbBnBFi3W+Fzytvm0haSkihhj3GU= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= +github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -397,6 +385,7 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -408,11 +397,14 @@ github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5O github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= @@ -421,22 +413,22 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= -github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= +github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= +github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= -github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= +github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -461,11 +453,11 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g= +github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -475,6 +467,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -483,8 +476,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= -github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= +github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= +github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -508,25 +501,28 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a h1:0usWxe5SGXKQovz3p+BiQ81Jy845xSMu2CWKuXsXuUM= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a/go.mod h1:3OETvrxfELvGsU2RoGGWercfeZ4bCL3+SOwzIWtJH/Q= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -536,6 +532,7 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -547,15 +544,17 @@ github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DV github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= -github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= +github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= +github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -575,29 +574,35 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus-community/prom-label-proxy v0.7.0 h1:1iNHXF7V8z2iOCinEyxKDUHu2jppPAAd6PmBCi3naok= github.com/prometheus-community/prom-label-proxy v0.7.0/go.mod h1:wR9C/Mwp5aBbiqM6gQ+FZdFRwL8pCzzhsje8lTAx/aA= -github.com/prometheus/alertmanager v0.25.1 h1:LGBNMspOfv8h7brb+LWj2wnwBCg2ZuuKWTh6CAVw2/Y= -github.com/prometheus/alertmanager v0.25.1/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= +github.com/prometheus-operator/prometheus-operator v0.69.1 h1:pqNMssMBBaM6mYg7FKK7kQi9sIyWYCA33z5FSmmbybw= +github.com/prometheus-operator/prometheus-operator v0.69.1/go.mod h1:1GSjL8dKOO9be+b7aSowZo7cuTdsdTqLT3ZETktVqvU= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1 h1:hOnp+1FLBm+ifsyiRbunmfSs99jKAq+Tr5elCmo5l5U= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1/go.mod h1:JtflYMUMay9HGil4aRg+dSj6X6mngtuBJf/ULOCxbxI= +github.com/prometheus-operator/prometheus-operator/pkg/client v0.69.1 h1:hCqId2xt6kOPuoeTxVxV/GiKmZyCJjYeuRRL90qcwH0= +github.com/prometheus-operator/prometheus-operator/pkg/client v0.69.1/go.mod h1:XfInnOa8WYXOlzOb0Iw+9eg0s/bkeOnXyten1pKFjuc= +github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= +github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -605,22 +610,23 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/prometheus v0.47.0 h1:tIJJKZGlmrMVsvIt6rMfB8he7CRHEc8ZxS5ubcZtbkM= -github.com/prometheus/prometheus v0.47.0/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= +github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shoenig/test v0.6.6 h1:Oe8TPH9wAbv++YPNDKJWUnI8Q4PPWCx3UbOfH+FxiMU= +github.com/shoenig/test v0.6.6/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -685,14 +691,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -718,13 +724,10 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -735,8 +738,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -759,8 +762,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -801,17 +804,16 @@ golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= -golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -825,8 +827,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -882,22 +884,19 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -909,8 +908,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -965,8 +964,8 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= -golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -989,16 +988,16 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc= -google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0= +google.golang.org/api v0.147.0 h1:Can3FaQo9LlVqxJCodNmeZW/ib3/qKAY3rFeXiHo5gc= +google.golang.org/api v0.147.0/go.mod h1:pQ/9j83DcmPd/5C9e2nFOdjjNkDZ1G+zkbK2uvdkJMs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1022,19 +1021,18 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 h1:+VoAg+OKmWaommL56xmZSE2sUK8A7m6SUO7X89F2tbw= -google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753/go.mod h1:iqkVr8IRpZ53gx1dEnWlCUIEwDWqWARWrbzpasaTNYM= -google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 h1:lCbbUxUDD+DiXx9Q6F/ttL0aAu7N2pz8XnmMm8ZW4NE= -google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 h1:XUODHrpzJEUeWmVo/jfNTLj0YyVveOo28oE6vkFbkO4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= +google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a h1:myvhA4is3vrit1a6NZCWBIwN0kNEnX21DJOJX/NvIfI= +google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c h1:jHkCUWkseRf+W+edG5hMzr/Uh1xkDREY4caybAq4dpY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1047,12 +1045,9 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1081,7 +1076,6 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1094,7 +1088,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1102,31 +1097,31 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= -k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= -k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= -k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= -k8s.io/utils v0.0.0-20230711102312-30195339c3c7 h1:ZgnF1KZsYxWIifwSNZFZgNtWE89WI5yiP5WwlfDoIyc= -k8s.io/utils v0.0.0-20230711102312-30195339c3c7/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= +k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= +k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= +k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= +k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= +k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= +k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= +k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= +k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= +k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f h1:eeEUOoGYWhOz7EyXqhlR2zHKNw2mNJ9vzJmub6YN6kk= +k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.16.2 h1:mwXAVuEk3EQf478PQwQ48zGOXvW27UJc8NHktQVuIPU= -sigs.k8s.io/controller-runtime v0.16.2/go.mod h1:vpMu3LpI5sYWtujJOa2uPK61nB5rbwlN7BAB8aSLvGU= +sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= +sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/otelcollector/otel-allocator/main.go b/otelcollector/otel-allocator/main.go index e8159e0cb..b89824503 100644 --- a/otelcollector/otel-allocator/main.go +++ b/otelcollector/otel-allocator/main.go @@ -16,9 +16,9 @@ package main import ( "context" + "fmt" "os" "os/signal" - "strings" "syscall" gokitlog "github.com/go-kit/log" @@ -65,35 +65,19 @@ func main() { interrupts = make(chan os.Signal, 1) errChan = make(chan error) ) - - // EULA statement is required for Arc extension - clusterResourceId := os.Getenv("CLUSTER") - if strings.EqualFold(clusterResourceId, "connectedclusters") { - setupLog.Info("MICROSOFT SOFTWARE LICENSE TERMS\n\nMICROSOFT Azure Arc-enabled Kubernetes\n\nThis software is licensed to you as part of your or your company's subscription license for Microsoft Azure Services. You may only use the software with Microsoft Azure Services and subject to the terms and conditions of the agreement under which you obtained Microsoft Azure Services. If you do not have an active subscription license for Microsoft Azure Services, you may not use the software. Microsoft Azure Legal Information: https://azure.microsoft.com/en-us/support/legal/") - } - - cliConf, err := config.ParseCLI() + cfg, configFilePath, err := config.Load() if err != nil { - setupLog.Error(err, "Failed to parse parameters") + fmt.Printf("Failed to load config: %v", err) os.Exit(1) } + ctrl.SetLogger(cfg.RootLogger) - // Defaulting to consistent hashing - allocationStrategy := "consistent-hashing" - // Config file will not exist at startup, so not attempting to load the file which results in an error and just using defaults here. - cfg := config.Config{ - AllocationStrategy: &allocationStrategy, - LabelSelector: map[string]string{ - "rsName": "ama-metrics", - "kubernetes.azure.com/managedby": "aks", - }, - } - - if validationErr := config.ValidateConfig(&cfg, &cliConf); validationErr != nil { + if validationErr := config.ValidateConfig(cfg); validationErr != nil { setupLog.Error(validationErr, "Invalid configuration") + os.Exit(1) } - cliConf.RootLogger.Info("Starting the Target Allocator") + cfg.RootLogger.Info("Starting the Target Allocator") ctx := context.Background() log := ctrl.Log.WithName("allocator") @@ -103,26 +87,30 @@ func main() { setupLog.Error(err, "Unable to initialize allocation strategy") os.Exit(1) } - srv := server.NewServer(log, allocator, cliConf.ListenAddr) + srv := server.NewServer(log, allocator, cfg.ListenAddr) discoveryCtx, discoveryCancel := context.WithCancel(ctx) discoveryManager = discovery.NewManager(discoveryCtx, gokitlog.NewNopLogger()) + discovery.RegisterMetrics() // discovery manager metrics need to be enabled explicitly + targetDiscoverer = target.NewDiscoverer(log, discoveryManager, allocatorPrehook, srv) - collectorWatcher, collectorWatcherErr := collector.NewClient(log, cliConf.ClusterConfig) + collectorWatcher, collectorWatcherErr := collector.NewClient(log, cfg.ClusterConfig) if collectorWatcherErr != nil { setupLog.Error(collectorWatcherErr, "Unable to initialize collector watcher") os.Exit(1) } - fileWatcher, err = allocatorWatcher.NewFileWatcher(setupLog.WithName("file-watcher"), cliConf) - if err != nil { - setupLog.Error(err, "Can't start the file watcher") - os.Exit(1) + if cfg.ReloadConfig { + fileWatcher, err = allocatorWatcher.NewFileWatcher(setupLog.WithName("file-watcher"), configFilePath) + if err != nil { + setupLog.Error(err, "Can't start the file watcher") + os.Exit(1) + } } signal.Notify(interrupts, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) defer close(interrupts) - if *cliConf.PromCRWatcherConf.Enabled { - promWatcher, err = allocatorWatcher.NewPrometheusCRWatcher(setupLog.WithName("prometheus-cr-watcher"), cfg, cliConf) + if cfg.PrometheusCR.Enabled { + promWatcher, err = allocatorWatcher.NewPrometheusCRWatcher(setupLog.WithName("prometheus-cr-watcher"), *cfg) if err != nil { setupLog.Error(err, "Can't start the prometheus watcher") os.Exit(1) @@ -141,19 +129,21 @@ func main() { } }) } - runGroup.Add( - func() error { - fileWatcherErr := fileWatcher.Watch(eventChan, errChan) - setupLog.Info("File watcher exited") - return fileWatcherErr - }, - func(_ error) { - setupLog.Info("Closing file watcher") - fileWatcherErr := fileWatcher.Close() - if fileWatcherErr != nil { - setupLog.Error(fileWatcherErr, "file watcher failed to close") - } - }) + if cfg.ReloadConfig { + runGroup.Add( + func() error { + fileWatcherErr := fileWatcher.Watch(eventChan, errChan) + setupLog.Info("File watcher exited") + return fileWatcherErr + }, + func(_ error) { + setupLog.Info("Closing file watcher") + fileWatcherErr := fileWatcher.Close() + if fileWatcherErr != nil { + setupLog.Error(fileWatcherErr, "file watcher failed to close") + } + }) + } runGroup.Add( func() error { discoveryManagerErr := discoveryManager.Run() @@ -167,25 +157,10 @@ func main() { runGroup.Add( func() error { // Initial loading of the config file's scrape config - cliConf.RootLogger.Info("Checking to see if config file exists for initial loading") - if _, err := os.Stat(*cliConf.ConfigFilePath); err == nil { - cliConf.RootLogger.Info("File Exists. Loading and applying config...\n") - loadConfig, err := fileWatcher.LoadConfig(ctx) - if err != nil { - setupLog.Error(err, "Unable to load configuration") - } - err = targetDiscoverer.ApplyConfig(allocatorWatcher.EventSourceConfigMap, loadConfig) - if err != nil { - setupLog.Error(err, "Unable to apply initial configuration") - return err - } - } else { - cliConf.RootLogger.Info("Config file doesn't yet exist for initial loading, using empty config to begin with") - err = targetDiscoverer.ApplyConfig(allocatorWatcher.EventSourceConfigMap, cfg.Config) - if err != nil { - setupLog.Error(err, "Unable to apply initial configuration") - return err - } + err = targetDiscoverer.ApplyConfig(allocatorWatcher.EventSourceConfigMap, cfg.PromConfig) + if err != nil { + setupLog.Error(err, "Unable to apply initial configuration") + return err } err := targetDiscoverer.Watch(allocator.SetTargets) setupLog.Info("Target discoverer exited") diff --git a/otelcollector/otel-allocator/prometheus-operator/.vs/prometheus-operator/v16/.suo b/otelcollector/otel-allocator/prometheus-operator/.vs/prometheus-operator/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..447310229e710411b44bb7a8e26bb5f243e27ae5 GIT binary patch literal 7168 zcmeHL%WoS+82{4J(w0YQ3n?ueD#)P+Cd}^owLw%-((;fb_JCBvu1a8cINwi^F3$%!>v=leD>w} zUuA$U$zi#(e_W1c#%It!ls-QpatwWr-PzyY=kQ@Pbfi-#VLHRP2;uE(iJCL9y5!xDJ!9$CZ zc?aF*#=w6R%zjK5uF88r*^zDRpKUXPd>JFHgMgE9;y;A`5j5)IF4N8H^SGvUJ=Gm~ zuojRH-_bmbQ??W6KY~WNr?n#0*#G0c1dngXyRr*!Z{c3l@8JrDo`wJM49J+KM&i-@ z>p8r>m`qs*ZX397z}MS|gf-bRG1!s7L`FNGmB9banUua+6#r?=<=K_QxM!5N5PKft z@D<3hgXgxSnIVEC9a)A{tdEho_M}=!;{OzQ6~)iizsumuo$e-_Zs6d zN`F7Ae{|UX`BuLUxprYERwUneXOCZP41DJJPrLSyz_kS*+=3P8Zyh0Ckoe;@cmbn> zx@mW#v=4uVwSqdO4tj46?q&C%-T4Y6VH9o}#CiBXE8-rWLc}F~kx|kg1r^x;B%oNI zisG}@F<+4K@HdPc9bu00yL;z~5L((Yk}Qtl|2!u>Y0&fWZvcb&W)&wB-l>N{vd6GL zeLp?_Tdp!Zjy{|26$a<$J6mw?an!sBQ~^-tF;qW>)ZI?$P^mkMtpn9Hs^gJ=5mQ)shj zXVJ3n(>`UK(tk$-jKic9pf@^Ax}JGx5`6j`*Y|id7x7q_CY7Ic^fnUuoDQm9J&YXX zRV+u9>Xk_OWw)lPz7BLvSAx*17%|OpneuHf;wx+E#kKVX%dRcxg^w-Ax9rG?RABif zRVq8Ka-FILW|8aZuxvZ^;AY3$hS8GaZPY14LXnrdvU!>X7nIwcHz$8F`5HLar0iuvV5^iIdB$H$$$%Hw$JSU(c z2Dz2-puB*GAcm256kB8am346N+e6d}ReHSHS+Uw^nZcNZ~(N<3R634`*o(|w| zd*i~!R`=4@rX}^QtKCO8u6EZiZ*OU8hH95IHn#&+@c;6~izi97EDZ)W`g?pqEw&6p zLGU27HZEvvZES96Y;&)bF&c-${_vKLawP+*s8CU0+?Fq$j~M}MXsDmxs4JS^xVTX* zl8K=VY+g~{+OVj;wS4OI=@kmWF?^L#7DNUHwk(Ty2mHN$Ur(Y6^y4Ap9Su^V@=NZq zTw34V?F)tcUH$>wMTM=gU@I?G}K9r{@o zTb#5W&76zH0ojXhy`y5=avPa(r*)7S7mF49Zr9Ja*kWj3o^i27+BtIwGfo=NL^Q`q zj&8=0b`LHv|DC+Z(^}gpS>AQj$bgFQ${BIN%UCF*;N(Hh>J*~+$^rI6F=k(N|;R=*5%Dj%a$uEj|`(AX~at| zlR5@#jGRMBj!`5^=?Y&k1QRVz^N%2lIlH2Q**2TVpncBY|>(c90H1 z@~C7e1k>)QYIgELwXEE(($zyj#zQvCY|d`<$U_z@$el~QLElig6RYjmGE2hoi-pqG zpc%?oFl;a+TAe4saz;pqMZmHgohO*H*MsKUqG~?PER>p#$JFRQ4Y*nAk7NSHq8+5R zgY+#$Co)Z1vnZ}v%$39h3kM-s#XJaci5Oq8Z4pnEbc3p-HQb7&)1;puvBjDx5?l1+ zrV6E5mGVQdM3Rnys_Tdz!}b*Z_ajV#|4zdkRoeM0`VFwdr3uo!rC}mJfmOPXf$}=t9Pv zouAK)_(+`+ZBoMO>R2n~YD7-T`N<@0g?AtV;}|2I%VDpUW)tDbxIRGepYhM&fWZNS z0|o~S4j3FTIACzV;DEsag98Q!3=S9^_+QR}EQUvA*=-Pk8T3kC*(sIPmDBP5pLM-~ zTwlV&_-Amy;DEsag98Q!3=S9^FgRdvz~F$v0fPeu2MiAU@8duw%X!$?11?O7jp6dG z(jf#J^ontPg5W>npTPlx0|o~S4j3FTIACzV;DEsag98Q!3=S9^FgWn@;J_%Z%&I#C zfWOUWUH`(pD{y`1`j_i;SBGn^tJGz2zT$kud71M>XRq@pr^h);{7iga{Iz(cxJ~R6 zTg36A-SL^@RmXjfOC38Ly^i^giH>yp2lnUf_uH?spJDH_&$E}>zO}t%yWh6Uw%#_$ z`h|7B^?d7AYmc?u>ae_Ex!AJKQf~gpe4lxbd8N5j_`7h2uu-TJSku#{drfDXT1^@J zTl|gu5MRfaai4LoagTF%avQl$ZV@+*bFyEvPqR0(0d^5v!g9<@%&p9+%rVS##(};; zuj3Bo_Y0_$u?XG)UobrA9rE`1f_;|P?FVYS*V@zi1eA^}!ti>UwXUqGtXDvFj8(v& zwfMVzg8}$rJrE3ex`REH$Atnzs|apK-8rQ`0o7u_?x1(r*Buz@_4mbst$kukSr4sm zI2ai8h5LPxP%tv!iv?WuuZ(fs0;+-fRKPf>l^Z@R?-I})9TaqEC>&c~`?3=zc?Gmk z2k8k6`+{ERP33^U3%WAo3)9}TE_Pu#|IkX33&6#z1XK;V>hLJ+ zq%g<+c2?#}0p)`@VL1Wj5>%YM0=Huo1_FJReSvn8UA^b)n&krOfNY7M@cmO|cOd8s zgdiF0)G{Yjxy3s;Foz&kezIwFJ4h{%0`;|#ys0a8WVH#X0Gjp>g?+&x?|=-O(F$!N ztI!vy3`GV>?u6@BO~4n&5+8pQnDuAjPCKy67# z?C}i`1hx#q9Ma(A-u1{4M+>Mg367RUo-X);4UZijBFd_)ykOl?0`dd)!N*pTPJ&KH zc=V__#Z5_tZ4u#nxnphmA^~NB6a>4x-Q{xTjD-SPo3!0b*b2wXs9Xbm#dDMaYU*Si<2&j_sK7xsF{6uB0>>A z%KK!-tW*uE<0WyP;(c)2?X|V3`l#ZmB0^E$ui2Y7Q$Qs!Xhi?g0i8iu_t#}RX4M?F z_|SUask|j)hGtbEV>sj8J?nC(3#bTM8}^2~`-y!~O&U88IDPW8LzFk##2cZ#6RHK& z0D_}kI<{YFW?E6S<;nWxVnXQ0^~8j65Do)twyF1t?9+P{Usi1u_RhjDA4o2pII?U zK=qjafgVqfA5`NozW&7173t~o(FK8mK6lfx`4eelgI@noXBh6AfVI4skp0Z5SC>rC zH>O>NXbn$);&)dFs0xoy&!8VJih*`E`MUZ8f%UXQKyzj}H6VPO;WCQ>AFjOyW_nf` zWCNABX=rsEY4yqHPtF>z%cs;l9?8in)#Vov_}}cxs~CrSt79%*emp_nK)?$(`V`Wt zr_ISK(N*Cl`H%E3%q|8y1FDcsNs53wS42BE9Pr>-U$GOgqSKg&T$7z9qmQCAX|TJ2#I`NNHr0x}c~mSK1kbp<}*2 zf4654wh}%Mox5_QH_f;^D~Iw9ugp+E8masG+TD5CShZM$2#BPoF9J6xg=iU2l$S-- zj?7mD@4E7woJ;`~LPr7K-#4U`T%Gq)W(Kt^y~BPb`^xjG3)88Y40a?CC*4S-09^6> zR|TVC7DE3UTAJHio8~QVZ)#o$<%H17zuA+YCZIAfCg%sbBiJ$`<0$hke-tjX3LuCB z-l4v3f8~}zVs6g3*mpvn3nmG!cu{@x!p6ldO07_q>7>MVMf#vEk<ICHc<@Gss%AW{q)kpy+ zmw0RfY68yT>FU91-y`WkPh=RxvxnA0!Oz})f4-GYahMH0Z%A8sR%u19g-QloG$RQj z#oM#<^n5eL8;*1h_(S~~8g_lYs9c~sHg6;hJ3uTjp!IT>mfF+5y*3z_OBNL5aJcgpVN)QuzIPz7DMUGU?sK zfeIvduE;8NbaPtgzJik}?LD(l;&0cAC z3m@9AHl1n;Ij=Q|?7Liv>pJ!qE{FK7^E=mL?04el?6C6==2Pe6TsODGah3CY=bv4F zWIM%U&9Cuam~Y@;U|us{?8-JTVSdBhU_RTtTD)Bx5jTp*iDT_=nL+7{ctwT-vmZT-r=zJ+5<^kk#h& z^Y1zB*f-cPFrm#Wqe}sLTf^bA1kh9On)M4j%BoZlSjpoYO5cJn4ugB;YW-bl-fcD@z)Xf*#jeFxA9v;|2 zc@v>)6FSq*<+9xaeo%5~7w&%;?t~&#?8I-Ra!kV+7|sg}4u{Z=0#6MV`G&g#!&@-q>6vic1{#qRO=mcOb5FzVYjS&mfjIxvBCb)_w@yl5r$Wbe2bT{$ zB3==+EoIXqcnq}Crq&Y0h$^#*V5z02xVc6~%i&lmPIhnwj4T=_jp6E;Wc@!ejVoga z@$#6QfN|yS9G}n4X7qaug^aD)Ts5Q8sN`=U`O0od$={sI)##~~TiImeavAFJ*eGym zKzYQ)l`uhAw6SXg7$24(z>g7faz%_PDnSdE$-sIV+JKt{Wgqr|%?Sf9_h(q!pTKCY zLJI^{4`py3Mqb8cq(R)ioC!b!m`&cn?%qBbVm+>wVrvfS08Z3zo*UGB!pplIagS?*iPYTari2kR%?GTwIOh70JO( zYdj&@ItyvACrjiCVbCRyM$tjdUy`G2V>P*v8ViFw$@iw!Rd<#V9o&x9e-yKG&_T8(derE_3y{x?C$=t*!!R zrL)92)@c@RvfOXE#`T%&KG#27e{&shz2bV&^{i{Z>o=~uTo<^`a_w|&cb(+g>b%~0rSoFvADj<4cRNpaMxDnyBhG-+@9cIibB=bdbRO+&bk1?sI;)-K&K#%1 z$%x;HpNQ{@Z-{>uUl4yUJ|R8=Clr1KzJ<%ge~Et=uMr0vFF78zue49L=i1(}mcY4# zzgeCWFA&cXcZ%D^lf=zpQ0x`giEG4mu~{7J__w%7oF^V3&JZVy6U1?1j+iFeM9%T0 zv+O(1)O=vayaeZ+uwBD;TY? zIF5A8a8x?R+dsB{Wq;59vi&~$bM`0g8|`!K58Lms-(bJOet~_D{WSYY_91(({aAa8 zeWAU^UT$~Wt#-!tjqNkr-|cC(S8Wg2erdbKc8%>4+c~zKwpQCwwt2Qc+Mc#OW*f0> zwFPa**}80NY_n`rZ4+$8wmjQto6W{rzqNjD{m}Z3^;PR1txsDYvp!(`rS%r;HP%b4 z=U8`IN8ltz(0ZJ;%euzeYCXz2&pOLG)jGkNZ%w!ImVaBmwEWZZhUF#8la_}qcUf+- zoMXAf(q-9c8L@1&1TDu|)>v9CM_J}sW?80MCRmCsd6v;2M#evb0|o~S4j3HxU&jG6 z$FfWgQzE6sQd%UXU^kNTLMa_9r3F$tMoROgG*3!%Nji$jA!!)`f|Q!1l*cLh zf#E0^`1Z*wL(*3nM6%Hj^c8(CrT>xAe@p3iQu?iwej}y-Bc)$U=~q(vFDd;}O23fO z&!zM;Dg9JRKatXprSu~y{il@vLrOoC(!WdT2U7aJl)fjWf0NR`O6j{&`i_*oEv0Ws z=>aKyQ%c{E($`74AHi=q0o(SYSEck7lD>fcBBg(p(wC+5B`N)rl)gyP{pgQU`ht`` zFQtEw(&wb~St)&nq)(yWOX<^6`a7xoDLQ=n$?HStNhy6oN`EV*k4x!eBz+Y9hN3+x zWj{jFeduAD{SbM55bY!B&FDdr-j5z2>AmRJ6zqQKb+44(N78%Hy(GOE-9yq_(XXWR zmr{DSl-?z!cS`9UQhGZ{Z$!6|^cHk0NpD8Ckn|>Wvs8W)Nq3q&Yo zx=t#;mZZDUHPZXlQhF6h&qP;}^g?unlwK~Smr3cRQhJG$UM!^-k#sk@kfeLi1yXvx zl%6N0=St~0QhK(Oo<-6fIJ5(@wHxgr>6vIZNq3<$DVujmU^}Js44S=zylz9MOX+D+ zda9Ie$6!IU4JRj|5t>A4a*By#n3GP%&)`Y;899+WPax0Z$#W}tZXwUj}@Uh-T=o}J`*EO~a|=bB^4-)r%6^&0$Kxtcsz;p$i7KigN}=bYvE+18G;+wh|m zzc($ze=a3|wvcBtc`hN(#pHQ3e$F`xKNmIOXZa$MvyeO&kY^)#&L__X@|;JW_2fAh zKg;LfXVsD9Sx25nkmqdjoJF3s_&H-H`MU-`%V*$c^>mUmjpS65zo(Mt6#T51O!BM9 z-<9O)AB-t)*a7eCW-$TOQfv&b`(JTu5M9V3m#k2L%kg&!_lBEss&Fsz6(9QaSp zPM$XMw34TVJk8`Okf(_}dHiHKjLLExvf}tZ>pB}-D`QZFlnd zj2sIGon6S+F-ZvlWj=b9dZ@PP~+yS zI!R}A`bO>Pu~mGho=H;lG;vscRR zlw|RW6*& zdy_%O%w>wOAcdIdW;X?IOhJu0a#Cb>&ioYAsL*O`cTU3;zB?KDDuN~uKWAPU-;x4D z4#m%@pTw_D3a9D>+RM3Q@lhL8B@yOo`JBV3s_MuTEJ!pURdp#i95>!oM;zAhRn1OO zx!PT6_^M{5pk0Mlhp(!ZEKri_!@>C(GY@w_t7=reS3ZNRuxg0DditS_cGa{ZzCo|E zW5V?1)hQUKTL_3mR89R6^Sf#aS%+fOOT}ce5UBjq2^R_1msgQ>S*si?D#_|4W$8{H zRe0QdJ?N{XLHmkHq&jWbzIdXpI<2Ctn2^m^0q^3z%cvkrjU2oe!Tgk?_v6a6Z^h%a zZ$+h)x}-7u!f{$~cL}jxWE-cjm=F^e$uBHQOk|;(m@hb*KZ-9wx^RB1vX$fc*#)Fy zazx+77s2jc`4%Fdh@cwN&(5QEQIe>Bb}s3S6xUD7ArnFq*-y*X+i>tjM3##$WYp+> zS|+su=vNFG#F&VU@Ta9`@Dov7jDIv=hGK&JBugLVPvc7gRr5`Pi!>;GiQpvms6Nuq ziaC5WN*L=Wv@5}W&OVNB0>eJ_7X~&Wj@p1fXC+)#L;jqFz>uInY%%ku@jjMqBgSR} zIRerK$DZk5or?lPfgt|X+cx~Gx45r8z9IA~`Wz5*4`2P@`~T4>{4o9*956UwaKPYz z!2yE<1_uld7#uJ-U~s_TfWZNS13y;|kR#j1{{QDXyhgta4j3FTIACzV;DEsag98Q! z3=S9^FgRdvz~BJkfD!*U1i|2d!2yE<1_uld7#uJ-U~s_TfWZNS0|o~S4*dK%V8s7_ z{$p(P(BOc<0fPeu2Mi7v956UwaKPYz!2yE<1_uld81a8Y1`G}u956UwaKPYz!2yE< z1_uld7#uJ-U~s_Tz|WrpM*RQhKgLE64GtI_FgRdvz~F$v0fPeu2Mi7v956UwaKPYz zvHv$@z~F$v0fPeu2Mi7v956UwaKPYz!2yE<1_uld{QNm!od5s%kFn81g98Q!3=S9^ zFgRdvz~F$v0fPeu2Mi7v956V5_y0CChg>t9e|3f&H#tVxkGAcx?y|gQ=7eS3+3YuL zD|?i|CxZir&H?`J?3ErSy39Y+R-9VrFlT!_%uY|(+cn^e?RxCHC=t_MKW}kk zf}V@Ea>|!DCN}kS0Ds#X7dE!Km$o)7sc&8FKDu$WyMB3lOH(scyQHzX9jJo;moHvC zNvdUOFtE|z;|prBWf%&A2cflbL1SxUb3Ra_Pza9UtBkTBGBB`ZS;RZw@Adn7 z5>=od4;k-hkP?+&a*yTG`tELDDCF<*58y5;Y>fqrk-<1PwaZ!t;)&9>B^34zDlCl6 z!mMON#+%ywA(v0;$7;^5s$fQ3L=xp@aebZmA!ks+Y|^kU zZ*E$)Tv>T!7zIfqUUHe#F<4{d97=MGB2h|L_<|vrXmOf<1X;}46&1|3*+dTI%4qfa zH>+L-^@SP9ttuZvRP(xcB4lgvRFaxT?!$7w2(}bHeWdG zAL=7>TC%rk4zHJ|csL?P#N4L{$tG>ZQdY>GIFVURBqy{1Y&2hI$hRTl8v?6M|H|p) zCZ@1_2!wwUU{*vIGUn|3d}hQ)>Xc}c5>{8oS}9i}a#GGuCTT0Y0}&X<80n;oB-#I? zJ;>GU*kk|7-eQ?zK0(;eFXpa>%%A+q)^imb3sks?;p+~{KGmaA& zazPtx>s4szOoCCW)6#>Lj?8vYIigJ--L}dJlVa!&DS{!|QW1M7L;|VFXp0{s5YR=i zO-?K`l50Qu%|yvh=D{UzoIxgv&Ip4l7!<4w=mz z727wDCI;*o6JyqBjHDvqw@kf`)E8=0rM}?DX-u^ag;aHkl@=^jxPHVk`(N(7Wn)>} zJ9(RS|_}##^H2bON4^N;cgU zo+O;}N@@JWJ%nAX>_3sGO``dgc;3qx2cKw%?XryJ=l{2wNbSy#aRDmqmIPF#?f>pZ zL`N4k2s_-0dP$-@{(saqiswo1my&!=XRq@pr^h);{7iga z{Iz(cxJ~R6Tg36A-SL^@RmXjfOC38Ly^i^giH>yp2lnUf_uH?spJDH_&$E}>zO}t% zyWh6Uw%#_$`h|7B^?d7AYmc?u>ae_Ex!AJKQf~gpe4lxbd8N5j_`7h2uu-TJSku#{ zdrfDXT1^@JTl|gu5MRfaai4LoagTF%avQl$ZV@+*bFyEvPqR0(0d^5v!g9<@%&p9+ z%rVS#=*&0hb;?L{S}9`@yaT>qc+flK?ehiuEU()S)C5<~~V)TITJ`L}UO7hI<~g|It@%KGNh3y%?yN5%}P-B?2g zrS6&RiE9PaC<92NEmy4{!P=7A%ryeal|>`8n%0r`QpRclWkdF$f3tsRCCLTg;#C5w zhFo=c6n0XWV}Cma_@2RN0UEc0;IdjHB0j*8iZn)n&6d?L1s1+#} zx3_kIfV@fZVsxQ~RRQmAbdI7bh!UeslV$AsN*3+iX70~MB7^)`KpnW^;)A4fz zG&`}T!D^9?^`yyp(~mry>Z`Db%=l{dzS_D}>`OG%6!pth$ILh))riGO7sdPJmrvBp zK0Fbjh#%#BGGkV%2G#MBI8X6Dxb61Z+Ejg1@l+9^sPEV8&6_Ep5*Re1f9ZhEAgufA zvK_N(4qJR^z3)`sk}*TGs*o|9@$Q~=xzhzy1g#Bw!`=PFzNjXR9SEF0dDO`-r^gSfaTx#niKi>l1NW4YX-Pq!yXn~ciL|jnuYagB48J!4Yk4st z`nu$ywud`IMT+BRN^6y8I#n|C?QT72|Mkbz}AFLQiwxjOHq%nWK-dWZc=_Lb*V7p7A)8SF?P zPWnY61>lP3zbY6Fvk>~<(9+!A+B9!@dsFj5C?|wo{>`5JGy#=?F*!fb9l@3n8Aq9S z`J-^5RRBR8@DBBL`zyB$5_5CL#l92rTrf#+#f$2j7d9?#QEG*sq3uL zid+ko4EUiLNf0UCo}H)Xnet}y`g~EjKzD53NEmj2SYSZ+;ro2M0$OTM z|MvDg6O{q@g{1EFRPE9xpe&om^Uf;xrfSK8f*cNa-Xd%Y1lRWt1U7{z=gxiZwoDew zz6A!#AMTHI5uRM|+JQ8NPO{34A(C}k=|_0~zmX9+=T7IKbD^^m_W56mFN*hwmx`Oj zE^(naSD(fVx)AF9>G0Wwa5zDcbBP^M)-~X-oD)Uxzr+If=9?Q{m1mO>2BEn511NEdHk3BEBs^pMf?VS1z*A2xKFuPxJS5izz@*D z&E@jhZ`s$`U$N(~8`)#oxojcx4f7gvKXWOwg=uAK8PWBQYrpF{*LGL8tIjpXd6kQC zKA6;>zE~gqwL8!w%SX)EBuu{iUq?do2Y8xAc-AsiZ z3Rgn`-nzReKMMPm*hXmSn`I@LQP`Pj}=;VVi+z>+$t^ zBLiVgH80dvj*Y@*0=GlgL8b4soo5@RukZ@H=OHLGw=mOGF z@4#@scZ$?gC@P79wTwldkf7PSUPtJ{P-x?$ym%Np*o+S3V6~hFOQFcU914A zq+(l01>D?|SsVom7z-4sQ3X_iLaWa$h=LhhrUB~GR5CEUuQ&>puUd(+lT<6|-MejE z6kEV@C0dhS1?#vnGb;)qhQuz1rUbYvU{WkAU`(>c5NZ9iEd7yY?q9a7X{lEPpMun zR=ry=W!I6yx$pE8MZv(Wg2LfQs6PPM>ZG`az|7jY&m9G0*8`Qq&j%2XnAAuJT}!KJ z{4_TTMlNn&5m2dpK+leXp{t!Dy9rk9$C0ckSh|>B)TJh&OkQ?(Rul|esQ~myyj7$4Y1p&pfiw8E^kb>pI73S;pBy(O=Jv0$U_ zm|YkJvluU7{o(L%d_}f1UMz}&J&dUb><}z5ag7O=9>|G;ZLFK9l;6b{vBgm^jj^l; z!5JU+Z3@CKH-)55?ZF(X`F7ilMNzPk35OInyB_AN`vRp=u$FPhu@Bo94*I)8V1^9` zz-5ZLP3!us>(=}zn9q2{h%f!eOD9)E!FI;x0T|aH>?*h6r$h&O$mr6V{(4VFUK9*z zEX3Zek)Y4pqc-#QnB0;m7}9v?wKG#s^y`_M3!-3AV@(i(S>RLFryZo@&!@GHj)GM! z%|^nq8t7?W6m064*+@lh>SODQqhL`_0jc*64-agiBO0MwHA!RvC^HH+HTI2n5BOmN zKovJk*_=*B^;Guwe8b&=VKU{nk$yh;!foy-n9%2#UE?@WGSW{XkoWBQZd?=$ZXDRrE^|s#6zulmx5}a@Hc&+7Zw%xO){`fm93SI| z?E$U!>eK&|eG&``p`R{*v;(-k6I0V4A@pDT_PQ}AfB*vdggLSR($Wiy>#~o>^{etg z3(n2FVEk6>#e`n#)=Z^06z;6E?knB`vjE`Ki4+5K=7wvEH%lwO_a;J zag_&@wsvac-pq|y5M|v>nQ;npU0MVt5#bWef{x{dK?wk45O(@F9s*KC%T74ilo?WL z0Yy)K2I|B+ZcxO@G0PUX)pdkDAJ}_oI9dfUBPeL(!kJ+Am z93_dADrjAEeml-jhd^UY#YX?ul{Mw}vC-8DH$N1>YIB!FS5ZB#83}ospchCr<|WsTjjl{s4F%v< z<`qO&P(@FC(lHeedF`NQ=Iki}IswbWPI?w^aJo zw^!Pjedu_m4!OQ?y#+hvM_k)nO)k;-FXtQ1KREX}FL7>iwla0j8P0U^UGYir7V&cN zG%+mt#AV`qu~r-_j&gkJc*F6$;}OU0j!T)_9lIUd9bJy29ktA*rdr2Xhnd-K|C{|j z`!0Krz1Ci6x7j|iy=;5TRARf$cA0IrZ7Z_|P6w>C9c7zh8*59m@z$@cuUhw7&$Di^ zc3T(0Splo%pO$AWck{1UuD4udIfIEgMVQVJPgas4d&_QVsn<+CVV5jC%h-;Y%;GCpR$hms3T%ucjW3k5L24NrV<&j9EaO)* zV>P951&kV%R~6&t0=|Z2lh``wJU3s@V7z2*?@8Hw6$Xg)<`!A_bi}}ciM~;M5df%x zi|IMMhh=2}QzaO^l(=9&dNzyqFib2)|6m$lqGn^iWmY<0qE?N2&N6 (n=27?<}H z`dwV!e)NpK1<;!VF1~=_nnDIuov-L7baQOhnP@jrVJg&ypqD^jktC zs1n&1Ah`?BX@u*V0>w#yPR-yaA|@s(Iy#rHA~sm8^9o%wfnUb54aBXb-F37tZi7rX z4+@N?8x8dCc)lqSXiI%0+^>SYlcYxY-C%#W9`x->es!W6F;pPv-%5hEYRzvI@pBS^ zs}Khgn4st(^tj9}=uf9E{DB_RTc-g02(jqm;?C)$@f032bPh2qA@E-)f_`Krw-ee$ z3^i>))Re}T!VqcV%dSy;31Tz{1jZ7*A%&TpM0~XlICOR)KZjwG$72OTf|vTL&<@i7 zM9wmFrj5^pitwI(18Gx=!)K)PWstAiJ+CK{uk4wRBON1?lCENQ01X{WN{FhpmK;cKB$%`s=q=KI(xzEfWa@=p#dCq8i7QOq|chF4C}uFdCb z^dRcqW79akF=kUl+fzW$HncsijW{pX$whpFzKz)POx0v%*7mxuU*xl)aeOQq?MF|M zeN6n3n~KEwh3?sWh-H&`6Cy*zf#B=W_!QI`^kyv|NRBIEy4AHq#e5@Wt0{dL=yfyf z$gB{~&*7^Pli-|$gJ@aYm~viY6j9XD$pF^I%tgmA8OY)^zh(ZVIci>NE)qT$ej}VE zbP3b=bwa6-DR8DwOs|>tn|@`w+O*TO!L-V>&~&6}yvf8b<$vkwa<#Z>;Hv?< z^F!zJ&ikAr&K1s?&P?$i;y!V=*elNCXEPaMIq&Ar5iO1n9KQo^!5&B0;dLx@cpSx! z3Z6`ixP00n5rh7KUX^uFdRQEVed$ z>KTC_7|zYtv1~H`Fie2c3;8-GDZoi+WGs|3$tsAPNR~$R+y_UjS8>_!(7 z%_lhPSma5KYaqJ zM)v=r9cU+^Le7XBuY2te5S@WbAwG$2BC1Whug7YKe*WPnivum|V_4dZ;+90O&gD;J z*>=cCqCyg9E1G~ot&)9*^ za9s*Mqj*1N%v_L7Uf4XlNlWT9fqp=4A+h7ZxkO*blI_G0?7~CC-fkSp2ABe3n(AXB zlG`hd$s(4vTCEfbQOYy(`03a=mEc>H&Ro7)TcoTw5yK${oJWR3Y;fTJU56NK4D_EF zsdG#|LqBT@-<`}!qe7DzDS2q-P2oFPR=WXegZMn%0d+143};1#+)Ny&xi zazcUbbhMcQ$Dh_g=M$?})ii|L>ZtV)+e|IieyrL}*r}FLB_$t#LYI+!e{8W@br-S6 zW6Cu$aSAmp6q=Qy$d(d*As8J>iSlWv`ibf)?|6PmLKu(arzF9brWWE-Pf(Q%rvEmw z`Jmul?H7?tD)_duY&?V|MW@-7HiTuhWrEy=FF01DI z4i2mT)bi+<(NK84a#gaDMNKs7sg6@O@q(zIzl@7TrM517+)Uj20M!^ol)~X%ej{ImW7r==2Pe6TsODG zl;zBGT;)8U{iE~G=3lw~$aadyvfr~GvsS*1KaahiA7^UgrgI;2FY}wY2lx)|3jPYG z-TWH=1>5F~m~Y@;U>7?5uJf4JxD0+i|F&zp`C?bLc?t6yQ;n&Nxxsw4d9`@EI3jKo zj}yn*-!@O=zh?{CHywkPM;vp_J+^agi|yaq#@p|W^=UCHi zAGw02XG{;9>#VG8#P+)F_mz zXpORay%OFQYgZU~X}SUms^gXD<*WydQDsc0zb?z;YS_d9qDynR={OW5FF#Z~u;^Wq z!A*<{$XuMoRpFxsG5+j}*!!(qCJC#cTkTw~W2FcLwY;Fphz#n=h#*q%i zUM>BN136cX;!0R;7~tHo+#F~>+40G9aC;hu?b$h8weEn0%*3;Bw@FMz>;J>uz8yC& z#Sm_bA^&Flt_f${kjZ&idDcnJk`TJi$rY-hEp#oeka~pC4*qon$Nn%EXh28VhT^90 zz|{eB^-+h@FtjFD4mq4!#5L;r7V82<+xdL1mNpb0&-$fOrV0&SFEJr^s{|_g4(H!B znk$nC$NC6o-Rb5Ub)Mr`Do*ClE9B}amX_D5p#56UFIAH6RR&2r4{)n{$8fV1LZrJf zsJey1`xH^!hligqTH}zx_`k~KYV=gg-knW0E>{XEZZyA#OdHd)v&e6D$U3fS{H9L95DnF&6nss0UwXYuk73pT&H!4(3kMfR?!CAq%D#Zw+uXB>tz;jRv_>9FCpLXD7uETL?fRau?yQIIt0%M%?r1=zUMoJ$>p-!+F)^9#5+$&aiEcpNpSWK7s_ zkWX3hK#o%h6LVO8TJpMR7jXS{4T@KfA)*md_SUNnC3445l zHyLf3Z+tYtrslv<@_^9)9Lb%0FvKN9gC>k8eeK~olA%+yrC#+Y-&ZO6v)DiAC-)GL zp8uLh>R0I0a91L9mZzahsA>uSVPwMf?7F z7^pF!zJH|Zl-g=cobSVG&VLBB>iYNhsa#(&oFoyx4^m8SiV_pvdq0I*irdh=m!kHB zySl&Oo#G+HxBiOVAIhPY*YF!&ddXLUuM&-|`#=)Cg562+M_dBvFA0GEjEx<#Ws+?e z^s@OGYIEV1=xz#>y-E9q{)9Ijk^>O?f*CX3r7K}R*-fj|`A58pNXq^NY(2$+!pua^ zV_z=bN@&9kf53Kvl!<|!v$&~UtV9VITYSeDAsH8b9}kS4wroH=c6P!3l*S?CM(KsN zXg@}Rbpl__B;VBXBz8?I{m@4?pKxA@c$sImP>hB(bOM}b^hE#(I*vQkIgUiOPt41fbZHWU^7ON95w(Jr` zJ8?Vm+wt0$0QRG5_r6L*)L+as9posQ4f7}2L9|>vee}oBeu0Tnrt2AaCzW6_4r9|> zlMj+Tgt-e@(%oAY(ys2?a@8r=o6pT=@O)A)a8@>HTd~D2m66SKWezu8&d|kHJ=y|o z6mX*YS#=88c`H;Z1zU=^g_=5*P_P<)_m1P1B!ZBm>O>S;up>ilT&YF| z(uqg&!GN_Qv!sk`OIWjJbB&#Hi?J^{5e0J4y$XwV5`Z}s+{(mdu>tpGQ@Fl^Lh8cp zN9#GSux3?~{3hbXP(})Siy)Mt1lq^NpwYO`U{3+w$3yqDaq@Mr^%_ic*0YmTqIeY* zY1o{?9dZ!oN+ySwGL13>&BK)7P;QRj;a)Su& z{@>_2%9ZAP-Fd5XqqE-0iNAy0|Iwn&vEOmBqsGD5AGV)vUuw^Q8~v|@v-l;}53HA2 zS6B-zA6RaI=>9bGx8`@u7n+YZcbn&#$C<6d2g2`#>xDCg4Z?C^nlJ{wBKXkslIaoC z<))3MWu`I{;$P(-=C9yS;=K^VF9kE>pWJ@#R&EcFWBfBX@blxq*b%sO3|~2@(F0gF zPYikKtRRG%AM{7G7@39f8}&@TGy+I->fAmKAVk6_3CLWcUK47-g~R z>#|1R9x?UuI=Nu{DVZa1ml(cA7I=drs9xI#>K zy`@wJclzXvz%^pz)>`E(8$pAjtP!|I3=<+>aY72-{(7Kf1TGQ7L#f#pC`=`n-qs$N z*_k&2SBl|FmNnaNa=TFN+hXb15x7JQ)2yii3qQqv?c^hKM&JrDd=HSav8P3^Ja$h0 z2wWT%bH}NK_;N@7*b%rVjMN_niZ9Y!$mcSE7X*-#B};-Z=rLYsiv8f%+ona~QnFMu>s-Mgt3X;HW$ zEd>wsK5dG2Q>9~G6s}R*ki5lI4sKe>b(7XtN8!G;wu4ln7x}9nbRQ9g>)29AT4L8X zZS?Ye8*8I*Wm{+RMicnKDek3Bw@r(}&2A}}rFV)`wDZ6JWLgw1drN_)_mESxbMr2o z8-=Uj29r~o++9wq*nQdl>L^?nmx9AO-!jG8xpaGD6z-7Ql%iqPrJcx;PU|^!Q=~Bp z_stzfJuzN&TF+4@|9Nf{Zl+7c2$h}~7dx$@@pqe#jKUpu{zK|g0-iK%Y^jUF^>%&9 zD@fvervx1N?7Oq0eJK@OLQg!!p8evOnrLrIbsp!IrP&uIlkzB|ZwLO2;3y01|6g?7=o*0NzSH@P^DJjK-1x_c&x%)x!|*Er z?P8-?EslZT0eH`{-SML1UdIKFQys&O)sA`atA82xZ|!f|AG6lxM) ztjAebS{GQSTT871{A$1xKfev2(IbNc1_uld7#uJ-@c$qO$gMLPcO2M7a2-eq`Djw> z@nnk0?P3}~CsRZ|_154j{+~1^`~UiFJ8>UpCino8bV)tEVBE-~97*`!ej^WjA&;c< zEaU_BWM?9>fAr-%^qvE7tHu0K6aLmWSs7eW@Ry`zPodwF&z&{iP26QT9{l=|tK4(JSNzQhnY1L*(`<$dnFva2Co&-6;JUQtQz43e^Rk^Bmeu1FiVub4o)5aZQlII5depDn|XJCAVn_;$BBp&J1UQ_fx_58_6yCUPJ@|B{mC-WUiYe?WBMPH@r mTZ~^6{c9G#A!+R?y`kvKRM*)MRK>-BzDPw=jQbIN`hNiQ>nQC2 literal 0 HcmV?d00001 diff --git a/otelcollector/otel-allocator/server/bench_test.go b/otelcollector/otel-allocator/server/bench_test.go index e2b90c136..8fcea90b0 100644 --- a/otelcollector/otel-allocator/server/bench_test.go +++ b/otelcollector/otel-allocator/server/bench_test.go @@ -54,7 +54,7 @@ func BenchmarkServerTargetsHandler(b *testing.B) { listenAddr := ":8080" a.SetCollectors(cols) a.SetTargets(targets) - s := NewServer(logger, a, &listenAddr) + s := NewServer(logger, a, listenAddr) b.Run(fmt.Sprintf("%s_num_cols_%d_num_jobs_%d", allocatorName, v.numCollectors, v.numJobs), func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { diff --git a/otelcollector/otel-allocator/server/server.go b/otelcollector/otel-allocator/server/server.go index 8351a85d3..9dda8347a 100644 --- a/otelcollector/otel-allocator/server/server.go +++ b/otelcollector/otel-allocator/server/server.go @@ -71,7 +71,7 @@ type Server struct { scrapeConfigResponse []byte } -func NewServer(log logr.Logger, allocator allocation.Allocator, listenAddr *string) *Server { +func NewServer(log logr.Logger, allocator allocation.Allocator, listenAddr string) *Server { s := &Server{ logger: log, allocator: allocator, @@ -88,9 +88,11 @@ func NewServer(log logr.Logger, allocator allocation.Allocator, listenAddr *stri router.GET("/jobs", s.JobHandler) router.GET("/jobs/:job_id/targets", s.TargetsHandler) router.GET("/metrics", gin.WrapH(promhttp.Handler())) + router.GET("/livez", s.LivenessProbeHandler) + router.GET("/readyz", s.ReadinessProbeHandler) registerPprof(router.Group("/debug/pprof/")) - s.server = &http.Server{Addr: *listenAddr, Handler: router, ReadHeaderTimeout: 90 * time.Second} + s.server = &http.Server{Addr: listenAddr, Handler: router, ReadHeaderTimeout: 90 * time.Second} return s } @@ -138,6 +140,18 @@ func (s *Server) ScrapeConfigsHandler(c *gin.Context) { } } +func (s *Server) ReadinessProbeHandler(c *gin.Context) { + s.mtx.RLock() + result := s.scrapeConfigResponse + s.mtx.RUnlock() + + if result != nil { + c.Status(http.StatusOK) + } else { + c.Status(http.StatusServiceUnavailable) + } +} + func (s *Server) JobHandler(c *gin.Context) { displayData := make(map[string]target.LinkJSON) for _, v := range s.allocator.TargetItems() { @@ -146,6 +160,10 @@ func (s *Server) JobHandler(c *gin.Context) { s.jsonHandler(c.Writer, displayData) } +func (s *Server) LivenessProbeHandler(c *gin.Context) { + c.Status(http.StatusOK) +} + func (s *Server) PrometheusMiddleware(c *gin.Context) { path := c.FullPath() timer := prometheus.NewTimer(httpDuration.WithLabelValues(path)) diff --git a/otelcollector/otel-allocator/server/server_test.go b/otelcollector/otel-allocator/server/server_test.go index c58f5dc6b..edda74e07 100644 --- a/otelcollector/otel-allocator/server/server_test.go +++ b/otelcollector/otel-allocator/server/server_test.go @@ -50,6 +50,19 @@ var ( testJobTargetItemTwo = target.NewItem("test-job", "test-url2", testJobLabelSetTwo, "test-collector2") ) +func TestServer_LivenessProbeHandler(t *testing.T) { + leastWeighted, _ := allocation.New("least-weighted", logger) + listenAddr := ":8080" + s := NewServer(logger, leastWeighted, listenAddr) + request := httptest.NewRequest("GET", "/livez", nil) + w := httptest.NewRecorder() + + s.server.Handler.ServeHTTP(w, request) + result := w.Result() + + assert.Equal(t, http.StatusOK, result.StatusCode) +} + func TestServer_TargetsHandler(t *testing.T) { leastWeighted, _ := allocation.New("least-weighted", logger) type args struct { @@ -154,7 +167,7 @@ func TestServer_TargetsHandler(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { listenAddr := ":8080" - s := NewServer(logger, tt.args.allocator, &listenAddr) + s := NewServer(logger, tt.args.allocator, listenAddr) tt.args.allocator.SetCollectors(map[string]*allocation.Collector{"test-collector": {Name: "test-collector"}}) tt.args.allocator.SetTargets(tt.args.cMap) request := httptest.NewRequest("GET", fmt.Sprintf("/jobs/%s/targets?collector_id=%s", tt.args.job, tt.args.collector), nil) @@ -445,7 +458,7 @@ func TestServer_ScrapeConfigsHandler(t *testing.T) { for _, tc := range tests { t.Run(tc.description, func(t *testing.T) { listenAddr := ":8080" - s := NewServer(logger, nil, &listenAddr) + s := NewServer(logger, nil, listenAddr) assert.NoError(t, s.UpdateScrapeConfigResponse(tc.scrapeConfigs)) request := httptest.NewRequest("GET", "/scrape_configs", nil) @@ -518,7 +531,7 @@ func TestServer_JobHandler(t *testing.T) { t.Run(tc.description, func(t *testing.T) { listenAddr := ":8080" a := &mockAllocator{targetItems: tc.targetItems} - s := NewServer(logger, a, &listenAddr) + s := NewServer(logger, a, listenAddr) request := httptest.NewRequest("GET", "/jobs", nil) w := httptest.NewRecorder() @@ -535,6 +548,69 @@ func TestServer_JobHandler(t *testing.T) { }) } } +func TestServer_Readiness(t *testing.T) { + tests := []struct { + description string + scrapeConfigs map[string]*promconfig.ScrapeConfig + expectedCode int + expectedBody []byte + }{ + { + description: "nil scrape config", + scrapeConfigs: nil, + expectedCode: http.StatusServiceUnavailable, + }, + { + description: "empty scrape config", + scrapeConfigs: map[string]*promconfig.ScrapeConfig{}, + expectedCode: http.StatusOK, + }, + { + description: "single entry", + scrapeConfigs: map[string]*promconfig.ScrapeConfig{ + "serviceMonitor/testapp/testapp/0": { + JobName: "serviceMonitor/testapp/testapp/0", + HonorTimestamps: true, + ScrapeInterval: model.Duration(30 * time.Second), + ScrapeTimeout: model.Duration(30 * time.Second), + MetricsPath: "/metrics", + Scheme: "http", + HTTPClientConfig: config.HTTPClientConfig{ + FollowRedirects: true, + }, + RelabelConfigs: []*relabel.Config{ + { + SourceLabels: model.LabelNames{model.LabelName("job")}, + Separator: ";", + Regex: relabel.MustNewRegexp("(.*)"), + TargetLabel: "__tmp_prometheus_job_name", + Replacement: "$$1", + Action: relabel.Replace, + }, + }, + }, + }, + expectedCode: http.StatusOK, + }, + } + for _, tc := range tests { + t.Run(tc.description, func(t *testing.T) { + listenAddr := ":8080" + s := NewServer(logger, nil, listenAddr) + if tc.scrapeConfigs != nil { + assert.NoError(t, s.UpdateScrapeConfigResponse(tc.scrapeConfigs)) + } + + request := httptest.NewRequest("GET", "/readyz", nil) + w := httptest.NewRecorder() + + s.server.Handler.ServeHTTP(w, request) + result := w.Result() + + assert.Equal(t, tc.expectedCode, result.StatusCode) + }) + } +} func newLink(jobName string) target.LinkJSON { return target.LinkJSON{Link: fmt.Sprintf("/jobs/%s/targets", url.QueryEscape(jobName))} diff --git a/otelcollector/otel-allocator/target/discovery.go b/otelcollector/otel-allocator/target/discovery.go index 058a099b9..9b16f9b69 100644 --- a/otelcollector/otel-allocator/target/discovery.go +++ b/otelcollector/otel-allocator/target/discovery.go @@ -15,7 +15,9 @@ package target import ( - "github.com/cnf/structhash" + "hash" + "hash/fnv" + "github.com/go-logr/logr" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -23,6 +25,7 @@ import ( "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/discovery" "github.com/prometheus/prometheus/model/relabel" + "gopkg.in/yaml.v3" allocatorWatcher "github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/watcher" ) @@ -40,7 +43,7 @@ type Discoverer struct { close chan struct{} configsMap map[allocatorWatcher.EventSource]*config.Config hook discoveryHook - scrapeConfigsHash string + scrapeConfigsHash hash.Hash scrapeConfigsUpdater scrapeConfigsUpdater } @@ -82,14 +85,13 @@ func (m *Discoverer) ApplyConfig(source allocatorWatcher.EventSource, cfg *confi } } - hash, err := structhash.Hash(jobToScrapeConfig, 1) + hash, err := getScrapeConfigHash(jobToScrapeConfig) if err != nil { return err } // If the hash has changed, updated stored hash and send the new config. // Otherwise skip updating scrape configs. if m.scrapeConfigsUpdater != nil && m.scrapeConfigsHash != hash { - m.log.Info("ScrapeConfig hash is different, updating new scrapeconfig detected for ", "source", source.String()) err := m.scrapeConfigsUpdater.UpdateScrapeConfigResponse(jobToScrapeConfig) if err != nil { return err @@ -132,3 +134,23 @@ func (m *Discoverer) Watch(fn func(targets map[string]*Item)) error { func (m *Discoverer) Close() { close(m.close) } + +// Calculate a hash for a scrape config map. +// This is done by marshaling to YAML because it's the most straightforward and doesn't run into problems with unexported fields. +func getScrapeConfigHash(jobToScrapeConfig map[string]*config.ScrapeConfig) (hash.Hash64, error) { + var err error + hash := fnv.New64() + yamlEncoder := yaml.NewEncoder(hash) + for jobName, scrapeConfig := range jobToScrapeConfig { + _, err = hash.Write([]byte(jobName)) + if err != nil { + return nil, err + } + err = yamlEncoder.Encode(scrapeConfig) + if err != nil { + return nil, err + } + } + yamlEncoder.Close() + return hash, err +} diff --git a/otelcollector/otel-allocator/target/discovery_test.go b/otelcollector/otel-allocator/target/discovery_test.go index 49bfaa471..506fb01b5 100644 --- a/otelcollector/otel-allocator/target/discovery_test.go +++ b/otelcollector/otel-allocator/target/discovery_test.go @@ -17,6 +17,7 @@ package target import ( "context" "errors" + "hash" "sort" "testing" "time" @@ -63,13 +64,14 @@ func TestDiscovery(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) d := discovery.NewManager(ctx, gokitlog.NewNopLogger()) manager := NewDiscoverer(ctrl.Log.WithName("test"), d, nil, scu) - defer close(manager.close) + + defer func() { manager.Close() }() defer cancelFunc() results := make(chan []string) go func() { err := d.Run() - assert.NoError(t, err) + assert.Error(t, err) }() go func() { err := manager.Watch(func(targets map[string]*Item) { @@ -83,10 +85,11 @@ func TestDiscovery(t *testing.T) { }() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - cfg, err := config.Load(tt.args.file) + cfg := config.CreateDefaultConfig() + err := config.LoadFromFile(tt.args.file, &cfg) assert.NoError(t, err) - assert.True(t, len(cfg.Config.ScrapeConfigs) > 0) - err = manager.ApplyConfig(allocatorWatcher.EventSourcePrometheusCR, cfg.Config) + assert.True(t, len(cfg.PromConfig.ScrapeConfigs) > 0) + err = manager.ApplyConfig(allocatorWatcher.EventSourcePrometheusCR, cfg.PromConfig) assert.NoError(t, err) gotTargets := <-results @@ -96,7 +99,7 @@ func TestDiscovery(t *testing.T) { // check the updated scrape configs expectedScrapeConfigs := map[string]*promconfig.ScrapeConfig{} - for _, scrapeConfig := range cfg.Config.ScrapeConfigs { + for _, scrapeConfig := range cfg.PromConfig.ScrapeConfigs { expectedScrapeConfigs[scrapeConfig.JobName] = scrapeConfig } assert.Equal(t, expectedScrapeConfigs, scu.mockCfg) @@ -251,6 +254,33 @@ func TestDiscovery_ScrapeConfigHashing(t *testing.T) { }, }, }, + { + description: "different regex", + cfg: &promconfig.Config{ + ScrapeConfigs: []*promconfig.ScrapeConfig{ + { + JobName: "serviceMonitor/testapp/testapp/1", + HonorTimestamps: false, + ScrapeTimeout: model.Duration(30 * time.Second), + MetricsPath: "/metrics", + Scheme: "http", + HTTPClientConfig: commonconfig.HTTPClientConfig{ + FollowRedirects: true, + }, + RelabelConfigs: []*relabel.Config{ + { + SourceLabels: model.LabelNames{model.LabelName("job")}, + Separator: ";", + Regex: relabel.MustNewRegexp("(.+)"), + TargetLabel: "__tmp_prometheus_job_name", + Replacement: "$$1", + Action: relabel.Replace, + }, + }, + }, + }, + }, + }, { description: "mock error on update - no hash update", cfg: &promconfig.Config{ @@ -262,39 +292,9 @@ func TestDiscovery_ScrapeConfigHashing(t *testing.T) { }, expectErr: true, }, - // { - // TODO: fix handler logic so this test passes. - // This test currently fails due to the regexp struct not having any - // exported fields for the hashing algorithm to hash on, causing the - // hashes to be the same even though the data is different. - // description: "different regex", - // cfg: &promconfig.Config{ - // ScrapeConfigs: []*promconfig.ScrapeConfig{ - // { - // JobName: "serviceMonitor/testapp/testapp/1", - // HonorTimestamps: false, - // ScrapeTimeout: model.Duration(30 * time.Second), - // MetricsPath: "/metrics", - // HTTPClientConfig: commonconfig.HTTPClientConfig{ - // FollowRedirects: true, - // }, - // RelabelConfigs: []*relabel.Config{ - // { - // SourceLabels: model.LabelNames{model.LabelName("job")}, - // Separator: ";", - // Regex: relabel.MustNewRegexp("something else"), - // TargetLabel: "__tmp_prometheus_job_name", - // Replacement: "$$1", - // Action: relabel.Replace, - // }, - // }, - // }, - // }, - // }, - // }, } var ( - lastValidHash uint64 + lastValidHash hash.Hash expectedConfig map[string]*promconfig.ScrapeConfig lastValidConfig map[string]*promconfig.ScrapeConfig ) @@ -344,7 +344,7 @@ func TestDiscovery_NoConfig(t *testing.T) { go func() { err := d.Run() - assert.NoError(t, err) + assert.Error(t, err) }() // check the updated scrape configs expectedScrapeConfigs := map[string]*promconfig.ScrapeConfig{} diff --git a/otelcollector/otel-allocator/watcher/file.go b/otelcollector/otel-allocator/watcher/file.go index 432da481f..ef7ea166b 100644 --- a/otelcollector/otel-allocator/watcher/file.go +++ b/otelcollector/otel-allocator/watcher/file.go @@ -34,7 +34,7 @@ type FileWatcher struct { closer chan bool } -func NewFileWatcher(logger logr.Logger, config config.CLIConfig) (*FileWatcher, error) { +func NewFileWatcher(logger logr.Logger, configFilePath string) (*FileWatcher, error) { fileWatcher, err := fsnotify.NewWatcher() if err != nil { logger.Error(err, "Can't start the watcher") @@ -43,19 +43,20 @@ func NewFileWatcher(logger logr.Logger, config config.CLIConfig) (*FileWatcher, return &FileWatcher{ logger: logger, - configFilePath: *config.ConfigFilePath, + configFilePath: configFilePath, watcher: fileWatcher, closer: make(chan bool), }, nil } func (f *FileWatcher) LoadConfig(_ context.Context) (*promconfig.Config, error) { - cfg, err := config.Load(f.configFilePath) + cfg := config.CreateDefaultConfig() + err := config.LoadFromFile(f.configFilePath, &cfg) if err != nil { f.logger.Error(err, "Unable to load configuration") return nil, err } - return cfg.Config, nil + return cfg.PromConfig, nil } func (f *FileWatcher) Watch(upstreamEvents chan Event, upstreamErrors chan error) error { @@ -63,6 +64,7 @@ func (f *FileWatcher) Watch(upstreamEvents chan Event, upstreamErrors chan error if err != nil { return err } + for { select { case <-f.closer: diff --git a/otelcollector/otel-allocator/watcher/promOperator.go b/otelcollector/otel-allocator/watcher/promOperator.go index 019593a22..9f916c881 100644 --- a/otelcollector/otel-allocator/watcher/promOperator.go +++ b/otelcollector/otel-allocator/watcher/promOperator.go @@ -18,10 +18,11 @@ import ( "context" "fmt" "os" + "time" "github.com/go-kit/log" - "github.com/go-logr/logr" "github.com/go-kit/log/level" + "github.com/go-logr/logr" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" promv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" "github.com/prometheus-operator/prometheus-operator/pkg/assets" @@ -39,13 +40,15 @@ import ( allocatorconfig "github.com/open-telemetry/opentelemetry-operator/cmd/otel-allocator/config" ) -func NewPrometheusCRWatcher(logger logr.Logger, cfg allocatorconfig.Config, cliConfig allocatorconfig.CLIConfig) (*PrometheusCRWatcher, error) { - mClient, err := monitoringclient.NewForConfig(cliConfig.ClusterConfig) +const minEventInterval = time.Second * 5 + +func NewPrometheusCRWatcher(logger logr.Logger, cfg allocatorconfig.Config) (*PrometheusCRWatcher, error) { + mClient, err := monitoringclient.NewForConfig(cfg.ClusterConfig) if err != nil { return nil, err } - clientset, err := kubernetes.NewForConfig(cliConfig.ClusterConfig) + clientset, err := kubernetes.NewForConfig(cfg.ClusterConfig) if err != nil { return nil, err } @@ -65,9 +68,10 @@ func NewPrometheusCRWatcher(logger logr.Logger, cfg allocatorconfig.Config, cliC }, }, } - promOperatorLogger := level.NewFilter(log.NewLogfmtLogger(os.Stderr), level.AllowWarn()) + promOperatorLogger := level.NewFilter(log.NewLogfmtLogger(os.Stderr), level.AllowWarn()) generator, err := prometheus.NewConfigGenerator(promOperatorLogger, prom, true) + if err != nil { return nil, err } @@ -82,8 +86,9 @@ func NewPrometheusCRWatcher(logger logr.Logger, cfg allocatorconfig.Config, cliC k8sClient: clientset, informers: monitoringInformers, stopChannel: make(chan struct{}), + eventInterval: minEventInterval, configGenerator: generator, - kubeConfigPath: cliConfig.KubeConfigFilePath, + kubeConfigPath: cfg.KubeConfigFilePath, serviceMonitorSelector: servMonSelector, podMonitorSelector: podMonSelector, }, nil @@ -94,6 +99,7 @@ type PrometheusCRWatcher struct { kubeMonitoringClient monitoringclient.Interface k8sClient kubernetes.Interface informers map[string]*informers.ForResource + eventInterval time.Duration stopChannel chan struct{} configGenerator *prometheus.ConfigGenerator kubeConfigPath string @@ -129,11 +135,9 @@ func getInformers(factory informers.FactoriesForNamespaces) (map[string]*informe // Watch wrapped informers and wait for an initial sync. func (w *PrometheusCRWatcher) Watch(upstreamEvents chan Event, upstreamErrors chan error) error { - event := Event{ - Source: EventSourcePrometheusCR, - Watcher: Watcher(w), - } success := true + // this channel needs to be buffered because notifications are asynchronous and neither producers nor consumers wait + notifyEvents := make(chan struct{}, 1) for name, resource := range w.informers { resource.Start(w.stopChannel) @@ -141,25 +145,74 @@ func (w *PrometheusCRWatcher) Watch(upstreamEvents chan Event, upstreamErrors ch if ok := cache.WaitForNamedCacheSync(name, w.stopChannel, resource.HasSynced); !ok { success = false } + + // only send an event notification if there isn't one already resource.AddEventHandler(cache.ResourceEventHandlerFuncs{ + // these functions only write to the notification channel if it's empty to avoid blocking + // if scrape config updates are being rate-limited AddFunc: func(obj interface{}) { - upstreamEvents <- event + select { + case notifyEvents <- struct{}{}: + default: + } }, UpdateFunc: func(oldObj, newObj interface{}) { - upstreamEvents <- event + select { + case notifyEvents <- struct{}{}: + default: + } }, DeleteFunc: func(obj interface{}) { - upstreamEvents <- event + select { + case notifyEvents <- struct{}{}: + default: + } }, }) } if !success { return fmt.Errorf("failed to sync cache") } + + // limit the rate of outgoing events + w.rateLimitedEventSender(upstreamEvents, notifyEvents) + <-w.stopChannel return nil } +// rateLimitedEventSender sends events to the upstreamEvents channel whenever it gets a notification on the notifyEvents channel, +// but not more frequently than once per w.eventPeriod. +func (w *PrometheusCRWatcher) rateLimitedEventSender(upstreamEvents chan Event, notifyEvents chan struct{}) { + ticker := time.NewTicker(w.eventInterval) + defer ticker.Stop() + + event := Event{ + Source: EventSourcePrometheusCR, + Watcher: Watcher(w), + } + + for { + select { + case <-w.stopChannel: + return + case <-ticker.C: // throttle events to avoid excessive updates + select { + case <-notifyEvents: + select { + case upstreamEvents <- event: + default: // put the notification back in the queue if we can't send it upstream + select { + case notifyEvents <- struct{}{}: + default: + } + } + default: + } + } + } +} + func (w *PrometheusCRWatcher) Close() error { close(w.stopChannel) return nil @@ -287,7 +340,7 @@ func (w *PrometheusCRWatcher) addStoreAssetsForPodMonitor( for i, endp := range podMetricsEndps { objKey := fmt.Sprintf("podMonitor/%s/%s/%d", pmNamespace, pmName, i) - if err = store.AddBearerToken(ctx, pmNamespace, endp.BearerTokenSecret, objKey); err != nil { + if err = store.AddBearerToken(ctx, pmNamespace, &endp.BearerTokenSecret, objKey); err != nil { break } diff --git a/otelcollector/otel-allocator/watcher/promOperator_test.go b/otelcollector/otel-allocator/watcher/promOperator_test.go index aafdfe35c..5aa05c23f 100644 --- a/otelcollector/otel-allocator/watcher/promOperator_test.go +++ b/otelcollector/otel-allocator/watcher/promOperator_test.go @@ -30,9 +30,11 @@ import ( "github.com/prometheus/prometheus/discovery" kubeDiscovery "github.com/prometheus/prometheus/discovery/kubernetes" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" + "k8s.io/client-go/tools/cache" ) func TestLoadConfig(t *testing.T) { @@ -244,7 +246,7 @@ func TestLoadConfig(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - w := getTestPrometheuCRWatcher(t, tt.serviceMonitor, tt.podMonitor) + w := getTestPrometheusCRWatcher(t, tt.serviceMonitor, tt.podMonitor) for _, informer := range w.informers { // Start informers in order to populate cache. informer.Start(w.stopChannel) @@ -266,9 +268,89 @@ func TestLoadConfig(t *testing.T) { } } +func TestRateLimit(t *testing.T) { + var err error + serviceMonitor := &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "simple", + Namespace: "test", + }, + Spec: monitoringv1.ServiceMonitorSpec{ + JobLabel: "test", + Endpoints: []monitoringv1.Endpoint{ + { + Port: "web", + }, + }, + }, + } + events := make(chan Event, 1) + eventInterval := 5 * time.Millisecond + + w := getTestPrometheusCRWatcher(t, nil, nil) + defer w.Close() + w.eventInterval = eventInterval + + go func() { + watchErr := w.Watch(events, make(chan error)) + require.NoError(t, watchErr) + }() + // we don't have a simple way to wait for the watch to actually add event handlers to the informer, + // instead, we just update a ServiceMonitor periodically and wait until we get a notification + _, err = w.kubeMonitoringClient.MonitoringV1().ServiceMonitors("test").Create(context.Background(), serviceMonitor, metav1.CreateOptions{}) + require.NoError(t, err) + + // wait for cache sync first + for _, informer := range w.informers { + success := cache.WaitForCacheSync(w.stopChannel, informer.HasSynced) + require.True(t, success) + } + + require.Eventually(t, func() bool { + _, createErr := w.kubeMonitoringClient.MonitoringV1().ServiceMonitors("test").Update(context.Background(), serviceMonitor, metav1.UpdateOptions{}) + if createErr != nil { + return false + } + select { + case <-events: + return true + default: + return false + } + }, eventInterval*2, time.Millisecond) + + // it's difficult to measure the rate precisely + // what we do, is send two updates, and then assert that the elapsed time is between eventInterval and 3*eventInterval + startTime := time.Now() + _, err = w.kubeMonitoringClient.MonitoringV1().ServiceMonitors("test").Update(context.Background(), serviceMonitor, metav1.UpdateOptions{}) + require.NoError(t, err) + require.Eventually(t, func() bool { + select { + case <-events: + return true + default: + return false + } + }, eventInterval*2, time.Millisecond) + _, err = w.kubeMonitoringClient.MonitoringV1().ServiceMonitors("test").Update(context.Background(), serviceMonitor, metav1.UpdateOptions{}) + require.NoError(t, err) + require.Eventually(t, func() bool { + select { + case <-events: + return true + default: + return false + } + }, eventInterval*2, time.Millisecond) + elapsedTime := time.Since(startTime) + assert.Less(t, eventInterval, elapsedTime) + assert.GreaterOrEqual(t, eventInterval*3, elapsedTime) + +} + // getTestPrometheuCRWatcher creates a test instance of PrometheusCRWatcher with fake clients // and test secrets. -func getTestPrometheuCRWatcher(t *testing.T, sm *monitoringv1.ServiceMonitor, pm *monitoringv1.PodMonitor) *PrometheusCRWatcher { +func getTestPrometheusCRWatcher(t *testing.T, sm *monitoringv1.ServiceMonitor, pm *monitoringv1.PodMonitor) *PrometheusCRWatcher { mClient := fakemonitoringclient.NewSimpleClientset() if sm != nil { _, err := mClient.MonitoringV1().ServiceMonitors("test").Create(context.Background(), sm, metav1.CreateOptions{}) From 7c44fbbe494520c6e12c8812af582ed563f1dd52 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 15:19:30 -0800 Subject: [PATCH 03/21] scheduling build --- .pipelines/azure-pipeline-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pipelines/azure-pipeline-build.yml b/.pipelines/azure-pipeline-build.yml index 4e5c206a2..dd1223d00 100644 --- a/.pipelines/azure-pipeline-build.yml +++ b/.pipelines/azure-pipeline-build.yml @@ -2,6 +2,7 @@ trigger: branches: include: - main + - rashmi/ta-wrapperandupgrade pr: autoCancel: true From 085e3a372ca04811327446648b4d3c4358732dbf Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 16:39:26 -0800 Subject: [PATCH 04/21] upgrade otelcollector with has fix from ta fix --- .../linux/configuration-reader/Dockerfile | 4 +- .../PROMETHEUS_VERSION | 2 +- .../opentelemetry-collector-builder/go.mod | 264 +++---- .../opentelemetry-collector-builder/go.sum | 565 +++++++-------- .../opentelemetry-collector-builder/main.go | 10 +- .../prom-config-validator-builder/go.mod | 206 +++--- .../prom-config-validator-builder/go.sum | 214 ++++++ otelcollector/prometheusreceiver/config.go | 26 +- .../prometheusreceiver/config_test.go | 24 +- otelcollector/prometheusreceiver/factory.go | 4 +- .../prometheusreceiver/factory_test.go | 2 +- otelcollector/prometheusreceiver/go.mod | 229 +++--- otelcollector/prometheusreceiver/go.sum | 679 ++++++------------ .../prometheusreceiver/internal/appendable.go | 6 +- .../prometheusreceiver/internal/logger.go | 14 +- .../internal/logger_test.go | 30 +- .../internal/staleness_end_to_end_test.go | 4 +- .../internal/transaction.go | 6 +- .../internal/transaction_test.go | 6 +- .../prometheusreceiver/metrics_receiver.go | 44 +- .../metrics_receiver_helper_test.go | 67 +- .../metrics_receiver_honor_timestamp_test.go | 14 +- .../metrics_receiver_labels_test.go | 26 +- ...ics_receiver_metric_name_normalize_test.go | 4 +- .../metrics_receiver_non_numerical_test.go | 8 +- .../metrics_receiver_open_metrics_test.go | 8 +- .../metrics_receiver_protobuf_test.go | 158 ++++ .../metrics_receiver_target_allocator_test.go | 14 +- .../metrics_receiver_test.go | 55 +- .../metrics_reciever_metric_rename_test.go | 8 +- 30 files changed, 1430 insertions(+), 1271 deletions(-) create mode 100644 otelcollector/prometheusreceiver/metrics_receiver_protobuf_test.go diff --git a/otelcollector/build/linux/configuration-reader/Dockerfile b/otelcollector/build/linux/configuration-reader/Dockerfile index a0369fae8..6f13aeec7 100644 --- a/otelcollector/build/linux/configuration-reader/Dockerfile +++ b/otelcollector/build/linux/configuration-reader/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.19 as prom-config-validator-builder +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.20 as prom-config-validator-builder WORKDIR /src RUN apt-get update && apt-get install gcc-aarch64-linux-gnu -y COPY ./prom-config-validator-builder/go.mod ./prom-config-validator-builder/go.sum ./prom-config-validator-builder/ @@ -13,7 +13,7 @@ COPY ./prometheusreceiver /src/prometheusreceiver ARG TARGETOS TARGETARCH RUN if [ "$TARGETARCH" = "arm64" ] ; then CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -buildmode=pie -ldflags '-linkmode external -extldflags=-Wl,-z,now' -o promconfigvalidator . ; else CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -buildmode=pie -ldflags '-linkmode external -extldflags=-Wl,-z,now' -o promconfigvalidator . ; fi -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.19 as configuration-reader-builder +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.20 as configuration-reader-builder WORKDIR /src RUN apt-get update && apt-get install gcc-aarch64-linux-gnu -y COPY ./configuration-reader-builder/go.mod ./configuration-reader-builder/go.sum ./configuration-reader-builder/ diff --git a/otelcollector/opentelemetry-collector-builder/PROMETHEUS_VERSION b/otelcollector/opentelemetry-collector-builder/PROMETHEUS_VERSION index bb13a7e35..9a9feb084 100644 --- a/otelcollector/opentelemetry-collector-builder/PROMETHEUS_VERSION +++ b/otelcollector/opentelemetry-collector-builder/PROMETHEUS_VERSION @@ -1 +1 @@ -2.47.0 +2.48.0 diff --git a/otelcollector/opentelemetry-collector-builder/go.mod b/otelcollector/opentelemetry-collector-builder/go.mod index 903774ccf..b283e373d 100644 --- a/otelcollector/opentelemetry-collector-builder/go.mod +++ b/otelcollector/opentelemetry-collector-builder/go.mod @@ -1,75 +1,68 @@ module github.com/vishiy/opentelemetry-collector-builder -go 1.17 +go 1.20 replace github.com/gracewehner/prometheusreceiver => ../prometheusreceiver require ( github.com/gracewehner/prometheusreceiver v0.0.0-00010101000000-000000000000 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 - go.opentelemetry.io/collector/component v0.86.0 - go.opentelemetry.io/collector/connector v0.86.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 - go.opentelemetry.io/collector/exporter v0.86.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 - go.opentelemetry.io/collector/extension v0.86.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.86.0 - go.opentelemetry.io/collector/otelcol v0.86.0 - go.opentelemetry.io/collector/processor v0.86.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 - go.opentelemetry.io/collector/receiver v0.86.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 + go.opentelemetry.io/collector/component v0.90.0 + go.opentelemetry.io/collector/connector v0.90.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 + go.opentelemetry.io/collector/exporter v0.90.0 + go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 + go.opentelemetry.io/collector/extension v0.90.0 + go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 + go.opentelemetry.io/collector/otelcol v0.90.0 + go.opentelemetry.io/collector/processor v0.90.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 + go.opentelemetry.io/collector/receiver v0.90.0 ) require ( - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect - github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.45.12 // indirect + github.com/aws/aws-sdk-go v1.48.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect - github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.99.0 // indirect + github.com/digitalocean/godo v1.104.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.6+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/docker v24.0.7+incompatible // indirect + github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea // indirect github.com/docker/go-units v0.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/envoyproxy/go-control-plane v0.11.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/analysis v0.21.4 // indirect @@ -84,23 +77,24 @@ require ( github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gophercloud/gophercloud v1.5.0 // indirect + github.com/gophercloud/gophercloud v1.7.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect - github.com/hashicorp/consul/api v1.24.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect + github.com/hashicorp/consul/api v1.26.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -109,145 +103,151 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e // indirect + github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.0.0 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.4.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.8 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.1.9 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/compress v1.17.3 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/linode/linodego v1.19.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/linode/linodego v1.23.0 // indirect + github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.55 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/miekg/dns v1.1.56 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.1 // indirect + github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/oklog/ulid v1.3.1 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0 // indirect + github.com/onsi/ginkgo/v2 v2.11.0 // indirect + github.com/onsi/gomega v1.27.10 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc4 // indirect - github.com/ovh/go-ovh v1.4.1 // indirect + github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/ovh/go-ovh v1.4.3 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/alertmanager v0.25.0 // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect + github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect + github.com/prometheus/alertmanager v0.26.0 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/common/assets v0.2.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect github.com/prometheus/exporter-toolkit v0.10.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect - github.com/prometheus/prometheus v0.47.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/prometheus v0.48.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect - github.com/rs/cors v1.10.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 // indirect - github.com/shirou/gopsutil/v3 v3.23.8 // indirect + github.com/rs/cors v1.10.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect + github.com/shirou/gopsutil/v3 v3.23.10 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect + github.com/tidwall/gjson v1.14.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.mongodb.org/mongo-driver v1.12.0 // indirect + go.mongodb.org/mongo-driver v1.13.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.86.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.86.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.86.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.86.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.86.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.86.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.86.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.86.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.86.0 // indirect - go.opentelemetry.io/collector/config/internal v0.86.0 // indirect - go.opentelemetry.io/collector/confmap v0.86.0 // indirect - go.opentelemetry.io/collector/consumer v0.86.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.86.0 // indirect - go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015 // indirect - go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 // indirect - go.opentelemetry.io/collector/semconv v0.86.0 // indirect - go.opentelemetry.io/collector/service v0.86.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.19.0 // indirect - go.opentelemetry.io/contrib/zpages v0.44.0 // indirect - go.opentelemetry.io/otel v1.18.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 // indirect - go.opentelemetry.io/otel/metric v1.18.0 // indirect - go.opentelemetry.io/otel/sdk v1.18.0 // indirect - go.opentelemetry.io/otel/sdk/metric v0.41.0 // indirect - go.opentelemetry.io/otel/trace v1.18.0 // indirect + go.opentelemetry.io/collector v0.90.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.90.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.90.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect + go.opentelemetry.io/collector/config/internal v0.90.0 // indirect + go.opentelemetry.io/collector/confmap v0.90.0 // indirect + go.opentelemetry.io/collector/consumer v0.90.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect + go.opentelemetry.io/collector/featuregate v1.0.0 // indirect + go.opentelemetry.io/collector/pdata v1.0.0 // indirect + go.opentelemetry.io/collector/semconv v0.90.0 // indirect + go.opentelemetry.io/collector/service v0.90.0 // indirect + go.opentelemetry.io/contrib/config v0.1.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect + go.opentelemetry.io/contrib/zpages v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/bridge/opencensus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/goleak v1.2.1 // indirect + go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.13.0 // indirect - golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.14.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.4.0 // indirect + golang.org/x/tools v0.16.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/api v0.141.0 // indirect + google.golang.org/api v0.151.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 // indirect - google.golang.org/grpc v1.58.1 // indirect + google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.2 // indirect - k8s.io/apimachinery v0.28.2 // indirect - k8s.io/client-go v0.28.2 // indirect + gotest.tools/v3 v3.5.0 // indirect + k8s.io/api v0.28.4 // indirect + k8s.io/apimachinery v0.28.4 // indirect + k8s.io/client-go v0.28.4 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect diff --git a/otelcollector/opentelemetry-collector-builder/go.sum b/otelcollector/opentelemetry-collector-builder/go.sum index 566090b54..55fe3f60f 100644 --- a/otelcollector/opentelemetry-collector-builder/go.sum +++ b/otelcollector/opentelemetry-collector-builder/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 h1:aRVqY1p2IJaBGStWMsQMpkAa83cPkCDLl80eOj0Rbz4= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68/go.mod h1:1a3eRNYX12fs5UABBIXS8HXVvQbX9hRB/RkEBPORpe8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -37,37 +37,23 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -92,8 +78,8 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= -github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.48.5 h1:cp3inTx9trQNCNZV/Id5S5egpilBXKdF32uKtb1LszI= +github.com/aws/aws-sdk-go v1.48.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -115,11 +101,9 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -127,21 +111,21 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= -github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= +github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= +github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea h1:+4n+kUVbPdu6qMI9SUnSKMC+D50gNW4L7Lhk9tI2lVo= +github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -150,16 +134,16 @@ github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -177,8 +161,8 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -254,11 +238,9 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -294,7 +276,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -310,8 +293,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -326,31 +310,31 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= -github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= +github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= -github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= -github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= -github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= +github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= +github.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A= +github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -383,6 +367,7 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= @@ -391,20 +376,20 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= -github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= +github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= +github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= -github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= +github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -431,8 +416,8 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -454,10 +439,11 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= -github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= +github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -481,13 +467,13 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -512,8 +498,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/mostynb/go-grpc-compression v1.2.1 h1:16tdYxBZSD8p9AUmvw4F7Nyc2T4/eE7XsIXrgxSEcJI= -github.com/mostynb/go-grpc-compression v1.2.1/go.mod h1:oidYvYyefMmhcuvU8fLJ8FfZyTyVzJ6SkmD5fIKgRe8= +github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= +github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -522,39 +508,42 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 h1:pmX1xywF9ZhS8Qo44xp7U4/tEhKJO3c0E20EqfEbhC4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0/go.mod h1:GU9a92SNvLcioVmKa+B6tgxdofn1zaVEYgbCOTN0zE8= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 h1:2nEjzC4LZ0Y0NptV1XyOCkqZ3/ogQ/vQzLUa5QWKijI= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0/go.mod h1:RpGBotLXh2ilbGkWDmd4bp4uPYvG4VcVqEVpIVTynX4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.85.0 h1:6/OlktNNS8X3pL/Ry1pBAjwB4QGXjOm7MvF7Qjucbso= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 h1:JTHKAQLFae3rIXUFPuW9I2uvTlS2FAx2D2t5yTMH0+I= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0/go.mod h1:AOMyqzzvJNqas262U8YuWZhSae+zW2f74/+yuy4zEso= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 h1:X8iSLyznuGeWEN+aVt1Ehwstdw+nbJ347uO+P91O52E= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0/go.mod h1:v78K/hBoKNxtahmrWGCW5F5tlw/XEE9XZ5+nEIf6K4s= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.86.0 h1:g7HlND105lwm7NW8JCxAfbpaFyk1WKcEUUVwchIo9zE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0 h1:HEuJ7hCbLVfoL7xLrGQ2QORvocyFfWuaoDuzyTLwTdc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0/go.mod h1:ss8TG43W1xNke9aeI0uTIVpyXW5OmYslxMj01UMdjR8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 h1:S6b7ToTSFZvVzcabjqoUBqAwair7YuELvBS6mOAopHs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0/go.mod h1:aLQB8gu7vJ1lokUeWoZs9ExpduamPrD3oRbDk7hNg/g= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.86.0 h1:EzGSvuCXAsGpwgeieTVcy1gs0hOlPidhFPcvwcPEU8s= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0 h1:xt/YvYpgssWk2Ix2C9SSXrILIzRqyWe+r5RE348m1fE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0/go.mod h1:fjK1kn7PIDP+TqOIFVEth3w0Eiexx5jIk411c//fYkM= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0 h1:9u4hF+3SE+00aAaaMemlxujFPjmo2o2VeB2+x1Y5rCI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0/go.mod h1:WfLBDz9rENrI1MYCPLmW21Mok23V2iBJP2fZTmJbCx8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0 h1:nnzuEQYlsRIkMPAw1jEl+8L2Is68QQl58QvY2dHHgDU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0/go.mod h1:prodbjWZpQkRcd45W2wkRaryv6JomuuWZUmM6mDj27k= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0 h1:U6jXC1LrqtW7/MLGMRbumuOcwr5g+J3mkngPgyBYEV0= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 h1:IWFGmyeOI/Ux3oBg2iwD5SbNbLgS9JATYGxvCIN2L58= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0/go.mod h1:mxpjy+fw19QBCa9aqipEUY6TrIYgp2THyLj4dmas6Jc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.85.0 h1:8jlK2ASLOVtSkepS2go85uO6lpkijNB57JRFRE/Krd4= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 h1:G2YXTArLUF0STpYZjncq1ZdChkd6nOy5TIdQ3H+/RmY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0/go.mod h1:GKRoieqvf+iICn2AuFDReF6ynYNqxOgglGpGuqcmFdY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 h1:fbczHVkEsOYJ+ZVDQrMtJ31PcdjWRyJ5vM/dmjP+hwY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0/go.mod h1:17AyWbqEB5NAlNtfGWSHKqzI/TjCY4vYUmC0o6sKiPw= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.90.0 h1:HE0TGGOrQ6IKyycbqQorH61sII/lpefgjmlkDs4R7rM= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 h1:MrvzqtUkjOygG1WL3oYLtlJyt0iS9S4yY+U8bFTchNw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0/go.mod h1:IddDLOQp/QUjwskjlRLetMnZy+F/soYWdn9qoDhNIyg= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 h1:/C/0rXlUu2FqpwzwfcGl5P2AHdg+QEmDyYOxerXkW30= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0/go.mod h1:oR1zloRYO5wb1FyrDTK+fHra4bsfYWW1UcKdaqL9GWs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.90.0 h1:OJBbKAdG1X54h4gYCZdP2JTzdPeEnFvsGrmitgQiRzk= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 h1:mJUUjarDCMA+NnGpH45G3R5xNJWDnOyU1V14Df7rBoU= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0/go.mod h1:fuLlV9ckNXKtZPTkoSnl/zohOXpjAALntCLt+iWGOi0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 h1:ZnAtlWtn+9rrDVkm6I8aYXPfG098xNRgm1hBQc1Pscw= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0/go.mod h1:8boejehb8q18UUdiYL/ukUJvDgFaO+RvKpzYAE85mXM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.90.0 h1:pMBaQ/5fc4PPuCGb1DFzxdp1q04BKkCZapI3VnAWow4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 h1:ybdoWklcOxQ5Bv4SKuXn8OBjeImJozaF4YGvkgJkp6Y= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 h1:zlaGA4tT/lA9YpuPB8fofIg2cYTfBPaGgvM74+Y8cEo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0/go.mod h1:oR9qdvK2Ti6pNrW5rHBaCmeJH08LqroUlpEh3meINJk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 h1:hmARQTWY/GnsGZsBUT1RcKhARnX1KMUE+2tAtCQd2xA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0/go.mod h1:BiaiuIKXAdl9LPa+99bwI3g3sWsMa51E/FJFTmvc8Bk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.90.0 h1:XF+bBAe9pVsMiToTr3w+UGrqnahzD0ew6H5nCaVOw+Q= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 h1:Xkx1JT+GiJH9oawv61eM3yWdkXqT/fk5FcAT140PPqY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0/go.mod h1:wxJfumGLuNPUkKRMN+5rFCI7At+7BbMOvKpJSiAUqmQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 h1:3/v2gdRnq/oh7NuJ8qBtci2J/1IWKZ0tBTbZ8xTdfxI= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0/go.mod h1:FF1Uxgox+ptWe6a4Hdfw9AxuatYR8JggJDoVkrXY9aA= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= -github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= -github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= +github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= +github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -570,10 +559,11 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/alertmanager v0.25.0 h1:vbXKUR6PYRiZPRIKfmXaG+dmCKG52RtPL4Btl8hQGvg= -github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= +github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -582,14 +572,14 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= @@ -598,8 +588,8 @@ github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= @@ -613,26 +603,26 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/prometheus v0.47.0 h1:tIJJKZGlmrMVsvIt6rMfB8he7CRHEc8ZxS5ubcZtbkM= -github.com/prometheus/prometheus v0.47.0/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= +github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= -github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= -github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= +github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= +github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -645,8 +635,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -664,14 +654,16 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= -github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= +github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -699,8 +691,8 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= -go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= +go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= +go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -709,108 +701,109 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.86.0 h1:Yxu0muUws9e7HG+5DDiYajkfAeOo/riUv0sJO4E9rXA= -go.opentelemetry.io/collector v0.86.0/go.mod h1:HoXzPE/mJMN4jy5E1cSUMznxkKFiGAGJbkguzpnq5ak= -go.opentelemetry.io/collector/component v0.86.0 h1:3+6OTiknu081jWYSUx4PdOecvmo0kn5w1YlydZLKz8E= -go.opentelemetry.io/collector/component v0.86.0/go.mod h1:XaBL2y1EhcmbCIFqAqk5r3xOZyi1SarwU7Wj/iTiDOA= -go.opentelemetry.io/collector/config/configauth v0.86.0 h1:cqfr/zXyGGg5TGgmS+Ws6XFy6DdBNJxkTLUWpOVzmVI= -go.opentelemetry.io/collector/config/configauth v0.86.0/go.mod h1:8/v2oLZe9kskODghcRQSp2xP56EySlU1aNRthEIwn8w= -go.opentelemetry.io/collector/config/configcompression v0.86.0 h1:qA7i0igeYEpOW4PcGk3tYYSAO5dn+aMuDbCc/D0Rli4= -go.opentelemetry.io/collector/config/configcompression v0.86.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/configgrpc v0.86.0 h1:M1fq3QAGy+Q8bheiT1YWUpCcVEBnhWttHU1l8oXBQWg= -go.opentelemetry.io/collector/config/configgrpc v0.86.0/go.mod h1:PR4Ydn5RylPs06TEQRx6ygBdcOPYR9pni7XKoat8EYM= -go.opentelemetry.io/collector/config/confighttp v0.86.0 h1:DLHWhUG3Xp9Gci6+ewJ21GwIV0RQd8jlNt3F36397uk= -go.opentelemetry.io/collector/config/confighttp v0.86.0/go.mod h1:FMCmz/9rg8AXxdltWKUbFxOGQ/g9rNvTfb4EUA+RjT4= -go.opentelemetry.io/collector/config/confignet v0.86.0 h1:jg8rsMsAGKa+x3gs1yxqnfr2jpSAu8mGn7hc4y8h71o= -go.opentelemetry.io/collector/config/confignet v0.86.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= -go.opentelemetry.io/collector/config/configopaque v0.86.0 h1:usNMgdFXbmprEcTImwVtziGkhXHeC/aWE93n2ZXlIO8= -go.opentelemetry.io/collector/config/configopaque v0.86.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.86.0 h1:xMqeL/gz7ZwZKRB58WYimEGU+Lvbzo5zd99uihjkMZY= -go.opentelemetry.io/collector/config/configtelemetry v0.86.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.86.0 h1:3BdB8Ntme+nDgYDPaWAb0jYbb/n7ueckN7hAPU3J3IM= -go.opentelemetry.io/collector/config/configtls v0.86.0/go.mod h1:vopMMIUjAvb6kojrc5G6vQOmfPIRxTU+hMHomvGNa2s= -go.opentelemetry.io/collector/config/internal v0.86.0 h1:r4LnOMxXmnKwAMaSX16bPe1jMbjkT9Up8VKt6IrJac0= -go.opentelemetry.io/collector/config/internal v0.86.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.86.0 h1:u3qXVuIz2cmH/rb2teX0Ft/OKYHgObv1e4OQ2UXqxrE= -go.opentelemetry.io/collector/confmap v0.86.0/go.mod h1:vJms49x98lXUR7Mj6/28eXV+Otn3dDQpc+Znvex9Z84= -go.opentelemetry.io/collector/connector v0.86.0 h1:tQaphbRyLhDDBkKpcAWawc+vFdnnNwvpKx8CBzW5xR4= -go.opentelemetry.io/collector/connector v0.86.0/go.mod h1:0n6B8ZyDgT0hvZbJLFYd9y+uAH54wttUGZ6O7Zo1B5M= -go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 h1:qaqPBOpYVLDObaCfZwLV/ASP9aXdVCM5qxic6sfoxdA= -go.opentelemetry.io/collector/connector/forwardconnector v0.85.0/go.mod h1:bcgIGydTq6N0uDDA8KVkmv9rsl/KIXK4ZsXwschp8dM= -go.opentelemetry.io/collector/consumer v0.86.0 h1:8AL9I30tJV01KfcSaa+8DTiARIiUDA8o2p7yQoSFUCs= -go.opentelemetry.io/collector/consumer v0.86.0/go.mod h1:SvoV1eto4VZzQ3ILKQ1rv4qgN8rUMJqupn78hoXLHRw= -go.opentelemetry.io/collector/exporter v0.86.0 h1:LFmBb7S4Fkj5fv/nrUkLOy50GT6s4R/BLrv6uTb+GNo= -go.opentelemetry.io/collector/exporter v0.86.0/go.mod h1:+PKZrFV4sVgS2TVFnfZ+RCJqXexEENjW1riWaqkxsN4= -go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 h1:bSTfWv0RobFgs/c9g4jo5V8tFSlD2ILZZE2RrJ/eY44= -go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0/go.mod h1:xQrg9pnp5XTvDZq/Q556emFZ90niT3jKhD4IQZQoWGw= -go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 h1:3MlKoGSFPdOHKtRcm5nTHRMpMmDtTGr6WAVrSuD0p3g= -go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0/go.mod h1:wNkRTwQ4V3SZzvxzPpLME0EQkpySGTaiSHYcWhBuvkk= -go.opentelemetry.io/collector/extension v0.86.0 h1:oXnZarkh1aBgnr/U3JSj/lPpBJUquOQ3DHMXXP4Jacc= -go.opentelemetry.io/collector/extension v0.86.0/go.mod h1:EPAloXQ+48577GvHTP5wGDvV4OyHPuldvM+2rYbM/fw= -go.opentelemetry.io/collector/extension/auth v0.86.0 h1:VwKbeElL8sBnvRDC565EWOw4ixMG/t0oXjIphNsRszU= -go.opentelemetry.io/collector/extension/auth v0.86.0/go.mod h1:qGIIkeWXaOtdYO1fYEn1vAEhUS+OhVcceUC1G3XOsdk= -go.opentelemetry.io/collector/extension/zpagesextension v0.86.0 h1:Ga5ZGEChIN0eqide9NFqlfEZPTRaTX3mAdLdbKwiOPQ= -go.opentelemetry.io/collector/extension/zpagesextension v0.86.0/go.mod h1:o30mkGrQYPMMBPqoq5igj5br+sAyJr0gIbgp5Mf/A20= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015 h1:Wv8JFRUD01MwWkhZwF85to5oukHDFPRjnt88ArDFqco= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015/go.mod h1:fLmJMf1AoHttkF8p5oJAc4o5ZpHu8yO5XYJ7gbLCLzo= -go.opentelemetry.io/collector/otelcol v0.86.0 h1:p9NjJ7dIgQs0tp6uTsnmziDZdIwHDQqQ/wbnyD4FoIM= -go.opentelemetry.io/collector/otelcol v0.86.0/go.mod h1:jYS+YFA1qaxmgblwnARe97kQm0N2ngejb2qhR3zRPgg= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 h1:8PzrQFk3oKiT1Sd5EmNEcagdMyt1KcBy5/OyF5He5gY= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0015/go.mod h1:I1PqyHJlsXjANC73tp43nDId7/jiv82NoZZ6uS0xdwM= -go.opentelemetry.io/collector/processor v0.86.0 h1:b4Htiom5mgcM5d7Memw1NkxBKgOADF1je0mLIhulQUM= -go.opentelemetry.io/collector/processor v0.86.0/go.mod h1:gJCNmRCqm/GKBHjRqlvRxMqWWcLCe1S6QNOxjtFv638= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 h1:Rel52zGeC57hBVXV5av6FmGJiQCa2mYX84HHGaTPAH0= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0/go.mod h1:Qr/hC52XN0dNyRIZu1M4RxuKyYLsrzJoqYDvOEfH7TQ= -go.opentelemetry.io/collector/receiver v0.86.0 h1:AP+KZ225CmXR1oBD36+vV/pZcRFTkSiG7HvAVqfHoRg= -go.opentelemetry.io/collector/receiver v0.86.0/go.mod h1:oFpofH/OG4HqmaVsb8ftnIAhLAhQnH/3bWrOdZZZjTk= -go.opentelemetry.io/collector/semconv v0.86.0 h1:bLlPe/JYNjQHo744cqi7iIEybuLv+M5DntUwQPTrvZo= -go.opentelemetry.io/collector/semconv v0.86.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.86.0 h1:vyoynxNY2Oc6XET2ZvFkRC+Fpc1oMl9qQkORyX5LoWg= -go.opentelemetry.io/collector/service v0.86.0/go.mod h1:IT8MQbc9GWreG+GCuuG7DcQ72HUfV4a9iZXmwyPs27Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 h1:b8xjZxHbLrXAum4SxJd1Rlm7Y/fKaB+6ACI7/e5EfSA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0/go.mod h1:1ei0a32xOGkFoySu7y1DAHfcuIhC0pNZpvY2huXuMy4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= -go.opentelemetry.io/contrib/propagators/b3 v1.19.0 h1:ulz44cpm6V5oAeg5Aw9HyqGFMS6XM7untlMEhD7YzzA= -go.opentelemetry.io/contrib/propagators/b3 v1.19.0/go.mod h1:OzCmE2IVS+asTI+odXQstRGVfXQ4bXv9nMBRK0nNyqQ= -go.opentelemetry.io/contrib/zpages v0.44.0 h1:9J/cxTTWhM6kzgdaBt6NiXS2HUreXn/eW2M+vzHgDAQ= -go.opentelemetry.io/contrib/zpages v0.44.0/go.mod h1:G3eNCGhodjn2wIdM+i6GneZb1Cqg6dNRBlm1cpNEElg= -go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs= -go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= -go.opentelemetry.io/otel/bridge/opencensus v0.41.0 h1:VBpeaTbrvLFHvRtsyCJXjsTaicBNrAFdmctiN1k6WNI= -go.opentelemetry.io/otel/bridge/opencensus v0.41.0/go.mod h1:yCQB5IKRhgjlbTLc91+ixcZc2/8BncGGJ+CS3dZJwtY= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 h1:k0k7hFNDd8K4iOMJXj7s8sHaC4mhTlAeppRmZXLgZ6k= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0 h1:HgbDTD8pioFdY3NRc/YCvsWjqQPtweGyXxa32LgnTOw= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0/go.mod h1:tmvt/yK5Es5d6lHYWerLSOna8lCEfrBVX/a9M0ggqss= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0 h1:iV3BOgW4fry1Riw9dwypigqlIYWXvSRVT2RJmblzo40= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0/go.mod h1:7PGzqlKrxIRmbj5tlNW0nTkYZ5fHXDgk6Fy8/KjR0CI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 h1:IAtl+7gua134xcV3NieDhJHjjOVeJhXAnYf/0hswjUY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0/go.mod h1:w+pXobnBzh95MNIkeIuAKcHe/Uu/CX2PKIvBP6ipKRA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 h1:yE32ay7mJG2leczfREEhoW3VfSZIvHaB+gvVo1o8DQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0/go.mod h1:G17FHPDLt74bCI7tJ4CMitEk4BXTYG4FW6XUpkPBXa4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0 h1:6pu8ttx76BxHf+xz/H77AUZkPF3cwWzXqAUsXhVKI18= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0/go.mod h1:IOmXxPrxoxFMXdNy7lfDmE8MzE61YPcurbUm0SMjerI= -go.opentelemetry.io/otel/exporters/prometheus v0.41.0 h1:A3/bhjP5SmELy8dcpK+uttHeh9Qrh+YnS16/VzrztRQ= -go.opentelemetry.io/otel/exporters/prometheus v0.41.0/go.mod h1:mKuXEMi9suyyNJQ99SZCO0mpWGFe0MIALtjd3r6uo7Q= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0 h1:XzjGkawtAXs20Y+s6k1GNDMBsMDOV28TOT8cxmE42qM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0/go.mod h1:HAomEgjcKZk3VJ+HHdHLnhZXeGqdzPxxNTdKYRopUXY= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 h1:hSWWvDjXHVLq9DkmB+77fl8v7+t+yYiS+eNkiplDK54= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0/go.mod h1:zG7KQql1WjZCaUJd+L/ReSYx4bjbYJxg5ws9ws+mYes= -go.opentelemetry.io/otel/metric v1.18.0 h1:JwVzw94UYmbx3ej++CwLUQZxEODDj/pOuTCvzhtRrSQ= -go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= -go.opentelemetry.io/otel/sdk v1.18.0 h1:e3bAB0wB3MljH38sHzpV/qWrOTCFrdZF2ct9F8rBkcY= -go.opentelemetry.io/otel/sdk v1.18.0/go.mod h1:1RCygWV7plY2KmdskZEDDBs4tJeHG92MdHZIluiYs/M= -go.opentelemetry.io/otel/sdk/metric v0.41.0 h1:c3sAt9/pQ5fSIUfl0gPtClV3HhE18DCVzByD33R/zsk= -go.opentelemetry.io/otel/sdk/metric v0.41.0/go.mod h1:PmOmSt+iOklKtIg5O4Vz9H/ttcRFSNTgii+E1KGyn1w= -go.opentelemetry.io/otel/trace v1.18.0 h1:NY+czwbHbmndxojTEKiSMHkG2ClNH2PwmcHrdo0JY10= -go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= +go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= +go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= +go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= +go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= +go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= +go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= +go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= +go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/configgrpc v0.90.0 h1:fxKjv/6VxNltv7O3q6L9B2aggeEK4NxXahnjSwipQNo= +go.opentelemetry.io/collector/config/configgrpc v0.90.0/go.mod h1:kqSGz7XhKaoKXMq7XaL9+UJe8+0QIxpof9+CTD4u3Kw= +go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= +go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= +go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= +go.opentelemetry.io/collector/config/confignet v0.90.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= +go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= +go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= +go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= +go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= +go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= +go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= +go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= +go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 h1:Eop1jOK6kHGj+uyr3p0lvC2M0ELP+GOKsemwLE1HLzQ= +go.opentelemetry.io/collector/connector/forwardconnector v0.90.0/go.mod h1:01S/iIRLzmOWn30EQATK3CWDIKHWtELATDY+z8ON6Uo= +go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= +go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= +go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= +go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= +go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 h1:jO6Hepz/ujWvn+FJVeMMFtVMHaSoyoBZ5QuMjVCqu4U= +go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0/go.mod h1:qk2XJoDmOnjZb+udt3bU/j0kohJJ/RDYh8n56e8PPFw= +go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 h1:82wlzXpvBFCFU0yhB/VWVY5g4iu5NuX8uSsgZkBoqhQ= +go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0/go.mod h1:sv0NqTCWumuFcmZcZa/SGQOLin8Jejbc1lptLpjCV64= +go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= +go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= +go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= +go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0/go.mod h1:dS2OMWeiSp/BAbkEKgm1GaJD8LQ6vyBbDiK6iWYiVa4= +go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= +go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= +go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= +go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= +go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= +go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= +go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= +go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= +go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= +go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.90.0 h1:TCqjZma7Q0Sfgeiq8d/DsoHq8U6ImeGIgUB6NiPCNWM= +go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= +go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= +go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= +go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= +go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/contrib/propagators/b3 v1.21.1 h1:WPYiUgmw3+b7b3sQ1bFBFAf0q+Di9dvNc3AtYfnT4RQ= +go.opentelemetry.io/contrib/propagators/b3 v1.21.1/go.mod h1:EmzokPoSqsYMBVK4nRnhsfm5mbn8J1eDuz/U1UaQaWg= +go.opentelemetry.io/contrib/zpages v0.46.1 h1:U8Hh84dc+vJTVgRnL+QKWtWD2iqTSKibrQ85EeQqsNg= +go.opentelemetry.io/contrib/zpages v0.46.1/go.mod h1:1Wq9YTzkhr3Jkyi/sVrasFSppVzJQcvFf2Vc2ExZd6c= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/bridge/opencensus v0.44.0 h1:/inELPJztkn6Xx3ap9qw8i8XdeWF0B/OjGHOdRTePZ8= +go.opentelemetry.io/otel/bridge/opencensus v0.44.0/go.mod h1:dQTBJVBx1xahrXEFBV1BGPAnGuXC92LCj55fxIrtj7I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= +go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= @@ -826,11 +819,9 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -841,8 +832,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -864,8 +855,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -906,10 +897,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -917,8 +906,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -933,8 +922,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -997,20 +986,16 @@ golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1020,15 +1005,14 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1077,8 +1061,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1101,8 +1085,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.141.0 h1:Df6vfMgDoIM6ss0m7H4MPwFwY87WNXHfBIda/Bmfl4E= -google.golang.org/api v0.141.0/go.mod h1:iZqLkdPlXKyG0b90eu6KxVSE4D/ccRF2e/doKD2CnQQ= +google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= +google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1140,12 +1124,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 h1:o4LtQxebKIJ4vkzyhtD2rfUNZ20Zf0ik5YVP5E7G7VE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1159,8 +1143,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1205,7 +1189,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1213,12 +1198,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= +k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= +k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= +k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= +k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= +k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= diff --git a/otelcollector/opentelemetry-collector-builder/main.go b/otelcollector/opentelemetry-collector-builder/main.go index ed66009a1..52554c4d0 100644 --- a/otelcollector/opentelemetry-collector-builder/main.go +++ b/otelcollector/opentelemetry-collector-builder/main.go @@ -8,18 +8,14 @@ import ( ) func main() { - factories, err := components() - if err != nil { - log.Fatalf("failed to build components: %v", err) - } info := component.BuildInfo{ Command: "custom-collector-distro", Description: "Custom OpenTelemetry Collector distribution", - Version: "0.85.0", + Version: "0.90.0", } - app := otelcol.NewCommand(otelcol.CollectorSettings{BuildInfo: info, Factories: factories}) - err = app.Execute() + app := otelcol.NewCommand(otelcol.CollectorSettings{BuildInfo: info, Factories: components}) + err := app.Execute() if err != nil { log.Fatal("collector server run finished with error: %w", err) } diff --git a/otelcollector/prom-config-validator-builder/go.mod b/otelcollector/prom-config-validator-builder/go.mod index 6e4e7c204..d7d88e804 100644 --- a/otelcollector/prom-config-validator-builder/go.mod +++ b/otelcollector/prom-config-validator-builder/go.mod @@ -11,29 +11,31 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 - go.opentelemetry.io/collector/confmap v0.86.0 - go.opentelemetry.io/collector/connector v0.86.0 + go.opentelemetry.io/collector/confmap v0.90.0 + go.opentelemetry.io/collector/connector v0.90.0 go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 - go.opentelemetry.io/collector/exporter v0.86.0 + go.opentelemetry.io/collector/exporter v0.90.0 go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 - go.opentelemetry.io/collector/extension v0.86.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.86.0 - go.opentelemetry.io/collector/otelcol v0.86.0 - go.opentelemetry.io/collector/processor v0.86.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 - go.opentelemetry.io/collector/receiver v0.86.0 + go.opentelemetry.io/collector/extension v0.90.0 + go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 + go.opentelemetry.io/collector/otelcol v0.90.0 + go.opentelemetry.io/collector/processor v0.90.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 + go.opentelemetry.io/collector/receiver v0.90.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute v1.23.2 // indirect cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.29 // indirect github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect @@ -42,12 +44,12 @@ require ( github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.45.12 // indirect + github.com/aws/aws-sdk-go v1.47.10 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -56,9 +58,9 @@ require ( github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.99.0 // indirect + github.com/digitalocean/godo v1.104.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.6+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect @@ -66,11 +68,11 @@ require ( github.com/envoyproxy/go-control-plane v0.11.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/analysis v0.21.4 // indirect @@ -86,22 +88,23 @@ require ( github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gophercloud/gophercloud v1.5.0 // indirect + github.com/gophercloud/gophercloud v1.7.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect - github.com/hashicorp/consul/api v1.24.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect + github.com/hashicorp/consul/api v1.25.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -110,31 +113,33 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e // indirect + github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.0.0 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.4.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.8 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.1.9 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/compress v1.17.3 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/linode/linodego v1.19.0 // indirect + github.com/linode/linodego v1.23.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.55 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/miekg/dns v1.1.56 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect @@ -145,34 +150,34 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/oklog/ulid v1.3.1 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc4 // indirect - github.com/ovh/go-ovh v1.4.1 // indirect + github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/ovh/go-ovh v1.4.3 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/alertmanager v0.25.0 // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/alertmanager v0.26.0 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/common/assets v0.2.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect github.com/prometheus/exporter-toolkit v0.10.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect - github.com/prometheus/prometheus v0.47.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/prometheus v0.48.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect - github.com/rs/cors v1.10.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 // indirect - github.com/shirou/gopsutil/v3 v3.23.8 // indirect + github.com/rs/cors v1.10.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect + github.com/shirou/gopsutil/v3 v3.23.10 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -181,73 +186,74 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect go.mongodb.org/mongo-driver v1.12.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.86.0 // indirect - go.opentelemetry.io/collector/component v0.86.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.86.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.86.0 // indirect + go.opentelemetry.io/collector v0.90.0 // indirect + go.opentelemetry.io/collector/component v0.90.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect go.opentelemetry.io/collector/config/configgrpc v0.86.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.86.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.86.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.86.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.86.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.86.0 // indirect - go.opentelemetry.io/collector/config/internal v0.86.0 // indirect - go.opentelemetry.io/collector/consumer v0.86.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.86.0 // indirect - go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015 // indirect - go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 // indirect - go.opentelemetry.io/collector/semconv v0.86.0 // indirect - go.opentelemetry.io/collector/service v0.86.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.90.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect + go.opentelemetry.io/collector/config/internal v0.90.0 // indirect + go.opentelemetry.io/collector/consumer v0.90.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect + go.opentelemetry.io/collector/featuregate v1.0.0 // indirect + go.opentelemetry.io/collector/pdata v1.0.0 // indirect + go.opentelemetry.io/collector/semconv v0.90.0 // indirect + go.opentelemetry.io/collector/service v0.90.0 // indirect + go.opentelemetry.io/contrib/config v0.1.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.19.0 // indirect - go.opentelemetry.io/contrib/zpages v0.44.0 // indirect - go.opentelemetry.io/otel v1.18.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v0.41.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect + go.opentelemetry.io/contrib/zpages v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/bridge/opencensus v0.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 // indirect - go.opentelemetry.io/otel/metric v1.18.0 // indirect - go.opentelemetry.io/otel/sdk v1.18.0 // indirect - go.opentelemetry.io/otel/sdk/metric v0.41.0 // indirect - go.opentelemetry.io/otel/trace v1.18.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/goleak v1.2.1 // indirect + go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.13.0 // indirect - golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/oauth2 v0.14.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.4.0 // indirect + golang.org/x/tools v0.15.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/api v0.141.0 // indirect + google.golang.org/api v0.150.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 // indirect - google.golang.org/grpc v1.58.1 // indirect + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.2 // indirect - k8s.io/apimachinery v0.28.2 // indirect - k8s.io/client-go v0.28.2 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/apimachinery v0.28.3 // indirect + k8s.io/client-go v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect diff --git a/otelcollector/prom-config-validator-builder/go.sum b/otelcollector/prom-config-validator-builder/go.sum index 566090b54..b9d961f72 100644 --- a/otelcollector/prom-config-validator-builder/go.sum +++ b/otelcollector/prom-config-validator-builder/go.sum @@ -21,6 +21,8 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= +cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 h1:aRVqY1p2IJaBGStWMsQMpkAa83cPkCDLl80eOj0Rbz4= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68/go.mod h1:1a3eRNYX12fs5UABBIXS8HXVvQbX9hRB/RkEBPORpe8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -41,10 +43,19 @@ github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9Eb github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -68,6 +79,8 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -94,6 +107,8 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:W github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= +github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -120,6 +135,7 @@ github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3 github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -129,11 +145,15 @@ github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= +github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= +github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -158,8 +178,12 @@ github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -179,6 +203,8 @@ github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -257,6 +283,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -312,6 +340,8 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -334,22 +364,32 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= +github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= @@ -383,6 +423,7 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= @@ -393,10 +434,14 @@ github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= +github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= +github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= @@ -405,6 +450,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= +github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -433,6 +480,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -456,6 +505,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= +github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= +github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -483,11 +534,15 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -536,15 +591,23 @@ github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextensi github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.86.0 h1:g7HlND105lwm7NW8JCxAfbpaFyk1WKcEUUVwchIo9zE= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0 h1:HEuJ7hCbLVfoL7xLrGQ2QORvocyFfWuaoDuzyTLwTdc= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0/go.mod h1:ss8TG43W1xNke9aeI0uTIVpyXW5OmYslxMj01UMdjR8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 h1:mJUUjarDCMA+NnGpH45G3R5xNJWDnOyU1V14Df7rBoU= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0/go.mod h1:fuLlV9ckNXKtZPTkoSnl/zohOXpjAALntCLt+iWGOi0= github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 h1:S6b7ToTSFZvVzcabjqoUBqAwair7YuELvBS6mOAopHs= github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0/go.mod h1:aLQB8gu7vJ1lokUeWoZs9ExpduamPrD3oRbDk7hNg/g= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.86.0 h1:EzGSvuCXAsGpwgeieTVcy1gs0hOlPidhFPcvwcPEU8s= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0 h1:xt/YvYpgssWk2Ix2C9SSXrILIzRqyWe+r5RE348m1fE= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0/go.mod h1:fjK1kn7PIDP+TqOIFVEth3w0Eiexx5jIk411c//fYkM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 h1:ybdoWklcOxQ5Bv4SKuXn8OBjeImJozaF4YGvkgJkp6Y= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0 h1:9u4hF+3SE+00aAaaMemlxujFPjmo2o2VeB2+x1Y5rCI= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0/go.mod h1:WfLBDz9rENrI1MYCPLmW21Mok23V2iBJP2fZTmJbCx8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 h1:zlaGA4tT/lA9YpuPB8fofIg2cYTfBPaGgvM74+Y8cEo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0/go.mod h1:oR9qdvK2Ti6pNrW5rHBaCmeJH08LqroUlpEh3meINJk= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0 h1:nnzuEQYlsRIkMPAw1jEl+8L2Is68QQl58QvY2dHHgDU= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0/go.mod h1:prodbjWZpQkRcd45W2wkRaryv6JomuuWZUmM6mDj27k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 h1:hmARQTWY/GnsGZsBUT1RcKhARnX1KMUE+2tAtCQd2xA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0/go.mod h1:BiaiuIKXAdl9LPa+99bwI3g3sWsMa51E/FJFTmvc8Bk= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0 h1:U6jXC1LrqtW7/MLGMRbumuOcwr5g+J3mkngPgyBYEV0= github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 h1:IWFGmyeOI/Ux3oBg2iwD5SbNbLgS9JATYGxvCIN2L58= github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0/go.mod h1:mxpjy+fw19QBCa9aqipEUY6TrIYgp2THyLj4dmas6Jc= @@ -553,8 +616,12 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= +github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= +github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -574,6 +641,8 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/alertmanager v0.25.0 h1:vbXKUR6PYRiZPRIKfmXaG+dmCKG52RtPL4Btl8hQGvg= github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= +github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= +github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -584,12 +653,16 @@ github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrb github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= @@ -600,6 +673,8 @@ github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJ github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= @@ -615,8 +690,12 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/prometheus v0.47.0 h1:tIJJKZGlmrMVsvIt6rMfB8he7CRHEc8ZxS5ubcZtbkM= github.com/prometheus/prometheus v0.47.0/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= +github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= +github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -625,14 +704,20 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= +github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= +github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -647,6 +732,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -711,106 +798,194 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/collector v0.86.0 h1:Yxu0muUws9e7HG+5DDiYajkfAeOo/riUv0sJO4E9rXA= go.opentelemetry.io/collector v0.86.0/go.mod h1:HoXzPE/mJMN4jy5E1cSUMznxkKFiGAGJbkguzpnq5ak= +go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= +go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= go.opentelemetry.io/collector/component v0.86.0 h1:3+6OTiknu081jWYSUx4PdOecvmo0kn5w1YlydZLKz8E= go.opentelemetry.io/collector/component v0.86.0/go.mod h1:XaBL2y1EhcmbCIFqAqk5r3xOZyi1SarwU7Wj/iTiDOA= +go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= +go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= go.opentelemetry.io/collector/config/configauth v0.86.0 h1:cqfr/zXyGGg5TGgmS+Ws6XFy6DdBNJxkTLUWpOVzmVI= go.opentelemetry.io/collector/config/configauth v0.86.0/go.mod h1:8/v2oLZe9kskODghcRQSp2xP56EySlU1aNRthEIwn8w= +go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= +go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= go.opentelemetry.io/collector/config/configcompression v0.86.0 h1:qA7i0igeYEpOW4PcGk3tYYSAO5dn+aMuDbCc/D0Rli4= go.opentelemetry.io/collector/config/configcompression v0.86.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= +go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= go.opentelemetry.io/collector/config/configgrpc v0.86.0 h1:M1fq3QAGy+Q8bheiT1YWUpCcVEBnhWttHU1l8oXBQWg= go.opentelemetry.io/collector/config/configgrpc v0.86.0/go.mod h1:PR4Ydn5RylPs06TEQRx6ygBdcOPYR9pni7XKoat8EYM= go.opentelemetry.io/collector/config/confighttp v0.86.0 h1:DLHWhUG3Xp9Gci6+ewJ21GwIV0RQd8jlNt3F36397uk= go.opentelemetry.io/collector/config/confighttp v0.86.0/go.mod h1:FMCmz/9rg8AXxdltWKUbFxOGQ/g9rNvTfb4EUA+RjT4= +go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= +go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= go.opentelemetry.io/collector/config/confignet v0.86.0 h1:jg8rsMsAGKa+x3gs1yxqnfr2jpSAu8mGn7hc4y8h71o= go.opentelemetry.io/collector/config/confignet v0.86.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= +go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= +go.opentelemetry.io/collector/config/confignet v0.90.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= go.opentelemetry.io/collector/config/configopaque v0.86.0 h1:usNMgdFXbmprEcTImwVtziGkhXHeC/aWE93n2ZXlIO8= go.opentelemetry.io/collector/config/configopaque v0.86.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= +go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= go.opentelemetry.io/collector/config/configtelemetry v0.86.0 h1:xMqeL/gz7ZwZKRB58WYimEGU+Lvbzo5zd99uihjkMZY= go.opentelemetry.io/collector/config/configtelemetry v0.86.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= go.opentelemetry.io/collector/config/configtls v0.86.0 h1:3BdB8Ntme+nDgYDPaWAb0jYbb/n7ueckN7hAPU3J3IM= go.opentelemetry.io/collector/config/configtls v0.86.0/go.mod h1:vopMMIUjAvb6kojrc5G6vQOmfPIRxTU+hMHomvGNa2s= +go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= +go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= go.opentelemetry.io/collector/config/internal v0.86.0 h1:r4LnOMxXmnKwAMaSX16bPe1jMbjkT9Up8VKt6IrJac0= go.opentelemetry.io/collector/config/internal v0.86.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= +go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= go.opentelemetry.io/collector/confmap v0.86.0 h1:u3qXVuIz2cmH/rb2teX0Ft/OKYHgObv1e4OQ2UXqxrE= go.opentelemetry.io/collector/confmap v0.86.0/go.mod h1:vJms49x98lXUR7Mj6/28eXV+Otn3dDQpc+Znvex9Z84= +go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= +go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= go.opentelemetry.io/collector/connector v0.86.0 h1:tQaphbRyLhDDBkKpcAWawc+vFdnnNwvpKx8CBzW5xR4= go.opentelemetry.io/collector/connector v0.86.0/go.mod h1:0n6B8ZyDgT0hvZbJLFYd9y+uAH54wttUGZ6O7Zo1B5M= +go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= +go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 h1:qaqPBOpYVLDObaCfZwLV/ASP9aXdVCM5qxic6sfoxdA= go.opentelemetry.io/collector/connector/forwardconnector v0.85.0/go.mod h1:bcgIGydTq6N0uDDA8KVkmv9rsl/KIXK4ZsXwschp8dM= go.opentelemetry.io/collector/consumer v0.86.0 h1:8AL9I30tJV01KfcSaa+8DTiARIiUDA8o2p7yQoSFUCs= go.opentelemetry.io/collector/consumer v0.86.0/go.mod h1:SvoV1eto4VZzQ3ILKQ1rv4qgN8rUMJqupn78hoXLHRw= +go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= +go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= go.opentelemetry.io/collector/exporter v0.86.0 h1:LFmBb7S4Fkj5fv/nrUkLOy50GT6s4R/BLrv6uTb+GNo= go.opentelemetry.io/collector/exporter v0.86.0/go.mod h1:+PKZrFV4sVgS2TVFnfZ+RCJqXexEENjW1riWaqkxsN4= +go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= +go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 h1:bSTfWv0RobFgs/c9g4jo5V8tFSlD2ILZZE2RrJ/eY44= go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0/go.mod h1:xQrg9pnp5XTvDZq/Q556emFZ90niT3jKhD4IQZQoWGw= go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 h1:3MlKoGSFPdOHKtRcm5nTHRMpMmDtTGr6WAVrSuD0p3g= go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0/go.mod h1:wNkRTwQ4V3SZzvxzPpLME0EQkpySGTaiSHYcWhBuvkk= go.opentelemetry.io/collector/extension v0.86.0 h1:oXnZarkh1aBgnr/U3JSj/lPpBJUquOQ3DHMXXP4Jacc= go.opentelemetry.io/collector/extension v0.86.0/go.mod h1:EPAloXQ+48577GvHTP5wGDvV4OyHPuldvM+2rYbM/fw= +go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= +go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= go.opentelemetry.io/collector/extension/auth v0.86.0 h1:VwKbeElL8sBnvRDC565EWOw4ixMG/t0oXjIphNsRszU= go.opentelemetry.io/collector/extension/auth v0.86.0/go.mod h1:qGIIkeWXaOtdYO1fYEn1vAEhUS+OhVcceUC1G3XOsdk= +go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= +go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= go.opentelemetry.io/collector/extension/zpagesextension v0.86.0 h1:Ga5ZGEChIN0eqide9NFqlfEZPTRaTX3mAdLdbKwiOPQ= go.opentelemetry.io/collector/extension/zpagesextension v0.86.0/go.mod h1:o30mkGrQYPMMBPqoq5igj5br+sAyJr0gIbgp5Mf/A20= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0/go.mod h1:dS2OMWeiSp/BAbkEKgm1GaJD8LQ6vyBbDiK6iWYiVa4= go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015 h1:Wv8JFRUD01MwWkhZwF85to5oukHDFPRjnt88ArDFqco= go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015/go.mod h1:fLmJMf1AoHttkF8p5oJAc4o5ZpHu8yO5XYJ7gbLCLzo= +go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= +go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= go.opentelemetry.io/collector/otelcol v0.86.0 h1:p9NjJ7dIgQs0tp6uTsnmziDZdIwHDQqQ/wbnyD4FoIM= go.opentelemetry.io/collector/otelcol v0.86.0/go.mod h1:jYS+YFA1qaxmgblwnARe97kQm0N2ngejb2qhR3zRPgg= +go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= +go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 h1:8PzrQFk3oKiT1Sd5EmNEcagdMyt1KcBy5/OyF5He5gY= go.opentelemetry.io/collector/pdata v1.0.0-rcv0015/go.mod h1:I1PqyHJlsXjANC73tp43nDId7/jiv82NoZZ6uS0xdwM= +go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= +go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= go.opentelemetry.io/collector/processor v0.86.0 h1:b4Htiom5mgcM5d7Memw1NkxBKgOADF1je0mLIhulQUM= go.opentelemetry.io/collector/processor v0.86.0/go.mod h1:gJCNmRCqm/GKBHjRqlvRxMqWWcLCe1S6QNOxjtFv638= +go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= +go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 h1:Rel52zGeC57hBVXV5av6FmGJiQCa2mYX84HHGaTPAH0= go.opentelemetry.io/collector/processor/batchprocessor v0.85.0/go.mod h1:Qr/hC52XN0dNyRIZu1M4RxuKyYLsrzJoqYDvOEfH7TQ= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= go.opentelemetry.io/collector/receiver v0.86.0 h1:AP+KZ225CmXR1oBD36+vV/pZcRFTkSiG7HvAVqfHoRg= go.opentelemetry.io/collector/receiver v0.86.0/go.mod h1:oFpofH/OG4HqmaVsb8ftnIAhLAhQnH/3bWrOdZZZjTk= +go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= +go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= go.opentelemetry.io/collector/semconv v0.86.0 h1:bLlPe/JYNjQHo744cqi7iIEybuLv+M5DntUwQPTrvZo= go.opentelemetry.io/collector/semconv v0.86.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= +go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= go.opentelemetry.io/collector/service v0.86.0 h1:vyoynxNY2Oc6XET2ZvFkRC+Fpc1oMl9qQkORyX5LoWg= go.opentelemetry.io/collector/service v0.86.0/go.mod h1:IT8MQbc9GWreG+GCuuG7DcQ72HUfV4a9iZXmwyPs27Q= +go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= +go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= +go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= +go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 h1:b8xjZxHbLrXAum4SxJd1Rlm7Y/fKaB+6ACI7/e5EfSA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0/go.mod h1:1ei0a32xOGkFoySu7y1DAHfcuIhC0pNZpvY2huXuMy4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= go.opentelemetry.io/contrib/propagators/b3 v1.19.0 h1:ulz44cpm6V5oAeg5Aw9HyqGFMS6XM7untlMEhD7YzzA= go.opentelemetry.io/contrib/propagators/b3 v1.19.0/go.mod h1:OzCmE2IVS+asTI+odXQstRGVfXQ4bXv9nMBRK0nNyqQ= +go.opentelemetry.io/contrib/propagators/b3 v1.21.1 h1:WPYiUgmw3+b7b3sQ1bFBFAf0q+Di9dvNc3AtYfnT4RQ= +go.opentelemetry.io/contrib/propagators/b3 v1.21.1/go.mod h1:EmzokPoSqsYMBVK4nRnhsfm5mbn8J1eDuz/U1UaQaWg= go.opentelemetry.io/contrib/zpages v0.44.0 h1:9J/cxTTWhM6kzgdaBt6NiXS2HUreXn/eW2M+vzHgDAQ= go.opentelemetry.io/contrib/zpages v0.44.0/go.mod h1:G3eNCGhodjn2wIdM+i6GneZb1Cqg6dNRBlm1cpNEElg= +go.opentelemetry.io/contrib/zpages v0.46.1 h1:U8Hh84dc+vJTVgRnL+QKWtWD2iqTSKibrQ85EeQqsNg= +go.opentelemetry.io/contrib/zpages v0.46.1/go.mod h1:1Wq9YTzkhr3Jkyi/sVrasFSppVzJQcvFf2Vc2ExZd6c= go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs= go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/bridge/opencensus v0.41.0 h1:VBpeaTbrvLFHvRtsyCJXjsTaicBNrAFdmctiN1k6WNI= go.opentelemetry.io/otel/bridge/opencensus v0.41.0/go.mod h1:yCQB5IKRhgjlbTLc91+ixcZc2/8BncGGJ+CS3dZJwtY= +go.opentelemetry.io/otel/bridge/opencensus v0.44.0 h1:/inELPJztkn6Xx3ap9qw8i8XdeWF0B/OjGHOdRTePZ8= +go.opentelemetry.io/otel/bridge/opencensus v0.44.0/go.mod h1:dQTBJVBx1xahrXEFBV1BGPAnGuXC92LCj55fxIrtj7I= go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 h1:k0k7hFNDd8K4iOMJXj7s8sHaC4mhTlAeppRmZXLgZ6k= go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0 h1:HgbDTD8pioFdY3NRc/YCvsWjqQPtweGyXxa32LgnTOw= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0/go.mod h1:tmvt/yK5Es5d6lHYWerLSOna8lCEfrBVX/a9M0ggqss= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0 h1:iV3BOgW4fry1Riw9dwypigqlIYWXvSRVT2RJmblzo40= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0/go.mod h1:7PGzqlKrxIRmbj5tlNW0nTkYZ5fHXDgk6Fy8/KjR0CI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 h1:IAtl+7gua134xcV3NieDhJHjjOVeJhXAnYf/0hswjUY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0/go.mod h1:w+pXobnBzh95MNIkeIuAKcHe/Uu/CX2PKIvBP6ipKRA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 h1:yE32ay7mJG2leczfREEhoW3VfSZIvHaB+gvVo1o8DQ8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0/go.mod h1:G17FHPDLt74bCI7tJ4CMitEk4BXTYG4FW6XUpkPBXa4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0 h1:6pu8ttx76BxHf+xz/H77AUZkPF3cwWzXqAUsXhVKI18= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0/go.mod h1:IOmXxPrxoxFMXdNy7lfDmE8MzE61YPcurbUm0SMjerI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= go.opentelemetry.io/otel/exporters/prometheus v0.41.0 h1:A3/bhjP5SmELy8dcpK+uttHeh9Qrh+YnS16/VzrztRQ= go.opentelemetry.io/otel/exporters/prometheus v0.41.0/go.mod h1:mKuXEMi9suyyNJQ99SZCO0mpWGFe0MIALtjd3r6uo7Q= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0 h1:XzjGkawtAXs20Y+s6k1GNDMBsMDOV28TOT8cxmE42qM= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0/go.mod h1:HAomEgjcKZk3VJ+HHdHLnhZXeGqdzPxxNTdKYRopUXY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 h1:hSWWvDjXHVLq9DkmB+77fl8v7+t+yYiS+eNkiplDK54= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0/go.mod h1:zG7KQql1WjZCaUJd+L/ReSYx4bjbYJxg5ws9ws+mYes= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= go.opentelemetry.io/otel/metric v1.18.0 h1:JwVzw94UYmbx3ej++CwLUQZxEODDj/pOuTCvzhtRrSQ= go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/sdk v1.18.0 h1:e3bAB0wB3MljH38sHzpV/qWrOTCFrdZF2ct9F8rBkcY= go.opentelemetry.io/otel/sdk v1.18.0/go.mod h1:1RCygWV7plY2KmdskZEDDBs4tJeHG92MdHZIluiYs/M= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk/metric v0.41.0 h1:c3sAt9/pQ5fSIUfl0gPtClV3HhE18DCVzByD33R/zsk= go.opentelemetry.io/otel/sdk/metric v0.41.0/go.mod h1:PmOmSt+iOklKtIg5O4Vz9H/ttcRFSNTgii+E1KGyn1w= +go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= +go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= go.opentelemetry.io/otel/trace v1.18.0 h1:NY+czwbHbmndxojTEKiSMHkG2ClNH2PwmcHrdo0JY10= go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= @@ -831,6 +1006,8 @@ golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -843,6 +1020,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -866,6 +1045,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -910,6 +1091,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -919,6 +1102,8 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -935,6 +1120,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1005,12 +1192,17 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1024,11 +1216,15 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1079,6 +1275,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1103,6 +1301,8 @@ google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSr google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.141.0 h1:Df6vfMgDoIM6ss0m7H4MPwFwY87WNXHfBIda/Bmfl4E= google.golang.org/api v0.141.0/go.mod h1:iZqLkdPlXKyG0b90eu6KxVSE4D/ccRF2e/doKD2CnQQ= +google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1142,10 +1342,16 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 h1:o4LtQxebKIJ4vkzyhtD2rfUNZ20Zf0ik5YVP5E7G7VE= google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1161,6 +1367,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1215,10 +1423,16 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= diff --git a/otelcollector/prometheusreceiver/config.go b/otelcollector/prometheusreceiver/config.go index 28f224b7b..edcd0d2e5 100644 --- a/otelcollector/prometheusreceiver/config.go +++ b/otelcollector/prometheusreceiver/config.go @@ -18,6 +18,7 @@ import ( "github.com/prometheus/prometheus/discovery/kubernetes" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap" + "go.uber.org/zap" "gopkg.in/yaml.v2" ) @@ -51,7 +52,11 @@ type Config struct { // ConfigPlaceholder is just an entry to make the configuration pass a check // that requires that all keys present in the config actually exist on the // structure, ie.: it will error if an unknown key is present. - ConfigPlaceholder interface{} `mapstructure:"config"` + ConfigPlaceholder any `mapstructure:"config"` + + // EnableProtobufNegotiation allows the collector to set the scraper option for + // protobuf negotiation when conferring with a prometheus client. + EnableProtobufNegotiation bool `mapstructure:"enable_protobuf_negotiation"` } type targetAllocator struct { @@ -61,7 +66,7 @@ type targetAllocator struct { // ConfigPlaceholder is just an entry to make the configuration pass a check // that requires that all keys present in the config actually exist on the // structure, ie.: it will error if an unknown key is present. - ConfigPlaceholder interface{} `mapstructure:"http_sd_config"` + ConfigPlaceholder any `mapstructure:"http_sd_config"` HTTPSDConfig *promHTTP.SDConfig `mapstructure:"-"` } @@ -138,13 +143,6 @@ func (cfg *Config) validatePromConfig(promConfig *promconfig.Config) error { } for _, sc := range cfg.PrometheusConfig.ScrapeConfigs { - for _, rc := range sc.MetricRelabelConfigs { - if rc.TargetLabel == "__name__" { - // TODO(#2297): Remove validation after renaming is fixed - return fmt.Errorf("error validating scrapeconfig for job %v: %w", sc.JobName, errRenamingDisallowed) - } - } - if sc.HTTPClientConfig.Authorization != nil { if err := checkFile(sc.HTTPClientConfig.Authorization.CredentialsFile); err != nil { return fmt.Errorf("error checking authorization credentials file %q: %w", sc.HTTPClientConfig.Authorization.CredentialsFile, err) @@ -237,3 +235,13 @@ func (cfg *Config) Unmarshal(componentParser *confmap.Conf) error { return nil } + +func configWarnings(logger *zap.Logger, cfg *Config) { + for _, sc := range cfg.PrometheusConfig.ScrapeConfigs { + for _, rc := range sc.MetricRelabelConfigs { + if rc.TargetLabel == "__name__" { + logger.Warn("metric renaming using metric_relabel_configs will result in unknown-typed metrics without a unit or description", zap.String("job", sc.JobName)) + } + } + } +} diff --git a/otelcollector/prometheusreceiver/config_test.go b/otelcollector/prometheusreceiver/config_test.go index eefb12f0b..5289ae4c8 100644 --- a/otelcollector/prometheusreceiver/config_test.go +++ b/otelcollector/prometheusreceiver/config_test.go @@ -4,6 +4,7 @@ package prometheusreceiver import ( + "context" "path/filepath" "strings" "testing" @@ -15,8 +16,11 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/receiver/receivertest" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" - "github.com/gracewehner/prometheusreceiver/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver/internal/metadata" ) func TestLoadConfig(t *testing.T) { @@ -41,6 +45,7 @@ func TestLoadConfig(t *testing.T) { assert.Equal(t, time.Duration(r1.PrometheusConfig.ScrapeConfigs[0].ScrapeInterval), 5*time.Second) assert.Equal(t, r1.UseStartTimeMetric, true) assert.Equal(t, r1.TrimMetricSuffixes, true) + assert.Equal(t, r1.EnableProtobufNegotiation, true) assert.Equal(t, r1.StartTimeMetricRegex, "^(.+_)*process_start_time_seconds$") assert.True(t, r1.ReportExtraScrapeMetrics) @@ -119,9 +124,10 @@ func TestLoadConfigFailsOnUnknownPrometheusSection(t *testing.T) { require.Error(t, component.UnmarshalConfig(sub, cfg)) } -// Renaming is not allowed -func TestLoadConfigFailsOnRenameDisallowed(t *testing.T) { - cm, err := confmaptest.LoadConf(filepath.Join("testdata", "invalid-config-prometheus-relabel.yaml")) +// Renaming emits a warning +func TestConfigWarningsOnRenameDisallowed(t *testing.T) { + // Construct the config that should emit a warning + cm, err := confmaptest.LoadConf(filepath.Join("testdata", "warning-config-prometheus-relabel.yaml")) require.NoError(t, err) factory := NewFactory() cfg := factory.CreateDefaultConfig() @@ -129,8 +135,14 @@ func TestLoadConfigFailsOnRenameDisallowed(t *testing.T) { sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "").String()) require.NoError(t, err) require.NoError(t, component.UnmarshalConfig(sub, cfg)) - assert.Error(t, component.ValidateConfig(cfg)) - + // Use a fake logger + creationSet := receivertest.NewNopCreateSettings() + observedZapCore, observedLogs := observer.New(zap.WarnLevel) + creationSet.Logger = zap.New(observedZapCore) + _, err = createMetricsReceiver(context.Background(), creationSet, cfg, nil) + require.NoError(t, err) + // We should have received a warning + assert.Equal(t, 1, observedLogs.Len()) } func TestRejectUnsupportedPrometheusFeatures(t *testing.T) { diff --git a/otelcollector/prometheusreceiver/factory.go b/otelcollector/prometheusreceiver/factory.go index 003696fe2..961aaac3a 100644 --- a/otelcollector/prometheusreceiver/factory.go +++ b/otelcollector/prometheusreceiver/factory.go @@ -5,7 +5,6 @@ package prometheusreceiver // import "github.com/open-telemetry/opentelemetry-co import ( "context" - "errors" promconfig "github.com/prometheus/prometheus/config" _ "github.com/prometheus/prometheus/discovery/install" // init() of this package registers service discovery impl. @@ -25,8 +24,6 @@ var useCreatedMetricGate = featuregate.GlobalRegistry().MustRegister( " retrieve the start time for Summary, Histogram and Sum metrics from _created metric"), ) -var errRenamingDisallowed = errors.New("metric renaming using metric_relabel_configs is disallowed") - // NewFactory creates a new Prometheus receiver factory. func NewFactory() receiver.Factory { return receiver.NewFactory( @@ -49,5 +46,6 @@ func createMetricsReceiver( cfg component.Config, nextConsumer consumer.Metrics, ) (receiver.Metrics, error) { + configWarnings(set.Logger, cfg.(*Config)) return newPrometheusReceiver(set, cfg.(*Config), nextConsumer), nil } diff --git a/otelcollector/prometheusreceiver/factory_test.go b/otelcollector/prometheusreceiver/factory_test.go index aef27bb5d..5e3d37e48 100644 --- a/otelcollector/prometheusreceiver/factory_test.go +++ b/otelcollector/prometheusreceiver/factory_test.go @@ -15,7 +15,7 @@ import ( "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/receiver/receivertest" - "github.com/gracewehner/prometheusreceiver/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver/internal/metadata" ) func TestCreateDefaultConfig(t *testing.T) { diff --git a/otelcollector/prometheusreceiver/go.mod b/otelcollector/prometheusreceiver/go.mod index fb6326a37..4ac99ba40 100644 --- a/otelcollector/prometheusreceiver/go.mod +++ b/otelcollector/prometheusreceiver/go.mod @@ -3,106 +3,89 @@ module github.com/gracewehner/prometheusreceiver go 1.20 require ( - github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 github.com/go-kit/log v0.2.1 github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.85.0 - github.com/prometheus/client_golang v1.16.0 - github.com/prometheus/common v0.44.0 - github.com/prometheus/prometheus v0.47.0 + github.com/mitchellh/hashstructure/v2 v2.0.2 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 + github.com/prometheus/common v0.45.0 + github.com/prometheus/prometheus v0.48.0 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/collector v0.85.0 - go.opentelemetry.io/collector/component v0.85.0 - go.opentelemetry.io/collector/confmap v0.85.0 - go.opentelemetry.io/collector/consumer v0.85.0 - go.opentelemetry.io/collector/exporter v0.85.0 - go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014 - go.opentelemetry.io/collector/pdata v1.0.0-rcv0014 - go.opentelemetry.io/collector/processor v0.85.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 - go.opentelemetry.io/collector/receiver v0.85.0 - go.opentelemetry.io/collector/semconv v0.85.0 - go.uber.org/zap v1.25.0 + go.opentelemetry.io/collector/component v0.90.0 + go.opentelemetry.io/collector/confmap v0.90.0 + go.opentelemetry.io/collector/consumer v0.90.0 + go.opentelemetry.io/collector/exporter v0.90.0 + go.opentelemetry.io/collector/featuregate v1.0.0 + go.opentelemetry.io/collector/otelcol v0.90.0 + go.opentelemetry.io/collector/pdata v1.0.0 + go.opentelemetry.io/collector/processor v0.90.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 + go.opentelemetry.io/collector/receiver v0.90.0 + go.opentelemetry.io/collector/semconv v0.90.0 + go.uber.org/zap v1.26.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute v1.23.2 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect - github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.45.2 // indirect + github.com/aws/aws-sdk-go v1.47.10 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/digitalocean/godo v1.99.0 // indirect + github.com/digitalocean/godo v1.104.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.5+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/envoyproxy/go-control-plane v0.11.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/analysis v0.21.4 // indirect - github.com/go-openapi/errors v0.20.4 // indirect github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/loads v0.21.2 // indirect - github.com/go-openapi/spec v0.20.9 // indirect - github.com/go-openapi/strfmt v0.21.7 // indirect github.com/go-openapi/swag v0.22.4 // indirect - github.com/go-openapi/validate v0.22.1 // indirect github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gophercloud/gophercloud v1.5.0 // indirect + github.com/gophercloud/gophercloud v1.7.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 // indirect - github.com/hashicorp/consul/api v1.24.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect + github.com/hashicorp/consul/api v1.25.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -111,30 +94,31 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e // indirect + github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hetznercloud/hcloud-go/v2 v2.0.0 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.4.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ionos-cloud/sdk-go/v6 v6.1.8 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.1.9 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/knadh/koanf v1.5.0 // indirect + github.com/klauspost/compress v1.17.3 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/linode/linodego v1.19.0 // indirect + github.com/linode/linodego v1.23.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.55 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/miekg/dns v1.1.56 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect @@ -143,29 +127,25 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/oklog/ulid v1.3.1 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.85.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.90.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/ovh/go-ovh v1.4.1 // indirect + github.com/ovh/go-ovh v1.4.3 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/alertmanager v0.25.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common/assets v0.2.0 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/exporter-toolkit v0.10.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect - github.com/rs/cors v1.10.0 // indirect - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 // indirect - github.com/shirou/gopsutil/v3 v3.23.8 // indirect + github.com/rs/cors v1.10.1 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect + github.com/shirou/gopsutil/v3 v3.23.10 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tidwall/gjson v1.10.2 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -176,63 +156,62 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.mongodb.org/mongo-driver v1.12.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.85.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.85.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.85.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.85.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.85.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.85.0 // indirect - go.opentelemetry.io/collector/config/internal v0.85.0 // indirect - go.opentelemetry.io/collector/connector v0.85.0 // indirect - go.opentelemetry.io/collector/extension v0.85.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.85.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.43.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.17.0 // indirect - go.opentelemetry.io/otel v1.17.0 // indirect - go.opentelemetry.io/otel/bridge/opencensus v0.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.17.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.17.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.17.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.40.1-0.20230831181707-02616a25c68e // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.40.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.17.0 // indirect - go.opentelemetry.io/otel/metric v1.17.0 // indirect - go.opentelemetry.io/otel/sdk v1.17.0 // indirect - go.opentelemetry.io/otel/sdk/metric v0.40.0 // indirect - go.opentelemetry.io/otel/trace v1.17.0 // indirect + go.opentelemetry.io/collector v0.90.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect + go.opentelemetry.io/collector/config/internal v0.90.0 // indirect + go.opentelemetry.io/collector/connector v0.90.0 // indirect + go.opentelemetry.io/collector/extension v0.90.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect + go.opentelemetry.io/collector/service v0.90.0 // indirect + go.opentelemetry.io/contrib/config v0.1.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/bridge/opencensus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/atomic v1.11.0 // indirect - go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.13.0 // indirect - golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/oauth2 v0.14.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.4.0 // indirect + golang.org/x/tools v0.15.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/api v0.139.0 // indirect + google.golang.org/api v0.150.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/grpc v1.58.0 // indirect + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/grpc v1.59.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.1 // indirect - k8s.io/apimachinery v0.28.1 // indirect - k8s.io/client-go v0.28.1 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/apimachinery v0.28.3 // indirect + k8s.io/client-go v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect diff --git a/otelcollector/prometheusreceiver/go.sum b/otelcollector/prometheusreceiver/go.sum index c75e474ae..9f2a48ef9 100644 --- a/otelcollector/prometheusreceiver/go.sum +++ b/otelcollector/prometheusreceiver/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= +cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -37,45 +37,28 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -83,30 +66,15 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.45.2 h1:hTong9YUklQKqzrGk3WnKABReb5R8GjbG4Y6dEQfjnk= -github.com/aws/aws-sdk-go v1.45.2/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= -github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= -github.com/aws/aws-sdk-go-v2/service/appconfig v1.4.2/go.mod h1:FZ3HkCe+b10uFZZkFdvf98LHW21k49W8o8J366lqVKY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= -github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= +github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -126,16 +94,9 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -143,26 +104,22 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= -github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= +github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= +github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -174,13 +131,10 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -190,7 +144,6 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -199,89 +152,32 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= -github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= -github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= -github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.4 h1:unTcVm6PispJsMECE3zWgvG4xTiKda1LIR5rCRWLG6M= -github.com/go-openapi/errors v0.20.4/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= -github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= -github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= -github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= -github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= -github.com/go-openapi/strfmt v0.21.7 h1:rspiXgNWgeUzhjo1YU01do6qsahtJNByjLVbPLNHb8k= -github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU= -github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -312,7 +208,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -332,10 +227,10 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -350,34 +245,29 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= -github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= +github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= -github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ= -github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= -github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= @@ -385,13 +275,9 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= -github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -403,59 +289,45 @@ github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHh github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= -github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= -github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= -github.com/hjson/hjson-go/v4 v4.0.0/go.mod h1:KaYt3bTw3zhBjYqnXkYywcYctk0A2nxeEFTse3rH13E= +github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= +github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= -github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= +github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -469,27 +341,23 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= -github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= github.com/knadh/koanf/v2 v2.0.1 h1:1dYGITt1I23x8cfx8ZnldtezdyaZtfAuRtIFOiRzK7g= github.com/knadh/koanf/v2 v2.0.1/go.mod h1:ZeiIlIDXTE7w1lMT6UVcNiRAS2/rCeLn/GdLNvY1Dus= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -498,17 +366,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= -github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= +github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= +github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -518,7 +381,6 @@ github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxec github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -526,32 +388,24 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= @@ -562,43 +416,24 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.85.0 h1:6/OlktNNS8X3pL/Ry1pBAjwB4QGXjOm7MvF7Qjucbso= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.85.0/go.mod h1:cNNuHYuh8ZFZQmjCzWle3P93KpyBtvt7MJQBxzszCW8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.85.0 h1:LSh3CEsFBQJykzrnAzFP2RhdWTR8tpPiQYa3Cjl5+oI= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.85.0 h1:syi7DOno9/zo5t90bdqQe9EhFMjeozS2RT1A2Ty/bVM= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.85.0 h1:spVx9VQV8KV6EsvyeBjoz7lfZxApg0InR8Ju6j3Yyk0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.85.0/go.mod h1:h5h6CZwte3hBoitlWffAO2OHtc38jBRdr1UAS9hyXFs= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.85.0 h1:HxYC9D6ghO9qjUbuNscASG6D2ONTmf3izq3Pb8Kb7/s= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.85.0/go.mod h1:kbCp9bF+bKcP4d06k6ZLOHFt8RAIDDan+eCFErGOTvY= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.85.0 h1:xM+OELzJqaDJrYt+GoDdVgjruJVPL4jtaaUxM3CNvM8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.85.0/go.mod h1:AjlewnpSdqaRwimNsRURcRqP6hLpUnTUt6GUTIMmYdg= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0 h1:U6jXC1LrqtW7/MLGMRbumuOcwr5g+J3mkngPgyBYEV0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0/go.mod h1:McKtbYeooqdDHKorvo/vwO9u8keV+4AhFHU6jKg2v7U= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= -github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= +github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= +github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -612,25 +447,22 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/alertmanager v0.25.0 h1:vbXKUR6PYRiZPRIKfmXaG+dmCKG52RtPL4Btl8hQGvg= -github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= @@ -639,14 +471,10 @@ github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= -github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/exporter-toolkit v0.10.0 h1:yOAzZTi4M22ZzVxD+fhy1URTuNRj/36uQJJ5S8IPza8= -github.com/prometheus/exporter-toolkit v0.10.0/go.mod h1:+sVFzuvV5JDyw+Ih6p3zFxZNVnKQa3x5qPmDSiPu4ZY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= @@ -654,45 +482,33 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/prometheus v0.47.0 h1:tIJJKZGlmrMVsvIt6rMfB8he7CRHEc8ZxS5ubcZtbkM= -github.com/prometheus/prometheus v0.47.0/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= +github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= -github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= -github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= -github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= +github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= +github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shoenig/test v0.6.6 h1:Oe8TPH9wAbv++YPNDKJWUnI8Q4PPWCx3UbOfH+FxiMU= -github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs= -github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -703,14 +519,12 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= @@ -718,7 +532,6 @@ github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= @@ -732,30 +545,12 @@ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9f github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= -go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= -go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= -go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -764,114 +559,108 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.85.0 h1:I037iYQ2FlAOKmaesT5Hgy7VazJO5oO4rcHSgc1+K8A= -go.opentelemetry.io/collector v0.85.0/go.mod h1:jcETa0UJmwkDSyhkOTwQi8rgie1M3TjsIO98KeGM2vk= -go.opentelemetry.io/collector/component v0.85.0 h1:RdeUDdX3prvkf0PFFbhMjWLsYUJdxy/d0oovOuObRDs= -go.opentelemetry.io/collector/component v0.85.0/go.mod h1:C3CWpjYa+k7Vjkqes/8abJ/fkCn6FlR1sNkW4QPd+kI= -go.opentelemetry.io/collector/config/configauth v0.85.0 h1:KJquqyQ/Am3wgyOEhLHAYmLix1Mow7zUORNKitUv6GQ= -go.opentelemetry.io/collector/config/configauth v0.85.0/go.mod h1:+NTOnvvrYtuLUu5e0dM9luKjeyzHf+DPK9MEP/S24Vk= -go.opentelemetry.io/collector/config/configcompression v0.85.0 h1:QWqDla4mE+pDV+97vnA8OpBxX4VJxllsi1DSMN2M0mo= -go.opentelemetry.io/collector/config/configcompression v0.85.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/confighttp v0.85.0 h1:CwY8qLcMdRshKCPzdZX6UnH5QU4YwuXtLNt/E6if+LY= -go.opentelemetry.io/collector/config/confighttp v0.85.0/go.mod h1:T+UpZ+VwkayTaFOAANa4nkUx1P3YlYdR6gx6mSoEwsU= -go.opentelemetry.io/collector/config/confignet v0.85.0 h1:oo+P10MC5wWvSfN5NyZFqVXQCvVNfAwf0SIRDcFRuJ0= -go.opentelemetry.io/collector/config/configopaque v0.85.0 h1:FdQCf88Vq2yX7kiRswN00t/oGY+BbRCaAd0paG0if1A= -go.opentelemetry.io/collector/config/configopaque v0.85.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.85.0 h1:hxKBwHEK4enl4YKtdZCq2rxxIKHrccoChoZlVgG8vbI= -go.opentelemetry.io/collector/config/configtelemetry v0.85.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.85.0 h1:oYXJ5Je0218tXyJef1ri98HDEORPdToO4rM1C7D+1YI= -go.opentelemetry.io/collector/config/configtls v0.85.0/go.mod h1:IZJrxrpGoNb5W8U1ihe2lLOp0KdtBYPC6z2aoaBrRPo= -go.opentelemetry.io/collector/config/internal v0.85.0 h1:Pjr2XMqSLCHXsmzZrW7zVZf1VBcal84tYNDoEsu8loA= -go.opentelemetry.io/collector/config/internal v0.85.0/go.mod h1:XN8Y+Vhq/RqxGry7CGKwhMXJptUrmWTHdC6ZeI+Uy9E= -go.opentelemetry.io/collector/confmap v0.85.0 h1:xyshTMElkpCJRCbg9OyGL41f7ToCr+PRBJKuAbGR17I= -go.opentelemetry.io/collector/confmap v0.85.0/go.mod h1:/SNHqYkLagF0TjBjQyCy2Gt3ZF6hTK8VKbaan/ZHuJs= -go.opentelemetry.io/collector/connector v0.85.0 h1:eiDGlbhjRCrhZlgcIbm5fizKBnZ4t7P6bjgehldKx88= -go.opentelemetry.io/collector/connector v0.85.0/go.mod h1:2CK6s5lepQ59In8bBw6UmAknBCVxXQY9Xg6hCxJQjlQ= -go.opentelemetry.io/collector/consumer v0.85.0 h1:YG1yQHhuLWLNANyRIqM6QasVFKanDI/p51mcjXV8+k8= -go.opentelemetry.io/collector/consumer v0.85.0/go.mod h1:Ysc7XgJDZuNkyyvQVKz+/e6R3Z7haiOcFNsjkgmBSHY= -go.opentelemetry.io/collector/exporter v0.85.0 h1:06RnmrcEiBG3xhhGcGNT+hEk/j/4XtHavlMIxZcJHQE= -go.opentelemetry.io/collector/exporter v0.85.0/go.mod h1:4RNnq8xd6OBmc10XUF/K+NLUMfRiXrus+XRpAZeoLuA= -go.opentelemetry.io/collector/extension v0.85.0 h1:izKozTZ4vOnYdMGhu0ROV69hXCptH6DI8JVkN/ZOEJQ= -go.opentelemetry.io/collector/extension v0.85.0/go.mod h1:l5zRPdhtmBjRmPeOhxJsZ/GRIimq4/HIAq/Rgf70W+o= -go.opentelemetry.io/collector/extension/auth v0.85.0 h1:mMZfNUCeWaXnQY85gepFA9uhzsEf0AAnAE4/Oblx/Wc= -go.opentelemetry.io/collector/extension/auth v0.85.0/go.mod h1:TBe1YtL27cc7liJFpamMhkmMVOEzR5/ccavvQFlLkAQ= -go.opentelemetry.io/collector/extension/zpagesextension v0.85.0 h1:nhcOh4HAKOmOHEnZjCcicv3GXy9L7IKKXMkKMt54qm4= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014 h1:C9o0mbP0MyygqFnKueVQK/v9jef6zvuttmTGlKaqhgw= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014/go.mod h1:0mE3mDLmUrOXVoNsuvj+7dV14h/9HFl/Fy9YTLoLObo= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0014 h1:iT5qH0NLmkGeIdDtnBogYDx7L58t6CaWGL378DEo2QY= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0014/go.mod h1:BRvDrx43kiSoUx3mr7SoA7h9B8+OY99mUK+CZSQFWW4= -go.opentelemetry.io/collector/processor v0.85.0 h1:vN3A+E/rm6nCkx9iM+kjlMzXAtE0a2vP1JhF9oqLjZQ= -go.opentelemetry.io/collector/processor v0.85.0/go.mod h1:jp9vOjg9dS13zUy1ma6C4u4hGTdbp2GKb9xp5bX2krc= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 h1:Rel52zGeC57hBVXV5av6FmGJiQCa2mYX84HHGaTPAH0= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0/go.mod h1:Qr/hC52XN0dNyRIZu1M4RxuKyYLsrzJoqYDvOEfH7TQ= -go.opentelemetry.io/collector/receiver v0.85.0 h1:ecDJicAq1mbQcsEkzo1q+6Y2DP8plK51y4p4w7ZhNmA= -go.opentelemetry.io/collector/receiver v0.85.0/go.mod h1:6pmub7FpyQIAcCLmijUtelzWD9Jj8Csno7W+3FBQFJo= -go.opentelemetry.io/collector/semconv v0.85.0 h1:TVXgaWeYADXnytlhNq44zyv2W9m3VodBR1ffiMFDusI= -go.opentelemetry.io/collector/semconv v0.85.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.43.0 h1:HKORGpiOY0R0nAPtKx/ub8/7XoHhRooP8yNRkuPfelI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.43.0/go.mod h1:e+y1M74SYXo/FcIx3UATwth2+5dDkM8dBi7eXg1tbw8= -go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= -go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= -go.opentelemetry.io/contrib/zpages v0.43.0 h1:3Vp9HDMY/lGe7UY8fDRGmwddCoAb7cACiAL2joIdJh8= -go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= -go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= -go.opentelemetry.io/otel/bridge/opencensus v0.40.0 h1:pqDiayRhBgoqy1vwnscik+TizcImJ58l053NScJyZso= -go.opentelemetry.io/otel/bridge/opencensus v0.40.0/go.mod h1:1NvVHb6tLTe5A9qCYz+eErW0t8iPn4ZfR6tDKcqlGTM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0 h1:MZbjiZeMmn5wFMORhozpouGKDxj9POHTuU5UA8msBQk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0/go.mod h1:C7tOYVCJmrDTCwxNny0MuUtnDIR3032vFHYke0F2ZrU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0 h1:q3FNPi8FLQVjLlmV+WWHQfH9ZCCtQIS0O/+dn1+4cJ4= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0/go.mod h1:rmx4n0uSIAkKBeQYkygcv9dENAlL2/tv3OSq68h1JAo= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.40.0 h1:SZaSbubADNhH2Gxm+1GaZ/cFsGiYefZoodMMX79AOd4= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.40.0/go.mod h1:N65FzQDfQH7NY7umgb0U+7ypGKVYKwwE24L6KXT4OA8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.17.0 h1:U5GYackKpVKlPrd/5gKMlrTlP2dCESAAFU682VCpieY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.17.0/go.mod h1:aFsJfCEnLzEu9vRRAcUiB/cpRTbVsNdF3OHSPpdjxZQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.17.0 h1:iGeIsSYwpYSvh5UGzWrJfTDJvPjrXtxl3GUppj6IXQU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.17.0/go.mod h1:1j3H3G1SBYpZFti6OI4P0uRQCW20MXkG5v4UWXppLLE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.17.0 h1:kvWMtSUNVylLVrOE4WLUmBtgziYoCIYUNSpTYtMzVJI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.17.0/go.mod h1:SExUrRYIXhDgEKG4tkiQovd2HTaELiHUsuK08s5Nqx4= -go.opentelemetry.io/otel/exporters/prometheus v0.40.1-0.20230831181707-02616a25c68e h1:eh19+pVw4g/V7QM/8iNDk3M5cNy3mOVzggEgdlt9jkY= -go.opentelemetry.io/otel/exporters/prometheus v0.40.1-0.20230831181707-02616a25c68e/go.mod h1:5USWZ0ovyQB5CIM3IO3bGRSoDPMXiT3t+15gu8Zo9HQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.40.0 h1:hf7JSONqAuXT1PDYYlVhKNMPLe4060d+4RFREcv7X2c= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.40.0/go.mod h1:IxD5qbw/XcnFB7i5k4d7J1aW5iBU2h4DgSxtk4YqR4c= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.17.0 h1:Ut6hgtYcASHwCzRHkXEtSsM251cXJPW+Z9DyLwEn6iI= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.17.0/go.mod h1:TYeE+8d5CjrgBa0ZuRaDeMpIC1xZ7atg4g+nInjuSjc= -go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= -go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= -go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= -go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= -go.opentelemetry.io/otel/sdk/metric v0.40.0 h1:qOM29YaGcxipWjL5FzpyZDpCYrDREvX0mVlmXdOjCHU= -go.opentelemetry.io/otel/sdk/metric v0.40.0/go.mod h1:dWxHtdzdJvg+ciJUKLTKwrMe5P6Dv3FyDbh8UkfgkVs= -go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= -go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= +go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= +go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= +go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= +go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= +go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= +go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= +go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= +go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= +go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= +go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= +go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= +go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= +go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= +go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= +go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= +go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= +go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= +go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= +go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= +go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= +go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= +go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= +go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= +go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= +go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= +go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= +go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= +go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= +go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= +go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= +go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= +go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= +go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= +go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= +go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= +go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= +go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= +go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= +go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= +go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/contrib/propagators/b3 v1.21.1 h1:WPYiUgmw3+b7b3sQ1bFBFAf0q+Di9dvNc3AtYfnT4RQ= +go.opentelemetry.io/contrib/propagators/b3 v1.21.1/go.mod h1:EmzokPoSqsYMBVK4nRnhsfm5mbn8J1eDuz/U1UaQaWg= +go.opentelemetry.io/contrib/zpages v0.46.1 h1:U8Hh84dc+vJTVgRnL+QKWtWD2iqTSKibrQ85EeQqsNg= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/bridge/opencensus v0.44.0 h1:/inELPJztkn6Xx3ap9qw8i8XdeWF0B/OjGHOdRTePZ8= +go.opentelemetry.io/otel/bridge/opencensus v0.44.0/go.mod h1:dQTBJVBx1xahrXEFBV1BGPAnGuXC92LCj55fxIrtj7I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= +go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -882,8 +671,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -896,7 +685,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -905,10 +693,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -941,19 +727,14 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -961,13 +742,12 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -976,24 +756,18 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1001,8 +775,6 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1010,7 +782,6 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1030,10 +801,7 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1045,55 +813,41 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -1128,10 +882,8 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1154,8 +906,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.139.0 h1:A1TrCPgMmOiYu0AiNkvQIpIx+D8blHTDcJ5EogkP7LI= -google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= +google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1166,7 +918,6 @@ google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1188,25 +939,21 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1216,11 +963,9 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1238,11 +983,9 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -1250,10 +993,8 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1261,9 +1002,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= @@ -1274,12 +1012,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.1 h1:i+0O8k2NPBCPYaMB+uCkseEbawEt/eFaiRqUx8aB108= -k8s.io/api v0.28.1/go.mod h1:uBYwID+66wiL28Kn2tBjBYQdEU0Xk0z5qF8bIBqk/Dg= -k8s.io/apimachinery v0.28.1 h1:EJD40og3GizBSV3mkIoXQBsws32okPOy+MkRyzh6nPY= -k8s.io/apimachinery v0.28.1/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw= -k8s.io/client-go v0.28.1 h1:pRhMzB8HyLfVwpngWKE8hDcXRqifh1ga2Z/PU9SXVK8= -k8s.io/client-go v0.28.1/go.mod h1:pEZA3FqOsVkCc07pFVzK076R+P/eXqsgx5zuuRWukNE= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= @@ -1293,6 +1031,5 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/otelcollector/prometheusreceiver/internal/appendable.go b/otelcollector/prometheusreceiver/internal/appendable.go index 81cee2f01..33acfa460 100644 --- a/otelcollector/prometheusreceiver/internal/appendable.go +++ b/otelcollector/prometheusreceiver/internal/appendable.go @@ -11,8 +11,8 @@ import ( "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/storage" "go.opentelemetry.io/collector/consumer" - "go.opentelemetry.io/collector/obsreport" "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/receiverhelper" ) // appendable translates Prometheus scraping diffs into OpenTelemetry format. @@ -25,7 +25,7 @@ type appendable struct { externalLabels labels.Labels settings receiver.CreateSettings - obsrecv *obsreport.Receiver + obsrecv *receiverhelper.ObsReport } // NewAppendable returns a storage.Appendable instance that emits metrics to the sink. @@ -45,7 +45,7 @@ func NewAppendable( metricAdjuster = NewStartTimeMetricAdjuster(set.Logger, startTimeMetricRegex) } - obsrecv, err := obsreport.NewReceiver(obsreport.ReceiverSettings{ReceiverID: set.ID, Transport: transport, ReceiverCreateSettings: set}) + obsrecv, err := receiverhelper.NewObsReport(receiverhelper.ObsReportSettings{ReceiverID: set.ID, Transport: transport, ReceiverCreateSettings: set}) if err != nil { return nil, err } diff --git a/otelcollector/prometheusreceiver/internal/logger.go b/otelcollector/prometheusreceiver/internal/logger.go index 726d23657..cd9ac7f20 100644 --- a/otelcollector/prometheusreceiver/internal/logger.go +++ b/otelcollector/prometheusreceiver/internal/logger.go @@ -30,10 +30,10 @@ type zapToGokitLogAdapter struct { type logData struct { level level.Value msg string - otherFields []interface{} + otherFields []any } -func (w *zapToGokitLogAdapter) Log(keyvals ...interface{}) error { +func (w *zapToGokitLogAdapter) Log(keyvals ...any) error { // expecting key value pairs, the number of items need to be even if len(keyvals)%2 == 0 { // Extract log level and message and log them using corresponding zap function @@ -47,7 +47,7 @@ func (w *zapToGokitLogAdapter) Log(keyvals ...interface{}) error { return nil } -func extractLogData(keyvals []interface{}) logData { +func extractLogData(keyvals []any) logData { ld := logData{ level: level.InfoValue(), // default } @@ -78,7 +78,7 @@ func extractLogData(keyvals []interface{}) logData { } // check if a given key-value pair represents go-kit log message and return it -func matchLogMessage(key interface{}, val interface{}) (string, bool) { +func matchLogMessage(key any, val any) (string, bool) { if strKey, ok := key.(string); !ok || strKey != msgKey { return "", false } @@ -91,7 +91,7 @@ func matchLogMessage(key interface{}, val interface{}) (string, bool) { } // check if a given key-value pair represents go-kit log level and return it -func matchLogLevel(key interface{}, val interface{}) (level.Value, bool) { +func matchLogLevel(key any, val any) (level.Value, bool) { strKey, ok := key.(string) if !ok || strKey != levelKey { return nil, false @@ -107,7 +107,7 @@ func matchLogLevel(key interface{}, val interface{}) (level.Value, bool) { //revive:disable:error-return // check if a given key-value pair represents an error and return it -func matchError(key interface{}, val interface{}) (error, bool) { +func matchError(key any, val any) (error, bool) { strKey, ok := key.(string) if !ok || strKey != errKey { return nil, false @@ -123,7 +123,7 @@ func matchError(key interface{}, val interface{}) (error, bool) { //revive:enable:error-return // find a matching zap logging function to be used for a given level -func levelToFunc(logger *zap.SugaredLogger, lvl level.Value) func(string, ...interface{}) { +func levelToFunc(logger *zap.SugaredLogger, lvl level.Value) func(string, ...any) { switch lvl { case level.DebugValue(): return logger.Debugw diff --git a/otelcollector/prometheusreceiver/internal/logger_test.go b/otelcollector/prometheusreceiver/internal/logger_test.go index 5a17fd051..037e23d94 100644 --- a/otelcollector/prometheusreceiver/internal/logger_test.go +++ b/otelcollector/prometheusreceiver/internal/logger_test.go @@ -20,13 +20,13 @@ import ( func TestLog(t *testing.T) { tcs := []struct { name string - input []interface{} + input []any wantLevel zapcore.Level wantMessage string }{ { name: "Starting provider", - input: []interface{}{ + input: []any{ "level", level.DebugValue(), "msg", @@ -41,7 +41,7 @@ func TestLog(t *testing.T) { }, { name: "Scrape failed", - input: []interface{}{ + input: []any{ "level", level.ErrorValue(), "scrape_pool", @@ -84,10 +84,10 @@ func TestLog(t *testing.T) { func TestExtractLogData(t *testing.T) { tcs := []struct { name string - input []interface{} + input []any wantLevel level.Value wantMessage string - wantOutput []interface{} + wantOutput []any }{ { name: "nil fields", @@ -98,14 +98,14 @@ func TestExtractLogData(t *testing.T) { }, { name: "empty fields", - input: []interface{}{}, + input: []any{}, wantLevel: level.InfoValue(), // Default wantMessage: "", wantOutput: nil, }, { name: "info level", - input: []interface{}{ + input: []any{ "level", level.InfoValue(), }, @@ -115,7 +115,7 @@ func TestExtractLogData(t *testing.T) { }, { name: "warn level", - input: []interface{}{ + input: []any{ "level", level.WarnValue(), }, @@ -125,7 +125,7 @@ func TestExtractLogData(t *testing.T) { }, { name: "error level", - input: []interface{}{ + input: []any{ "level", level.ErrorValue(), }, @@ -135,7 +135,7 @@ func TestExtractLogData(t *testing.T) { }, { name: "debug level + extra fields", - input: []interface{}{ + input: []any{ "timestamp", 1596604719, "level", @@ -145,13 +145,13 @@ func TestExtractLogData(t *testing.T) { }, wantLevel: level.DebugValue(), wantMessage: "http client error", - wantOutput: []interface{}{ + wantOutput: []any{ "timestamp", 1596604719, }, }, { name: "missing level field", - input: []interface{}{ + input: []any{ "timestamp", 1596604719, "msg", @@ -159,18 +159,18 @@ func TestExtractLogData(t *testing.T) { }, wantLevel: level.InfoValue(), // Default wantMessage: "http client error", - wantOutput: []interface{}{ + wantOutput: []any{ "timestamp", 1596604719, }, }, { name: "invalid level type", - input: []interface{}{ + input: []any{ "level", "warn", // String is not recognized }, wantLevel: level.InfoValue(), // Default - wantOutput: []interface{}{ + wantOutput: []any{ "level", "warn", // Field is preserved }, }, diff --git a/otelcollector/prometheusreceiver/internal/staleness_end_to_end_test.go b/otelcollector/prometheusreceiver/internal/staleness_end_to_end_test.go index 11cef94e8..8e38178a1 100644 --- a/otelcollector/prometheusreceiver/internal/staleness_end_to_end_test.go +++ b/otelcollector/prometheusreceiver/internal/staleness_end_to_end_test.go @@ -34,7 +34,7 @@ import ( "go.uber.org/zap/zapcore" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter" - "github.com/gracewehner/prometheusreceiver" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver" ) // Test that staleness markers are emitted for timeseries that intermittently disappear. @@ -157,7 +157,7 @@ service: require.NoError(t, err) appSettings := otelcol.CollectorSettings{ - Factories: factories, + Factories: func() (otelcol.Factories, error) { return factories, nil }, ConfigProvider: configProvider, BuildInfo: component.BuildInfo{ Command: "otelcol", diff --git a/otelcollector/prometheusreceiver/internal/transaction.go b/otelcollector/prometheusreceiver/internal/transaction.go index 98d75f805..4b3b869d4 100644 --- a/otelcollector/prometheusreceiver/internal/transaction.go +++ b/otelcollector/prometheusreceiver/internal/transaction.go @@ -19,10 +19,10 @@ import ( "github.com/prometheus/prometheus/storage" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" - "go.opentelemetry.io/collector/obsreport" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/receiverhelper" "go.uber.org/zap" ) @@ -47,7 +47,7 @@ type transaction struct { logger *zap.Logger buildInfo component.BuildInfo metricAdjuster MetricsAdjuster - obsrecv *obsreport.Receiver + obsrecv *receiverhelper.ObsReport // Used as buffer to calculate series ref hash. bufBytes []byte } @@ -65,7 +65,7 @@ func newTransaction( sink consumer.Metrics, externalLabels labels.Labels, settings receiver.CreateSettings, - obsrecv *obsreport.Receiver, + obsrecv *receiverhelper.ObsReport, trimSuffixes bool) *transaction { return &transaction{ ctx: ctx, diff --git a/otelcollector/prometheusreceiver/internal/transaction_test.go b/otelcollector/prometheusreceiver/internal/transaction_test.go index e17c8602a..a6a6b8f66 100644 --- a/otelcollector/prometheusreceiver/internal/transaction_test.go +++ b/otelcollector/prometheusreceiver/internal/transaction_test.go @@ -18,9 +18,9 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer/consumertest" - "go.opentelemetry.io/collector/obsreport" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" + "go.opentelemetry.io/collector/receiver/receiverhelper" "go.opentelemetry.io/collector/receiver/receivertest" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" @@ -352,8 +352,8 @@ func TestAppendExemplarWithEmptyLabelArray(t *testing.T) { assert.Equal(t, errNoJobInstance, err) } -func nopObsRecv(t *testing.T) *obsreport.Receiver { - obsrecv, err := obsreport.NewReceiver(obsreport.ReceiverSettings{ +func nopObsRecv(t *testing.T) *receiverhelper.ObsReport { + obsrecv, err := receiverhelper.NewObsReport(receiverhelper.ObsReportSettings{ ReceiverID: component.NewID("prometheus"), Transport: transport, ReceiverCreateSettings: receivertest.NewNopCreateSettings(), diff --git a/otelcollector/prometheusreceiver/metrics_receiver.go b/otelcollector/prometheusreceiver/metrics_receiver.go index caaa71408..9d8443f1c 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver.go +++ b/otelcollector/prometheusreceiver/metrics_receiver.go @@ -6,7 +6,10 @@ package prometheusreceiver // import "github.com/open-telemetry/opentelemetry-co import ( "bytes" "context" + "errors" "fmt" + "hash" + "hash/fnv" "io" "net/http" "net/url" @@ -15,7 +18,6 @@ import ( "sync" "time" - "github.com/cnf/structhash" "github.com/go-kit/log" commonconfig "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -111,7 +113,7 @@ func (r *pReceiver) Start(_ context.Context, host component.Host) error { func (r *pReceiver) startTargetAllocator(allocConf *targetAllocator, baseCfg *config.Config) error { r.settings.Logger.Info("Starting target allocator discovery") // immediately sync jobs, not waiting for the first tick - savedHash, err := r.syncTargetAllocator("", allocConf, baseCfg) + savedHash, err := r.syncTargetAllocator(nil, allocConf, baseCfg) if err != nil { return err } @@ -136,21 +138,40 @@ func (r *pReceiver) startTargetAllocator(allocConf *targetAllocator, baseCfg *co return nil } +// Calculate a hash for a scrape config map. +// This is done by marshaling to YAML because it's the most straightforward and doesn't run into problems with unexported fields. +func getScrapeConfigHash(jobToScrapeConfig map[string]*config.ScrapeConfig) (hash.Hash64, error) { + var err error + hash := fnv.New64() + yamlEncoder := yaml.NewEncoder(hash) + for jobName, scrapeConfig := range jobToScrapeConfig { + _, err = hash.Write([]byte(jobName)) + if err != nil { + return nil, err + } + err = yamlEncoder.Encode(scrapeConfig) + if err != nil { + return nil, err + } + } + yamlEncoder.Close() + return hash, err +} + // syncTargetAllocator request jobs from targetAllocator and update underlying receiver, if the response does not match the provided compareHash. // baseDiscoveryCfg can be used to provide additional ScrapeConfigs which will be added to the retrieved jobs. -func (r *pReceiver) syncTargetAllocator(compareHash string, allocConf *targetAllocator, baseCfg *config.Config) (string, error) { +func (r *pReceiver) syncTargetAllocator(compareHash hash.Hash64, allocConf *targetAllocator, baseCfg *config.Config) (hash.Hash64, error) { r.settings.Logger.Debug("Syncing target allocator jobs") scrapeConfigsResponse, err := r.getScrapeConfigsResponse(allocConf.Endpoint) if err != nil { r.settings.Logger.Error("Failed to retrieve job list", zap.Error(err)) - return "", err + return nil, err } - hash, err := structhash.Hash(scrapeConfigsResponse, 1) - + hash, err := getScrapeConfigHash(scrapeConfigsResponse) if err != nil { r.settings.Logger.Error("Failed to hash job list", zap.Error(err)) - return "", err + return nil, err } if hash == compareHash { // no update needed @@ -182,7 +203,7 @@ func (r *pReceiver) syncTargetAllocator(compareHash string, allocConf *targetAll err = r.applyCfg(baseCfg) if err != nil { r.settings.Logger.Error("Failed to apply new scrape configuration", zap.Error(err)) - return "", err + return nil, err } return hash, nil @@ -251,7 +272,7 @@ func (r *pReceiver) initPrometheusComponents(ctx context.Context, host component go func() { r.settings.Logger.Info("Starting discovery manager") - if err := r.discoveryManager.Run(); err != nil { + if err := r.discoveryManager.Run(); err != nil && !errors.Is(err, context.Canceled) { r.settings.Logger.Error("Discovery manager failed", zap.Error(err)) host.ReportFatalError(err) } @@ -281,8 +302,9 @@ func (r *pReceiver) initPrometheusComponents(ctx context.Context, host component } r.scrapeManager = scrape.NewManager(&scrape.Options{ - PassMetadataInContext: true, - ExtraMetrics: r.cfg.ReportExtraScrapeMetrics, + PassMetadataInContext: true, + EnableProtobufNegotiation: r.cfg.EnableProtobufNegotiation, + ExtraMetrics: r.cfg.ReportExtraScrapeMetrics, HTTPClientOptions: []commonconfig.HTTPClientOption{ commonconfig.WithUserAgent(r.settings.BuildInfo.Command + "/" + r.settings.BuildInfo.Version), }, diff --git a/otelcollector/prometheusreceiver/metrics_receiver_helper_test.go b/otelcollector/prometheusreceiver/metrics_receiver_helper_test.go index b7917d6b6..56769d375 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_helper_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_helper_test.go @@ -4,7 +4,9 @@ package prometheusreceiver import ( + "bytes" "context" + "encoding/binary" "fmt" "log" "math" @@ -17,9 +19,11 @@ import ( "time" gokitlog "github.com/go-kit/log" + "github.com/gogo/protobuf/proto" promcfg "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/value" + dto "github.com/prometheus/prometheus/prompb/io/prometheus/client" "github.com/prometheus/prometheus/scrape" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -30,13 +34,16 @@ import ( "go.opentelemetry.io/collector/receiver/receivertest" "gopkg.in/yaml.v2" - "github.com/gracewehner/prometheusreceiver/internal" + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver/internal" ) type mockPrometheusResponse struct { code int data string useOpenMetrics bool + + useProtoBuf bool // This overrides data and useOpenMetrics above + buf []byte } type mockPrometheus struct { @@ -82,11 +89,18 @@ func (mp *mockPrometheus) ServeHTTP(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(404) return } - if pages[index].useOpenMetrics { + switch { + case pages[index].useProtoBuf: + rw.Header().Set("Content-Type", "application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited") + case pages[index].useOpenMetrics: rw.Header().Set("Content-Type", "application/openmetrics-text") } rw.WriteHeader(pages[index].code) - _, _ = rw.Write([]byte(pages[index].data)) + if pages[index].useProtoBuf { + _, _ = rw.Write(pages[index].buf) + } else { + _, _ = rw.Write([]byte(pages[index].data)) + } } func (mp *mockPrometheus) Close() { @@ -115,7 +129,7 @@ type testData struct { // setupMockPrometheus to create a mocked prometheus based on targets, returning the server and a prometheus exporting // config func setupMockPrometheus(tds ...*testData) (*mockPrometheus, *promcfg.Config, error) { - jobs := make([]map[string]interface{}, 0, len(tds)) + jobs := make([]map[string]any, 0, len(tds)) endpoints := make(map[string][]mockPrometheusResponse) metricPaths := make([]string, len(tds)) for i, t := range tds { @@ -126,18 +140,18 @@ func setupMockPrometheus(tds ...*testData) (*mockPrometheus, *promcfg.Config, er mp := newMockPrometheus(endpoints) u, _ := url.Parse(mp.srv.URL) for i := 0; i < len(tds); i++ { - job := make(map[string]interface{}) + job := make(map[string]any) job["job_name"] = tds[i].name job["metrics_path"] = metricPaths[i] job["scrape_interval"] = "1s" job["scrape_timeout"] = "500ms" - job["static_configs"] = []map[string]interface{}{{"targets": []string{u.Host}}} + job["static_configs"] = []map[string]any{{"targets": []string{u.Host}}} jobs = append(jobs, job) } if len(jobs) != len(tds) { log.Fatal("len(jobs) != len(targets), make sure job names are unique") } - configP := make(map[string]interface{}) + configP := make(map[string]any) configP["scrape_configs"] = jobs cfg, err := yaml.Marshal(&configP) if err != nil { @@ -563,10 +577,11 @@ func assertNormalNan() numberPointComparator { } } -func compareHistogram(count uint64, sum float64, buckets []uint64) histogramPointComparator { +func compareHistogram(count uint64, sum float64, upperBounds []float64, buckets []uint64) histogramPointComparator { return func(t *testing.T, histogramDataPoint pmetric.HistogramDataPoint) { assert.Equal(t, count, histogramDataPoint.Count(), "Histogram count value does not match") assert.Equal(t, sum, histogramDataPoint.Sum(), "Histogram sum value does not match") + assert.Equal(t, upperBounds, histogramDataPoint.ExplicitBounds().AsRaw(), "Histogram upper bounds values do not match") assert.Equal(t, buckets, histogramDataPoint.BucketCounts().AsRaw(), "Histogram bucket count values do not match") } } @@ -593,7 +608,7 @@ func compareSummary(count uint64, sum float64, quantiles [][]float64) summaryPoi } // starts prometheus receiver with custom config, retrieves metrics from MetricsSink -func testComponent(t *testing.T, targets []*testData, useStartTimeMetric bool, trimMetricSuffixes bool, startTimeMetricRegex string, cfgMuts ...func(*promcfg.Config)) { +func testComponent(t *testing.T, targets []*testData, alterConfig func(*Config), cfgMuts ...func(*promcfg.Config)) { ctx := context.Background() mp, cfg, err := setupMockPrometheus(targets...) for _, cfgMut := range cfgMuts { @@ -602,13 +617,16 @@ func testComponent(t *testing.T, targets []*testData, useStartTimeMetric bool, t require.Nilf(t, err, "Failed to create Prometheus config: %v", err) defer mp.Close() - cms := new(consumertest.MetricsSink) - receiver := newPrometheusReceiver(receivertest.NewNopCreateSettings(), &Config{ + config := &Config{ PrometheusConfig: cfg, - UseStartTimeMetric: useStartTimeMetric, - StartTimeMetricRegex: startTimeMetricRegex, - TrimMetricSuffixes: trimMetricSuffixes, - }, cms) + StartTimeMetricRegex: "", + } + if alterConfig != nil { + alterConfig(config) + } + + cms := new(consumertest.MetricsSink) + receiver := newPrometheusReceiver(receivertest.NewNopCreateSettings(), config, cms) require.NoError(t, receiver.Start(ctx, componenttest.NewNopHost())) // verify state after shutdown is called @@ -695,3 +713,22 @@ func getTS(ms pmetric.MetricSlice) pcommon.Timestamp { } return 0 } + +func prometheusMetricFamilyToProtoBuf(t *testing.T, buffer *bytes.Buffer, metricFamily *dto.MetricFamily) *bytes.Buffer { + if buffer == nil { + buffer = &bytes.Buffer{} + } + + data, err := proto.Marshal(metricFamily) + require.NoError(t, err) + + varintBuf := make([]byte, binary.MaxVarintLen32) + varintLength := binary.PutUvarint(varintBuf, uint64(len(data))) + + _, err = buffer.Write(varintBuf[:varintLength]) + require.NoError(t, err) + _, err = buffer.Write(data) + require.NoError(t, err) + + return buffer +} diff --git a/otelcollector/prometheusreceiver/metrics_receiver_honor_timestamp_test.go b/otelcollector/prometheusreceiver/metrics_receiver_honor_timestamp_test.go index 3ce6b001b..020ed21db 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_honor_timestamp_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_honor_timestamp_test.go @@ -150,7 +150,7 @@ func TestHonorTimeStampsWithTrue(t *testing.T) { }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } // TestHonorTimeStampsWithFalse validates that with honor_timestamp config set to false, @@ -168,7 +168,7 @@ func TestHonorTimeStampsWithFalse(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { for _, scrapeConfig := range cfg.ScrapeConfigs { scrapeConfig.HonorTimestamps = false } @@ -246,7 +246,7 @@ func verifyHonorTimeStampsTrue(t *testing.T, td *testData, resourceMetrics []pme histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(pcommon.NewTimestampFromTime(time.UnixMilli(ts4))), compareHistogramTimestamp(pcommon.NewTimestampFromTime(time.UnixMilli(ts4))), - compareHistogram(2500, 5000, []uint64{1000, 500, 500, 500}), + compareHistogram(2500, 5000, []float64{0.05, 0.5, 1}, []uint64{1000, 500, 500, 500}), }, }, }), @@ -310,7 +310,7 @@ func verifyHonorTimeStampsTrue(t *testing.T, td *testData, resourceMetrics []pme histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(pcommon.NewTimestampFromTime(time.UnixMilli(ts9))), compareHistogramTimestamp(pcommon.NewTimestampFromTime(time.UnixMilli(ts9))), - compareHistogram(2400, 4950, []uint64{900, 500, 500, 500}), + compareHistogram(2400, 4950, []float64{0.05, 0.5, 1}, []uint64{900, 500, 500, 500}), }, }, }), @@ -374,7 +374,7 @@ func verifyHonorTimeStampsTrue(t *testing.T, td *testData, resourceMetrics []pme histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(pcommon.NewTimestampFromTime(time.UnixMilli(ts9))), compareHistogramTimestamp(pcommon.NewTimestampFromTime(time.UnixMilli(ts14))), - compareHistogram(2500, 5000, []uint64{1000, 500, 500, 500}), + compareHistogram(2500, 5000, []float64{0.05, 0.5, 1}, []uint64{1000, 500, 500, 500}), }, }, }), @@ -446,7 +446,7 @@ func verifyHonorTimeStampsFalse(t *testing.T, td *testData, resourceMetrics []pm histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), - compareHistogram(2500, 5000, []uint64{1000, 500, 500, 500}), + compareHistogram(2500, 5000, []float64{0.05, 0.5, 1}, []uint64{1000, 500, 500, 500}), }, }, }), @@ -512,7 +512,7 @@ func verifyHonorTimeStampsFalse(t *testing.T, td *testData, resourceMetrics []pm histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts2), compareHistogramTimestamp(ts2), - compareHistogram(2400, 4950, []uint64{900, 500, 500, 500}), + compareHistogram(2400, 4950, []float64{0.05, 0.5, 1}, []uint64{900, 500, 500, 500}), }, }, }), diff --git a/otelcollector/prometheusreceiver/metrics_receiver_labels_test.go b/otelcollector/prometheusreceiver/metrics_receiver_labels_test.go index c1e0631f0..8db248ef0 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_labels_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_labels_test.go @@ -29,7 +29,7 @@ func TestExternalLabels(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { cfg.GlobalConfig.ExternalLabels = labels.FromStrings("key", "value") }) } @@ -121,7 +121,7 @@ func TestLabelLimitConfig(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { // set label limit in scrape_config for _, scrapeCfg := range cfg.ScrapeConfigs { scrapeCfg.LabelLimit = 5 @@ -198,7 +198,7 @@ func verifyLabelConfigTarget1(t *testing.T, td *testData, rms []pmetric.Resource histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), - compareHistogram(2500, 5000, []uint64{1000, 500, 500, 500}), + compareHistogram(2500, 5000, []float64{0.1, 0.5, 1}, []uint64{1000, 500, 500, 500}), compareHistogramAttributes(map[string]string{"label1": "value1", "label2": "value2"}), }, }, @@ -248,7 +248,7 @@ func TestLabelNameLimitConfig(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { // set label limit in scrape_config for _, scrapeCfg := range cfg.ScrapeConfigs { scrapeCfg.LabelNameLengthLimit = 20 @@ -284,7 +284,7 @@ func TestLabelValueLimitConfig(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { // set label name limit in scrape_config for _, scrapeCfg := range cfg.ScrapeConfigs { scrapeCfg.LabelValueLengthLimit = 25 @@ -360,7 +360,7 @@ func verifyEmptyLabelValuesTarget1(t *testing.T, td *testData, rms []pmetric.Res histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), - compareHistogram(2500, 5000, []uint64{1000, 500, 500, 500}), + compareHistogram(2500, 5000, []float64{0.1, 0.5, 1}, []uint64{1000, 500, 500, 500}), compareHistogramAttributes(map[string]string{"id": "1"}), }, }, @@ -462,7 +462,7 @@ func TestEmptyLabelValues(t *testing.T) { validateFunc: verifyEmptyLabelValuesTarget2, }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } const honorLabelsTarget = ` @@ -556,7 +556,7 @@ func TestEmptyLabels(t *testing.T) { validateFunc: verifyEmptyLabelsTarget1, }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func TestHonorLabelsFalseConfig(t *testing.T) { @@ -570,7 +570,7 @@ func TestHonorLabelsFalseConfig(t *testing.T) { }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyHonorLabelsTrue(t *testing.T, td *testData, rms []pmetric.ResourceMetrics) { @@ -613,7 +613,7 @@ func TestHonorLabelsTrueConfig(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { // set label name limit in scrape_config for _, scrapeCfg := range cfg.ScrapeConfigs { scrapeCfg.HonorLabels = true @@ -639,7 +639,7 @@ func TestRelabelJobInstance(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { for _, scrapeConfig := range cfg.ScrapeConfigs { scrapeConfig.MetricRelabelConfigs = []*relabel.Config{ { @@ -709,7 +709,7 @@ func TestTargetInfoResourceAttributes(t *testing.T) { }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyTargetInfoResourceAttributes(t *testing.T, td *testData, rms []pmetric.ResourceMetrics) { @@ -759,7 +759,7 @@ func TestScopeInfoScopeAttributes(t *testing.T) { }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyMultipleScopes(t *testing.T, td *testData, rms []pmetric.ResourceMetrics) { diff --git a/otelcollector/prometheusreceiver/metrics_receiver_metric_name_normalize_test.go b/otelcollector/prometheusreceiver/metrics_receiver_metric_name_normalize_test.go index 5ac7682f1..b2c06b590 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_metric_name_normalize_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_metric_name_normalize_test.go @@ -44,7 +44,9 @@ func TestMetricNormalize(t *testing.T) { }, } - testComponent(t, targets, false, true, "") + testComponent(t, targets, func(c *Config) { + c.TrimMetricSuffixes = true + }) } func verifyNormalizeMetric(t *testing.T, td *testData, resourceMetrics []pmetric.ResourceMetrics) { diff --git a/otelcollector/prometheusreceiver/metrics_receiver_non_numerical_test.go b/otelcollector/prometheusreceiver/metrics_receiver_non_numerical_test.go index 05107737a..85c5986e1 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_non_numerical_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_non_numerical_test.go @@ -70,7 +70,7 @@ func TestStaleNaNs(t *testing.T) { validateScrapes: true, }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyStaleNaNs(t *testing.T, td *testData, resourceMetrics []pmetric.ResourceMetrics) { @@ -133,7 +133,7 @@ func verifyStaleNaNsSuccessfulScrape(t *testing.T, td *testData, resourceMetric histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(startTimestamp), compareHistogramTimestamp(ts1), - compareHistogram(2500, 5000, []uint64{1000, 500, 500, 500}), + compareHistogram(2500, 5000, []float64{0.05, 0.5, 1}, []uint64{1000, 500, 500, 500}), }, }, }), @@ -252,7 +252,7 @@ func TestNormalNaNs(t *testing.T) { validateFunc: verifyNormalNaNs, }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyNormalNaNs(t *testing.T, td *testData, resourceMetrics []pmetric.ResourceMetrics) { @@ -339,7 +339,7 @@ func TestInfValues(t *testing.T) { validateFunc: verifyInfValues, }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyInfValues(t *testing.T, td *testData, resourceMetrics []pmetric.ResourceMetrics) { diff --git a/otelcollector/prometheusreceiver/metrics_receiver_open_metrics_test.go b/otelcollector/prometheusreceiver/metrics_receiver_open_metrics_test.go index 3ab80d737..a39b12bdf 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_open_metrics_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_open_metrics_test.go @@ -74,7 +74,7 @@ func TestOpenMetricsPositive(t *testing.T) { targets = append(targets, testData) } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyFailTarget(t *testing.T, td *testData, mds []pmetric.ResourceMetrics) { @@ -107,7 +107,7 @@ func TestOpenMetricsFail(t *testing.T) { targets = append(targets, testData) } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyInvalidTarget(t *testing.T, td *testData, mds []pmetric.ResourceMetrics) { @@ -142,7 +142,7 @@ func TestOpenMetricsInvalid(t *testing.T) { targets = append(targets, testData) } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } // reads test data from testdata/openmetrics directory @@ -228,7 +228,7 @@ func TestInfoStatesetMetrics(t *testing.T) { }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } diff --git a/otelcollector/prometheusreceiver/metrics_receiver_protobuf_test.go b/otelcollector/prometheusreceiver/metrics_receiver_protobuf_test.go new file mode 100644 index 000000000..dbb00e902 --- /dev/null +++ b/otelcollector/prometheusreceiver/metrics_receiver_protobuf_test.go @@ -0,0 +1,158 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package prometheusreceiver + +import ( + "math" + "testing" + + dto "github.com/prometheus/prometheus/prompb/io/prometheus/client" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func TestScrapeViaProtobuf(t *testing.T) { + mf := &dto.MetricFamily{ + Name: "test_counter", + Type: dto.MetricType_COUNTER, + Metric: []dto.Metric{ + { + Label: []dto.LabelPair{ + { + Name: "foo", + Value: "bar", + }, + }, + Counter: &dto.Counter{ + Value: 1234, + }, + }, + }, + } + buffer := prometheusMetricFamilyToProtoBuf(t, nil, mf) + + mf = &dto.MetricFamily{ + Name: "test_gauge", + Type: dto.MetricType_GAUGE, + Metric: []dto.Metric{ + { + Gauge: &dto.Gauge{ + Value: 400.8, + }, + }, + }, + } + prometheusMetricFamilyToProtoBuf(t, buffer, mf) + + mf = &dto.MetricFamily{ + Name: "test_summary", + Type: dto.MetricType_SUMMARY, + Metric: []dto.Metric{ + { + Summary: &dto.Summary{ + SampleCount: 1213, + SampleSum: 456, + Quantile: []dto.Quantile{ + { + Quantile: 0.5, + Value: 789, + }, + { + Quantile: 0.9, + Value: 1011, + }, + }, + }, + }, + }, + } + prometheusMetricFamilyToProtoBuf(t, buffer, mf) + + mf = &dto.MetricFamily{ + Name: "test_histogram", + Type: dto.MetricType_HISTOGRAM, + Metric: []dto.Metric{ + { + Histogram: &dto.Histogram{ + SampleCount: 1213, + SampleSum: 456, + Bucket: []dto.Bucket{ + { + UpperBound: 0.5, + CumulativeCount: 789, + }, + { + UpperBound: 10, + CumulativeCount: 1011, + }, + { + UpperBound: math.Inf(1), + CumulativeCount: 1213, + }, + }, + }, + }, + }, + } + prometheusMetricFamilyToProtoBuf(t, buffer, mf) + + expectations := []testExpectation{ + assertMetricPresent( + "test_counter", + compareMetricType(pmetric.MetricTypeSum), + compareMetricUnit(""), + []dataPointExpectation{{ + numberPointComparator: []numberPointComparator{ + compareDoubleValue(1234), + }, + }}, + ), + assertMetricPresent( + "test_gauge", + compareMetricType(pmetric.MetricTypeGauge), + compareMetricUnit(""), + []dataPointExpectation{{ + numberPointComparator: []numberPointComparator{ + compareDoubleValue(400.8), + }, + }}, + ), + assertMetricPresent( + "test_summary", + compareMetricType(pmetric.MetricTypeSummary), + compareMetricUnit(""), + []dataPointExpectation{{ + summaryPointComparator: []summaryPointComparator{ + compareSummary(1213, 456, [][]float64{{0.5, 789}, {0.9, 1011}}), + }, + }}, + ), + assertMetricPresent( + "test_histogram", + compareMetricType(pmetric.MetricTypeHistogram), + compareMetricUnit(""), + []dataPointExpectation{{ + histogramPointComparator: []histogramPointComparator{ + compareHistogram(1213, 456, []float64{0.5, 10}, []uint64{789, 222, 202}), + }, + }}, + ), + } + + targets := []*testData{ + { + name: "target1", + pages: []mockPrometheusResponse{ + {code: 200, useProtoBuf: true, buf: buffer.Bytes()}, + }, + validateFunc: func(t *testing.T, td *testData, result []pmetric.ResourceMetrics) { + verifyNumValidScrapeResults(t, td, result) + doCompare(t, "target1", td.attributes, result[0], expectations) + }, + }, + } + + testComponent(t, targets, func(c *Config) { + c.EnableProtobufNegotiation = true + }) +} diff --git a/otelcollector/prometheusreceiver/metrics_receiver_target_allocator_test.go b/otelcollector/prometheusreceiver/metrics_receiver_target_allocator_test.go index 2ad8d4623..5feed213d 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_target_allocator_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_target_allocator_test.go @@ -42,7 +42,7 @@ type mockTargetAllocatorResponse struct { type mockTargetAllocatorResponseRaw struct { code int - data interface{} + data any } type hTTPSDResponse struct { @@ -162,7 +162,7 @@ func TestTargetAllocatorJobRetrieval(t *testing.T) { responses: Responses{ responses: map[string][]mockTargetAllocatorResponseRaw{ "/scrape_configs": { - mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]interface{}{ + mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]any{ "job1": { "job_name": "job1", "scrape_interval": "30s", @@ -256,7 +256,7 @@ func TestTargetAllocatorJobRetrieval(t *testing.T) { responses: Responses{ responses: map[string][]mockTargetAllocatorResponseRaw{ "/scrape_configs": { - mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]interface{}{ + mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]any{ "job1": { "job_name": "job1", "scrape_interval": "30s", @@ -348,7 +348,7 @@ func TestTargetAllocatorJobRetrieval(t *testing.T) { }, responses: map[string][]mockTargetAllocatorResponseRaw{ "/scrape_configs": { - mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]interface{}{ + mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]any{ "job1": { "job_name": "job1", "scrape_interval": "30s", @@ -368,7 +368,7 @@ func TestTargetAllocatorJobRetrieval(t *testing.T) { "metric_relabel_configs": nil, }, }}, - mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]interface{}{ + mockTargetAllocatorResponseRaw{code: 200, data: map[string]map[string]any{ "job1": { "job_name": "job1", "scrape_interval": "30s", @@ -460,8 +460,8 @@ func TestTargetAllocatorJobRetrieval(t *testing.T) { }, responses: map[string][]mockTargetAllocatorResponseRaw{ "/scrape_configs": { - mockTargetAllocatorResponseRaw{code: 404, data: map[string]map[string]interface{}{}}, - mockTargetAllocatorResponseRaw{code: 404, data: map[string]map[string]interface{}{}}, + mockTargetAllocatorResponseRaw{code: 404, data: map[string]map[string]any{}}, + mockTargetAllocatorResponseRaw{code: 404, data: map[string]map[string]any{}}, }, }, }, diff --git a/otelcollector/prometheusreceiver/metrics_receiver_test.go b/otelcollector/prometheusreceiver/metrics_receiver_test.go index acfc6f8a4..bef58d079 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver_test.go +++ b/otelcollector/prometheusreceiver/metrics_receiver_test.go @@ -167,7 +167,7 @@ func verifyTarget1(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), - compareHistogram(2500, 5000, []uint64{1000, 500, 500, 500}), + compareHistogram(2500, 5000, []float64{0.05, 0.5, 1}, []uint64{1000, 500, 500, 500}), }, }, }), @@ -234,7 +234,7 @@ func verifyTarget1(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc // TODO: Prometheus Receiver Issue- start_timestamp are incorrect for Summary and Histogram metrics after a failed scrape (issue not yet posted on collector-contrib repo) compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts2), - compareHistogram(2600, 5050, []uint64{1100, 500, 500, 500}), + compareHistogram(2600, 5050, []float64{0.05, 0.5, 1}, []uint64{1100, 500, 500, 500}), }, }, }), @@ -303,7 +303,7 @@ func verifyTarget1(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc // TODO: #6360 Prometheus Receiver Issue- start_timestamp should reset if the prior scrape had higher value compareHistogramStartTimestamp(ts3), compareHistogramTimestamp(ts3), - compareHistogram(2400, 4900, []uint64{900, 500, 500, 500}), + compareHistogram(2400, 4900, []float64{0.05, 0.5, 1}, []uint64{900, 500, 500, 500}), }, }, }), @@ -545,7 +545,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), compareHistogramAttributes(map[string]string{"method": "post", "code": "200"}), - compareHistogram(10, 7, []uint64{8, 2}), + compareHistogram(10, 7, []float64{1}, []uint64{8, 2}), }, }, { @@ -553,7 +553,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), compareHistogramAttributes(map[string]string{"method": "post", "code": "400"}), - compareHistogram(50, 25, []uint64{30, 20}), + compareHistogram(50, 25, []float64{1}, []uint64{30, 20}), }, }, }), @@ -629,7 +629,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts2), compareHistogramAttributes(map[string]string{"method": "post", "code": "200"}), - compareHistogram(50, 43, []uint64{40, 10}), + compareHistogram(50, 43, []float64{1}, []uint64{40, 10}), }, }, { @@ -637,7 +637,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts2), compareHistogramTimestamp(ts2), compareHistogramAttributes(map[string]string{"method": "post", "code": "300"}), - compareHistogram(3, 2, []uint64{3, 0}), + compareHistogram(3, 2, []float64{1}, []uint64{3, 0}), }, }, { @@ -645,7 +645,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts2), compareHistogramAttributes(map[string]string{"method": "post", "code": "400"}), - compareHistogram(60, 30, []uint64{35, 25}), + compareHistogram(60, 30, []float64{1}, []uint64{35, 25}), }, }, }), @@ -737,7 +737,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts3), compareHistogramAttributes(map[string]string{"method": "post", "code": "200"}), - compareHistogram(50, 43, []uint64{40, 10}), + compareHistogram(50, 43, []float64{1}, []uint64{40, 10}), }, }, { @@ -745,7 +745,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts2), compareHistogramTimestamp(ts3), compareHistogramAttributes(map[string]string{"method": "post", "code": "300"}), - compareHistogram(5, 7, []uint64{3, 2}), + compareHistogram(5, 7, []float64{1}, []uint64{3, 2}), }, }, { @@ -753,7 +753,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts3), compareHistogramAttributes(map[string]string{"method": "post", "code": "400"}), - compareHistogram(60, 30, []uint64{35, 25}), + compareHistogram(60, 30, []float64{1}, []uint64{35, 25}), }, }, }), @@ -845,7 +845,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts4), compareHistogramTimestamp(ts4), compareHistogramAttributes(map[string]string{"method": "post", "code": "200"}), - compareHistogram(49, 42, []uint64{40, 9}), + compareHistogram(49, 42, []float64{1}, []uint64{40, 9}), }, }, { @@ -853,7 +853,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts4), compareHistogramTimestamp(ts4), compareHistogramAttributes(map[string]string{"method": "post", "code": "300"}), - compareHistogram(3, 4, []uint64{2, 1}), + compareHistogram(3, 4, []float64{1}, []uint64{2, 1}), }, }, { @@ -861,7 +861,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts4), compareHistogramTimestamp(ts4), compareHistogramAttributes(map[string]string{"method": "post", "code": "400"}), - compareHistogram(59, 29, []uint64{34, 25}), + compareHistogram(59, 29, []float64{1}, []uint64{34, 25}), }, }, }), @@ -953,7 +953,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts4), compareHistogramTimestamp(ts5), compareHistogramAttributes(map[string]string{"method": "post", "code": "200"}), - compareHistogram(50, 43, []uint64{41, 9}), + compareHistogram(50, 43, []float64{1}, []uint64{41, 9}), }, }, { @@ -961,7 +961,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts4), compareHistogramTimestamp(ts5), compareHistogramAttributes(map[string]string{"method": "post", "code": "300"}), - compareHistogram(5, 4, []uint64{4, 1}), + compareHistogram(5, 4, []float64{1}, []uint64{4, 1}), }, }, { @@ -969,7 +969,7 @@ func verifyTarget2(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc compareHistogramStartTimestamp(ts4), compareHistogramTimestamp(ts5), compareHistogramAttributes(map[string]string{"method": "post", "code": "400"}), - compareHistogram(59, 29, []uint64{34, 25}), + compareHistogram(59, 29, []float64{1}, []uint64{34, 25}), }, }, }), @@ -1146,7 +1146,7 @@ func verifyTarget3(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), - compareHistogram(13003, 50000, []uint64{10000, 1000, 1001, 1002}), + compareHistogram(13003, 50000, []float64{0.2, 0.5, 1}, []uint64{10000, 1000, 1001, 1002}), }, }, }), @@ -1158,7 +1158,7 @@ func verifyTarget3(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts1), - compareHistogram(10, 100, []uint64{10}), + compareHistogram(10, 100, nil, []uint64{10}), }, }, }), @@ -1212,7 +1212,7 @@ func verifyTarget3(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts2), - compareHistogram(14003, 50100, []uint64{11000, 1000, 1001, 1002}), + compareHistogram(14003, 50100, []float64{0.2, 0.5, 1}, []uint64{11000, 1000, 1001, 1002}), }, }, }), @@ -1224,7 +1224,7 @@ func verifyTarget3(t *testing.T, td *testData, resourceMetrics []pmetric.Resourc histogramPointComparator: []histogramPointComparator{ compareHistogramStartTimestamp(ts1), compareHistogramTimestamp(ts2), - compareHistogram(15, 101, []uint64{15}), + compareHistogram(15, 101, nil, []uint64{15}), }, }, }), @@ -1336,7 +1336,7 @@ func TestCoreMetricsEndToEnd(t *testing.T) { validateScrapes: true, }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } var startTimeMetricPage = ` @@ -1423,7 +1423,9 @@ func TestStartTimeMetric(t *testing.T) { validateFunc: verifyStartTimeMetricPage, }, } - testComponent(t, targets, true, false, "") + testComponent(t, targets, func(c *Config) { + c.UseStartTimeMetric = true + }) } var startTimeMetricRegexPage = ` @@ -1472,7 +1474,10 @@ func TestStartTimeMetricRegex(t *testing.T) { validateFunc: verifyStartTimeMetricPage, }, } - testComponent(t, targets, true, false, "^(.+_)*process_start_time_seconds$") + testComponent(t, targets, func(c *Config) { + c.StartTimeMetricRegex = "^(.+_)*process_start_time_seconds$" + c.UseStartTimeMetric = true + }) } // metric type is defined as 'untyped' in the first metric @@ -1501,7 +1506,7 @@ func TestUntypedMetrics(t *testing.T) { }, } - testComponent(t, targets, false, false, "") + testComponent(t, targets, nil) } func verifyUntypedMetrics(t *testing.T, td *testData, resourceMetrics []pmetric.ResourceMetrics) { diff --git a/otelcollector/prometheusreceiver/metrics_reciever_metric_rename_test.go b/otelcollector/prometheusreceiver/metrics_reciever_metric_rename_test.go index 70abdd2eb..3c030a279 100644 --- a/otelcollector/prometheusreceiver/metrics_reciever_metric_rename_test.go +++ b/otelcollector/prometheusreceiver/metrics_reciever_metric_rename_test.go @@ -47,7 +47,7 @@ func TestMetricRenaming(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { for _, scrapeConfig := range cfg.ScrapeConfigs { scrapeConfig.MetricRelabelConfigs = []*relabel.Config{ { @@ -90,7 +90,7 @@ func TestMetricRenamingKeepAction(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { for _, scrapeConfig := range cfg.ScrapeConfigs { scrapeConfig.MetricRelabelConfigs = []*relabel.Config{ { @@ -232,7 +232,7 @@ func TestLabelRenaming(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { for _, scrapeConfig := range cfg.ScrapeConfigs { scrapeConfig.MetricRelabelConfigs = []*relabel.Config{ { @@ -362,7 +362,7 @@ func TestLabelRenamingKeepAction(t *testing.T) { }, } - testComponent(t, targets, false, false, "", func(cfg *promcfg.Config) { + testComponent(t, targets, nil, func(cfg *promcfg.Config) { for _, scrapeConfig := range cfg.ScrapeConfigs { scrapeConfig.MetricRelabelConfigs = []*relabel.Config{ { From 194b808b919eab5217fd9676eb67d8856754262a Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 16:55:15 -0800 Subject: [PATCH 05/21] updating golang ref and removing unwanted dockerfiles --- otelcollector/build/linux/Dockerfile | 4 +- .../prometheus-operator/Dockerfile | 15 ------- .../cmd/admission-webhook/Dockerfile | 9 ----- .../cmd/prometheus-config-reloader/Dockerfile | 9 ----- .../scripts/tooling/Dockerfile | 40 ------------------- 5 files changed, 2 insertions(+), 75 deletions(-) delete mode 100644 otelcollector/otel-allocator/prometheus-operator/Dockerfile delete mode 100644 otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile delete mode 100644 otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile delete mode 100644 otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile diff --git a/otelcollector/build/linux/Dockerfile b/otelcollector/build/linux/Dockerfile index 276ab3a43..5abfb6c6f 100644 --- a/otelcollector/build/linux/Dockerfile +++ b/otelcollector/build/linux/Dockerfile @@ -8,7 +8,7 @@ RUN apt-get update && apt-get install gcc-aarch64-linux-gnu -y ARG TARGETOS TARGETARCH RUN if [ "$TARGETARCH" = "arm64" ] ; then CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -buildmode=c-shared -ldflags '-extldflags=-Wl,-z,now' -o out_appinsights.so . ; else CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -buildmode=c-shared -ldflags '-extldflags=-Wl,-z,now' -o out_appinsights.so . ; fi -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.19 as otelcollector-builder +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.20 as otelcollector-builder WORKDIR /src RUN apt-get update && apt-get install gcc-aarch64-linux-gnu -y RUN go version > goversion.txt @@ -23,7 +23,7 @@ COPY ./prometheusreceiver /src/prometheusreceiver ARG TARGETOS TARGETARCH RUN if [ "$TARGETARCH" = "arm64" ] ; then CC=aarch64-linux-gnu-gcc CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -buildmode=pie -ldflags '-linkmode external -extldflags=-Wl,-z,now' -o otelcollector . ; else CGO_ENABLED=1 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -buildmode=pie -ldflags '-linkmode external -extldflags=-Wl,-z,now' -o otelcollector . ; fi -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.19 as prom-config-validator-builder +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/oss/go/microsoft/golang:1.20 as prom-config-validator-builder WORKDIR /src RUN apt-get update && apt-get install gcc-aarch64-linux-gnu -y COPY ./prom-config-validator-builder/go.mod ./prom-config-validator-builder/go.sum ./prom-config-validator-builder/ diff --git a/otelcollector/otel-allocator/prometheus-operator/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/Dockerfile deleted file mode 100644 index 12ea770a2..000000000 --- a/otelcollector/otel-allocator/prometheus-operator/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -ARG ARCH="amd64" -ARG OS="linux" -FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest - -COPY operator /bin/operator - -# On busybox 'nobody' has uid `65534' -USER 65534 - -LABEL org.opencontainers.image.source="https://github.com/prometheus-operator/prometheus-operator" \ - org.opencontainers.image.url="https://prometheus-operator.dev/" \ - org.opencontainers.image.documentation="https://prometheus-operator.dev/" \ - org.opencontainers.image.licenses="Apache-2.0" - -ENTRYPOINT ["/bin/operator"] diff --git a/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile deleted file mode 100644 index 613dc084e..000000000 --- a/otelcollector/otel-allocator/prometheus-operator/cmd/admission-webhook/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -ARG ARCH="amd64" -ARG OS="linux" -FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest - -COPY admission-webhook /bin/admission-webhook - -USER nobody - -ENTRYPOINT ["/bin/admission-webhook"] diff --git a/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile deleted file mode 100644 index 0e5e367d2..000000000 --- a/otelcollector/otel-allocator/prometheus-operator/cmd/prometheus-config-reloader/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -ARG ARCH="amd64" -ARG OS="linux" -FROM quay.io/prometheus/busybox-${OS}-${ARCH}:latest - -COPY prometheus-config-reloader /bin/prometheus-config-reloader - -USER nobody - -ENTRYPOINT ["/bin/prometheus-config-reloader"] diff --git a/otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile b/otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile deleted file mode 100644 index ee23b99df..000000000 --- a/otelcollector/otel-allocator/prometheus-operator/scripts/tooling/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM golang:1.14 as builder - -ENV JSONNET_VERSION v0.15.0 -# This corresponds to v2.16.0, but needs to be written as commit hash due to golang 1.13 issues -ENV PROMTOOL_VERSION b90be6f32a33c03163d700e1452b54454ddce0ec -ENV GOLANGCILINT_VERSION v1.23.6 -ENV JB_VERSION v0.3.1 -ENV GO_BINDATA_VERSION v3.1.3 - -RUN apt-get update -y && apt-get install -y g++ make git && \ - rm -rf /var/lib/apt/lists/* -RUN curl -Lso - https://github.com/google/jsonnet/archive/${JSONNET_VERSION}.tar.gz | \ - tar xfz - -C /tmp && \ - cd /tmp/jsonnet-${JSONNET_VERSION#v} && \ - make && mv jsonnetfmt /usr/local/bin && \ - rm -rf /tmp/jsonnet-${JSONNET_VERSION#v} - -RUN GO111MODULE=on go get github.com/google/go-jsonnet/cmd/jsonnet@${JSONNET_VERSION} -RUN GO111MODULE=on go get github.com/prometheus/prometheus/cmd/promtool@${PROMTOOL_VERSION} -RUN GO111MODULE=on go get github.com/golangci/golangci-lint/cmd/golangci-lint@${GOLANGCILINT_VERSION} -RUN GO111MODULE=on go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb@${JB_VERSION} -RUN go get github.com/brancz/gojsontoyaml -RUN go get github.com/campoy/embedmd -RUN GO111MODULE=on go get github.com/go-bindata/go-bindata/v3/go-bindata@${GO_BINDATA_VERSION} - -# Add po-lint -WORKDIR /go/src/github.com/prometheus-operator/prometheus-operator -COPY . . -RUN GO111MODULE=on make po-lint && chmod +x po-lint && mv po-lint /go/bin/ - -FROM golang:1.14 -RUN apt-get update -y && apt-get install -y make git jq gawk python-yaml && \ - rm -rf /var/lib/apt/lists/* -COPY --from=builder /usr/local/bin/jsonnetfmt /usr/local/bin/jsonnetfmt -COPY --from=builder /go/bin/* /go/bin/ - -RUN mkdir -p /go/src/github.com/prometheus-operator/prometheus-operator /.cache && \ - chmod -R 777 /go /.cache - -WORKDIR /go/src/github.com/prometheus-operator/prometheus-operator From 2e87d0247c4490bbe08eb5120729bf7da7cb1656 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 17:07:14 -0800 Subject: [PATCH 06/21] updating golang for binary scanning --- .pipelines/azure-pipeline-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pipelines/azure-pipeline-build.yml b/.pipelines/azure-pipeline-build.yml index dd1223d00..8402aad42 100644 --- a/.pipelines/azure-pipeline-build.yml +++ b/.pipelines/azure-pipeline-build.yml @@ -255,7 +255,7 @@ jobs: - task: GoTool@0 displayName: "Build: specify golang version" inputs: - version: '1.20' + version: '1.21' - bash: | sudo apt-get install build-essential -y From d72f513e84a7e3ad79e3184792ed14bcf3a3e0d0 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 17:08:30 -0800 Subject: [PATCH 07/21] removing memory leak yaml --- .../testTemplates/memory-leak.yaml | 52 ------------------- 1 file changed, 52 deletions(-) delete mode 100644 internal/referenceapp/testTemplates/memory-leak.yaml diff --git a/internal/referenceapp/testTemplates/memory-leak.yaml b/internal/referenceapp/testTemplates/memory-leak.yaml deleted file mode 100644 index 1ddd93b21..000000000 --- a/internal/referenceapp/testTemplates/memory-leak.yaml +++ /dev/null @@ -1,52 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: memory-leak - name: memory-leak -spec: - replicas: 1 - selector: - matchLabels: - app: memory-leak - template: - metadata: - creationTimestamp: null - labels: - app: memory-leak - spec: - volumes: - - name: html - emptyDir: {} - containers: - - name: memoryleak-1 - image: valentinomiazzo/jvm-memory-test - resources: - limits: - cpu: 150m - memory: 15Mi - requests: - cpu: 75m - memory: 12Mi - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - imagePullPolicy: Always - restartPolicy: Always - terminationGracePeriodSeconds: 30 - dnsPolicy: ClusterFirst - nodeSelector: - beta.kubernetes.io/os: linux - securityContext: {} - schedulerName: default-scheduler - tolerations: - - key: node-role.kubernetes.io/master - operator: Equal - value: 'true' - effect: NoSchedule - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 25% - maxSurge: 25% - revisionHistoryLimit: 10 - progressDeadlineSeconds: 600 \ No newline at end of file From 376f762b656ec7d5953dc64d0aa0770709979327 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Tue, 2 Jan 2024 17:50:15 -0800 Subject: [PATCH 08/21] upgrading to 0.91 for otelcollector --- .../opentelemetry-collector-builder/go.mod | 83 ++- .../opentelemetry-collector-builder/go.sum | 178 +++--- .../prom-config-validator-builder/go.mod | 149 +++-- .../prom-config-validator-builder/go.sum | 539 +++++------------- otelcollector/prometheusreceiver/go.mod | 66 +-- otelcollector/prometheusreceiver/go.sum | 117 ++-- .../prometheusreceiver/metrics_receiver.go | 6 +- 7 files changed, 448 insertions(+), 690 deletions(-) diff --git a/otelcollector/opentelemetry-collector-builder/go.mod b/otelcollector/opentelemetry-collector-builder/go.mod index b283e373d..03ee7771a 100644 --- a/otelcollector/opentelemetry-collector-builder/go.mod +++ b/otelcollector/opentelemetry-collector-builder/go.mod @@ -6,23 +6,23 @@ replace github.com/gracewehner/prometheusreceiver => ../prometheusreceiver require ( github.com/gracewehner/prometheusreceiver v0.0.0-00010101000000-000000000000 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 - go.opentelemetry.io/collector/component v0.90.0 - go.opentelemetry.io/collector/connector v0.90.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 - go.opentelemetry.io/collector/exporter v0.90.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 - go.opentelemetry.io/collector/extension v0.90.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 - go.opentelemetry.io/collector/otelcol v0.90.0 - go.opentelemetry.io/collector/processor v0.90.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 - go.opentelemetry.io/collector/receiver v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 + go.opentelemetry.io/collector/component v0.91.0 + go.opentelemetry.io/collector/connector v0.91.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 + go.opentelemetry.io/collector/exporter v0.91.0 + go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 + go.opentelemetry.io/collector/extension v0.91.0 + go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 + go.opentelemetry.io/collector/otelcol v0.91.0 + go.opentelemetry.io/collector/processor v0.91.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 + go.opentelemetry.io/collector/receiver v0.91.0 ) require ( @@ -40,7 +40,7 @@ require ( github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.48.5 // indirect + github.com/aws/aws-sdk-go v1.48.14 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -116,7 +116,7 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/compress v1.17.3 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect @@ -141,12 +141,11 @@ require ( github.com/oklog/ulid v1.3.1 // indirect github.com/onsi/ginkgo/v2 v2.11.0 // indirect github.com/onsi/gomega v1.27.10 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/ovh/go-ovh v1.4.3 // indirect @@ -166,7 +165,7 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rs/cors v1.10.1 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect - github.com/shirou/gopsutil/v3 v3.23.10 // indirect + github.com/shirou/gopsutil/v3 v3.23.11 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/spf13/cobra v1.8.0 // indirect @@ -179,23 +178,23 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect go.mongodb.org/mongo-driver v1.13.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.90.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.90.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.90.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect - go.opentelemetry.io/collector/config/internal v0.90.0 // indirect - go.opentelemetry.io/collector/confmap v0.90.0 // indirect - go.opentelemetry.io/collector/consumer v0.90.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect + go.opentelemetry.io/collector v0.91.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.91.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.91.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.91.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.91.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.91.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.91.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.91.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.91.0 // indirect + go.opentelemetry.io/collector/config/internal v0.91.0 // indirect + go.opentelemetry.io/collector/confmap v0.91.0 // indirect + go.opentelemetry.io/collector/consumer v0.91.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.91.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0 // indirect go.opentelemetry.io/collector/pdata v1.0.0 // indirect - go.opentelemetry.io/collector/semconv v0.90.0 // indirect - go.opentelemetry.io/collector/service v0.90.0 // indirect + go.opentelemetry.io/collector/semconv v0.91.0 // indirect + go.opentelemetry.io/collector/service v0.91.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect @@ -208,7 +207,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect diff --git a/otelcollector/opentelemetry-collector-builder/go.sum b/otelcollector/opentelemetry-collector-builder/go.sum index 55fe3f60f..6b44110ec 100644 --- a/otelcollector/opentelemetry-collector-builder/go.sum +++ b/otelcollector/opentelemetry-collector-builder/go.sum @@ -78,8 +78,8 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.48.5 h1:cp3inTx9trQNCNZV/Id5S5egpilBXKdF32uKtb1LszI= -github.com/aws/aws-sdk-go v1.48.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.48.14 h1:nVLrp+F84SG+xGiFMfe1TE6ZV6smF+42tuuNgYGV30s= +github.com/aws/aws-sdk-go v1.48.14/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -416,8 +416,8 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= -github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -512,32 +512,31 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 h1:G2YXTArLUF0STpYZjncq1ZdChkd6nOy5TIdQ3H+/RmY= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0/go.mod h1:GKRoieqvf+iICn2AuFDReF6ynYNqxOgglGpGuqcmFdY= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 h1:fbczHVkEsOYJ+ZVDQrMtJ31PcdjWRyJ5vM/dmjP+hwY= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0/go.mod h1:17AyWbqEB5NAlNtfGWSHKqzI/TjCY4vYUmC0o6sKiPw= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.90.0 h1:HE0TGGOrQ6IKyycbqQorH61sII/lpefgjmlkDs4R7rM= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 h1:MrvzqtUkjOygG1WL3oYLtlJyt0iS9S4yY+U8bFTchNw= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0/go.mod h1:IddDLOQp/QUjwskjlRLetMnZy+F/soYWdn9qoDhNIyg= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 h1:/C/0rXlUu2FqpwzwfcGl5P2AHdg+QEmDyYOxerXkW30= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0/go.mod h1:oR1zloRYO5wb1FyrDTK+fHra4bsfYWW1UcKdaqL9GWs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.90.0 h1:OJBbKAdG1X54h4gYCZdP2JTzdPeEnFvsGrmitgQiRzk= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 h1:mJUUjarDCMA+NnGpH45G3R5xNJWDnOyU1V14Df7rBoU= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0/go.mod h1:fuLlV9ckNXKtZPTkoSnl/zohOXpjAALntCLt+iWGOi0= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 h1:ZnAtlWtn+9rrDVkm6I8aYXPfG098xNRgm1hBQc1Pscw= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0/go.mod h1:8boejehb8q18UUdiYL/ukUJvDgFaO+RvKpzYAE85mXM= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.90.0 h1:pMBaQ/5fc4PPuCGb1DFzxdp1q04BKkCZapI3VnAWow4= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 h1:ybdoWklcOxQ5Bv4SKuXn8OBjeImJozaF4YGvkgJkp6Y= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 h1:zlaGA4tT/lA9YpuPB8fofIg2cYTfBPaGgvM74+Y8cEo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0/go.mod h1:oR9qdvK2Ti6pNrW5rHBaCmeJH08LqroUlpEh3meINJk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 h1:hmARQTWY/GnsGZsBUT1RcKhARnX1KMUE+2tAtCQd2xA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0/go.mod h1:BiaiuIKXAdl9LPa+99bwI3g3sWsMa51E/FJFTmvc8Bk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.90.0 h1:XF+bBAe9pVsMiToTr3w+UGrqnahzD0ew6H5nCaVOw+Q= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 h1:Xkx1JT+GiJH9oawv61eM3yWdkXqT/fk5FcAT140PPqY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0/go.mod h1:wxJfumGLuNPUkKRMN+5rFCI7At+7BbMOvKpJSiAUqmQ= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 h1:3/v2gdRnq/oh7NuJ8qBtci2J/1IWKZ0tBTbZ8xTdfxI= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0/go.mod h1:FF1Uxgox+ptWe6a4Hdfw9AxuatYR8JggJDoVkrXY9aA= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 h1:p8gP126reF8nK4HvgpQ+6R3+CVxnYohjInD67uKqfDw= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0/go.mod h1:j26btuTJfz02X+urX9Qk73I13BdfuJoyjLm+edN1G94= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 h1:Qf4dntxfwgZVaqf7dmZEVG5xKwpSOh1J6OeVZh4LWyU= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0/go.mod h1:qTmlvq1ZTdGVY6QHxrGkpzh7IY0yMnFopFw0+HkJ82A= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.91.0 h1:gEtcld4dRU6PBO42AK95Bw4C7WN8n82zc04NRq/fzHU= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 h1:aSmn6Ln4rJ4mqXitb6cqxCsYKGSmFZ20WPzKcA49L5U= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0/go.mod h1:CpkIhyKKFxqD/KAu+e7sObuI8HdFkCweEBzg5xe7lgI= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 h1:bJt6FA6ksKSLkveP9ncb+Ksn2G7azNcmAQnbXpGH6tk= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0/go.mod h1:gIXeXK8NwOJE0GFd0WcQOY3gy0YBSiQkt0XABUKwXNs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.91.0 h1:8nzprvG2+4BK6C5wFSgZruZpoPiGKc1kRO2rp33tpTo= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 h1:I3MFZXcQdnATObbeKseHLEWOWMFt1jHhHCbeunBw3mE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0/go.mod h1:xHPYTciFeEEE2HnPu65FMgsCQFYNns66mqiHsMqb+HM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 h1:jbzYDR6RLJkruWSunpXUqyj9SuSpuAcvppcdH6hE8PM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0/go.mod h1:CNM7IdgOO6r4GL2bpd6tAXU9SR26KA+V+qA5JtOkQmA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.91.0 h1:qFnhbBNSv7fzxxkAjobOoGiiFFtx/HpvZ5C6zV3+ZBw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 h1:a4XbucJve0K8g7kCO25EpNinBsXRGBJ8IhoLKNM0kdQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 h1:rRY2L7ZDOnTSHkUhcWbEMNIMwHMxlB5kuo+PRjwr5U0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0/go.mod h1:KydzPxPgbtZUYl4DYJrbfzCkPU8ifDoKqiO1GPFYJvk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 h1:FZS628dMMcY3db/2apfLEDdMw4JE53Rxed0nMNXRdzo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0/go.mod h1:c7ehfnmijlXERu8uO/nfesvkdBk+BYrURTloTLYVsWY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.91.0 h1:MFDHOeY7OY00OPTtJiqn+h3y9PTZuO4N+2xAYkPWAPo= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 h1:fO7E0Uw+cGgVYzTNkIevO2fr8Wkh/vjglMm74C50uLY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0/go.mod h1:l+VhjYgCbyLHjVEpUNB1CBv1JV6/qeHt21m56HGDDRk= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.91.0 h1:G6hhju30lXqNpWH3hJNXoR3gk1WVisGAWguI8fmro+4= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= @@ -621,8 +620,8 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULu github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= -github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= +github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= +github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -701,65 +700,65 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= -go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= -go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= -go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= -go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= -go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= -go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= -go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/configgrpc v0.90.0 h1:fxKjv/6VxNltv7O3q6L9B2aggeEK4NxXahnjSwipQNo= -go.opentelemetry.io/collector/config/configgrpc v0.90.0/go.mod h1:kqSGz7XhKaoKXMq7XaL9+UJe8+0QIxpof9+CTD4u3Kw= -go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= -go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= -go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= -go.opentelemetry.io/collector/config/confignet v0.90.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= -go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= -go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= -go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= -go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= -go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= -go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= -go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= -go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= -go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= -go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 h1:Eop1jOK6kHGj+uyr3p0lvC2M0ELP+GOKsemwLE1HLzQ= -go.opentelemetry.io/collector/connector/forwardconnector v0.90.0/go.mod h1:01S/iIRLzmOWn30EQATK3CWDIKHWtELATDY+z8ON6Uo= -go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= -go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= -go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= -go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= -go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 h1:jO6Hepz/ujWvn+FJVeMMFtVMHaSoyoBZ5QuMjVCqu4U= -go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0/go.mod h1:qk2XJoDmOnjZb+udt3bU/j0kohJJ/RDYh8n56e8PPFw= -go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 h1:82wlzXpvBFCFU0yhB/VWVY5g4iu5NuX8uSsgZkBoqhQ= -go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0/go.mod h1:sv0NqTCWumuFcmZcZa/SGQOLin8Jejbc1lptLpjCV64= -go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= -go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= -go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= -go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= -go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= -go.opentelemetry.io/collector/extension/zpagesextension v0.90.0/go.mod h1:dS2OMWeiSp/BAbkEKgm1GaJD8LQ6vyBbDiK6iWYiVa4= +go.opentelemetry.io/collector v0.91.0 h1:C7sGUJDJ5nwm+CkWpAaVP3lNsuYpwSRbkmLncFjkmO8= +go.opentelemetry.io/collector v0.91.0/go.mod h1:YhQpIDZsn+bICAAqgBwXk9wqK8GKZDv+aogfG52zUuE= +go.opentelemetry.io/collector/component v0.91.0 h1:aBT1i2zGyfh9PalYJLfXVvQp+osHyalwyDFselI1CtA= +go.opentelemetry.io/collector/component v0.91.0/go.mod h1:2KBHvjNFdU7oOjsObQeC4Ta2Ef607OISU5obznW00fw= +go.opentelemetry.io/collector/config/configauth v0.91.0 h1:SjWKimuqlpfS3sIlFpfzdkSY/AmMMCEmn9+KRcjEU+s= +go.opentelemetry.io/collector/config/configauth v0.91.0/go.mod h1:wmmMYqv6PxwY+/h7qqvd/LP0XN/wzXoECDu6PYz2Of0= +go.opentelemetry.io/collector/config/configcompression v0.91.0 h1:v+jEpFhLgfJDCUCPsSF03gjoFEvm77PofTCqHKKgXTs= +go.opentelemetry.io/collector/config/configcompression v0.91.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/configgrpc v0.91.0 h1:+2zPmgVOhKgelluGaGwE3OMKqwi56i6OiU0+7xWTetM= +go.opentelemetry.io/collector/config/configgrpc v0.91.0/go.mod h1:iWDbg9vYaayewmbKfM2zEk4YvaOOwrs0eiUffypcZFk= +go.opentelemetry.io/collector/config/confighttp v0.91.0 h1:YAOyXcDaLDnF3UqPHH4kYU8lx8BqXJ7hS3Ou8GcmqpQ= +go.opentelemetry.io/collector/config/confighttp v0.91.0/go.mod h1:R6y8KSJzqDe6CE6JsYwt4CTZ2B4AlqRA+V74OJPX3vE= +go.opentelemetry.io/collector/config/confignet v0.91.0 h1:3huNXh04O3wXaN4qPhmmiefyz4dYbOlNcR/OKMByqig= +go.opentelemetry.io/collector/config/confignet v0.91.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= +go.opentelemetry.io/collector/config/configopaque v0.91.0 h1:bQgJPyARbuXAsU2p6h2YbEm1kHb1stS6hg42ekyMZmI= +go.opentelemetry.io/collector/config/configopaque v0.91.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.91.0 h1:mEwvqrYfwUJ7LwYfpcF9M8z7LHFoYaKhEPhnERD/88E= +go.opentelemetry.io/collector/config/configtelemetry v0.91.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.91.0 h1:lZromNeOslPwyVlTPMOzF2q++SY+VONvfH3cDqA0kKk= +go.opentelemetry.io/collector/config/configtls v0.91.0/go.mod h1:E+CW5gZoH8V3z5aSlZxwiof7GAcayzn1HRM+uRILLEI= +go.opentelemetry.io/collector/config/internal v0.91.0 h1:Yx17oFdXOPnY83Jfe1oiXhvfYW7RX/xh3/kpV/iYibM= +go.opentelemetry.io/collector/config/internal v0.91.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.91.0 h1:7U2MT+u74oEzq/WWrpXSLKB7nX5jPNC4drwtQdYfwKk= +go.opentelemetry.io/collector/confmap v0.91.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.91.0 h1:p2YsgBtr26guCib99ExQHtGuNmX+awgmH1Mbz23wYGU= +go.opentelemetry.io/collector/connector v0.91.0/go.mod h1:dG34jAOATtXFdqzp8IxZJsFwFLaUIkYK69WT1WQ03ZY= +go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 h1:SEgg1Jc7k3cxZjO3oqW1zNPFyuCTM1nk6cU0OkETO8g= +go.opentelemetry.io/collector/connector/forwardconnector v0.91.0/go.mod h1:CA8H0A4+HcUYcKMYgHQ4nlKyL8OJh2xvxrPcMOG2wCU= +go.opentelemetry.io/collector/consumer v0.91.0 h1:0nU1lUe2S0b8iOmF3w3R/9Dt24n413thRTbXz/nJgrM= +go.opentelemetry.io/collector/consumer v0.91.0/go.mod h1:phTUQmr7hpYfwXyDXo4mFHVjYrlSbZE+nZYlKlbVxGs= +go.opentelemetry.io/collector/exporter v0.91.0 h1:guWcGflFjaenp3BMxAmAKjb8RQG80jQQKjuUFouS+z8= +go.opentelemetry.io/collector/exporter v0.91.0/go.mod h1:hkOBunNNWu6CaTtkRsCJ/OJ509REJZg+DDElevFIQCQ= +go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 h1:mwKepKvfGciI6n/jLBYYH4bkbAVTr9RsNfzB3x66bCQ= +go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0/go.mod h1:7UTIR8N+Aw/8lT6mJWLqtbum8Yu/ZFznUq6fdNtPxxM= +go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 h1:PEVJgEZIUMQ/M2/aQ9uuEfjptW4t0bmm91LeeNpa8mc= +go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0/go.mod h1:ebWRIZhk6zere5QnvUpPHjfTvbapscwI6QfCial/X0Y= +go.opentelemetry.io/collector/extension v0.91.0 h1:bkoSLgnWm4g6n+RLmyKG6Up7dr8KmJy68quonoLZnr0= +go.opentelemetry.io/collector/extension v0.91.0/go.mod h1:F3r0fVTTh4sYR0GVv51Qez8lk8v77kTDPdyMOp6A2kg= +go.opentelemetry.io/collector/extension/auth v0.91.0 h1:28Hv5W0GZgv2jR5IiFdJzutTs91KmXFh8DUfVTjwwmI= +go.opentelemetry.io/collector/extension/auth v0.91.0/go.mod h1:diY6Sw7cOAn2qivKipZk4niBFzCCFBj7swAXiG2h9ro= +go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 h1:d787uZ6cNHN1uaJ3pIgFlcrkHVB4ML6AlXBiCQRJ9t0= +go.opentelemetry.io/collector/extension/zpagesextension v0.91.0/go.mod h1:S1T9YKuxRqCKFENC+GuEZhz0fzuUBACOrScNY13Y96w= go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= -go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= -go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= +go.opentelemetry.io/collector/otelcol v0.91.0 h1:gq/PY/tHgkTr2fuMLp+F+NAm+03iiU+j/Eilvx38p5w= +go.opentelemetry.io/collector/otelcol v0.91.0/go.mod h1:9j8gKdZvuEgZoeUhz5f5D/fwCxx7M7Tg+6D207/KjNs= go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= -go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= -go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= -go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= -go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= -go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.90.0 h1:TCqjZma7Q0Sfgeiq8d/DsoHq8U6ImeGIgUB6NiPCNWM= -go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= -go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= -go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= +go.opentelemetry.io/collector/processor v0.91.0 h1:Xi52gYMXTG4zYmNhsqJ8ly/9f7b0n0crMhKxVVI9HpY= +go.opentelemetry.io/collector/processor v0.91.0/go.mod h1:naTuusZNfzM5MSqoTVzkKbR1MaJ8oD8v5ginR5JreDE= +go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 h1:YuPG52D7otNr4lNd8KGsIIBHvawAAaOqGoNTK9799ko= +go.opentelemetry.io/collector/processor/batchprocessor v0.91.0/go.mod h1:U2ZVSMwgr4OsaKKMfvX9OGaurG83zAPKjVdpTgmj0ok= +go.opentelemetry.io/collector/receiver v0.91.0 h1:0TZF/0OXoJtxgm+mvOinRRXo9LgVyOsOgCQfWkNGXJA= +go.opentelemetry.io/collector/receiver v0.91.0/go.mod h1:d5qo2mpovqKoi47hrMxj5BLdLzOXM0mUHL5CKrjfWNM= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.91.0 h1:1Eyc1uR8yr3heKkC4YXFoZip0JqgOXuOiN/tXvl9WUo= +go.opentelemetry.io/collector/semconv v0.91.0 h1:TRd+yDDfKQl+aNtS24wmEbJp1/QE/xAFV9SB5zWGxpE= +go.opentelemetry.io/collector/semconv v0.91.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.91.0 h1:AQS6YAiZO6V+ohcMX4upfyp/Ydi6y862yQEbFt8t+fQ= +go.opentelemetry.io/collector/service v0.91.0/go.mod h1:8Pf8mPo3YqcTNwOzXa0Ok/o+g2+d8hSCaGxRqR/c6CY= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= @@ -784,8 +783,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqhe go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 h1:TnhkxGJ5qPHAMIMI4r+HPT/BbpoHxqn4xONJrok054o= +go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= @@ -989,7 +988,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/otelcollector/prom-config-validator-builder/go.mod b/otelcollector/prom-config-validator-builder/go.mod index d7d88e804..5db69bc98 100644 --- a/otelcollector/prom-config-validator-builder/go.mod +++ b/otelcollector/prom-config-validator-builder/go.mod @@ -6,65 +6,56 @@ replace github.com/gracewehner/prometheusreceiver => ../prometheusreceiver require ( github.com/gracewehner/prometheusreceiver v0.0.0-00010101000000-000000000000 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 - go.opentelemetry.io/collector/confmap v0.90.0 - go.opentelemetry.io/collector/connector v0.90.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 - go.opentelemetry.io/collector/exporter v0.90.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 - go.opentelemetry.io/collector/extension v0.90.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 - go.opentelemetry.io/collector/otelcol v0.90.0 - go.opentelemetry.io/collector/processor v0.90.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 - go.opentelemetry.io/collector/receiver v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 + go.opentelemetry.io/collector/confmap v0.91.0 + go.opentelemetry.io/collector/connector v0.91.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 + go.opentelemetry.io/collector/exporter v0.91.0 + go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 + go.opentelemetry.io/collector/extension v0.91.0 + go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 + go.opentelemetry.io/collector/otelcol v0.91.0 + go.opentelemetry.io/collector/processor v0.91.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 + go.opentelemetry.io/collector/receiver v0.91.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go/compute v1.23.2 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect - github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.47.10 // indirect + github.com/aws/aws-sdk-go v1.48.14 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect - github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect github.com/digitalocean/godo v1.104.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/docker v24.0.7+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea // indirect github.com/docker/go-units v0.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/envoyproxy/go-control-plane v0.11.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/fatih/color v1.15.0 // indirect @@ -87,11 +78,11 @@ require ( github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -104,7 +95,7 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect - github.com/hashicorp/consul/api v1.25.1 // indirect + github.com/hashicorp/consul/api v1.26.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -126,18 +117,17 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/compress v1.17.3 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/linode/linodego v1.23.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/miekg/dns v1.1.56 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -146,22 +136,24 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.1 // indirect + github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/oklog/ulid v1.3.1 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect + github.com/onsi/ginkgo/v2 v2.11.0 // indirect + github.com/onsi/gomega v1.27.10 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/ovh/go-ovh v1.4.3 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect github.com/prometheus/alertmanager v0.26.0 // indirect github.com/prometheus/client_golang v1.17.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -174,49 +166,49 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rs/cors v1.10.1 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect - github.com/shirou/gopsutil/v3 v3.23.10 // indirect + github.com/shirou/gopsutil/v3 v3.23.11 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect + github.com/tidwall/gjson v1.14.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.mongodb.org/mongo-driver v1.12.0 // indirect + go.mongodb.org/mongo-driver v1.13.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.90.0 // indirect - go.opentelemetry.io/collector/component v0.90.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.86.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.90.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect - go.opentelemetry.io/collector/config/internal v0.90.0 // indirect - go.opentelemetry.io/collector/consumer v0.90.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect + go.opentelemetry.io/collector v0.91.0 // indirect + go.opentelemetry.io/collector/component v0.91.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.91.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.91.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.91.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.91.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.91.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.91.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.91.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.91.0 // indirect + go.opentelemetry.io/collector/config/internal v0.91.0 // indirect + go.opentelemetry.io/collector/consumer v0.91.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.91.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0 // indirect go.opentelemetry.io/collector/pdata v1.0.0 // indirect - go.opentelemetry.io/collector/semconv v0.90.0 // indirect - go.opentelemetry.io/collector/service v0.90.0 // indirect + go.opentelemetry.io/collector/semconv v0.91.0 // indirect + go.opentelemetry.io/collector/service v0.91.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect go.opentelemetry.io/contrib/zpages v0.46.1 // indirect go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/bridge/opencensus v0.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect @@ -228,32 +220,33 @@ require ( go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.14.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.4.0 // indirect - golang.org/x/tools v0.15.0 // indirect + golang.org/x/tools v0.16.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/api v0.150.0 // indirect + google.golang.org/api v0.151.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.3 // indirect - k8s.io/apimachinery v0.28.3 // indirect - k8s.io/client-go v0.28.3 // indirect + gotest.tools/v3 v3.5.0 // indirect + k8s.io/api v0.28.4 // indirect + k8s.io/apimachinery v0.28.4 // indirect + k8s.io/client-go v0.28.4 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect diff --git a/otelcollector/prom-config-validator-builder/go.sum b/otelcollector/prom-config-validator-builder/go.sum index b9d961f72..6b44110ec 100644 --- a/otelcollector/prom-config-validator-builder/go.sum +++ b/otelcollector/prom-config-validator-builder/go.sum @@ -19,10 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= -cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 h1:aRVqY1p2IJaBGStWMsQMpkAa83cPkCDLl80eOj0Rbz4= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68/go.mod h1:1a3eRNYX12fs5UABBIXS8HXVvQbX9hRB/RkEBPORpe8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -39,48 +37,23 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= -github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -105,10 +78,8 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= -github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= -github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.48.14 h1:nVLrp+F84SG+xGiFMfe1TE6ZV6smF+42tuuNgYGV30s= +github.com/aws/aws-sdk-go v1.48.14/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -130,11 +101,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -143,25 +111,21 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= -github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea h1:+4n+kUVbPdu6qMI9SUnSKMC+D50gNW4L7Lhk9tI2lVo= +github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -170,18 +134,14 @@ github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -201,8 +161,6 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -280,13 +238,9 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -322,7 +276,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -338,7 +293,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -356,41 +310,31 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= -github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= -github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= -github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= -github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= -github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= -github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= +github.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A= +github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -432,14 +376,10 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= -github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -448,8 +388,6 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= -github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= @@ -478,10 +416,8 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= -github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -503,12 +439,11 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= -github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -532,15 +467,11 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= @@ -567,8 +498,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/mostynb/go-grpc-compression v1.2.1 h1:16tdYxBZSD8p9AUmvw4F7Nyc2T4/eE7XsIXrgxSEcJI= -github.com/mostynb/go-grpc-compression v1.2.1/go.mod h1:oidYvYyefMmhcuvU8fLJ8FfZyTyVzJ6SkmD5fIKgRe8= +github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= +github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -577,49 +508,39 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 h1:pmX1xywF9ZhS8Qo44xp7U4/tEhKJO3c0E20EqfEbhC4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0/go.mod h1:GU9a92SNvLcioVmKa+B6tgxdofn1zaVEYgbCOTN0zE8= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 h1:2nEjzC4LZ0Y0NptV1XyOCkqZ3/ogQ/vQzLUa5QWKijI= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0/go.mod h1:RpGBotLXh2ilbGkWDmd4bp4uPYvG4VcVqEVpIVTynX4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.85.0 h1:6/OlktNNS8X3pL/Ry1pBAjwB4QGXjOm7MvF7Qjucbso= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 h1:JTHKAQLFae3rIXUFPuW9I2uvTlS2FAx2D2t5yTMH0+I= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0/go.mod h1:AOMyqzzvJNqas262U8YuWZhSae+zW2f74/+yuy4zEso= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 h1:X8iSLyznuGeWEN+aVt1Ehwstdw+nbJ347uO+P91O52E= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0/go.mod h1:v78K/hBoKNxtahmrWGCW5F5tlw/XEE9XZ5+nEIf6K4s= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.86.0 h1:g7HlND105lwm7NW8JCxAfbpaFyk1WKcEUUVwchIo9zE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0 h1:HEuJ7hCbLVfoL7xLrGQ2QORvocyFfWuaoDuzyTLwTdc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0/go.mod h1:ss8TG43W1xNke9aeI0uTIVpyXW5OmYslxMj01UMdjR8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 h1:mJUUjarDCMA+NnGpH45G3R5xNJWDnOyU1V14Df7rBoU= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0/go.mod h1:fuLlV9ckNXKtZPTkoSnl/zohOXpjAALntCLt+iWGOi0= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 h1:S6b7ToTSFZvVzcabjqoUBqAwair7YuELvBS6mOAopHs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0/go.mod h1:aLQB8gu7vJ1lokUeWoZs9ExpduamPrD3oRbDk7hNg/g= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.86.0 h1:EzGSvuCXAsGpwgeieTVcy1gs0hOlPidhFPcvwcPEU8s= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0 h1:xt/YvYpgssWk2Ix2C9SSXrILIzRqyWe+r5RE348m1fE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0/go.mod h1:fjK1kn7PIDP+TqOIFVEth3w0Eiexx5jIk411c//fYkM= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 h1:ybdoWklcOxQ5Bv4SKuXn8OBjeImJozaF4YGvkgJkp6Y= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0 h1:9u4hF+3SE+00aAaaMemlxujFPjmo2o2VeB2+x1Y5rCI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0/go.mod h1:WfLBDz9rENrI1MYCPLmW21Mok23V2iBJP2fZTmJbCx8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 h1:zlaGA4tT/lA9YpuPB8fofIg2cYTfBPaGgvM74+Y8cEo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0/go.mod h1:oR9qdvK2Ti6pNrW5rHBaCmeJH08LqroUlpEh3meINJk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0 h1:nnzuEQYlsRIkMPAw1jEl+8L2Is68QQl58QvY2dHHgDU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0/go.mod h1:prodbjWZpQkRcd45W2wkRaryv6JomuuWZUmM6mDj27k= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 h1:hmARQTWY/GnsGZsBUT1RcKhARnX1KMUE+2tAtCQd2xA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0/go.mod h1:BiaiuIKXAdl9LPa+99bwI3g3sWsMa51E/FJFTmvc8Bk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0 h1:U6jXC1LrqtW7/MLGMRbumuOcwr5g+J3mkngPgyBYEV0= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 h1:IWFGmyeOI/Ux3oBg2iwD5SbNbLgS9JATYGxvCIN2L58= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0/go.mod h1:mxpjy+fw19QBCa9aqipEUY6TrIYgp2THyLj4dmas6Jc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.85.0 h1:8jlK2ASLOVtSkepS2go85uO6lpkijNB57JRFRE/Krd4= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 h1:p8gP126reF8nK4HvgpQ+6R3+CVxnYohjInD67uKqfDw= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0/go.mod h1:j26btuTJfz02X+urX9Qk73I13BdfuJoyjLm+edN1G94= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 h1:Qf4dntxfwgZVaqf7dmZEVG5xKwpSOh1J6OeVZh4LWyU= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0/go.mod h1:qTmlvq1ZTdGVY6QHxrGkpzh7IY0yMnFopFw0+HkJ82A= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.91.0 h1:gEtcld4dRU6PBO42AK95Bw4C7WN8n82zc04NRq/fzHU= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 h1:aSmn6Ln4rJ4mqXitb6cqxCsYKGSmFZ20WPzKcA49L5U= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0/go.mod h1:CpkIhyKKFxqD/KAu+e7sObuI8HdFkCweEBzg5xe7lgI= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 h1:bJt6FA6ksKSLkveP9ncb+Ksn2G7azNcmAQnbXpGH6tk= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0/go.mod h1:gIXeXK8NwOJE0GFd0WcQOY3gy0YBSiQkt0XABUKwXNs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.91.0 h1:8nzprvG2+4BK6C5wFSgZruZpoPiGKc1kRO2rp33tpTo= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 h1:I3MFZXcQdnATObbeKseHLEWOWMFt1jHhHCbeunBw3mE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0/go.mod h1:xHPYTciFeEEE2HnPu65FMgsCQFYNns66mqiHsMqb+HM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 h1:jbzYDR6RLJkruWSunpXUqyj9SuSpuAcvppcdH6hE8PM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0/go.mod h1:CNM7IdgOO6r4GL2bpd6tAXU9SR26KA+V+qA5JtOkQmA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.91.0 h1:qFnhbBNSv7fzxxkAjobOoGiiFFtx/HpvZ5C6zV3+ZBw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 h1:a4XbucJve0K8g7kCO25EpNinBsXRGBJ8IhoLKNM0kdQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 h1:rRY2L7ZDOnTSHkUhcWbEMNIMwHMxlB5kuo+PRjwr5U0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0/go.mod h1:KydzPxPgbtZUYl4DYJrbfzCkPU8ifDoKqiO1GPFYJvk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 h1:FZS628dMMcY3db/2apfLEDdMw4JE53Rxed0nMNXRdzo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0/go.mod h1:c7ehfnmijlXERu8uO/nfesvkdBk+BYrURTloTLYVsWY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.91.0 h1:MFDHOeY7OY00OPTtJiqn+h3y9PTZuO4N+2xAYkPWAPo= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 h1:fO7E0Uw+cGgVYzTNkIevO2fr8Wkh/vjglMm74C50uLY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0/go.mod h1:l+VhjYgCbyLHjVEpUNB1CBv1JV6/qeHt21m56HGDDRk= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.91.0 h1:G6hhju30lXqNpWH3hJNXoR3gk1WVisGAWguI8fmro+4= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= -github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= -github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -637,10 +558,9 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/alertmanager v0.25.0 h1:vbXKUR6PYRiZPRIKfmXaG+dmCKG52RtPL4Btl8hQGvg= -github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -651,16 +571,12 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -671,8 +587,6 @@ github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= @@ -688,12 +602,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/prometheus v0.47.0 h1:tIJJKZGlmrMVsvIt6rMfB8he7CRHEc8ZxS5ubcZtbkM= -github.com/prometheus/prometheus v0.47.0/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= @@ -702,22 +612,16 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= -github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= -github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= -github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= -github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= +github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= +github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -730,8 +634,6 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -751,14 +653,16 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= -github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= +github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -786,8 +690,8 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= -go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= +go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= +go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -796,194 +700,107 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.86.0 h1:Yxu0muUws9e7HG+5DDiYajkfAeOo/riUv0sJO4E9rXA= -go.opentelemetry.io/collector v0.86.0/go.mod h1:HoXzPE/mJMN4jy5E1cSUMznxkKFiGAGJbkguzpnq5ak= -go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= -go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= -go.opentelemetry.io/collector/component v0.86.0 h1:3+6OTiknu081jWYSUx4PdOecvmo0kn5w1YlydZLKz8E= -go.opentelemetry.io/collector/component v0.86.0/go.mod h1:XaBL2y1EhcmbCIFqAqk5r3xOZyi1SarwU7Wj/iTiDOA= -go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= -go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= -go.opentelemetry.io/collector/config/configauth v0.86.0 h1:cqfr/zXyGGg5TGgmS+Ws6XFy6DdBNJxkTLUWpOVzmVI= -go.opentelemetry.io/collector/config/configauth v0.86.0/go.mod h1:8/v2oLZe9kskODghcRQSp2xP56EySlU1aNRthEIwn8w= -go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= -go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= -go.opentelemetry.io/collector/config/configcompression v0.86.0 h1:qA7i0igeYEpOW4PcGk3tYYSAO5dn+aMuDbCc/D0Rli4= -go.opentelemetry.io/collector/config/configcompression v0.86.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= -go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/configgrpc v0.86.0 h1:M1fq3QAGy+Q8bheiT1YWUpCcVEBnhWttHU1l8oXBQWg= -go.opentelemetry.io/collector/config/configgrpc v0.86.0/go.mod h1:PR4Ydn5RylPs06TEQRx6ygBdcOPYR9pni7XKoat8EYM= -go.opentelemetry.io/collector/config/confighttp v0.86.0 h1:DLHWhUG3Xp9Gci6+ewJ21GwIV0RQd8jlNt3F36397uk= -go.opentelemetry.io/collector/config/confighttp v0.86.0/go.mod h1:FMCmz/9rg8AXxdltWKUbFxOGQ/g9rNvTfb4EUA+RjT4= -go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= -go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= -go.opentelemetry.io/collector/config/confignet v0.86.0 h1:jg8rsMsAGKa+x3gs1yxqnfr2jpSAu8mGn7hc4y8h71o= -go.opentelemetry.io/collector/config/confignet v0.86.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= -go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= -go.opentelemetry.io/collector/config/confignet v0.90.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= -go.opentelemetry.io/collector/config/configopaque v0.86.0 h1:usNMgdFXbmprEcTImwVtziGkhXHeC/aWE93n2ZXlIO8= -go.opentelemetry.io/collector/config/configopaque v0.86.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= -go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.86.0 h1:xMqeL/gz7ZwZKRB58WYimEGU+Lvbzo5zd99uihjkMZY= -go.opentelemetry.io/collector/config/configtelemetry v0.86.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= -go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.86.0 h1:3BdB8Ntme+nDgYDPaWAb0jYbb/n7ueckN7hAPU3J3IM= -go.opentelemetry.io/collector/config/configtls v0.86.0/go.mod h1:vopMMIUjAvb6kojrc5G6vQOmfPIRxTU+hMHomvGNa2s= -go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= -go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= -go.opentelemetry.io/collector/config/internal v0.86.0 h1:r4LnOMxXmnKwAMaSX16bPe1jMbjkT9Up8VKt6IrJac0= -go.opentelemetry.io/collector/config/internal v0.86.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= -go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.86.0 h1:u3qXVuIz2cmH/rb2teX0Ft/OKYHgObv1e4OQ2UXqxrE= -go.opentelemetry.io/collector/confmap v0.86.0/go.mod h1:vJms49x98lXUR7Mj6/28eXV+Otn3dDQpc+Znvex9Z84= -go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= -go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= -go.opentelemetry.io/collector/connector v0.86.0 h1:tQaphbRyLhDDBkKpcAWawc+vFdnnNwvpKx8CBzW5xR4= -go.opentelemetry.io/collector/connector v0.86.0/go.mod h1:0n6B8ZyDgT0hvZbJLFYd9y+uAH54wttUGZ6O7Zo1B5M= -go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= -go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= -go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 h1:qaqPBOpYVLDObaCfZwLV/ASP9aXdVCM5qxic6sfoxdA= -go.opentelemetry.io/collector/connector/forwardconnector v0.85.0/go.mod h1:bcgIGydTq6N0uDDA8KVkmv9rsl/KIXK4ZsXwschp8dM= -go.opentelemetry.io/collector/consumer v0.86.0 h1:8AL9I30tJV01KfcSaa+8DTiARIiUDA8o2p7yQoSFUCs= -go.opentelemetry.io/collector/consumer v0.86.0/go.mod h1:SvoV1eto4VZzQ3ILKQ1rv4qgN8rUMJqupn78hoXLHRw= -go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= -go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= -go.opentelemetry.io/collector/exporter v0.86.0 h1:LFmBb7S4Fkj5fv/nrUkLOy50GT6s4R/BLrv6uTb+GNo= -go.opentelemetry.io/collector/exporter v0.86.0/go.mod h1:+PKZrFV4sVgS2TVFnfZ+RCJqXexEENjW1riWaqkxsN4= -go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= -go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= -go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 h1:bSTfWv0RobFgs/c9g4jo5V8tFSlD2ILZZE2RrJ/eY44= -go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0/go.mod h1:xQrg9pnp5XTvDZq/Q556emFZ90niT3jKhD4IQZQoWGw= -go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 h1:3MlKoGSFPdOHKtRcm5nTHRMpMmDtTGr6WAVrSuD0p3g= -go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0/go.mod h1:wNkRTwQ4V3SZzvxzPpLME0EQkpySGTaiSHYcWhBuvkk= -go.opentelemetry.io/collector/extension v0.86.0 h1:oXnZarkh1aBgnr/U3JSj/lPpBJUquOQ3DHMXXP4Jacc= -go.opentelemetry.io/collector/extension v0.86.0/go.mod h1:EPAloXQ+48577GvHTP5wGDvV4OyHPuldvM+2rYbM/fw= -go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= -go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= -go.opentelemetry.io/collector/extension/auth v0.86.0 h1:VwKbeElL8sBnvRDC565EWOw4ixMG/t0oXjIphNsRszU= -go.opentelemetry.io/collector/extension/auth v0.86.0/go.mod h1:qGIIkeWXaOtdYO1fYEn1vAEhUS+OhVcceUC1G3XOsdk= -go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= -go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= -go.opentelemetry.io/collector/extension/zpagesextension v0.86.0 h1:Ga5ZGEChIN0eqide9NFqlfEZPTRaTX3mAdLdbKwiOPQ= -go.opentelemetry.io/collector/extension/zpagesextension v0.86.0/go.mod h1:o30mkGrQYPMMBPqoq5igj5br+sAyJr0gIbgp5Mf/A20= -go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= -go.opentelemetry.io/collector/extension/zpagesextension v0.90.0/go.mod h1:dS2OMWeiSp/BAbkEKgm1GaJD8LQ6vyBbDiK6iWYiVa4= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015 h1:Wv8JFRUD01MwWkhZwF85to5oukHDFPRjnt88ArDFqco= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015/go.mod h1:fLmJMf1AoHttkF8p5oJAc4o5ZpHu8yO5XYJ7gbLCLzo= +go.opentelemetry.io/collector v0.91.0 h1:C7sGUJDJ5nwm+CkWpAaVP3lNsuYpwSRbkmLncFjkmO8= +go.opentelemetry.io/collector v0.91.0/go.mod h1:YhQpIDZsn+bICAAqgBwXk9wqK8GKZDv+aogfG52zUuE= +go.opentelemetry.io/collector/component v0.91.0 h1:aBT1i2zGyfh9PalYJLfXVvQp+osHyalwyDFselI1CtA= +go.opentelemetry.io/collector/component v0.91.0/go.mod h1:2KBHvjNFdU7oOjsObQeC4Ta2Ef607OISU5obznW00fw= +go.opentelemetry.io/collector/config/configauth v0.91.0 h1:SjWKimuqlpfS3sIlFpfzdkSY/AmMMCEmn9+KRcjEU+s= +go.opentelemetry.io/collector/config/configauth v0.91.0/go.mod h1:wmmMYqv6PxwY+/h7qqvd/LP0XN/wzXoECDu6PYz2Of0= +go.opentelemetry.io/collector/config/configcompression v0.91.0 h1:v+jEpFhLgfJDCUCPsSF03gjoFEvm77PofTCqHKKgXTs= +go.opentelemetry.io/collector/config/configcompression v0.91.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/configgrpc v0.91.0 h1:+2zPmgVOhKgelluGaGwE3OMKqwi56i6OiU0+7xWTetM= +go.opentelemetry.io/collector/config/configgrpc v0.91.0/go.mod h1:iWDbg9vYaayewmbKfM2zEk4YvaOOwrs0eiUffypcZFk= +go.opentelemetry.io/collector/config/confighttp v0.91.0 h1:YAOyXcDaLDnF3UqPHH4kYU8lx8BqXJ7hS3Ou8GcmqpQ= +go.opentelemetry.io/collector/config/confighttp v0.91.0/go.mod h1:R6y8KSJzqDe6CE6JsYwt4CTZ2B4AlqRA+V74OJPX3vE= +go.opentelemetry.io/collector/config/confignet v0.91.0 h1:3huNXh04O3wXaN4qPhmmiefyz4dYbOlNcR/OKMByqig= +go.opentelemetry.io/collector/config/confignet v0.91.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= +go.opentelemetry.io/collector/config/configopaque v0.91.0 h1:bQgJPyARbuXAsU2p6h2YbEm1kHb1stS6hg42ekyMZmI= +go.opentelemetry.io/collector/config/configopaque v0.91.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.91.0 h1:mEwvqrYfwUJ7LwYfpcF9M8z7LHFoYaKhEPhnERD/88E= +go.opentelemetry.io/collector/config/configtelemetry v0.91.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.91.0 h1:lZromNeOslPwyVlTPMOzF2q++SY+VONvfH3cDqA0kKk= +go.opentelemetry.io/collector/config/configtls v0.91.0/go.mod h1:E+CW5gZoH8V3z5aSlZxwiof7GAcayzn1HRM+uRILLEI= +go.opentelemetry.io/collector/config/internal v0.91.0 h1:Yx17oFdXOPnY83Jfe1oiXhvfYW7RX/xh3/kpV/iYibM= +go.opentelemetry.io/collector/config/internal v0.91.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.91.0 h1:7U2MT+u74oEzq/WWrpXSLKB7nX5jPNC4drwtQdYfwKk= +go.opentelemetry.io/collector/confmap v0.91.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.91.0 h1:p2YsgBtr26guCib99ExQHtGuNmX+awgmH1Mbz23wYGU= +go.opentelemetry.io/collector/connector v0.91.0/go.mod h1:dG34jAOATtXFdqzp8IxZJsFwFLaUIkYK69WT1WQ03ZY= +go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 h1:SEgg1Jc7k3cxZjO3oqW1zNPFyuCTM1nk6cU0OkETO8g= +go.opentelemetry.io/collector/connector/forwardconnector v0.91.0/go.mod h1:CA8H0A4+HcUYcKMYgHQ4nlKyL8OJh2xvxrPcMOG2wCU= +go.opentelemetry.io/collector/consumer v0.91.0 h1:0nU1lUe2S0b8iOmF3w3R/9Dt24n413thRTbXz/nJgrM= +go.opentelemetry.io/collector/consumer v0.91.0/go.mod h1:phTUQmr7hpYfwXyDXo4mFHVjYrlSbZE+nZYlKlbVxGs= +go.opentelemetry.io/collector/exporter v0.91.0 h1:guWcGflFjaenp3BMxAmAKjb8RQG80jQQKjuUFouS+z8= +go.opentelemetry.io/collector/exporter v0.91.0/go.mod h1:hkOBunNNWu6CaTtkRsCJ/OJ509REJZg+DDElevFIQCQ= +go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 h1:mwKepKvfGciI6n/jLBYYH4bkbAVTr9RsNfzB3x66bCQ= +go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0/go.mod h1:7UTIR8N+Aw/8lT6mJWLqtbum8Yu/ZFznUq6fdNtPxxM= +go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 h1:PEVJgEZIUMQ/M2/aQ9uuEfjptW4t0bmm91LeeNpa8mc= +go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0/go.mod h1:ebWRIZhk6zere5QnvUpPHjfTvbapscwI6QfCial/X0Y= +go.opentelemetry.io/collector/extension v0.91.0 h1:bkoSLgnWm4g6n+RLmyKG6Up7dr8KmJy68quonoLZnr0= +go.opentelemetry.io/collector/extension v0.91.0/go.mod h1:F3r0fVTTh4sYR0GVv51Qez8lk8v77kTDPdyMOp6A2kg= +go.opentelemetry.io/collector/extension/auth v0.91.0 h1:28Hv5W0GZgv2jR5IiFdJzutTs91KmXFh8DUfVTjwwmI= +go.opentelemetry.io/collector/extension/auth v0.91.0/go.mod h1:diY6Sw7cOAn2qivKipZk4niBFzCCFBj7swAXiG2h9ro= +go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 h1:d787uZ6cNHN1uaJ3pIgFlcrkHVB4ML6AlXBiCQRJ9t0= +go.opentelemetry.io/collector/extension/zpagesextension v0.91.0/go.mod h1:S1T9YKuxRqCKFENC+GuEZhz0fzuUBACOrScNY13Y96w= go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= -go.opentelemetry.io/collector/otelcol v0.86.0 h1:p9NjJ7dIgQs0tp6uTsnmziDZdIwHDQqQ/wbnyD4FoIM= -go.opentelemetry.io/collector/otelcol v0.86.0/go.mod h1:jYS+YFA1qaxmgblwnARe97kQm0N2ngejb2qhR3zRPgg= -go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= -go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 h1:8PzrQFk3oKiT1Sd5EmNEcagdMyt1KcBy5/OyF5He5gY= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0015/go.mod h1:I1PqyHJlsXjANC73tp43nDId7/jiv82NoZZ6uS0xdwM= +go.opentelemetry.io/collector/otelcol v0.91.0 h1:gq/PY/tHgkTr2fuMLp+F+NAm+03iiU+j/Eilvx38p5w= +go.opentelemetry.io/collector/otelcol v0.91.0/go.mod h1:9j8gKdZvuEgZoeUhz5f5D/fwCxx7M7Tg+6D207/KjNs= go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/processor v0.86.0 h1:b4Htiom5mgcM5d7Memw1NkxBKgOADF1je0mLIhulQUM= -go.opentelemetry.io/collector/processor v0.86.0/go.mod h1:gJCNmRCqm/GKBHjRqlvRxMqWWcLCe1S6QNOxjtFv638= -go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= -go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 h1:Rel52zGeC57hBVXV5av6FmGJiQCa2mYX84HHGaTPAH0= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0/go.mod h1:Qr/hC52XN0dNyRIZu1M4RxuKyYLsrzJoqYDvOEfH7TQ= -go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= -go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= -go.opentelemetry.io/collector/receiver v0.86.0 h1:AP+KZ225CmXR1oBD36+vV/pZcRFTkSiG7HvAVqfHoRg= -go.opentelemetry.io/collector/receiver v0.86.0/go.mod h1:oFpofH/OG4HqmaVsb8ftnIAhLAhQnH/3bWrOdZZZjTk= -go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= -go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= -go.opentelemetry.io/collector/semconv v0.86.0 h1:bLlPe/JYNjQHo744cqi7iIEybuLv+M5DntUwQPTrvZo= -go.opentelemetry.io/collector/semconv v0.86.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= -go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.86.0 h1:vyoynxNY2Oc6XET2ZvFkRC+Fpc1oMl9qQkORyX5LoWg= -go.opentelemetry.io/collector/service v0.86.0/go.mod h1:IT8MQbc9GWreG+GCuuG7DcQ72HUfV4a9iZXmwyPs27Q= -go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= -go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= +go.opentelemetry.io/collector/processor v0.91.0 h1:Xi52gYMXTG4zYmNhsqJ8ly/9f7b0n0crMhKxVVI9HpY= +go.opentelemetry.io/collector/processor v0.91.0/go.mod h1:naTuusZNfzM5MSqoTVzkKbR1MaJ8oD8v5ginR5JreDE= +go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 h1:YuPG52D7otNr4lNd8KGsIIBHvawAAaOqGoNTK9799ko= +go.opentelemetry.io/collector/processor/batchprocessor v0.91.0/go.mod h1:U2ZVSMwgr4OsaKKMfvX9OGaurG83zAPKjVdpTgmj0ok= +go.opentelemetry.io/collector/receiver v0.91.0 h1:0TZF/0OXoJtxgm+mvOinRRXo9LgVyOsOgCQfWkNGXJA= +go.opentelemetry.io/collector/receiver v0.91.0/go.mod h1:d5qo2mpovqKoi47hrMxj5BLdLzOXM0mUHL5CKrjfWNM= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.91.0 h1:1Eyc1uR8yr3heKkC4YXFoZip0JqgOXuOiN/tXvl9WUo= +go.opentelemetry.io/collector/semconv v0.91.0 h1:TRd+yDDfKQl+aNtS24wmEbJp1/QE/xAFV9SB5zWGxpE= +go.opentelemetry.io/collector/semconv v0.91.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.91.0 h1:AQS6YAiZO6V+ohcMX4upfyp/Ydi6y862yQEbFt8t+fQ= +go.opentelemetry.io/collector/service v0.91.0/go.mod h1:8Pf8mPo3YqcTNwOzXa0Ok/o+g2+d8hSCaGxRqR/c6CY= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 h1:b8xjZxHbLrXAum4SxJd1Rlm7Y/fKaB+6ACI7/e5EfSA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0/go.mod h1:1ei0a32xOGkFoySu7y1DAHfcuIhC0pNZpvY2huXuMy4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/contrib/propagators/b3 v1.19.0 h1:ulz44cpm6V5oAeg5Aw9HyqGFMS6XM7untlMEhD7YzzA= -go.opentelemetry.io/contrib/propagators/b3 v1.19.0/go.mod h1:OzCmE2IVS+asTI+odXQstRGVfXQ4bXv9nMBRK0nNyqQ= go.opentelemetry.io/contrib/propagators/b3 v1.21.1 h1:WPYiUgmw3+b7b3sQ1bFBFAf0q+Di9dvNc3AtYfnT4RQ= go.opentelemetry.io/contrib/propagators/b3 v1.21.1/go.mod h1:EmzokPoSqsYMBVK4nRnhsfm5mbn8J1eDuz/U1UaQaWg= -go.opentelemetry.io/contrib/zpages v0.44.0 h1:9J/cxTTWhM6kzgdaBt6NiXS2HUreXn/eW2M+vzHgDAQ= -go.opentelemetry.io/contrib/zpages v0.44.0/go.mod h1:G3eNCGhodjn2wIdM+i6GneZb1Cqg6dNRBlm1cpNEElg= go.opentelemetry.io/contrib/zpages v0.46.1 h1:U8Hh84dc+vJTVgRnL+QKWtWD2iqTSKibrQ85EeQqsNg= go.opentelemetry.io/contrib/zpages v0.46.1/go.mod h1:1Wq9YTzkhr3Jkyi/sVrasFSppVzJQcvFf2Vc2ExZd6c= -go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs= -go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/bridge/opencensus v0.41.0 h1:VBpeaTbrvLFHvRtsyCJXjsTaicBNrAFdmctiN1k6WNI= -go.opentelemetry.io/otel/bridge/opencensus v0.41.0/go.mod h1:yCQB5IKRhgjlbTLc91+ixcZc2/8BncGGJ+CS3dZJwtY= go.opentelemetry.io/otel/bridge/opencensus v0.44.0 h1:/inELPJztkn6Xx3ap9qw8i8XdeWF0B/OjGHOdRTePZ8= go.opentelemetry.io/otel/bridge/opencensus v0.44.0/go.mod h1:dQTBJVBx1xahrXEFBV1BGPAnGuXC92LCj55fxIrtj7I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 h1:k0k7hFNDd8K4iOMJXj7s8sHaC4mhTlAeppRmZXLgZ6k= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0 h1:HgbDTD8pioFdY3NRc/YCvsWjqQPtweGyXxa32LgnTOw= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0/go.mod h1:tmvt/yK5Es5d6lHYWerLSOna8lCEfrBVX/a9M0ggqss= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0 h1:iV3BOgW4fry1Riw9dwypigqlIYWXvSRVT2RJmblzo40= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0/go.mod h1:7PGzqlKrxIRmbj5tlNW0nTkYZ5fHXDgk6Fy8/KjR0CI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 h1:IAtl+7gua134xcV3NieDhJHjjOVeJhXAnYf/0hswjUY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0/go.mod h1:w+pXobnBzh95MNIkeIuAKcHe/Uu/CX2PKIvBP6ipKRA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 h1:yE32ay7mJG2leczfREEhoW3VfSZIvHaB+gvVo1o8DQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0/go.mod h1:G17FHPDLt74bCI7tJ4CMitEk4BXTYG4FW6XUpkPBXa4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0 h1:6pu8ttx76BxHf+xz/H77AUZkPF3cwWzXqAUsXhVKI18= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0/go.mod h1:IOmXxPrxoxFMXdNy7lfDmE8MzE61YPcurbUm0SMjerI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/prometheus v0.41.0 h1:A3/bhjP5SmELy8dcpK+uttHeh9Qrh+YnS16/VzrztRQ= -go.opentelemetry.io/otel/exporters/prometheus v0.41.0/go.mod h1:mKuXEMi9suyyNJQ99SZCO0mpWGFe0MIALtjd3r6uo7Q= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0 h1:XzjGkawtAXs20Y+s6k1GNDMBsMDOV28TOT8cxmE42qM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0/go.mod h1:HAomEgjcKZk3VJ+HHdHLnhZXeGqdzPxxNTdKYRopUXY= +go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 h1:TnhkxGJ5qPHAMIMI4r+HPT/BbpoHxqn4xONJrok054o= +go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 h1:hSWWvDjXHVLq9DkmB+77fl8v7+t+yYiS+eNkiplDK54= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0/go.mod h1:zG7KQql1WjZCaUJd+L/ReSYx4bjbYJxg5ws9ws+mYes= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= -go.opentelemetry.io/otel/metric v1.18.0 h1:JwVzw94UYmbx3ej++CwLUQZxEODDj/pOuTCvzhtRrSQ= -go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/sdk v1.18.0 h1:e3bAB0wB3MljH38sHzpV/qWrOTCFrdZF2ct9F8rBkcY= -go.opentelemetry.io/otel/sdk v1.18.0/go.mod h1:1RCygWV7plY2KmdskZEDDBs4tJeHG92MdHZIluiYs/M= go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk/metric v0.41.0 h1:c3sAt9/pQ5fSIUfl0gPtClV3HhE18DCVzByD33R/zsk= -go.opentelemetry.io/otel/sdk/metric v0.41.0/go.mod h1:PmOmSt+iOklKtIg5O4Vz9H/ttcRFSNTgii+E1KGyn1w= go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= -go.opentelemetry.io/otel/trace v1.18.0 h1:NY+czwbHbmndxojTEKiSMHkG2ClNH2PwmcHrdo0JY10= -go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -1001,13 +818,9 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1018,10 +831,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1043,8 +854,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1087,12 +896,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1100,8 +905,6 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1118,8 +921,6 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1184,25 +985,15 @@ golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1212,17 +1003,12 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1273,10 +1059,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1299,10 +1083,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.141.0 h1:Df6vfMgDoIM6ss0m7H4MPwFwY87WNXHfBIda/Bmfl4E= -google.golang.org/api v0.141.0/go.mod h1:iZqLkdPlXKyG0b90eu6KxVSE4D/ccRF2e/doKD2CnQQ= -google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= +google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1340,18 +1122,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 h1:o4LtQxebKIJ4vkzyhtD2rfUNZ20Zf0ik5YVP5E7G7VE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1365,8 +1141,6 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1413,7 +1187,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1421,18 +1196,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= -k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= -k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= -k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= -k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= +k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= +k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= +k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= +k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= +k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= diff --git a/otelcollector/prometheusreceiver/go.mod b/otelcollector/prometheusreceiver/go.mod index 4ac99ba40..1557470e3 100644 --- a/otelcollector/prometheusreceiver/go.mod +++ b/otelcollector/prometheusreceiver/go.mod @@ -7,23 +7,23 @@ require ( github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 github.com/mitchellh/hashstructure/v2 v2.0.2 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.90.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 github.com/prometheus/common v0.45.0 github.com/prometheus/prometheus v0.48.0 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/collector/component v0.90.0 - go.opentelemetry.io/collector/confmap v0.90.0 - go.opentelemetry.io/collector/consumer v0.90.0 - go.opentelemetry.io/collector/exporter v0.90.0 + go.opentelemetry.io/collector/component v0.91.0 + go.opentelemetry.io/collector/confmap v0.91.0 + go.opentelemetry.io/collector/consumer v0.91.0 + go.opentelemetry.io/collector/exporter v0.91.0 go.opentelemetry.io/collector/featuregate v1.0.0 - go.opentelemetry.io/collector/otelcol v0.90.0 + go.opentelemetry.io/collector/otelcol v0.91.0 go.opentelemetry.io/collector/pdata v1.0.0 - go.opentelemetry.io/collector/processor v0.90.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 - go.opentelemetry.io/collector/receiver v0.90.0 - go.opentelemetry.io/collector/semconv v0.90.0 + go.opentelemetry.io/collector/processor v0.91.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 + go.opentelemetry.io/collector/receiver v0.91.0 + go.opentelemetry.io/collector/semconv v0.91.0 go.uber.org/zap v1.26.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 @@ -106,7 +106,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.3 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect @@ -127,8 +127,8 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.91.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/ovh/go-ovh v1.4.3 // indirect @@ -143,7 +143,7 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rs/cors v1.10.1 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect - github.com/shirou/gopsutil/v3 v3.23.10 // indirect + github.com/shirou/gopsutil/v3 v3.23.11 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -157,18 +157,18 @@ require ( github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.90.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect - go.opentelemetry.io/collector/config/internal v0.90.0 // indirect - go.opentelemetry.io/collector/connector v0.90.0 // indirect - go.opentelemetry.io/collector/extension v0.90.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect - go.opentelemetry.io/collector/service v0.90.0 // indirect + go.opentelemetry.io/collector v0.91.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.91.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.91.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.91.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.91.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.91.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.91.0 // indirect + go.opentelemetry.io/collector/config/internal v0.91.0 // indirect + go.opentelemetry.io/collector/connector v0.91.0 // indirect + go.opentelemetry.io/collector/extension v0.91.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.91.0 // indirect + go.opentelemetry.io/collector/service v0.91.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect @@ -179,7 +179,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect @@ -189,13 +189,13 @@ require ( go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.15.0 // indirect + golang.org/x/crypto v0.16.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.14.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.4.0 // indirect golang.org/x/tools v0.15.0 // indirect diff --git a/otelcollector/prometheusreceiver/go.sum b/otelcollector/prometheusreceiver/go.sum index 9f2a48ef9..a0be7450a 100644 --- a/otelcollector/prometheusreceiver/go.sum +++ b/otelcollector/prometheusreceiver/go.sum @@ -344,8 +344,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= -github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -498,8 +498,8 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULu github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= -github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= +github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= +github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -559,54 +559,54 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= -go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= -go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= -go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= -go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= -go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= -go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= -go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= -go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= -go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= -go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= -go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= -go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= -go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= -go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= -go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= -go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= -go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= -go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= -go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= -go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= -go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= -go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= -go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= -go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= -go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= -go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= -go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= +go.opentelemetry.io/collector v0.91.0 h1:C7sGUJDJ5nwm+CkWpAaVP3lNsuYpwSRbkmLncFjkmO8= +go.opentelemetry.io/collector v0.91.0/go.mod h1:YhQpIDZsn+bICAAqgBwXk9wqK8GKZDv+aogfG52zUuE= +go.opentelemetry.io/collector/component v0.91.0 h1:aBT1i2zGyfh9PalYJLfXVvQp+osHyalwyDFselI1CtA= +go.opentelemetry.io/collector/component v0.91.0/go.mod h1:2KBHvjNFdU7oOjsObQeC4Ta2Ef607OISU5obznW00fw= +go.opentelemetry.io/collector/config/configauth v0.91.0 h1:SjWKimuqlpfS3sIlFpfzdkSY/AmMMCEmn9+KRcjEU+s= +go.opentelemetry.io/collector/config/configauth v0.91.0/go.mod h1:wmmMYqv6PxwY+/h7qqvd/LP0XN/wzXoECDu6PYz2Of0= +go.opentelemetry.io/collector/config/configcompression v0.91.0 h1:v+jEpFhLgfJDCUCPsSF03gjoFEvm77PofTCqHKKgXTs= +go.opentelemetry.io/collector/config/configcompression v0.91.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/confighttp v0.91.0 h1:YAOyXcDaLDnF3UqPHH4kYU8lx8BqXJ7hS3Ou8GcmqpQ= +go.opentelemetry.io/collector/config/confighttp v0.91.0/go.mod h1:R6y8KSJzqDe6CE6JsYwt4CTZ2B4AlqRA+V74OJPX3vE= +go.opentelemetry.io/collector/config/confignet v0.91.0 h1:3huNXh04O3wXaN4qPhmmiefyz4dYbOlNcR/OKMByqig= +go.opentelemetry.io/collector/config/configopaque v0.91.0 h1:bQgJPyARbuXAsU2p6h2YbEm1kHb1stS6hg42ekyMZmI= +go.opentelemetry.io/collector/config/configopaque v0.91.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.91.0 h1:mEwvqrYfwUJ7LwYfpcF9M8z7LHFoYaKhEPhnERD/88E= +go.opentelemetry.io/collector/config/configtelemetry v0.91.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.91.0 h1:lZromNeOslPwyVlTPMOzF2q++SY+VONvfH3cDqA0kKk= +go.opentelemetry.io/collector/config/configtls v0.91.0/go.mod h1:E+CW5gZoH8V3z5aSlZxwiof7GAcayzn1HRM+uRILLEI= +go.opentelemetry.io/collector/config/internal v0.91.0 h1:Yx17oFdXOPnY83Jfe1oiXhvfYW7RX/xh3/kpV/iYibM= +go.opentelemetry.io/collector/config/internal v0.91.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.91.0 h1:7U2MT+u74oEzq/WWrpXSLKB7nX5jPNC4drwtQdYfwKk= +go.opentelemetry.io/collector/confmap v0.91.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.91.0 h1:p2YsgBtr26guCib99ExQHtGuNmX+awgmH1Mbz23wYGU= +go.opentelemetry.io/collector/connector v0.91.0/go.mod h1:dG34jAOATtXFdqzp8IxZJsFwFLaUIkYK69WT1WQ03ZY= +go.opentelemetry.io/collector/consumer v0.91.0 h1:0nU1lUe2S0b8iOmF3w3R/9Dt24n413thRTbXz/nJgrM= +go.opentelemetry.io/collector/consumer v0.91.0/go.mod h1:phTUQmr7hpYfwXyDXo4mFHVjYrlSbZE+nZYlKlbVxGs= +go.opentelemetry.io/collector/exporter v0.91.0 h1:guWcGflFjaenp3BMxAmAKjb8RQG80jQQKjuUFouS+z8= +go.opentelemetry.io/collector/exporter v0.91.0/go.mod h1:hkOBunNNWu6CaTtkRsCJ/OJ509REJZg+DDElevFIQCQ= +go.opentelemetry.io/collector/extension v0.91.0 h1:bkoSLgnWm4g6n+RLmyKG6Up7dr8KmJy68quonoLZnr0= +go.opentelemetry.io/collector/extension v0.91.0/go.mod h1:F3r0fVTTh4sYR0GVv51Qez8lk8v77kTDPdyMOp6A2kg= +go.opentelemetry.io/collector/extension/auth v0.91.0 h1:28Hv5W0GZgv2jR5IiFdJzutTs91KmXFh8DUfVTjwwmI= +go.opentelemetry.io/collector/extension/auth v0.91.0/go.mod h1:diY6Sw7cOAn2qivKipZk4niBFzCCFBj7swAXiG2h9ro= +go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 h1:d787uZ6cNHN1uaJ3pIgFlcrkHVB4ML6AlXBiCQRJ9t0= go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= -go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= -go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= +go.opentelemetry.io/collector/otelcol v0.91.0 h1:gq/PY/tHgkTr2fuMLp+F+NAm+03iiU+j/Eilvx38p5w= +go.opentelemetry.io/collector/otelcol v0.91.0/go.mod h1:9j8gKdZvuEgZoeUhz5f5D/fwCxx7M7Tg+6D207/KjNs= go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= -go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= -go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= -go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= -go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= -go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= -go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= -go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= -go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= +go.opentelemetry.io/collector/processor v0.91.0 h1:Xi52gYMXTG4zYmNhsqJ8ly/9f7b0n0crMhKxVVI9HpY= +go.opentelemetry.io/collector/processor v0.91.0/go.mod h1:naTuusZNfzM5MSqoTVzkKbR1MaJ8oD8v5ginR5JreDE= +go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 h1:YuPG52D7otNr4lNd8KGsIIBHvawAAaOqGoNTK9799ko= +go.opentelemetry.io/collector/processor/batchprocessor v0.91.0/go.mod h1:U2ZVSMwgr4OsaKKMfvX9OGaurG83zAPKjVdpTgmj0ok= +go.opentelemetry.io/collector/receiver v0.91.0 h1:0TZF/0OXoJtxgm+mvOinRRXo9LgVyOsOgCQfWkNGXJA= +go.opentelemetry.io/collector/receiver v0.91.0/go.mod h1:d5qo2mpovqKoi47hrMxj5BLdLzOXM0mUHL5CKrjfWNM= +go.opentelemetry.io/collector/semconv v0.91.0 h1:TRd+yDDfKQl+aNtS24wmEbJp1/QE/xAFV9SB5zWGxpE= +go.opentelemetry.io/collector/semconv v0.91.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.91.0 h1:AQS6YAiZO6V+ohcMX4upfyp/Ydi6y862yQEbFt8t+fQ= +go.opentelemetry.io/collector/service v0.91.0/go.mod h1:8Pf8mPo3YqcTNwOzXa0Ok/o+g2+d8hSCaGxRqR/c6CY= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= @@ -628,8 +628,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqhe go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= -go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 h1:TnhkxGJ5qPHAMIMI4r+HPT/BbpoHxqn4xONJrok054o= +go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= @@ -659,8 +659,8 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -733,8 +733,8 @@ golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -818,13 +818,12 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/otelcollector/prometheusreceiver/metrics_receiver.go b/otelcollector/prometheusreceiver/metrics_receiver.go index 9d8443f1c..1ae9b2fa5 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver.go +++ b/otelcollector/prometheusreceiver/metrics_receiver.go @@ -40,7 +40,7 @@ import ( const ( defaultGCInterval = 2 * time.Minute gcIntervalDelta = 1 * time.Minute - // Use same settings as Prometheus web server + // Use same settings as Prometheus web server maxConnections = 512 readTimeoutMinutes = 10 ) @@ -258,7 +258,7 @@ func (r *pReceiver) applyCfg(cfg *config.Config) error { discoveryCfg[scrapeConfig.JobName] = scrapeConfig.ServiceDiscoveryConfigs r.settings.Logger.Info("Scrape job added", zap.String("jobName", scrapeConfig.JobName)) } - if err := r.discoveryManager.ApplyConfig(discoveryCfg); err != nil { + if err := r.discoveryManager.ApplyConfig(discoveryCfg); err != nil { return err } @@ -319,7 +319,7 @@ func (r *pReceiver) initPrometheusComponents(ctx context.Context, host component host.ReportFatalError(err) } }() - // Setup settings and logger and create Prometheus web handler + // Setup settings and logger and create Prometheus web handler webOptions := web.Options{ ScrapeManager: r.scrapeManager, Context: ctx, From a82a78d5d3d7e36f12d19e4f7d12aade5dfe1652 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 14:10:39 -0800 Subject: [PATCH 09/21] Revert "upgrading to 0.91 for otelcollector" This reverts commit 376f762b656ec7d5953dc64d0aa0770709979327. --- .../opentelemetry-collector-builder/go.mod | 83 +-- .../opentelemetry-collector-builder/go.sum | 178 +++--- .../prom-config-validator-builder/go.mod | 149 ++--- .../prom-config-validator-builder/go.sum | 539 +++++++++++++----- otelcollector/prometheusreceiver/go.mod | 66 +-- otelcollector/prometheusreceiver/go.sum | 117 ++-- .../prometheusreceiver/metrics_receiver.go | 6 +- 7 files changed, 690 insertions(+), 448 deletions(-) diff --git a/otelcollector/opentelemetry-collector-builder/go.mod b/otelcollector/opentelemetry-collector-builder/go.mod index 03ee7771a..b283e373d 100644 --- a/otelcollector/opentelemetry-collector-builder/go.mod +++ b/otelcollector/opentelemetry-collector-builder/go.mod @@ -6,23 +6,23 @@ replace github.com/gracewehner/prometheusreceiver => ../prometheusreceiver require ( github.com/gracewehner/prometheusreceiver v0.0.0-00010101000000-000000000000 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 - go.opentelemetry.io/collector/component v0.91.0 - go.opentelemetry.io/collector/connector v0.91.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 - go.opentelemetry.io/collector/exporter v0.91.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 - go.opentelemetry.io/collector/extension v0.91.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 - go.opentelemetry.io/collector/otelcol v0.91.0 - go.opentelemetry.io/collector/processor v0.91.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 - go.opentelemetry.io/collector/receiver v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 + go.opentelemetry.io/collector/component v0.90.0 + go.opentelemetry.io/collector/connector v0.90.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 + go.opentelemetry.io/collector/exporter v0.90.0 + go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 + go.opentelemetry.io/collector/extension v0.90.0 + go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 + go.opentelemetry.io/collector/otelcol v0.90.0 + go.opentelemetry.io/collector/processor v0.90.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 + go.opentelemetry.io/collector/receiver v0.90.0 ) require ( @@ -40,7 +40,7 @@ require ( github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.48.14 // indirect + github.com/aws/aws-sdk-go v1.48.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -116,7 +116,7 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/compress v1.17.3 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect @@ -141,11 +141,12 @@ require ( github.com/oklog/ulid v1.3.1 // indirect github.com/onsi/ginkgo/v2 v2.11.0 // indirect github.com/onsi/gomega v1.27.10 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/ovh/go-ovh v1.4.3 // indirect @@ -165,7 +166,7 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rs/cors v1.10.1 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect - github.com/shirou/gopsutil/v3 v3.23.11 // indirect + github.com/shirou/gopsutil/v3 v3.23.10 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/spf13/cobra v1.8.0 // indirect @@ -178,23 +179,23 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect go.mongodb.org/mongo-driver v1.13.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.91.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.91.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.91.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.91.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.91.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.91.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.91.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.91.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.91.0 // indirect - go.opentelemetry.io/collector/config/internal v0.91.0 // indirect - go.opentelemetry.io/collector/confmap v0.91.0 // indirect - go.opentelemetry.io/collector/consumer v0.91.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.91.0 // indirect + go.opentelemetry.io/collector v0.90.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.90.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.90.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect + go.opentelemetry.io/collector/config/internal v0.90.0 // indirect + go.opentelemetry.io/collector/confmap v0.90.0 // indirect + go.opentelemetry.io/collector/consumer v0.90.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0 // indirect go.opentelemetry.io/collector/pdata v1.0.0 // indirect - go.opentelemetry.io/collector/semconv v0.91.0 // indirect - go.opentelemetry.io/collector/service v0.91.0 // indirect + go.opentelemetry.io/collector/semconv v0.90.0 // indirect + go.opentelemetry.io/collector/service v0.90.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect @@ -207,7 +208,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect diff --git a/otelcollector/opentelemetry-collector-builder/go.sum b/otelcollector/opentelemetry-collector-builder/go.sum index 6b44110ec..55fe3f60f 100644 --- a/otelcollector/opentelemetry-collector-builder/go.sum +++ b/otelcollector/opentelemetry-collector-builder/go.sum @@ -78,8 +78,8 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.48.14 h1:nVLrp+F84SG+xGiFMfe1TE6ZV6smF+42tuuNgYGV30s= -github.com/aws/aws-sdk-go v1.48.14/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.48.5 h1:cp3inTx9trQNCNZV/Id5S5egpilBXKdF32uKtb1LszI= +github.com/aws/aws-sdk-go v1.48.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -416,8 +416,8 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -512,31 +512,32 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 h1:p8gP126reF8nK4HvgpQ+6R3+CVxnYohjInD67uKqfDw= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0/go.mod h1:j26btuTJfz02X+urX9Qk73I13BdfuJoyjLm+edN1G94= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 h1:Qf4dntxfwgZVaqf7dmZEVG5xKwpSOh1J6OeVZh4LWyU= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0/go.mod h1:qTmlvq1ZTdGVY6QHxrGkpzh7IY0yMnFopFw0+HkJ82A= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.91.0 h1:gEtcld4dRU6PBO42AK95Bw4C7WN8n82zc04NRq/fzHU= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 h1:aSmn6Ln4rJ4mqXitb6cqxCsYKGSmFZ20WPzKcA49L5U= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0/go.mod h1:CpkIhyKKFxqD/KAu+e7sObuI8HdFkCweEBzg5xe7lgI= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 h1:bJt6FA6ksKSLkveP9ncb+Ksn2G7azNcmAQnbXpGH6tk= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0/go.mod h1:gIXeXK8NwOJE0GFd0WcQOY3gy0YBSiQkt0XABUKwXNs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.91.0 h1:8nzprvG2+4BK6C5wFSgZruZpoPiGKc1kRO2rp33tpTo= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 h1:I3MFZXcQdnATObbeKseHLEWOWMFt1jHhHCbeunBw3mE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0/go.mod h1:xHPYTciFeEEE2HnPu65FMgsCQFYNns66mqiHsMqb+HM= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 h1:jbzYDR6RLJkruWSunpXUqyj9SuSpuAcvppcdH6hE8PM= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0/go.mod h1:CNM7IdgOO6r4GL2bpd6tAXU9SR26KA+V+qA5JtOkQmA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.91.0 h1:qFnhbBNSv7fzxxkAjobOoGiiFFtx/HpvZ5C6zV3+ZBw= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 h1:a4XbucJve0K8g7kCO25EpNinBsXRGBJ8IhoLKNM0kdQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 h1:rRY2L7ZDOnTSHkUhcWbEMNIMwHMxlB5kuo+PRjwr5U0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0/go.mod h1:KydzPxPgbtZUYl4DYJrbfzCkPU8ifDoKqiO1GPFYJvk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 h1:FZS628dMMcY3db/2apfLEDdMw4JE53Rxed0nMNXRdzo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0/go.mod h1:c7ehfnmijlXERu8uO/nfesvkdBk+BYrURTloTLYVsWY= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.91.0 h1:MFDHOeY7OY00OPTtJiqn+h3y9PTZuO4N+2xAYkPWAPo= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 h1:fO7E0Uw+cGgVYzTNkIevO2fr8Wkh/vjglMm74C50uLY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0/go.mod h1:l+VhjYgCbyLHjVEpUNB1CBv1JV6/qeHt21m56HGDDRk= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.91.0 h1:G6hhju30lXqNpWH3hJNXoR3gk1WVisGAWguI8fmro+4= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 h1:G2YXTArLUF0STpYZjncq1ZdChkd6nOy5TIdQ3H+/RmY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0/go.mod h1:GKRoieqvf+iICn2AuFDReF6ynYNqxOgglGpGuqcmFdY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 h1:fbczHVkEsOYJ+ZVDQrMtJ31PcdjWRyJ5vM/dmjP+hwY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0/go.mod h1:17AyWbqEB5NAlNtfGWSHKqzI/TjCY4vYUmC0o6sKiPw= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.90.0 h1:HE0TGGOrQ6IKyycbqQorH61sII/lpefgjmlkDs4R7rM= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 h1:MrvzqtUkjOygG1WL3oYLtlJyt0iS9S4yY+U8bFTchNw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0/go.mod h1:IddDLOQp/QUjwskjlRLetMnZy+F/soYWdn9qoDhNIyg= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 h1:/C/0rXlUu2FqpwzwfcGl5P2AHdg+QEmDyYOxerXkW30= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0/go.mod h1:oR1zloRYO5wb1FyrDTK+fHra4bsfYWW1UcKdaqL9GWs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.90.0 h1:OJBbKAdG1X54h4gYCZdP2JTzdPeEnFvsGrmitgQiRzk= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 h1:mJUUjarDCMA+NnGpH45G3R5xNJWDnOyU1V14Df7rBoU= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0/go.mod h1:fuLlV9ckNXKtZPTkoSnl/zohOXpjAALntCLt+iWGOi0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 h1:ZnAtlWtn+9rrDVkm6I8aYXPfG098xNRgm1hBQc1Pscw= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0/go.mod h1:8boejehb8q18UUdiYL/ukUJvDgFaO+RvKpzYAE85mXM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.90.0 h1:pMBaQ/5fc4PPuCGb1DFzxdp1q04BKkCZapI3VnAWow4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 h1:ybdoWklcOxQ5Bv4SKuXn8OBjeImJozaF4YGvkgJkp6Y= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 h1:zlaGA4tT/lA9YpuPB8fofIg2cYTfBPaGgvM74+Y8cEo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0/go.mod h1:oR9qdvK2Ti6pNrW5rHBaCmeJH08LqroUlpEh3meINJk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 h1:hmARQTWY/GnsGZsBUT1RcKhARnX1KMUE+2tAtCQd2xA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0/go.mod h1:BiaiuIKXAdl9LPa+99bwI3g3sWsMa51E/FJFTmvc8Bk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.90.0 h1:XF+bBAe9pVsMiToTr3w+UGrqnahzD0ew6H5nCaVOw+Q= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 h1:Xkx1JT+GiJH9oawv61eM3yWdkXqT/fk5FcAT140PPqY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0/go.mod h1:wxJfumGLuNPUkKRMN+5rFCI7At+7BbMOvKpJSiAUqmQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 h1:3/v2gdRnq/oh7NuJ8qBtci2J/1IWKZ0tBTbZ8xTdfxI= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0/go.mod h1:FF1Uxgox+ptWe6a4Hdfw9AxuatYR8JggJDoVkrXY9aA= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= @@ -620,8 +621,8 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULu github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= -github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= +github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -700,65 +701,65 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.91.0 h1:C7sGUJDJ5nwm+CkWpAaVP3lNsuYpwSRbkmLncFjkmO8= -go.opentelemetry.io/collector v0.91.0/go.mod h1:YhQpIDZsn+bICAAqgBwXk9wqK8GKZDv+aogfG52zUuE= -go.opentelemetry.io/collector/component v0.91.0 h1:aBT1i2zGyfh9PalYJLfXVvQp+osHyalwyDFselI1CtA= -go.opentelemetry.io/collector/component v0.91.0/go.mod h1:2KBHvjNFdU7oOjsObQeC4Ta2Ef607OISU5obznW00fw= -go.opentelemetry.io/collector/config/configauth v0.91.0 h1:SjWKimuqlpfS3sIlFpfzdkSY/AmMMCEmn9+KRcjEU+s= -go.opentelemetry.io/collector/config/configauth v0.91.0/go.mod h1:wmmMYqv6PxwY+/h7qqvd/LP0XN/wzXoECDu6PYz2Of0= -go.opentelemetry.io/collector/config/configcompression v0.91.0 h1:v+jEpFhLgfJDCUCPsSF03gjoFEvm77PofTCqHKKgXTs= -go.opentelemetry.io/collector/config/configcompression v0.91.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/configgrpc v0.91.0 h1:+2zPmgVOhKgelluGaGwE3OMKqwi56i6OiU0+7xWTetM= -go.opentelemetry.io/collector/config/configgrpc v0.91.0/go.mod h1:iWDbg9vYaayewmbKfM2zEk4YvaOOwrs0eiUffypcZFk= -go.opentelemetry.io/collector/config/confighttp v0.91.0 h1:YAOyXcDaLDnF3UqPHH4kYU8lx8BqXJ7hS3Ou8GcmqpQ= -go.opentelemetry.io/collector/config/confighttp v0.91.0/go.mod h1:R6y8KSJzqDe6CE6JsYwt4CTZ2B4AlqRA+V74OJPX3vE= -go.opentelemetry.io/collector/config/confignet v0.91.0 h1:3huNXh04O3wXaN4qPhmmiefyz4dYbOlNcR/OKMByqig= -go.opentelemetry.io/collector/config/confignet v0.91.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= -go.opentelemetry.io/collector/config/configopaque v0.91.0 h1:bQgJPyARbuXAsU2p6h2YbEm1kHb1stS6hg42ekyMZmI= -go.opentelemetry.io/collector/config/configopaque v0.91.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.91.0 h1:mEwvqrYfwUJ7LwYfpcF9M8z7LHFoYaKhEPhnERD/88E= -go.opentelemetry.io/collector/config/configtelemetry v0.91.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.91.0 h1:lZromNeOslPwyVlTPMOzF2q++SY+VONvfH3cDqA0kKk= -go.opentelemetry.io/collector/config/configtls v0.91.0/go.mod h1:E+CW5gZoH8V3z5aSlZxwiof7GAcayzn1HRM+uRILLEI= -go.opentelemetry.io/collector/config/internal v0.91.0 h1:Yx17oFdXOPnY83Jfe1oiXhvfYW7RX/xh3/kpV/iYibM= -go.opentelemetry.io/collector/config/internal v0.91.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.91.0 h1:7U2MT+u74oEzq/WWrpXSLKB7nX5jPNC4drwtQdYfwKk= -go.opentelemetry.io/collector/confmap v0.91.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= -go.opentelemetry.io/collector/connector v0.91.0 h1:p2YsgBtr26guCib99ExQHtGuNmX+awgmH1Mbz23wYGU= -go.opentelemetry.io/collector/connector v0.91.0/go.mod h1:dG34jAOATtXFdqzp8IxZJsFwFLaUIkYK69WT1WQ03ZY= -go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 h1:SEgg1Jc7k3cxZjO3oqW1zNPFyuCTM1nk6cU0OkETO8g= -go.opentelemetry.io/collector/connector/forwardconnector v0.91.0/go.mod h1:CA8H0A4+HcUYcKMYgHQ4nlKyL8OJh2xvxrPcMOG2wCU= -go.opentelemetry.io/collector/consumer v0.91.0 h1:0nU1lUe2S0b8iOmF3w3R/9Dt24n413thRTbXz/nJgrM= -go.opentelemetry.io/collector/consumer v0.91.0/go.mod h1:phTUQmr7hpYfwXyDXo4mFHVjYrlSbZE+nZYlKlbVxGs= -go.opentelemetry.io/collector/exporter v0.91.0 h1:guWcGflFjaenp3BMxAmAKjb8RQG80jQQKjuUFouS+z8= -go.opentelemetry.io/collector/exporter v0.91.0/go.mod h1:hkOBunNNWu6CaTtkRsCJ/OJ509REJZg+DDElevFIQCQ= -go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 h1:mwKepKvfGciI6n/jLBYYH4bkbAVTr9RsNfzB3x66bCQ= -go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0/go.mod h1:7UTIR8N+Aw/8lT6mJWLqtbum8Yu/ZFznUq6fdNtPxxM= -go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 h1:PEVJgEZIUMQ/M2/aQ9uuEfjptW4t0bmm91LeeNpa8mc= -go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0/go.mod h1:ebWRIZhk6zere5QnvUpPHjfTvbapscwI6QfCial/X0Y= -go.opentelemetry.io/collector/extension v0.91.0 h1:bkoSLgnWm4g6n+RLmyKG6Up7dr8KmJy68quonoLZnr0= -go.opentelemetry.io/collector/extension v0.91.0/go.mod h1:F3r0fVTTh4sYR0GVv51Qez8lk8v77kTDPdyMOp6A2kg= -go.opentelemetry.io/collector/extension/auth v0.91.0 h1:28Hv5W0GZgv2jR5IiFdJzutTs91KmXFh8DUfVTjwwmI= -go.opentelemetry.io/collector/extension/auth v0.91.0/go.mod h1:diY6Sw7cOAn2qivKipZk4niBFzCCFBj7swAXiG2h9ro= -go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 h1:d787uZ6cNHN1uaJ3pIgFlcrkHVB4ML6AlXBiCQRJ9t0= -go.opentelemetry.io/collector/extension/zpagesextension v0.91.0/go.mod h1:S1T9YKuxRqCKFENC+GuEZhz0fzuUBACOrScNY13Y96w= +go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= +go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= +go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= +go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= +go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= +go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= +go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= +go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/configgrpc v0.90.0 h1:fxKjv/6VxNltv7O3q6L9B2aggeEK4NxXahnjSwipQNo= +go.opentelemetry.io/collector/config/configgrpc v0.90.0/go.mod h1:kqSGz7XhKaoKXMq7XaL9+UJe8+0QIxpof9+CTD4u3Kw= +go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= +go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= +go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= +go.opentelemetry.io/collector/config/confignet v0.90.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= +go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= +go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= +go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= +go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= +go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= +go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= +go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= +go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 h1:Eop1jOK6kHGj+uyr3p0lvC2M0ELP+GOKsemwLE1HLzQ= +go.opentelemetry.io/collector/connector/forwardconnector v0.90.0/go.mod h1:01S/iIRLzmOWn30EQATK3CWDIKHWtELATDY+z8ON6Uo= +go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= +go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= +go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= +go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= +go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 h1:jO6Hepz/ujWvn+FJVeMMFtVMHaSoyoBZ5QuMjVCqu4U= +go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0/go.mod h1:qk2XJoDmOnjZb+udt3bU/j0kohJJ/RDYh8n56e8PPFw= +go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 h1:82wlzXpvBFCFU0yhB/VWVY5g4iu5NuX8uSsgZkBoqhQ= +go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0/go.mod h1:sv0NqTCWumuFcmZcZa/SGQOLin8Jejbc1lptLpjCV64= +go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= +go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= +go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= +go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0/go.mod h1:dS2OMWeiSp/BAbkEKgm1GaJD8LQ6vyBbDiK6iWYiVa4= go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= -go.opentelemetry.io/collector/otelcol v0.91.0 h1:gq/PY/tHgkTr2fuMLp+F+NAm+03iiU+j/Eilvx38p5w= -go.opentelemetry.io/collector/otelcol v0.91.0/go.mod h1:9j8gKdZvuEgZoeUhz5f5D/fwCxx7M7Tg+6D207/KjNs= +go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= +go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/processor v0.91.0 h1:Xi52gYMXTG4zYmNhsqJ8ly/9f7b0n0crMhKxVVI9HpY= -go.opentelemetry.io/collector/processor v0.91.0/go.mod h1:naTuusZNfzM5MSqoTVzkKbR1MaJ8oD8v5ginR5JreDE= -go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 h1:YuPG52D7otNr4lNd8KGsIIBHvawAAaOqGoNTK9799ko= -go.opentelemetry.io/collector/processor/batchprocessor v0.91.0/go.mod h1:U2ZVSMwgr4OsaKKMfvX9OGaurG83zAPKjVdpTgmj0ok= -go.opentelemetry.io/collector/receiver v0.91.0 h1:0TZF/0OXoJtxgm+mvOinRRXo9LgVyOsOgCQfWkNGXJA= -go.opentelemetry.io/collector/receiver v0.91.0/go.mod h1:d5qo2mpovqKoi47hrMxj5BLdLzOXM0mUHL5CKrjfWNM= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.91.0 h1:1Eyc1uR8yr3heKkC4YXFoZip0JqgOXuOiN/tXvl9WUo= -go.opentelemetry.io/collector/semconv v0.91.0 h1:TRd+yDDfKQl+aNtS24wmEbJp1/QE/xAFV9SB5zWGxpE= -go.opentelemetry.io/collector/semconv v0.91.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.91.0 h1:AQS6YAiZO6V+ohcMX4upfyp/Ydi6y862yQEbFt8t+fQ= -go.opentelemetry.io/collector/service v0.91.0/go.mod h1:8Pf8mPo3YqcTNwOzXa0Ok/o+g2+d8hSCaGxRqR/c6CY= +go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= +go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= +go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= +go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.90.0 h1:TCqjZma7Q0Sfgeiq8d/DsoHq8U6ImeGIgUB6NiPCNWM= +go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= +go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= +go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= @@ -783,8 +784,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqhe go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 h1:TnhkxGJ5qPHAMIMI4r+HPT/BbpoHxqn4xONJrok054o= -go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= @@ -988,6 +989,7 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/otelcollector/prom-config-validator-builder/go.mod b/otelcollector/prom-config-validator-builder/go.mod index 5db69bc98..d7d88e804 100644 --- a/otelcollector/prom-config-validator-builder/go.mod +++ b/otelcollector/prom-config-validator-builder/go.mod @@ -6,56 +6,65 @@ replace github.com/gracewehner/prometheusreceiver => ../prometheusreceiver require ( github.com/gracewehner/prometheusreceiver v0.0.0-00010101000000-000000000000 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 - go.opentelemetry.io/collector/confmap v0.91.0 - go.opentelemetry.io/collector/connector v0.91.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 - go.opentelemetry.io/collector/exporter v0.91.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 - go.opentelemetry.io/collector/extension v0.91.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 - go.opentelemetry.io/collector/otelcol v0.91.0 - go.opentelemetry.io/collector/processor v0.91.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 - go.opentelemetry.io/collector/receiver v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 + go.opentelemetry.io/collector/confmap v0.90.0 + go.opentelemetry.io/collector/connector v0.90.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 + go.opentelemetry.io/collector/exporter v0.90.0 + go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 + go.opentelemetry.io/collector/extension v0.90.0 + go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 + go.opentelemetry.io/collector/otelcol v0.90.0 + go.opentelemetry.io/collector/processor v0.90.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 + go.opentelemetry.io/collector/receiver v0.90.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go/compute v1.23.2 // indirect cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 // indirect + github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.29 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect + github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.48.14 // indirect + github.com/aws/aws-sdk-go v1.47.10 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect + github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect github.com/digitalocean/godo v1.104.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/docker v24.0.7+incompatible // indirect - github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea // indirect + github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/envoyproxy/go-control-plane v0.11.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/fatih/color v1.15.0 // indirect @@ -78,11 +87,11 @@ require ( github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -95,7 +104,7 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect - github.com/hashicorp/consul/api v1.26.1 // indirect + github.com/hashicorp/consul/api v1.25.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -117,17 +126,18 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/compress v1.17.3 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/linode/linodego v1.23.0 // indirect - github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/miekg/dns v1.1.56 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -136,24 +146,22 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.2 // indirect + github.com/mostynb/go-grpc-compression v1.2.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/oklog/ulid v1.3.1 // indirect - github.com/onsi/ginkgo/v2 v2.11.0 // indirect - github.com/onsi/gomega v1.27.10 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/ovh/go-ovh v1.4.3 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/alertmanager v0.26.0 // indirect github.com/prometheus/client_golang v1.17.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -166,49 +174,49 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rs/cors v1.10.1 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect - github.com/shirou/gopsutil/v3 v3.23.11 // indirect + github.com/shirou/gopsutil/v3 v3.23.10 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect - github.com/tidwall/gjson v1.14.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.mongodb.org/mongo-driver v1.13.0 // indirect + go.mongodb.org/mongo-driver v1.12.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.91.0 // indirect - go.opentelemetry.io/collector/component v0.91.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.91.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.91.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.91.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.91.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.91.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.91.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.91.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.91.0 // indirect - go.opentelemetry.io/collector/config/internal v0.91.0 // indirect - go.opentelemetry.io/collector/consumer v0.91.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.91.0 // indirect + go.opentelemetry.io/collector v0.90.0 // indirect + go.opentelemetry.io/collector/component v0.90.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.86.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect + go.opentelemetry.io/collector/config/confignet v0.90.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect + go.opentelemetry.io/collector/config/internal v0.90.0 // indirect + go.opentelemetry.io/collector/consumer v0.90.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0 // indirect go.opentelemetry.io/collector/pdata v1.0.0 // indirect - go.opentelemetry.io/collector/semconv v0.91.0 // indirect - go.opentelemetry.io/collector/service v0.91.0 // indirect + go.opentelemetry.io/collector/semconv v0.90.0 // indirect + go.opentelemetry.io/collector/service v0.90.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect go.opentelemetry.io/contrib/zpages v0.46.1 // indirect go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/bridge/opencensus v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect @@ -220,33 +228,32 @@ require ( go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect + golang.org/x/net v0.18.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.4.0 // indirect - golang.org/x/tools v0.16.0 // indirect + golang.org/x/tools v0.15.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/api v0.151.0 // indirect + google.golang.org/api v0.150.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.0 // indirect - k8s.io/api v0.28.4 // indirect - k8s.io/apimachinery v0.28.4 // indirect - k8s.io/client-go v0.28.4 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/apimachinery v0.28.3 // indirect + k8s.io/client-go v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect diff --git a/otelcollector/prom-config-validator-builder/go.sum b/otelcollector/prom-config-validator-builder/go.sum index 6b44110ec..b9d961f72 100644 --- a/otelcollector/prom-config-validator-builder/go.sum +++ b/otelcollector/prom-config-validator-builder/go.sum @@ -19,8 +19,10 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= +cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 h1:aRVqY1p2IJaBGStWMsQMpkAa83cPkCDLl80eOj0Rbz4= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68/go.mod h1:1a3eRNYX12fs5UABBIXS8HXVvQbX9hRB/RkEBPORpe8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -37,23 +39,48 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q= +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= +github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= +github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= +github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= +github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= +github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= +github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -78,8 +105,10 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.48.14 h1:nVLrp+F84SG+xGiFMfe1TE6ZV6smF+42tuuNgYGV30s= -github.com/aws/aws-sdk-go v1.48.14/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= +github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= +github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -101,8 +130,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= +github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -111,21 +143,25 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= +github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= +github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= +github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea h1:+4n+kUVbPdu6qMI9SUnSKMC+D50gNW4L7Lhk9tI2lVo= -github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= +github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -134,14 +170,18 @@ github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -161,6 +201,8 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -238,9 +280,13 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -276,8 +322,7 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -293,6 +338,7 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -310,31 +356,41 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= +github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= -github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= -github.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= +github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= +github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= +github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -376,10 +432,14 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= +github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= +github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -388,6 +448,8 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= +github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= @@ -416,8 +478,10 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -439,11 +503,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= +github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -467,11 +532,15 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= @@ -498,8 +567,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= -github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/mostynb/go-grpc-compression v1.2.1 h1:16tdYxBZSD8p9AUmvw4F7Nyc2T4/eE7XsIXrgxSEcJI= +github.com/mostynb/go-grpc-compression v1.2.1/go.mod h1:oidYvYyefMmhcuvU8fLJ8FfZyTyVzJ6SkmD5fIKgRe8= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -508,39 +577,49 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0 h1:p8gP126reF8nK4HvgpQ+6R3+CVxnYohjInD67uKqfDw= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.91.0/go.mod h1:j26btuTJfz02X+urX9Qk73I13BdfuJoyjLm+edN1G94= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0 h1:Qf4dntxfwgZVaqf7dmZEVG5xKwpSOh1J6OeVZh4LWyU= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.91.0/go.mod h1:qTmlvq1ZTdGVY6QHxrGkpzh7IY0yMnFopFw0+HkJ82A= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.91.0 h1:gEtcld4dRU6PBO42AK95Bw4C7WN8n82zc04NRq/fzHU= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0 h1:aSmn6Ln4rJ4mqXitb6cqxCsYKGSmFZ20WPzKcA49L5U= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.91.0/go.mod h1:CpkIhyKKFxqD/KAu+e7sObuI8HdFkCweEBzg5xe7lgI= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0 h1:bJt6FA6ksKSLkveP9ncb+Ksn2G7azNcmAQnbXpGH6tk= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.91.0/go.mod h1:gIXeXK8NwOJE0GFd0WcQOY3gy0YBSiQkt0XABUKwXNs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.91.0 h1:8nzprvG2+4BK6C5wFSgZruZpoPiGKc1kRO2rp33tpTo= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0 h1:I3MFZXcQdnATObbeKseHLEWOWMFt1jHhHCbeunBw3mE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.91.0/go.mod h1:xHPYTciFeEEE2HnPu65FMgsCQFYNns66mqiHsMqb+HM= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0 h1:jbzYDR6RLJkruWSunpXUqyj9SuSpuAcvppcdH6hE8PM= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.91.0/go.mod h1:CNM7IdgOO6r4GL2bpd6tAXU9SR26KA+V+qA5JtOkQmA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.91.0 h1:qFnhbBNSv7fzxxkAjobOoGiiFFtx/HpvZ5C6zV3+ZBw= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 h1:a4XbucJve0K8g7kCO25EpNinBsXRGBJ8IhoLKNM0kdQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 h1:rRY2L7ZDOnTSHkUhcWbEMNIMwHMxlB5kuo+PRjwr5U0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0/go.mod h1:KydzPxPgbtZUYl4DYJrbfzCkPU8ifDoKqiO1GPFYJvk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 h1:FZS628dMMcY3db/2apfLEDdMw4JE53Rxed0nMNXRdzo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0/go.mod h1:c7ehfnmijlXERu8uO/nfesvkdBk+BYrURTloTLYVsWY= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.91.0 h1:MFDHOeY7OY00OPTtJiqn+h3y9PTZuO4N+2xAYkPWAPo= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0 h1:fO7E0Uw+cGgVYzTNkIevO2fr8Wkh/vjglMm74C50uLY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.91.0/go.mod h1:l+VhjYgCbyLHjVEpUNB1CBv1JV6/qeHt21m56HGDDRk= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.91.0 h1:G6hhju30lXqNpWH3hJNXoR3gk1WVisGAWguI8fmro+4= +github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 h1:pmX1xywF9ZhS8Qo44xp7U4/tEhKJO3c0E20EqfEbhC4= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0/go.mod h1:GU9a92SNvLcioVmKa+B6tgxdofn1zaVEYgbCOTN0zE8= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 h1:2nEjzC4LZ0Y0NptV1XyOCkqZ3/ogQ/vQzLUa5QWKijI= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0/go.mod h1:RpGBotLXh2ilbGkWDmd4bp4uPYvG4VcVqEVpIVTynX4= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.85.0 h1:6/OlktNNS8X3pL/Ry1pBAjwB4QGXjOm7MvF7Qjucbso= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 h1:JTHKAQLFae3rIXUFPuW9I2uvTlS2FAx2D2t5yTMH0+I= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0/go.mod h1:AOMyqzzvJNqas262U8YuWZhSae+zW2f74/+yuy4zEso= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 h1:X8iSLyznuGeWEN+aVt1Ehwstdw+nbJ347uO+P91O52E= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0/go.mod h1:v78K/hBoKNxtahmrWGCW5F5tlw/XEE9XZ5+nEIf6K4s= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.86.0 h1:g7HlND105lwm7NW8JCxAfbpaFyk1WKcEUUVwchIo9zE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0 h1:HEuJ7hCbLVfoL7xLrGQ2QORvocyFfWuaoDuzyTLwTdc= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0/go.mod h1:ss8TG43W1xNke9aeI0uTIVpyXW5OmYslxMj01UMdjR8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 h1:mJUUjarDCMA+NnGpH45G3R5xNJWDnOyU1V14Df7rBoU= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0/go.mod h1:fuLlV9ckNXKtZPTkoSnl/zohOXpjAALntCLt+iWGOi0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 h1:S6b7ToTSFZvVzcabjqoUBqAwair7YuELvBS6mOAopHs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0/go.mod h1:aLQB8gu7vJ1lokUeWoZs9ExpduamPrD3oRbDk7hNg/g= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.86.0 h1:EzGSvuCXAsGpwgeieTVcy1gs0hOlPidhFPcvwcPEU8s= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0 h1:xt/YvYpgssWk2Ix2C9SSXrILIzRqyWe+r5RE348m1fE= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0/go.mod h1:fjK1kn7PIDP+TqOIFVEth3w0Eiexx5jIk411c//fYkM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 h1:ybdoWklcOxQ5Bv4SKuXn8OBjeImJozaF4YGvkgJkp6Y= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0 h1:9u4hF+3SE+00aAaaMemlxujFPjmo2o2VeB2+x1Y5rCI= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0/go.mod h1:WfLBDz9rENrI1MYCPLmW21Mok23V2iBJP2fZTmJbCx8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 h1:zlaGA4tT/lA9YpuPB8fofIg2cYTfBPaGgvM74+Y8cEo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0/go.mod h1:oR9qdvK2Ti6pNrW5rHBaCmeJH08LqroUlpEh3meINJk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0 h1:nnzuEQYlsRIkMPAw1jEl+8L2Is68QQl58QvY2dHHgDU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0/go.mod h1:prodbjWZpQkRcd45W2wkRaryv6JomuuWZUmM6mDj27k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 h1:hmARQTWY/GnsGZsBUT1RcKhARnX1KMUE+2tAtCQd2xA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0/go.mod h1:BiaiuIKXAdl9LPa+99bwI3g3sWsMa51E/FJFTmvc8Bk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0 h1:U6jXC1LrqtW7/MLGMRbumuOcwr5g+J3mkngPgyBYEV0= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 h1:IWFGmyeOI/Ux3oBg2iwD5SbNbLgS9JATYGxvCIN2L58= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0/go.mod h1:mxpjy+fw19QBCa9aqipEUY6TrIYgp2THyLj4dmas6Jc= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.85.0 h1:8jlK2ASLOVtSkepS2go85uO6lpkijNB57JRFRE/Krd4= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= +github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -558,9 +637,10 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/alertmanager v0.25.0 h1:vbXKUR6PYRiZPRIKfmXaG+dmCKG52RtPL4Btl8hQGvg= +github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -571,12 +651,16 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -587,6 +671,8 @@ github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= @@ -602,8 +688,12 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= +github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/prometheus v0.47.0 h1:tIJJKZGlmrMVsvIt6rMfB8he7CRHEc8ZxS5ubcZtbkM= +github.com/prometheus/prometheus v0.47.0/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= @@ -612,16 +702,22 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= +github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= -github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= +github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= +github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= +github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -634,6 +730,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -653,16 +751,14 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= -github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= -github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -690,8 +786,8 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= -go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= +go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -700,107 +796,194 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.91.0 h1:C7sGUJDJ5nwm+CkWpAaVP3lNsuYpwSRbkmLncFjkmO8= -go.opentelemetry.io/collector v0.91.0/go.mod h1:YhQpIDZsn+bICAAqgBwXk9wqK8GKZDv+aogfG52zUuE= -go.opentelemetry.io/collector/component v0.91.0 h1:aBT1i2zGyfh9PalYJLfXVvQp+osHyalwyDFselI1CtA= -go.opentelemetry.io/collector/component v0.91.0/go.mod h1:2KBHvjNFdU7oOjsObQeC4Ta2Ef607OISU5obznW00fw= -go.opentelemetry.io/collector/config/configauth v0.91.0 h1:SjWKimuqlpfS3sIlFpfzdkSY/AmMMCEmn9+KRcjEU+s= -go.opentelemetry.io/collector/config/configauth v0.91.0/go.mod h1:wmmMYqv6PxwY+/h7qqvd/LP0XN/wzXoECDu6PYz2Of0= -go.opentelemetry.io/collector/config/configcompression v0.91.0 h1:v+jEpFhLgfJDCUCPsSF03gjoFEvm77PofTCqHKKgXTs= -go.opentelemetry.io/collector/config/configcompression v0.91.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/configgrpc v0.91.0 h1:+2zPmgVOhKgelluGaGwE3OMKqwi56i6OiU0+7xWTetM= -go.opentelemetry.io/collector/config/configgrpc v0.91.0/go.mod h1:iWDbg9vYaayewmbKfM2zEk4YvaOOwrs0eiUffypcZFk= -go.opentelemetry.io/collector/config/confighttp v0.91.0 h1:YAOyXcDaLDnF3UqPHH4kYU8lx8BqXJ7hS3Ou8GcmqpQ= -go.opentelemetry.io/collector/config/confighttp v0.91.0/go.mod h1:R6y8KSJzqDe6CE6JsYwt4CTZ2B4AlqRA+V74OJPX3vE= -go.opentelemetry.io/collector/config/confignet v0.91.0 h1:3huNXh04O3wXaN4qPhmmiefyz4dYbOlNcR/OKMByqig= -go.opentelemetry.io/collector/config/confignet v0.91.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= -go.opentelemetry.io/collector/config/configopaque v0.91.0 h1:bQgJPyARbuXAsU2p6h2YbEm1kHb1stS6hg42ekyMZmI= -go.opentelemetry.io/collector/config/configopaque v0.91.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.91.0 h1:mEwvqrYfwUJ7LwYfpcF9M8z7LHFoYaKhEPhnERD/88E= -go.opentelemetry.io/collector/config/configtelemetry v0.91.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.91.0 h1:lZromNeOslPwyVlTPMOzF2q++SY+VONvfH3cDqA0kKk= -go.opentelemetry.io/collector/config/configtls v0.91.0/go.mod h1:E+CW5gZoH8V3z5aSlZxwiof7GAcayzn1HRM+uRILLEI= -go.opentelemetry.io/collector/config/internal v0.91.0 h1:Yx17oFdXOPnY83Jfe1oiXhvfYW7RX/xh3/kpV/iYibM= -go.opentelemetry.io/collector/config/internal v0.91.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.91.0 h1:7U2MT+u74oEzq/WWrpXSLKB7nX5jPNC4drwtQdYfwKk= -go.opentelemetry.io/collector/confmap v0.91.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= -go.opentelemetry.io/collector/connector v0.91.0 h1:p2YsgBtr26guCib99ExQHtGuNmX+awgmH1Mbz23wYGU= -go.opentelemetry.io/collector/connector v0.91.0/go.mod h1:dG34jAOATtXFdqzp8IxZJsFwFLaUIkYK69WT1WQ03ZY= -go.opentelemetry.io/collector/connector/forwardconnector v0.91.0 h1:SEgg1Jc7k3cxZjO3oqW1zNPFyuCTM1nk6cU0OkETO8g= -go.opentelemetry.io/collector/connector/forwardconnector v0.91.0/go.mod h1:CA8H0A4+HcUYcKMYgHQ4nlKyL8OJh2xvxrPcMOG2wCU= -go.opentelemetry.io/collector/consumer v0.91.0 h1:0nU1lUe2S0b8iOmF3w3R/9Dt24n413thRTbXz/nJgrM= -go.opentelemetry.io/collector/consumer v0.91.0/go.mod h1:phTUQmr7hpYfwXyDXo4mFHVjYrlSbZE+nZYlKlbVxGs= -go.opentelemetry.io/collector/exporter v0.91.0 h1:guWcGflFjaenp3BMxAmAKjb8RQG80jQQKjuUFouS+z8= -go.opentelemetry.io/collector/exporter v0.91.0/go.mod h1:hkOBunNNWu6CaTtkRsCJ/OJ509REJZg+DDElevFIQCQ= -go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0 h1:mwKepKvfGciI6n/jLBYYH4bkbAVTr9RsNfzB3x66bCQ= -go.opentelemetry.io/collector/exporter/loggingexporter v0.91.0/go.mod h1:7UTIR8N+Aw/8lT6mJWLqtbum8Yu/ZFznUq6fdNtPxxM= -go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0 h1:PEVJgEZIUMQ/M2/aQ9uuEfjptW4t0bmm91LeeNpa8mc= -go.opentelemetry.io/collector/exporter/otlpexporter v0.91.0/go.mod h1:ebWRIZhk6zere5QnvUpPHjfTvbapscwI6QfCial/X0Y= -go.opentelemetry.io/collector/extension v0.91.0 h1:bkoSLgnWm4g6n+RLmyKG6Up7dr8KmJy68quonoLZnr0= -go.opentelemetry.io/collector/extension v0.91.0/go.mod h1:F3r0fVTTh4sYR0GVv51Qez8lk8v77kTDPdyMOp6A2kg= -go.opentelemetry.io/collector/extension/auth v0.91.0 h1:28Hv5W0GZgv2jR5IiFdJzutTs91KmXFh8DUfVTjwwmI= -go.opentelemetry.io/collector/extension/auth v0.91.0/go.mod h1:diY6Sw7cOAn2qivKipZk4niBFzCCFBj7swAXiG2h9ro= -go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 h1:d787uZ6cNHN1uaJ3pIgFlcrkHVB4ML6AlXBiCQRJ9t0= -go.opentelemetry.io/collector/extension/zpagesextension v0.91.0/go.mod h1:S1T9YKuxRqCKFENC+GuEZhz0fzuUBACOrScNY13Y96w= +go.opentelemetry.io/collector v0.86.0 h1:Yxu0muUws9e7HG+5DDiYajkfAeOo/riUv0sJO4E9rXA= +go.opentelemetry.io/collector v0.86.0/go.mod h1:HoXzPE/mJMN4jy5E1cSUMznxkKFiGAGJbkguzpnq5ak= +go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= +go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= +go.opentelemetry.io/collector/component v0.86.0 h1:3+6OTiknu081jWYSUx4PdOecvmo0kn5w1YlydZLKz8E= +go.opentelemetry.io/collector/component v0.86.0/go.mod h1:XaBL2y1EhcmbCIFqAqk5r3xOZyi1SarwU7Wj/iTiDOA= +go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= +go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= +go.opentelemetry.io/collector/config/configauth v0.86.0 h1:cqfr/zXyGGg5TGgmS+Ws6XFy6DdBNJxkTLUWpOVzmVI= +go.opentelemetry.io/collector/config/configauth v0.86.0/go.mod h1:8/v2oLZe9kskODghcRQSp2xP56EySlU1aNRthEIwn8w= +go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= +go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= +go.opentelemetry.io/collector/config/configcompression v0.86.0 h1:qA7i0igeYEpOW4PcGk3tYYSAO5dn+aMuDbCc/D0Rli4= +go.opentelemetry.io/collector/config/configcompression v0.86.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= +go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/configgrpc v0.86.0 h1:M1fq3QAGy+Q8bheiT1YWUpCcVEBnhWttHU1l8oXBQWg= +go.opentelemetry.io/collector/config/configgrpc v0.86.0/go.mod h1:PR4Ydn5RylPs06TEQRx6ygBdcOPYR9pni7XKoat8EYM= +go.opentelemetry.io/collector/config/confighttp v0.86.0 h1:DLHWhUG3Xp9Gci6+ewJ21GwIV0RQd8jlNt3F36397uk= +go.opentelemetry.io/collector/config/confighttp v0.86.0/go.mod h1:FMCmz/9rg8AXxdltWKUbFxOGQ/g9rNvTfb4EUA+RjT4= +go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= +go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= +go.opentelemetry.io/collector/config/confignet v0.86.0 h1:jg8rsMsAGKa+x3gs1yxqnfr2jpSAu8mGn7hc4y8h71o= +go.opentelemetry.io/collector/config/confignet v0.86.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= +go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= +go.opentelemetry.io/collector/config/confignet v0.90.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= +go.opentelemetry.io/collector/config/configopaque v0.86.0 h1:usNMgdFXbmprEcTImwVtziGkhXHeC/aWE93n2ZXlIO8= +go.opentelemetry.io/collector/config/configopaque v0.86.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= +go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.86.0 h1:xMqeL/gz7ZwZKRB58WYimEGU+Lvbzo5zd99uihjkMZY= +go.opentelemetry.io/collector/config/configtelemetry v0.86.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.86.0 h1:3BdB8Ntme+nDgYDPaWAb0jYbb/n7ueckN7hAPU3J3IM= +go.opentelemetry.io/collector/config/configtls v0.86.0/go.mod h1:vopMMIUjAvb6kojrc5G6vQOmfPIRxTU+hMHomvGNa2s= +go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= +go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= +go.opentelemetry.io/collector/config/internal v0.86.0 h1:r4LnOMxXmnKwAMaSX16bPe1jMbjkT9Up8VKt6IrJac0= +go.opentelemetry.io/collector/config/internal v0.86.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= +go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.86.0 h1:u3qXVuIz2cmH/rb2teX0Ft/OKYHgObv1e4OQ2UXqxrE= +go.opentelemetry.io/collector/confmap v0.86.0/go.mod h1:vJms49x98lXUR7Mj6/28eXV+Otn3dDQpc+Znvex9Z84= +go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= +go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.86.0 h1:tQaphbRyLhDDBkKpcAWawc+vFdnnNwvpKx8CBzW5xR4= +go.opentelemetry.io/collector/connector v0.86.0/go.mod h1:0n6B8ZyDgT0hvZbJLFYd9y+uAH54wttUGZ6O7Zo1B5M= +go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= +go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= +go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 h1:qaqPBOpYVLDObaCfZwLV/ASP9aXdVCM5qxic6sfoxdA= +go.opentelemetry.io/collector/connector/forwardconnector v0.85.0/go.mod h1:bcgIGydTq6N0uDDA8KVkmv9rsl/KIXK4ZsXwschp8dM= +go.opentelemetry.io/collector/consumer v0.86.0 h1:8AL9I30tJV01KfcSaa+8DTiARIiUDA8o2p7yQoSFUCs= +go.opentelemetry.io/collector/consumer v0.86.0/go.mod h1:SvoV1eto4VZzQ3ILKQ1rv4qgN8rUMJqupn78hoXLHRw= +go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= +go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= +go.opentelemetry.io/collector/exporter v0.86.0 h1:LFmBb7S4Fkj5fv/nrUkLOy50GT6s4R/BLrv6uTb+GNo= +go.opentelemetry.io/collector/exporter v0.86.0/go.mod h1:+PKZrFV4sVgS2TVFnfZ+RCJqXexEENjW1riWaqkxsN4= +go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= +go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= +go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 h1:bSTfWv0RobFgs/c9g4jo5V8tFSlD2ILZZE2RrJ/eY44= +go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0/go.mod h1:xQrg9pnp5XTvDZq/Q556emFZ90niT3jKhD4IQZQoWGw= +go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 h1:3MlKoGSFPdOHKtRcm5nTHRMpMmDtTGr6WAVrSuD0p3g= +go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0/go.mod h1:wNkRTwQ4V3SZzvxzPpLME0EQkpySGTaiSHYcWhBuvkk= +go.opentelemetry.io/collector/extension v0.86.0 h1:oXnZarkh1aBgnr/U3JSj/lPpBJUquOQ3DHMXXP4Jacc= +go.opentelemetry.io/collector/extension v0.86.0/go.mod h1:EPAloXQ+48577GvHTP5wGDvV4OyHPuldvM+2rYbM/fw= +go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= +go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= +go.opentelemetry.io/collector/extension/auth v0.86.0 h1:VwKbeElL8sBnvRDC565EWOw4ixMG/t0oXjIphNsRszU= +go.opentelemetry.io/collector/extension/auth v0.86.0/go.mod h1:qGIIkeWXaOtdYO1fYEn1vAEhUS+OhVcceUC1G3XOsdk= +go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= +go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= +go.opentelemetry.io/collector/extension/zpagesextension v0.86.0 h1:Ga5ZGEChIN0eqide9NFqlfEZPTRaTX3mAdLdbKwiOPQ= +go.opentelemetry.io/collector/extension/zpagesextension v0.86.0/go.mod h1:o30mkGrQYPMMBPqoq5igj5br+sAyJr0gIbgp5Mf/A20= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0/go.mod h1:dS2OMWeiSp/BAbkEKgm1GaJD8LQ6vyBbDiK6iWYiVa4= +go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015 h1:Wv8JFRUD01MwWkhZwF85to5oukHDFPRjnt88ArDFqco= +go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015/go.mod h1:fLmJMf1AoHttkF8p5oJAc4o5ZpHu8yO5XYJ7gbLCLzo= go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= -go.opentelemetry.io/collector/otelcol v0.91.0 h1:gq/PY/tHgkTr2fuMLp+F+NAm+03iiU+j/Eilvx38p5w= -go.opentelemetry.io/collector/otelcol v0.91.0/go.mod h1:9j8gKdZvuEgZoeUhz5f5D/fwCxx7M7Tg+6D207/KjNs= +go.opentelemetry.io/collector/otelcol v0.86.0 h1:p9NjJ7dIgQs0tp6uTsnmziDZdIwHDQqQ/wbnyD4FoIM= +go.opentelemetry.io/collector/otelcol v0.86.0/go.mod h1:jYS+YFA1qaxmgblwnARe97kQm0N2ngejb2qhR3zRPgg= +go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= +go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= +go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 h1:8PzrQFk3oKiT1Sd5EmNEcagdMyt1KcBy5/OyF5He5gY= +go.opentelemetry.io/collector/pdata v1.0.0-rcv0015/go.mod h1:I1PqyHJlsXjANC73tp43nDId7/jiv82NoZZ6uS0xdwM= go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/processor v0.91.0 h1:Xi52gYMXTG4zYmNhsqJ8ly/9f7b0n0crMhKxVVI9HpY= -go.opentelemetry.io/collector/processor v0.91.0/go.mod h1:naTuusZNfzM5MSqoTVzkKbR1MaJ8oD8v5ginR5JreDE= -go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 h1:YuPG52D7otNr4lNd8KGsIIBHvawAAaOqGoNTK9799ko= -go.opentelemetry.io/collector/processor/batchprocessor v0.91.0/go.mod h1:U2ZVSMwgr4OsaKKMfvX9OGaurG83zAPKjVdpTgmj0ok= -go.opentelemetry.io/collector/receiver v0.91.0 h1:0TZF/0OXoJtxgm+mvOinRRXo9LgVyOsOgCQfWkNGXJA= -go.opentelemetry.io/collector/receiver v0.91.0/go.mod h1:d5qo2mpovqKoi47hrMxj5BLdLzOXM0mUHL5CKrjfWNM= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.91.0 h1:1Eyc1uR8yr3heKkC4YXFoZip0JqgOXuOiN/tXvl9WUo= -go.opentelemetry.io/collector/semconv v0.91.0 h1:TRd+yDDfKQl+aNtS24wmEbJp1/QE/xAFV9SB5zWGxpE= -go.opentelemetry.io/collector/semconv v0.91.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.91.0 h1:AQS6YAiZO6V+ohcMX4upfyp/Ydi6y862yQEbFt8t+fQ= -go.opentelemetry.io/collector/service v0.91.0/go.mod h1:8Pf8mPo3YqcTNwOzXa0Ok/o+g2+d8hSCaGxRqR/c6CY= +go.opentelemetry.io/collector/processor v0.86.0 h1:b4Htiom5mgcM5d7Memw1NkxBKgOADF1je0mLIhulQUM= +go.opentelemetry.io/collector/processor v0.86.0/go.mod h1:gJCNmRCqm/GKBHjRqlvRxMqWWcLCe1S6QNOxjtFv638= +go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= +go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= +go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 h1:Rel52zGeC57hBVXV5av6FmGJiQCa2mYX84HHGaTPAH0= +go.opentelemetry.io/collector/processor/batchprocessor v0.85.0/go.mod h1:Qr/hC52XN0dNyRIZu1M4RxuKyYLsrzJoqYDvOEfH7TQ= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= +go.opentelemetry.io/collector/receiver v0.86.0 h1:AP+KZ225CmXR1oBD36+vV/pZcRFTkSiG7HvAVqfHoRg= +go.opentelemetry.io/collector/receiver v0.86.0/go.mod h1:oFpofH/OG4HqmaVsb8ftnIAhLAhQnH/3bWrOdZZZjTk= +go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= +go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= +go.opentelemetry.io/collector/semconv v0.86.0 h1:bLlPe/JYNjQHo744cqi7iIEybuLv+M5DntUwQPTrvZo= +go.opentelemetry.io/collector/semconv v0.86.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= +go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.86.0 h1:vyoynxNY2Oc6XET2ZvFkRC+Fpc1oMl9qQkORyX5LoWg= +go.opentelemetry.io/collector/service v0.86.0/go.mod h1:IT8MQbc9GWreG+GCuuG7DcQ72HUfV4a9iZXmwyPs27Q= +go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= +go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 h1:b8xjZxHbLrXAum4SxJd1Rlm7Y/fKaB+6ACI7/e5EfSA= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0/go.mod h1:1ei0a32xOGkFoySu7y1DAHfcuIhC0pNZpvY2huXuMy4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/contrib/propagators/b3 v1.19.0 h1:ulz44cpm6V5oAeg5Aw9HyqGFMS6XM7untlMEhD7YzzA= +go.opentelemetry.io/contrib/propagators/b3 v1.19.0/go.mod h1:OzCmE2IVS+asTI+odXQstRGVfXQ4bXv9nMBRK0nNyqQ= go.opentelemetry.io/contrib/propagators/b3 v1.21.1 h1:WPYiUgmw3+b7b3sQ1bFBFAf0q+Di9dvNc3AtYfnT4RQ= go.opentelemetry.io/contrib/propagators/b3 v1.21.1/go.mod h1:EmzokPoSqsYMBVK4nRnhsfm5mbn8J1eDuz/U1UaQaWg= +go.opentelemetry.io/contrib/zpages v0.44.0 h1:9J/cxTTWhM6kzgdaBt6NiXS2HUreXn/eW2M+vzHgDAQ= +go.opentelemetry.io/contrib/zpages v0.44.0/go.mod h1:G3eNCGhodjn2wIdM+i6GneZb1Cqg6dNRBlm1cpNEElg= go.opentelemetry.io/contrib/zpages v0.46.1 h1:U8Hh84dc+vJTVgRnL+QKWtWD2iqTSKibrQ85EeQqsNg= go.opentelemetry.io/contrib/zpages v0.46.1/go.mod h1:1Wq9YTzkhr3Jkyi/sVrasFSppVzJQcvFf2Vc2ExZd6c= +go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs= +go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/bridge/opencensus v0.41.0 h1:VBpeaTbrvLFHvRtsyCJXjsTaicBNrAFdmctiN1k6WNI= +go.opentelemetry.io/otel/bridge/opencensus v0.41.0/go.mod h1:yCQB5IKRhgjlbTLc91+ixcZc2/8BncGGJ+CS3dZJwtY= go.opentelemetry.io/otel/bridge/opencensus v0.44.0 h1:/inELPJztkn6Xx3ap9qw8i8XdeWF0B/OjGHOdRTePZ8= go.opentelemetry.io/otel/bridge/opencensus v0.44.0/go.mod h1:dQTBJVBx1xahrXEFBV1BGPAnGuXC92LCj55fxIrtj7I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 h1:k0k7hFNDd8K4iOMJXj7s8sHaC4mhTlAeppRmZXLgZ6k= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0 h1:HgbDTD8pioFdY3NRc/YCvsWjqQPtweGyXxa32LgnTOw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0/go.mod h1:tmvt/yK5Es5d6lHYWerLSOna8lCEfrBVX/a9M0ggqss= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0 h1:iV3BOgW4fry1Riw9dwypigqlIYWXvSRVT2RJmblzo40= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0/go.mod h1:7PGzqlKrxIRmbj5tlNW0nTkYZ5fHXDgk6Fy8/KjR0CI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 h1:IAtl+7gua134xcV3NieDhJHjjOVeJhXAnYf/0hswjUY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0/go.mod h1:w+pXobnBzh95MNIkeIuAKcHe/Uu/CX2PKIvBP6ipKRA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 h1:yE32ay7mJG2leczfREEhoW3VfSZIvHaB+gvVo1o8DQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0/go.mod h1:G17FHPDLt74bCI7tJ4CMitEk4BXTYG4FW6XUpkPBXa4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0 h1:6pu8ttx76BxHf+xz/H77AUZkPF3cwWzXqAUsXhVKI18= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0/go.mod h1:IOmXxPrxoxFMXdNy7lfDmE8MzE61YPcurbUm0SMjerI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 h1:TnhkxGJ5qPHAMIMI4r+HPT/BbpoHxqn4xONJrok054o= -go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/prometheus v0.41.0 h1:A3/bhjP5SmELy8dcpK+uttHeh9Qrh+YnS16/VzrztRQ= +go.opentelemetry.io/otel/exporters/prometheus v0.41.0/go.mod h1:mKuXEMi9suyyNJQ99SZCO0mpWGFe0MIALtjd3r6uo7Q= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0 h1:XzjGkawtAXs20Y+s6k1GNDMBsMDOV28TOT8cxmE42qM= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0/go.mod h1:HAomEgjcKZk3VJ+HHdHLnhZXeGqdzPxxNTdKYRopUXY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 h1:hSWWvDjXHVLq9DkmB+77fl8v7+t+yYiS+eNkiplDK54= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0/go.mod h1:zG7KQql1WjZCaUJd+L/ReSYx4bjbYJxg5ws9ws+mYes= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= +go.opentelemetry.io/otel/metric v1.18.0 h1:JwVzw94UYmbx3ej++CwLUQZxEODDj/pOuTCvzhtRrSQ= +go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.18.0 h1:e3bAB0wB3MljH38sHzpV/qWrOTCFrdZF2ct9F8rBkcY= +go.opentelemetry.io/otel/sdk v1.18.0/go.mod h1:1RCygWV7plY2KmdskZEDDBs4tJeHG92MdHZIluiYs/M= go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk/metric v0.41.0 h1:c3sAt9/pQ5fSIUfl0gPtClV3HhE18DCVzByD33R/zsk= +go.opentelemetry.io/otel/sdk/metric v0.41.0/go.mod h1:PmOmSt+iOklKtIg5O4Vz9H/ttcRFSNTgii+E1KGyn1w= go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= +go.opentelemetry.io/otel/trace v1.18.0 h1:NY+czwbHbmndxojTEKiSMHkG2ClNH2PwmcHrdo0JY10= +go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -818,9 +1001,13 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -831,8 +1018,10 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= -golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -854,6 +1043,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -896,8 +1087,12 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -905,6 +1100,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -921,6 +1118,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -985,15 +1184,25 @@ golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1003,12 +1212,17 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1059,8 +1273,10 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= -golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1083,8 +1299,10 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= -google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.141.0 h1:Df6vfMgDoIM6ss0m7H4MPwFwY87WNXHfBIda/Bmfl4E= +google.golang.org/api v0.141.0/go.mod h1:iZqLkdPlXKyG0b90eu6KxVSE4D/ccRF2e/doKD2CnQQ= +google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1122,12 +1340,18 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 h1:o4LtQxebKIJ4vkzyhtD2rfUNZ20Zf0ik5YVP5E7G7VE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1141,6 +1365,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1187,8 +1413,7 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1196,12 +1421,18 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= -k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= -k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= -k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= -k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= -k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= +k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= +k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= +k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= +k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= diff --git a/otelcollector/prometheusreceiver/go.mod b/otelcollector/prometheusreceiver/go.mod index 1557470e3..4ac99ba40 100644 --- a/otelcollector/prometheusreceiver/go.mod +++ b/otelcollector/prometheusreceiver/go.mod @@ -7,23 +7,23 @@ require ( github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 github.com/mitchellh/hashstructure/v2 v2.0.2 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.91.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.91.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 github.com/prometheus/common v0.45.0 github.com/prometheus/prometheus v0.48.0 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/collector/component v0.91.0 - go.opentelemetry.io/collector/confmap v0.91.0 - go.opentelemetry.io/collector/consumer v0.91.0 - go.opentelemetry.io/collector/exporter v0.91.0 + go.opentelemetry.io/collector/component v0.90.0 + go.opentelemetry.io/collector/confmap v0.90.0 + go.opentelemetry.io/collector/consumer v0.90.0 + go.opentelemetry.io/collector/exporter v0.90.0 go.opentelemetry.io/collector/featuregate v1.0.0 - go.opentelemetry.io/collector/otelcol v0.91.0 + go.opentelemetry.io/collector/otelcol v0.90.0 go.opentelemetry.io/collector/pdata v1.0.0 - go.opentelemetry.io/collector/processor v0.91.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 - go.opentelemetry.io/collector/receiver v0.91.0 - go.opentelemetry.io/collector/semconv v0.91.0 + go.opentelemetry.io/collector/processor v0.90.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 + go.opentelemetry.io/collector/receiver v0.90.0 + go.opentelemetry.io/collector/semconv v0.90.0 go.uber.org/zap v1.26.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 @@ -106,7 +106,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/compress v1.17.3 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect @@ -127,8 +127,8 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.91.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.91.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.90.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/ovh/go-ovh v1.4.3 // indirect @@ -143,7 +143,7 @@ require ( github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rs/cors v1.10.1 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 // indirect - github.com/shirou/gopsutil/v3 v3.23.11 // indirect + github.com/shirou/gopsutil/v3 v3.23.10 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -157,18 +157,18 @@ require ( github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.91.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.91.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.91.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.91.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.91.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.91.0 // indirect - go.opentelemetry.io/collector/config/configtls v0.91.0 // indirect - go.opentelemetry.io/collector/config/internal v0.91.0 // indirect - go.opentelemetry.io/collector/connector v0.91.0 // indirect - go.opentelemetry.io/collector/extension v0.91.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.91.0 // indirect - go.opentelemetry.io/collector/service v0.91.0 // indirect + go.opentelemetry.io/collector v0.90.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect + go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect + go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect + go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.90.0 // indirect + go.opentelemetry.io/collector/config/configtls v0.90.0 // indirect + go.opentelemetry.io/collector/config/internal v0.90.0 // indirect + go.opentelemetry.io/collector/connector v0.90.0 // indirect + go.opentelemetry.io/collector/extension v0.90.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.90.0 // indirect + go.opentelemetry.io/collector/service v0.90.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect @@ -179,7 +179,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect @@ -189,13 +189,13 @@ require ( go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.15.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect + golang.org/x/net v0.18.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.4.0 // indirect golang.org/x/tools v0.15.0 // indirect diff --git a/otelcollector/prometheusreceiver/go.sum b/otelcollector/prometheusreceiver/go.sum index a0be7450a..9f2a48ef9 100644 --- a/otelcollector/prometheusreceiver/go.sum +++ b/otelcollector/prometheusreceiver/go.sum @@ -344,8 +344,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= @@ -498,8 +498,8 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULu github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= -github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= +github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= @@ -559,54 +559,54 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.91.0 h1:C7sGUJDJ5nwm+CkWpAaVP3lNsuYpwSRbkmLncFjkmO8= -go.opentelemetry.io/collector v0.91.0/go.mod h1:YhQpIDZsn+bICAAqgBwXk9wqK8GKZDv+aogfG52zUuE= -go.opentelemetry.io/collector/component v0.91.0 h1:aBT1i2zGyfh9PalYJLfXVvQp+osHyalwyDFselI1CtA= -go.opentelemetry.io/collector/component v0.91.0/go.mod h1:2KBHvjNFdU7oOjsObQeC4Ta2Ef607OISU5obznW00fw= -go.opentelemetry.io/collector/config/configauth v0.91.0 h1:SjWKimuqlpfS3sIlFpfzdkSY/AmMMCEmn9+KRcjEU+s= -go.opentelemetry.io/collector/config/configauth v0.91.0/go.mod h1:wmmMYqv6PxwY+/h7qqvd/LP0XN/wzXoECDu6PYz2Of0= -go.opentelemetry.io/collector/config/configcompression v0.91.0 h1:v+jEpFhLgfJDCUCPsSF03gjoFEvm77PofTCqHKKgXTs= -go.opentelemetry.io/collector/config/configcompression v0.91.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/confighttp v0.91.0 h1:YAOyXcDaLDnF3UqPHH4kYU8lx8BqXJ7hS3Ou8GcmqpQ= -go.opentelemetry.io/collector/config/confighttp v0.91.0/go.mod h1:R6y8KSJzqDe6CE6JsYwt4CTZ2B4AlqRA+V74OJPX3vE= -go.opentelemetry.io/collector/config/confignet v0.91.0 h1:3huNXh04O3wXaN4qPhmmiefyz4dYbOlNcR/OKMByqig= -go.opentelemetry.io/collector/config/configopaque v0.91.0 h1:bQgJPyARbuXAsU2p6h2YbEm1kHb1stS6hg42ekyMZmI= -go.opentelemetry.io/collector/config/configopaque v0.91.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.91.0 h1:mEwvqrYfwUJ7LwYfpcF9M8z7LHFoYaKhEPhnERD/88E= -go.opentelemetry.io/collector/config/configtelemetry v0.91.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.91.0 h1:lZromNeOslPwyVlTPMOzF2q++SY+VONvfH3cDqA0kKk= -go.opentelemetry.io/collector/config/configtls v0.91.0/go.mod h1:E+CW5gZoH8V3z5aSlZxwiof7GAcayzn1HRM+uRILLEI= -go.opentelemetry.io/collector/config/internal v0.91.0 h1:Yx17oFdXOPnY83Jfe1oiXhvfYW7RX/xh3/kpV/iYibM= -go.opentelemetry.io/collector/config/internal v0.91.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.91.0 h1:7U2MT+u74oEzq/WWrpXSLKB7nX5jPNC4drwtQdYfwKk= -go.opentelemetry.io/collector/confmap v0.91.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= -go.opentelemetry.io/collector/connector v0.91.0 h1:p2YsgBtr26guCib99ExQHtGuNmX+awgmH1Mbz23wYGU= -go.opentelemetry.io/collector/connector v0.91.0/go.mod h1:dG34jAOATtXFdqzp8IxZJsFwFLaUIkYK69WT1WQ03ZY= -go.opentelemetry.io/collector/consumer v0.91.0 h1:0nU1lUe2S0b8iOmF3w3R/9Dt24n413thRTbXz/nJgrM= -go.opentelemetry.io/collector/consumer v0.91.0/go.mod h1:phTUQmr7hpYfwXyDXo4mFHVjYrlSbZE+nZYlKlbVxGs= -go.opentelemetry.io/collector/exporter v0.91.0 h1:guWcGflFjaenp3BMxAmAKjb8RQG80jQQKjuUFouS+z8= -go.opentelemetry.io/collector/exporter v0.91.0/go.mod h1:hkOBunNNWu6CaTtkRsCJ/OJ509REJZg+DDElevFIQCQ= -go.opentelemetry.io/collector/extension v0.91.0 h1:bkoSLgnWm4g6n+RLmyKG6Up7dr8KmJy68quonoLZnr0= -go.opentelemetry.io/collector/extension v0.91.0/go.mod h1:F3r0fVTTh4sYR0GVv51Qez8lk8v77kTDPdyMOp6A2kg= -go.opentelemetry.io/collector/extension/auth v0.91.0 h1:28Hv5W0GZgv2jR5IiFdJzutTs91KmXFh8DUfVTjwwmI= -go.opentelemetry.io/collector/extension/auth v0.91.0/go.mod h1:diY6Sw7cOAn2qivKipZk4niBFzCCFBj7swAXiG2h9ro= -go.opentelemetry.io/collector/extension/zpagesextension v0.91.0 h1:d787uZ6cNHN1uaJ3pIgFlcrkHVB4ML6AlXBiCQRJ9t0= +go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= +go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= +go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= +go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= +go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= +go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= +go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= +go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= +go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= +go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= +go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= +go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= +go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= +go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= +go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= +go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= +go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= +go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= +go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= +go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= +go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= +go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= +go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= +go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= +go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= +go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= +go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= +go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= +go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= +go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= +go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= -go.opentelemetry.io/collector/otelcol v0.91.0 h1:gq/PY/tHgkTr2fuMLp+F+NAm+03iiU+j/Eilvx38p5w= -go.opentelemetry.io/collector/otelcol v0.91.0/go.mod h1:9j8gKdZvuEgZoeUhz5f5D/fwCxx7M7Tg+6D207/KjNs= +go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= +go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/processor v0.91.0 h1:Xi52gYMXTG4zYmNhsqJ8ly/9f7b0n0crMhKxVVI9HpY= -go.opentelemetry.io/collector/processor v0.91.0/go.mod h1:naTuusZNfzM5MSqoTVzkKbR1MaJ8oD8v5ginR5JreDE= -go.opentelemetry.io/collector/processor/batchprocessor v0.91.0 h1:YuPG52D7otNr4lNd8KGsIIBHvawAAaOqGoNTK9799ko= -go.opentelemetry.io/collector/processor/batchprocessor v0.91.0/go.mod h1:U2ZVSMwgr4OsaKKMfvX9OGaurG83zAPKjVdpTgmj0ok= -go.opentelemetry.io/collector/receiver v0.91.0 h1:0TZF/0OXoJtxgm+mvOinRRXo9LgVyOsOgCQfWkNGXJA= -go.opentelemetry.io/collector/receiver v0.91.0/go.mod h1:d5qo2mpovqKoi47hrMxj5BLdLzOXM0mUHL5CKrjfWNM= -go.opentelemetry.io/collector/semconv v0.91.0 h1:TRd+yDDfKQl+aNtS24wmEbJp1/QE/xAFV9SB5zWGxpE= -go.opentelemetry.io/collector/semconv v0.91.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.91.0 h1:AQS6YAiZO6V+ohcMX4upfyp/Ydi6y862yQEbFt8t+fQ= -go.opentelemetry.io/collector/service v0.91.0/go.mod h1:8Pf8mPo3YqcTNwOzXa0Ok/o+g2+d8hSCaGxRqR/c6CY= +go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= +go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= +go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= +go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= +go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= +go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= +go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= +go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= @@ -628,8 +628,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqhe go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2 h1:TnhkxGJ5qPHAMIMI4r+HPT/BbpoHxqn4xONJrok054o= -go.opentelemetry.io/otel/exporters/prometheus v0.44.1-0.20231201153405-6027c1ae76f2/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= @@ -659,8 +659,8 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -733,8 +733,8 @@ golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -818,12 +818,13 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/otelcollector/prometheusreceiver/metrics_receiver.go b/otelcollector/prometheusreceiver/metrics_receiver.go index 1ae9b2fa5..9d8443f1c 100644 --- a/otelcollector/prometheusreceiver/metrics_receiver.go +++ b/otelcollector/prometheusreceiver/metrics_receiver.go @@ -40,7 +40,7 @@ import ( const ( defaultGCInterval = 2 * time.Minute gcIntervalDelta = 1 * time.Minute - // Use same settings as Prometheus web server + // Use same settings as Prometheus web server maxConnections = 512 readTimeoutMinutes = 10 ) @@ -258,7 +258,7 @@ func (r *pReceiver) applyCfg(cfg *config.Config) error { discoveryCfg[scrapeConfig.JobName] = scrapeConfig.ServiceDiscoveryConfigs r.settings.Logger.Info("Scrape job added", zap.String("jobName", scrapeConfig.JobName)) } - if err := r.discoveryManager.ApplyConfig(discoveryCfg); err != nil { + if err := r.discoveryManager.ApplyConfig(discoveryCfg); err != nil { return err } @@ -319,7 +319,7 @@ func (r *pReceiver) initPrometheusComponents(ctx context.Context, host component host.ReportFatalError(err) } }() - // Setup settings and logger and create Prometheus web handler + // Setup settings and logger and create Prometheus web handler webOptions := web.Options{ ScrapeManager: r.scrapeManager, Context: ctx, From acf79f6a1c2adad89ddcbbd1ceb627d7a36453e8 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 14:13:39 -0800 Subject: [PATCH 10/21] clean up trivyignore --- .trivyignore | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.trivyignore b/.trivyignore index 79cd6c4a1..0a56e3692 100644 --- a/.trivyignore +++ b/.trivyignore @@ -6,13 +6,13 @@ # =========== HIGH ================ # HIGH - otelcollector -GHSA-m425-mq94-257g -CVE-2023-47108 +#GHSA-m425-mq94-257g +#CVE-2023-47108 # HIGH - telegraf GHSA-fr2g-9hjm-wr23 # HIGH - promconfigvalidator -GHSA-m425-mq94-257g -CVE-2023-47108 +#GHSA-m425-mq94-257g +#CVE-2023-47108 # HIGH - telegraf GHSA-m425-mq94-257g CVE-2023-47090 @@ -20,14 +20,14 @@ CVE-2023-46129 # =========== MEDIUM ================ # MEDIUM - otelcollector -CVE-2023-40577 -GHSA-jq35-85cj-fj4p +#CVE-2023-40577 +#GHSA-jq35-85cj-fj4p # MEDIUM - promconfigvalidator -CVE-2023-40577 -GHSA-jq35-85cj-fj4p +#CVE-2023-40577 +#GHSA-jq35-85cj-fj4p # MEDIUM - telegraf GHSA-jq35-85cj-fj4p # MEDIUM - go vulnerabilities -CVE-2023-39325 -CVE-2023-3978 -CVE-2023-44487 \ No newline at end of file +#CVE-2023-39325 +#CVE-2023-3978 +#CVE-2023-44487 \ No newline at end of file From 2b67b8ab3df3a4e33cd4892298247ffe051b0ce2 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 14:24:57 -0800 Subject: [PATCH 11/21] comment out go version in sdl scan --- .pipelines/azure-pipeline-build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pipelines/azure-pipeline-build.yml b/.pipelines/azure-pipeline-build.yml index 8402aad42..c9084d107 100644 --- a/.pipelines/azure-pipeline-build.yml +++ b/.pipelines/azure-pipeline-build.yml @@ -252,10 +252,10 @@ jobs: - task: CodeQL3000Init@0 displayName: 'SDL: init codeql' - - task: GoTool@0 - displayName: "Build: specify golang version" - inputs: - version: '1.21' + # - task: GoTool@0 + # displayName: "Build: specify golang version" + # inputs: + # version: '1.21' - bash: | sudo apt-get install build-essential -y From cd88c8ec577581419e5a3976a9a4354e05f6a17c Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 15:21:22 -0800 Subject: [PATCH 12/21] fixing build issues --- .pipelines/azure-pipeline-build.yml | 3 +- .trivyignore | 21 +- .../opentelemetry-collector-builder/go.mod | 1 - .../opentelemetry-collector-builder/go.sum | 1 - .../prom-config-validator-builder/go.mod | 89 ++-- .../prom-config-validator-builder/go.sum | 418 ++++-------------- 6 files changed, 147 insertions(+), 386 deletions(-) diff --git a/.pipelines/azure-pipeline-build.yml b/.pipelines/azure-pipeline-build.yml index c9084d107..c5143a714 100644 --- a/.pipelines/azure-pipeline-build.yml +++ b/.pipelines/azure-pipeline-build.yml @@ -267,7 +267,8 @@ jobs: displayName: 'SDL: run binskim' inputs: InputType: 'CommandLine' - arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' + # Remove - $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator for targetallocator since go 1.21 is not yet supported by build pipeline + arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' - task: Gosec@1 displayName: 'SDL: run gosec' diff --git a/.trivyignore b/.trivyignore index 0a56e3692..8cb61ddbd 100644 --- a/.trivyignore +++ b/.trivyignore @@ -6,28 +6,27 @@ # =========== HIGH ================ # HIGH - otelcollector -#GHSA-m425-mq94-257g -#CVE-2023-47108 # HIGH - telegraf GHSA-fr2g-9hjm-wr23 # HIGH - promconfigvalidator -#GHSA-m425-mq94-257g -#CVE-2023-47108 # HIGH - telegraf +CVE-2023-39325 GHSA-m425-mq94-257g CVE-2023-47090 CVE-2023-46129 # =========== MEDIUM ================ # MEDIUM - otelcollector -#CVE-2023-40577 -#GHSA-jq35-85cj-fj4p +CVE-2023-48795 # MEDIUM - promconfigvalidator -#CVE-2023-40577 -#GHSA-jq35-85cj-fj4p +CVE-2023-48795 # MEDIUM - telegraf GHSA-jq35-85cj-fj4p +GHSA-7ww5-4wqc-m92c +GHSA-mhpq-9638-x6pw +CVE-2023-48795 +CVE-2023-3978 +CVE-2023-44487 # MEDIUM - go vulnerabilities -#CVE-2023-39325 -#CVE-2023-3978 -#CVE-2023-44487 \ No newline at end of file +# MEDIUM - mariner +CVE-2023-5678 \ No newline at end of file diff --git a/otelcollector/opentelemetry-collector-builder/go.mod b/otelcollector/opentelemetry-collector-builder/go.mod index b283e373d..ed4599bff 100644 --- a/otelcollector/opentelemetry-collector-builder/go.mod +++ b/otelcollector/opentelemetry-collector-builder/go.mod @@ -146,7 +146,6 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/ovh/go-ovh v1.4.3 // indirect diff --git a/otelcollector/opentelemetry-collector-builder/go.sum b/otelcollector/opentelemetry-collector-builder/go.sum index 55fe3f60f..512deaa84 100644 --- a/otelcollector/opentelemetry-collector-builder/go.sum +++ b/otelcollector/opentelemetry-collector-builder/go.sum @@ -537,7 +537,6 @@ github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometh github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 h1:Xkx1JT+GiJH9oawv61eM3yWdkXqT/fk5FcAT140PPqY= github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0/go.mod h1:wxJfumGLuNPUkKRMN+5rFCI7At+7BbMOvKpJSiAUqmQ= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 h1:3/v2gdRnq/oh7NuJ8qBtci2J/1IWKZ0tBTbZ8xTdfxI= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0/go.mod h1:FF1Uxgox+ptWe6a4Hdfw9AxuatYR8JggJDoVkrXY9aA= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= diff --git a/otelcollector/prom-config-validator-builder/go.mod b/otelcollector/prom-config-validator-builder/go.mod index d7d88e804..c8ea60388 100644 --- a/otelcollector/prom-config-validator-builder/go.mod +++ b/otelcollector/prom-config-validator-builder/go.mod @@ -6,17 +6,17 @@ replace github.com/gracewehner/prometheusreceiver => ../prometheusreceiver require ( github.com/gracewehner/prometheusreceiver v0.0.0-00010101000000-000000000000 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 go.opentelemetry.io/collector/confmap v0.90.0 go.opentelemetry.io/collector/connector v0.90.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 go.opentelemetry.io/collector/exporter v0.90.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 + go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 go.opentelemetry.io/collector/extension v0.90.0 go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 go.opentelemetry.io/collector/otelcol v0.90.0 @@ -27,44 +27,35 @@ require ( ) require ( - cloud.google.com/go/compute v1.23.2 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect - github.com/Azure/azure-sdk-for-go v65.0.0+incompatible // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.29 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.47.10 // indirect + github.com/aws/aws-sdk-go v1.48.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect - github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect github.com/digitalocean/godo v1.104.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/docker v24.0.7+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea // indirect github.com/docker/go-units v0.5.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/envoyproxy/go-control-plane v0.11.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect github.com/fatih/color v1.15.0 // indirect @@ -87,11 +78,11 @@ require ( github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/btree v1.1.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -104,7 +95,7 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect - github.com/hashicorp/consul/api v1.25.1 // indirect + github.com/hashicorp/consul/api v1.26.1 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -133,11 +124,10 @@ require ( github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/linode/linodego v1.23.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/miekg/dns v1.1.56 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -146,12 +136,14 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mostynb/go-grpc-compression v1.2.1 // indirect + github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/oklog/ulid v1.3.1 // indirect + github.com/onsi/ginkgo/v2 v2.11.0 // indirect + github.com/onsi/gomega v1.27.10 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 // indirect @@ -161,7 +153,7 @@ require ( github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect github.com/prometheus/alertmanager v0.26.0 // indirect github.com/prometheus/client_golang v1.17.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -180,17 +172,18 @@ require ( github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.4 // indirect + github.com/tidwall/gjson v1.14.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.mongodb.org/mongo-driver v1.12.0 // indirect + go.mongodb.org/mongo-driver v1.13.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector v0.90.0 // indirect go.opentelemetry.io/collector/component v0.90.0 // indirect go.opentelemetry.io/collector/config/configauth v0.90.0 // indirect go.opentelemetry.io/collector/config/configcompression v0.90.0 // indirect - go.opentelemetry.io/collector/config/configgrpc v0.86.0 // indirect + go.opentelemetry.io/collector/config/configgrpc v0.90.0 // indirect go.opentelemetry.io/collector/config/confighttp v0.90.0 // indirect go.opentelemetry.io/collector/config/confignet v0.90.0 // indirect go.opentelemetry.io/collector/config/configopaque v0.90.0 // indirect @@ -204,13 +197,12 @@ require ( go.opentelemetry.io/collector/semconv v0.90.0 // indirect go.opentelemetry.io/collector/service v0.90.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect go.opentelemetry.io/contrib/zpages v0.46.1 // indirect go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/bridge/opencensus v0.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect @@ -228,32 +220,33 @@ require ( go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.14.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.4.0 // indirect - golang.org/x/tools v0.15.0 // indirect + golang.org/x/tools v0.16.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/api v0.150.0 // indirect + google.golang.org/api v0.151.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.3 // indirect - k8s.io/apimachinery v0.28.3 // indirect - k8s.io/client-go v0.28.3 // indirect + gotest.tools/v3 v3.5.0 // indirect + k8s.io/api v0.28.4 // indirect + k8s.io/apimachinery v0.28.4 // indirect + k8s.io/client-go v0.28.4 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect diff --git a/otelcollector/prom-config-validator-builder/go.sum b/otelcollector/prom-config-validator-builder/go.sum index b9d961f72..512deaa84 100644 --- a/otelcollector/prom-config-validator-builder/go.sum +++ b/otelcollector/prom-config-validator-builder/go.sum @@ -19,10 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= -cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 h1:aRVqY1p2IJaBGStWMsQMpkAa83cPkCDLl80eOj0Rbz4= cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68/go.mod h1:1a3eRNYX12fs5UABBIXS8HXVvQbX9hRB/RkEBPORpe8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -39,48 +37,23 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= -github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= -github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= -github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -105,10 +78,8 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= -github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= -github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.48.5 h1:cp3inTx9trQNCNZV/Id5S5egpilBXKdF32uKtb1LszI= +github.com/aws/aws-sdk-go v1.48.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -130,11 +101,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= -github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -143,25 +111,21 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/digitalocean/godo v1.99.0 h1:gUHO7n9bDaZFWvbzOum4bXE0/09ZuYA9yA8idQHX57E= -github.com/digitalocean/godo v1.99.0/go.mod h1:SsS2oXo2rznfM/nORlZ/6JaUJZFhmKTib1YhopUc8NA= github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea h1:+4n+kUVbPdu6qMI9SUnSKMC+D50gNW4L7Lhk9tI2lVo= +github.com/docker/go-connections v0.4.1-0.20231110212414-fa09c952e3ea/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -170,18 +134,14 @@ github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -201,8 +161,6 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -280,13 +238,9 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -322,7 +276,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -338,7 +293,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -356,41 +310,31 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= -github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= -github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= -github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= -github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= -github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= -github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= +github.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A= +github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -432,14 +376,10 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e h1:sr4lujmn9heD030xx/Pd4B/JSmvRhFzuotNXaaV0WLs= -github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.0.0 h1:Sg1DJ+MAKvbYAqaBaq9tPbwXBS2ckPIaMtVdUjKu+4g= -github.com/hetznercloud/hcloud-go/v2 v2.0.0/go.mod h1:4iUG2NG8b61IAwNx6UsMWQ6IfIf/i1RsG0BbsKAyR5Q= github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -448,8 +388,6 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0= -github.com/ionos-cloud/sdk-go/v6 v6.1.8/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= @@ -478,8 +416,6 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= @@ -503,12 +439,11 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/linode/linodego v1.19.0 h1:n4WJrcr9+30e9JGZ6DI0nZbm5SdAj1kSwvvt/998YUw= -github.com/linode/linodego v1.19.0/go.mod h1:XZFR+yJ9mm2kwf6itZ6SCpu+6w3KnIevV0Uu5HNWJgQ= github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -532,15 +467,11 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= @@ -567,8 +498,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/mostynb/go-grpc-compression v1.2.1 h1:16tdYxBZSD8p9AUmvw4F7Nyc2T4/eE7XsIXrgxSEcJI= -github.com/mostynb/go-grpc-compression v1.2.1/go.mod h1:oidYvYyefMmhcuvU8fLJ8FfZyTyVzJ6SkmD5fIKgRe8= +github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= +github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -577,49 +508,39 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0 h1:pmX1xywF9ZhS8Qo44xp7U4/tEhKJO3c0E20EqfEbhC4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.85.0/go.mod h1:GU9a92SNvLcioVmKa+B6tgxdofn1zaVEYgbCOTN0zE8= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0 h1:2nEjzC4LZ0Y0NptV1XyOCkqZ3/ogQ/vQzLUa5QWKijI= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.85.0/go.mod h1:RpGBotLXh2ilbGkWDmd4bp4uPYvG4VcVqEVpIVTynX4= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.85.0 h1:6/OlktNNS8X3pL/Ry1pBAjwB4QGXjOm7MvF7Qjucbso= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0 h1:JTHKAQLFae3rIXUFPuW9I2uvTlS2FAx2D2t5yTMH0+I= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.85.0/go.mod h1:AOMyqzzvJNqas262U8YuWZhSae+zW2f74/+yuy4zEso= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0 h1:X8iSLyznuGeWEN+aVt1Ehwstdw+nbJ347uO+P91O52E= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.85.0/go.mod h1:v78K/hBoKNxtahmrWGCW5F5tlw/XEE9XZ5+nEIf6K4s= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.86.0 h1:g7HlND105lwm7NW8JCxAfbpaFyk1WKcEUUVwchIo9zE= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0 h1:HEuJ7hCbLVfoL7xLrGQ2QORvocyFfWuaoDuzyTLwTdc= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.86.0/go.mod h1:ss8TG43W1xNke9aeI0uTIVpyXW5OmYslxMj01UMdjR8= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0 h1:G2YXTArLUF0STpYZjncq1ZdChkd6nOy5TIdQ3H+/RmY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.90.0/go.mod h1:GKRoieqvf+iICn2AuFDReF6ynYNqxOgglGpGuqcmFdY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0 h1:fbczHVkEsOYJ+ZVDQrMtJ31PcdjWRyJ5vM/dmjP+hwY= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.90.0/go.mod h1:17AyWbqEB5NAlNtfGWSHKqzI/TjCY4vYUmC0o6sKiPw= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter v0.90.0 h1:HE0TGGOrQ6IKyycbqQorH61sII/lpefgjmlkDs4R7rM= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0 h1:MrvzqtUkjOygG1WL3oYLtlJyt0iS9S4yY+U8bFTchNw= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.90.0/go.mod h1:IddDLOQp/QUjwskjlRLetMnZy+F/soYWdn9qoDhNIyg= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0 h1:/C/0rXlUu2FqpwzwfcGl5P2AHdg+QEmDyYOxerXkW30= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.90.0/go.mod h1:oR1zloRYO5wb1FyrDTK+fHra4bsfYWW1UcKdaqL9GWs= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.90.0 h1:OJBbKAdG1X54h4gYCZdP2JTzdPeEnFvsGrmitgQiRzk= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0 h1:mJUUjarDCMA+NnGpH45G3R5xNJWDnOyU1V14Df7rBoU= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.90.0/go.mod h1:fuLlV9ckNXKtZPTkoSnl/zohOXpjAALntCLt+iWGOi0= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0 h1:S6b7ToTSFZvVzcabjqoUBqAwair7YuELvBS6mOAopHs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.86.0/go.mod h1:aLQB8gu7vJ1lokUeWoZs9ExpduamPrD3oRbDk7hNg/g= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.86.0 h1:EzGSvuCXAsGpwgeieTVcy1gs0hOlPidhFPcvwcPEU8s= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0 h1:xt/YvYpgssWk2Ix2C9SSXrILIzRqyWe+r5RE348m1fE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.86.0/go.mod h1:fjK1kn7PIDP+TqOIFVEth3w0Eiexx5jIk411c//fYkM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0 h1:ZnAtlWtn+9rrDVkm6I8aYXPfG098xNRgm1hBQc1Pscw= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.90.0/go.mod h1:8boejehb8q18UUdiYL/ukUJvDgFaO+RvKpzYAE85mXM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.90.0 h1:pMBaQ/5fc4PPuCGb1DFzxdp1q04BKkCZapI3VnAWow4= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0 h1:ybdoWklcOxQ5Bv4SKuXn8OBjeImJozaF4YGvkgJkp6Y= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.90.0/go.mod h1:LrsgmhaNo+f3xb4loclG8+gLTWgyzmiS1bplK1CVRu0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0 h1:9u4hF+3SE+00aAaaMemlxujFPjmo2o2VeB2+x1Y5rCI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.86.0/go.mod h1:WfLBDz9rENrI1MYCPLmW21Mok23V2iBJP2fZTmJbCx8= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0 h1:zlaGA4tT/lA9YpuPB8fofIg2cYTfBPaGgvM74+Y8cEo= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.90.0/go.mod h1:oR9qdvK2Ti6pNrW5rHBaCmeJH08LqroUlpEh3meINJk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0 h1:nnzuEQYlsRIkMPAw1jEl+8L2Is68QQl58QvY2dHHgDU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.86.0/go.mod h1:prodbjWZpQkRcd45W2wkRaryv6JomuuWZUmM6mDj27k= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0 h1:hmARQTWY/GnsGZsBUT1RcKhARnX1KMUE+2tAtCQd2xA= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.90.0/go.mod h1:BiaiuIKXAdl9LPa+99bwI3g3sWsMa51E/FJFTmvc8Bk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.85.0 h1:U6jXC1LrqtW7/MLGMRbumuOcwr5g+J3mkngPgyBYEV0= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0 h1:IWFGmyeOI/Ux3oBg2iwD5SbNbLgS9JATYGxvCIN2L58= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.85.0/go.mod h1:mxpjy+fw19QBCa9aqipEUY6TrIYgp2THyLj4dmas6Jc= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.85.0 h1:8jlK2ASLOVtSkepS2go85uO6lpkijNB57JRFRE/Krd4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheusremotewrite v0.90.0 h1:XF+bBAe9pVsMiToTr3w+UGrqnahzD0ew6H5nCaVOw+Q= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0 h1:Xkx1JT+GiJH9oawv61eM3yWdkXqT/fk5FcAT140PPqY= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourceprocessor v0.90.0/go.mod h1:wxJfumGLuNPUkKRMN+5rFCI7At+7BbMOvKpJSiAUqmQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.90.0 h1:3/v2gdRnq/oh7NuJ8qBtci2J/1IWKZ0tBTbZ8xTdfxI= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= -github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/ovh/go-ovh v1.4.1 h1:VBGa5wMyQtTP7Zb+w97zRCh9sLtM/2YKRyy+MEJmWaM= -github.com/ovh/go-ovh v1.4.1/go.mod h1:6bL6pPyUT7tBfI0pqOegJgRjgjuO+mOo+MyXd1EEC0M= github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -637,10 +558,9 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/alertmanager v0.25.0 h1:vbXKUR6PYRiZPRIKfmXaG+dmCKG52RtPL4Btl8hQGvg= -github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -651,16 +571,12 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -671,8 +587,6 @@ github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= @@ -688,12 +602,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/prometheus v0.47.0 h1:tIJJKZGlmrMVsvIt6rMfB8he7CRHEc8ZxS5ubcZtbkM= -github.com/prometheus/prometheus v0.47.0/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= @@ -702,20 +612,14 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= -github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20 h1:a9hSJdJcd16e0HoMsnFvaHvxB3pxSD+SC7+CISp7xY0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.20/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= -github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= @@ -730,8 +634,6 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -751,14 +653,16 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= -github.com/tidwall/gjson v1.10.2 h1:APbLGOM0rrEkd8WBw9C24nllro4ajFuJu0Sc9hRz8Bo= +github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -786,8 +690,8 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= -go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= +go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= +go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -796,194 +700,107 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.86.0 h1:Yxu0muUws9e7HG+5DDiYajkfAeOo/riUv0sJO4E9rXA= -go.opentelemetry.io/collector v0.86.0/go.mod h1:HoXzPE/mJMN4jy5E1cSUMznxkKFiGAGJbkguzpnq5ak= go.opentelemetry.io/collector v0.90.0 h1:Wyiiu+78tV5zZDvza9hvZu6FgOkFqURNzPHkKcI+asw= go.opentelemetry.io/collector v0.90.0/go.mod h1:qRhpGBXozKMn+7SiniobhcZ0AbCSWdYqL+XM3gnwejQ= -go.opentelemetry.io/collector/component v0.86.0 h1:3+6OTiknu081jWYSUx4PdOecvmo0kn5w1YlydZLKz8E= -go.opentelemetry.io/collector/component v0.86.0/go.mod h1:XaBL2y1EhcmbCIFqAqk5r3xOZyi1SarwU7Wj/iTiDOA= go.opentelemetry.io/collector/component v0.90.0 h1:rufHQfFpZQ4mc30GAsW6JSm1DvJWCGjoyw+dNXpgTV8= go.opentelemetry.io/collector/component v0.90.0/go.mod h1:+WX5h5I98AwL256AdFvn8EpPZ02Q+UrKo9AdI8LLfuQ= -go.opentelemetry.io/collector/config/configauth v0.86.0 h1:cqfr/zXyGGg5TGgmS+Ws6XFy6DdBNJxkTLUWpOVzmVI= -go.opentelemetry.io/collector/config/configauth v0.86.0/go.mod h1:8/v2oLZe9kskODghcRQSp2xP56EySlU1aNRthEIwn8w= go.opentelemetry.io/collector/config/configauth v0.90.0 h1:lt/02ssxsoGXOsj3sGrn6NXIjOoFEXyK/t70lvr7EWo= go.opentelemetry.io/collector/config/configauth v0.90.0/go.mod h1:tHCeUhnik4RrLuiHuyDMRy7YxjMnXb/PCm7jdkmyfyc= -go.opentelemetry.io/collector/config/configcompression v0.86.0 h1:qA7i0igeYEpOW4PcGk3tYYSAO5dn+aMuDbCc/D0Rli4= -go.opentelemetry.io/collector/config/configcompression v0.86.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= go.opentelemetry.io/collector/config/configcompression v0.90.0 h1:5y5sGbvo0NZKJo6soxhxWHPbfwfc+XuzN6L44M6aDoo= go.opentelemetry.io/collector/config/configcompression v0.90.0/go.mod h1:LaavoxZsro5lL7qh1g9DMifG0qixWPEecW18Qr8bpag= -go.opentelemetry.io/collector/config/configgrpc v0.86.0 h1:M1fq3QAGy+Q8bheiT1YWUpCcVEBnhWttHU1l8oXBQWg= -go.opentelemetry.io/collector/config/configgrpc v0.86.0/go.mod h1:PR4Ydn5RylPs06TEQRx6ygBdcOPYR9pni7XKoat8EYM= -go.opentelemetry.io/collector/config/confighttp v0.86.0 h1:DLHWhUG3Xp9Gci6+ewJ21GwIV0RQd8jlNt3F36397uk= -go.opentelemetry.io/collector/config/confighttp v0.86.0/go.mod h1:FMCmz/9rg8AXxdltWKUbFxOGQ/g9rNvTfb4EUA+RjT4= +go.opentelemetry.io/collector/config/configgrpc v0.90.0 h1:fxKjv/6VxNltv7O3q6L9B2aggeEK4NxXahnjSwipQNo= +go.opentelemetry.io/collector/config/configgrpc v0.90.0/go.mod h1:kqSGz7XhKaoKXMq7XaL9+UJe8+0QIxpof9+CTD4u3Kw= go.opentelemetry.io/collector/config/confighttp v0.90.0 h1:trgTrKp3hzyCMO8RDtPTfrnia6h1qhr8QOqS5Sizl6M= go.opentelemetry.io/collector/config/confighttp v0.90.0/go.mod h1:viutRIlajhHWuR3snu1RLako3b+Rd3MM0OfRDhIuicM= -go.opentelemetry.io/collector/config/confignet v0.86.0 h1:jg8rsMsAGKa+x3gs1yxqnfr2jpSAu8mGn7hc4y8h71o= -go.opentelemetry.io/collector/config/confignet v0.86.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= go.opentelemetry.io/collector/config/confignet v0.90.0 h1:+1AR+lzjZ8LGHWM4ujOBUXu53hvnC6qycHVeNvp8+U4= go.opentelemetry.io/collector/config/confignet v0.90.0/go.mod h1:cpO8JYWGONaViOygKVw+Hd2UoBcn2cUiyi0WWeFTwJY= -go.opentelemetry.io/collector/config/configopaque v0.86.0 h1:usNMgdFXbmprEcTImwVtziGkhXHeC/aWE93n2ZXlIO8= -go.opentelemetry.io/collector/config/configopaque v0.86.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= go.opentelemetry.io/collector/config/configopaque v0.90.0 h1:tnuwVWaKbPIhgLawcU4xnex53tJbQsecNq86eZRz1rE= go.opentelemetry.io/collector/config/configopaque v0.90.0/go.mod h1:TPCHaU+QXiEV+JXbgyr6mSErTI9chwQyasDVMdJr3eY= -go.opentelemetry.io/collector/config/configtelemetry v0.86.0 h1:xMqeL/gz7ZwZKRB58WYimEGU+Lvbzo5zd99uihjkMZY= -go.opentelemetry.io/collector/config/configtelemetry v0.86.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= go.opentelemetry.io/collector/config/configtelemetry v0.90.0 h1:1exyNLDVSSkdDLUoVTLiy5pfzB7ak802JhOaOTOe2Zo= go.opentelemetry.io/collector/config/configtelemetry v0.90.0/go.mod h1:+LAXM5WFMW/UbTlAuSs6L/W72WC+q8TBJt/6z39FPOU= -go.opentelemetry.io/collector/config/configtls v0.86.0 h1:3BdB8Ntme+nDgYDPaWAb0jYbb/n7ueckN7hAPU3J3IM= -go.opentelemetry.io/collector/config/configtls v0.86.0/go.mod h1:vopMMIUjAvb6kojrc5G6vQOmfPIRxTU+hMHomvGNa2s= go.opentelemetry.io/collector/config/configtls v0.90.0 h1:bsPZkh5ejlIk/XwLdzz91empM3STU8xr6yArqMVYxJ4= go.opentelemetry.io/collector/config/configtls v0.90.0/go.mod h1:eLLgpNPxHAtAynKCJN7p9O7GIDEIRKfjsFJs3BQazyg= -go.opentelemetry.io/collector/config/internal v0.86.0 h1:r4LnOMxXmnKwAMaSX16bPe1jMbjkT9Up8VKt6IrJac0= -go.opentelemetry.io/collector/config/internal v0.86.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= go.opentelemetry.io/collector/config/internal v0.90.0 h1:CVRGxmXupYOcLGgYjWb5XmFI9oWmvRD4NwzoasjolUs= go.opentelemetry.io/collector/config/internal v0.90.0/go.mod h1:42VsQ/1kP2qnvzjNi+dfNP+KyCFRADejyrJ8m2GVL3M= -go.opentelemetry.io/collector/confmap v0.86.0 h1:u3qXVuIz2cmH/rb2teX0Ft/OKYHgObv1e4OQ2UXqxrE= -go.opentelemetry.io/collector/confmap v0.86.0/go.mod h1:vJms49x98lXUR7Mj6/28eXV+Otn3dDQpc+Znvex9Z84= go.opentelemetry.io/collector/confmap v0.90.0 h1:vU+759p/4zLeet8yeI8uVq4+xCm73/5K8t2Tx0MzX/8= go.opentelemetry.io/collector/confmap v0.90.0/go.mod h1:uxV+fZ85kG31oovL6Cl3fAMQ3RRPwUvfAbbA9WT1Yhk= -go.opentelemetry.io/collector/connector v0.86.0 h1:tQaphbRyLhDDBkKpcAWawc+vFdnnNwvpKx8CBzW5xR4= -go.opentelemetry.io/collector/connector v0.86.0/go.mod h1:0n6B8ZyDgT0hvZbJLFYd9y+uAH54wttUGZ6O7Zo1B5M= go.opentelemetry.io/collector/connector v0.90.0 h1:a/LqC0FjcvTI2rCN4HOYDfVwAY8a3wmSosmPQTIyNgw= go.opentelemetry.io/collector/connector v0.90.0/go.mod h1:qdIh6GGJvauYkTkqtoSQ3pQDh+DShZ/CH4lhguAOhag= -go.opentelemetry.io/collector/connector/forwardconnector v0.85.0 h1:qaqPBOpYVLDObaCfZwLV/ASP9aXdVCM5qxic6sfoxdA= -go.opentelemetry.io/collector/connector/forwardconnector v0.85.0/go.mod h1:bcgIGydTq6N0uDDA8KVkmv9rsl/KIXK4ZsXwschp8dM= -go.opentelemetry.io/collector/consumer v0.86.0 h1:8AL9I30tJV01KfcSaa+8DTiARIiUDA8o2p7yQoSFUCs= -go.opentelemetry.io/collector/consumer v0.86.0/go.mod h1:SvoV1eto4VZzQ3ILKQ1rv4qgN8rUMJqupn78hoXLHRw= +go.opentelemetry.io/collector/connector/forwardconnector v0.90.0 h1:Eop1jOK6kHGj+uyr3p0lvC2M0ELP+GOKsemwLE1HLzQ= +go.opentelemetry.io/collector/connector/forwardconnector v0.90.0/go.mod h1:01S/iIRLzmOWn30EQATK3CWDIKHWtELATDY+z8ON6Uo= go.opentelemetry.io/collector/consumer v0.90.0 h1:5cScUTbv9PIvI/bKTa2GbAn/LAMwcg2znAb0UKfhVy4= go.opentelemetry.io/collector/consumer v0.90.0/go.mod h1:mh/eEA0UClEtgQMDICQVL7oSylgbskFfueBO0i5HkSQ= -go.opentelemetry.io/collector/exporter v0.86.0 h1:LFmBb7S4Fkj5fv/nrUkLOy50GT6s4R/BLrv6uTb+GNo= -go.opentelemetry.io/collector/exporter v0.86.0/go.mod h1:+PKZrFV4sVgS2TVFnfZ+RCJqXexEENjW1riWaqkxsN4= go.opentelemetry.io/collector/exporter v0.90.0 h1:XMpOprVtAG3yryRQ8fw6a9TZsL7t9jzCrYCvhHrtBw4= go.opentelemetry.io/collector/exporter v0.90.0/go.mod h1:QNhT4FZ/698dDybYM2FbfguNvh2S7M7jKiDvFLntWOw= -go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0 h1:bSTfWv0RobFgs/c9g4jo5V8tFSlD2ILZZE2RrJ/eY44= -go.opentelemetry.io/collector/exporter/loggingexporter v0.85.0/go.mod h1:xQrg9pnp5XTvDZq/Q556emFZ90niT3jKhD4IQZQoWGw= -go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0 h1:3MlKoGSFPdOHKtRcm5nTHRMpMmDtTGr6WAVrSuD0p3g= -go.opentelemetry.io/collector/exporter/otlpexporter v0.85.0/go.mod h1:wNkRTwQ4V3SZzvxzPpLME0EQkpySGTaiSHYcWhBuvkk= -go.opentelemetry.io/collector/extension v0.86.0 h1:oXnZarkh1aBgnr/U3JSj/lPpBJUquOQ3DHMXXP4Jacc= -go.opentelemetry.io/collector/extension v0.86.0/go.mod h1:EPAloXQ+48577GvHTP5wGDvV4OyHPuldvM+2rYbM/fw= +go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0 h1:jO6Hepz/ujWvn+FJVeMMFtVMHaSoyoBZ5QuMjVCqu4U= +go.opentelemetry.io/collector/exporter/loggingexporter v0.90.0/go.mod h1:qk2XJoDmOnjZb+udt3bU/j0kohJJ/RDYh8n56e8PPFw= +go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0 h1:82wlzXpvBFCFU0yhB/VWVY5g4iu5NuX8uSsgZkBoqhQ= +go.opentelemetry.io/collector/exporter/otlpexporter v0.90.0/go.mod h1:sv0NqTCWumuFcmZcZa/SGQOLin8Jejbc1lptLpjCV64= go.opentelemetry.io/collector/extension v0.90.0 h1:NDvZneZEapDeOD195kDZiEW8IUb2SimmkI/CrKfy+WA= go.opentelemetry.io/collector/extension v0.90.0/go.mod h1:vUiLcJQuM04CuyCf6AbjW8OCSeINSU4242GPVzTzX9w= -go.opentelemetry.io/collector/extension/auth v0.86.0 h1:VwKbeElL8sBnvRDC565EWOw4ixMG/t0oXjIphNsRszU= -go.opentelemetry.io/collector/extension/auth v0.86.0/go.mod h1:qGIIkeWXaOtdYO1fYEn1vAEhUS+OhVcceUC1G3XOsdk= go.opentelemetry.io/collector/extension/auth v0.90.0 h1:L5UfHQ0jXMllC7nB4l9EAXeAEExlsvwJOr22sB+55Cs= go.opentelemetry.io/collector/extension/auth v0.90.0/go.mod h1:x/U5M+J3Xjmcec94j3v79s8vjsLMaUrN5abjcal0sEw= -go.opentelemetry.io/collector/extension/zpagesextension v0.86.0 h1:Ga5ZGEChIN0eqide9NFqlfEZPTRaTX3mAdLdbKwiOPQ= -go.opentelemetry.io/collector/extension/zpagesextension v0.86.0/go.mod h1:o30mkGrQYPMMBPqoq5igj5br+sAyJr0gIbgp5Mf/A20= go.opentelemetry.io/collector/extension/zpagesextension v0.90.0 h1:ht8nHiq6NTaxHiMytmgCU0EuLRdxiQ0s6DdYkbRqEoc= go.opentelemetry.io/collector/extension/zpagesextension v0.90.0/go.mod h1:dS2OMWeiSp/BAbkEKgm1GaJD8LQ6vyBbDiK6iWYiVa4= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015 h1:Wv8JFRUD01MwWkhZwF85to5oukHDFPRjnt88ArDFqco= -go.opentelemetry.io/collector/featuregate v1.0.0-rcv0015/go.mod h1:fLmJMf1AoHttkF8p5oJAc4o5ZpHu8yO5XYJ7gbLCLzo= go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= -go.opentelemetry.io/collector/otelcol v0.86.0 h1:p9NjJ7dIgQs0tp6uTsnmziDZdIwHDQqQ/wbnyD4FoIM= -go.opentelemetry.io/collector/otelcol v0.86.0/go.mod h1:jYS+YFA1qaxmgblwnARe97kQm0N2ngejb2qhR3zRPgg= go.opentelemetry.io/collector/otelcol v0.90.0 h1:wODP49c6/bjKDpkXCGubNPPrk4L8q3np2rv0nKOUuKU= go.opentelemetry.io/collector/otelcol v0.90.0/go.mod h1:JiI+lALswTlWivZm+aPeUXwJt8YNgIXg3fMGLgTrnEI= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 h1:8PzrQFk3oKiT1Sd5EmNEcagdMyt1KcBy5/OyF5He5gY= -go.opentelemetry.io/collector/pdata v1.0.0-rcv0015/go.mod h1:I1PqyHJlsXjANC73tp43nDId7/jiv82NoZZ6uS0xdwM= go.opentelemetry.io/collector/pdata v1.0.0 h1:ECP2jnLztewsHmL1opL8BeMtWVc7/oSlKNhfY9jP8ec= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/processor v0.86.0 h1:b4Htiom5mgcM5d7Memw1NkxBKgOADF1je0mLIhulQUM= -go.opentelemetry.io/collector/processor v0.86.0/go.mod h1:gJCNmRCqm/GKBHjRqlvRxMqWWcLCe1S6QNOxjtFv638= go.opentelemetry.io/collector/processor v0.90.0 h1:GP9er9lx+lSUg1khsjkuiAN0VIGfkd517gl2KT5c64M= go.opentelemetry.io/collector/processor v0.90.0/go.mod h1:EbXqZoGuLIc+qYa9uS3ZTU05r3e981No81vyp6PH2q0= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0 h1:Rel52zGeC57hBVXV5av6FmGJiQCa2mYX84HHGaTPAH0= -go.opentelemetry.io/collector/processor/batchprocessor v0.85.0/go.mod h1:Qr/hC52XN0dNyRIZu1M4RxuKyYLsrzJoqYDvOEfH7TQ= go.opentelemetry.io/collector/processor/batchprocessor v0.90.0 h1:dZgivTromKrcXDi2DT+HTxZVpZgYQaYwJSx/8d9MhvA= go.opentelemetry.io/collector/processor/batchprocessor v0.90.0/go.mod h1:RVBetXehmR2rJntkyjrtIzt0Mub8OyxA5Oiy3ty1RRw= -go.opentelemetry.io/collector/receiver v0.86.0 h1:AP+KZ225CmXR1oBD36+vV/pZcRFTkSiG7HvAVqfHoRg= -go.opentelemetry.io/collector/receiver v0.86.0/go.mod h1:oFpofH/OG4HqmaVsb8ftnIAhLAhQnH/3bWrOdZZZjTk= go.opentelemetry.io/collector/receiver v0.90.0 h1:cVp1s9c9kSfn5ZTXb9o8nlZnLEgs2gutEYzty5+eUEI= go.opentelemetry.io/collector/receiver v0.90.0/go.mod h1:oRmH7WKmkJo7tgc7odoArLXjrz2TZdcw7pco0KRZjWo= -go.opentelemetry.io/collector/semconv v0.86.0 h1:bLlPe/JYNjQHo744cqi7iIEybuLv+M5DntUwQPTrvZo= -go.opentelemetry.io/collector/semconv v0.86.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.90.0 h1:TCqjZma7Q0Sfgeiq8d/DsoHq8U6ImeGIgUB6NiPCNWM= go.opentelemetry.io/collector/semconv v0.90.0 h1:X361OfWNRqCgMCht+nuo7NH4OzpfYEbh9JTga7r5d0c= go.opentelemetry.io/collector/semconv v0.90.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/collector/service v0.86.0 h1:vyoynxNY2Oc6XET2ZvFkRC+Fpc1oMl9qQkORyX5LoWg= -go.opentelemetry.io/collector/service v0.86.0/go.mod h1:IT8MQbc9GWreG+GCuuG7DcQ72HUfV4a9iZXmwyPs27Q= go.opentelemetry.io/collector/service v0.90.0 h1:Sht6G9uIM4IUQvAGzbDInhAaOu/s4h8VrBnZC7MadbM= go.opentelemetry.io/collector/service v0.90.0/go.mod h1:0uuDwZCbAcKNXLK9RCQ+EyByLjmk6eO+XvaDdqOgx2Y= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 h1:b8xjZxHbLrXAum4SxJd1Rlm7Y/fKaB+6ACI7/e5EfSA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0/go.mod h1:1ei0a32xOGkFoySu7y1DAHfcuIhC0pNZpvY2huXuMy4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/contrib/propagators/b3 v1.19.0 h1:ulz44cpm6V5oAeg5Aw9HyqGFMS6XM7untlMEhD7YzzA= -go.opentelemetry.io/contrib/propagators/b3 v1.19.0/go.mod h1:OzCmE2IVS+asTI+odXQstRGVfXQ4bXv9nMBRK0nNyqQ= go.opentelemetry.io/contrib/propagators/b3 v1.21.1 h1:WPYiUgmw3+b7b3sQ1bFBFAf0q+Di9dvNc3AtYfnT4RQ= go.opentelemetry.io/contrib/propagators/b3 v1.21.1/go.mod h1:EmzokPoSqsYMBVK4nRnhsfm5mbn8J1eDuz/U1UaQaWg= -go.opentelemetry.io/contrib/zpages v0.44.0 h1:9J/cxTTWhM6kzgdaBt6NiXS2HUreXn/eW2M+vzHgDAQ= -go.opentelemetry.io/contrib/zpages v0.44.0/go.mod h1:G3eNCGhodjn2wIdM+i6GneZb1Cqg6dNRBlm1cpNEElg= go.opentelemetry.io/contrib/zpages v0.46.1 h1:U8Hh84dc+vJTVgRnL+QKWtWD2iqTSKibrQ85EeQqsNg= go.opentelemetry.io/contrib/zpages v0.46.1/go.mod h1:1Wq9YTzkhr3Jkyi/sVrasFSppVzJQcvFf2Vc2ExZd6c= -go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs= -go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/bridge/opencensus v0.41.0 h1:VBpeaTbrvLFHvRtsyCJXjsTaicBNrAFdmctiN1k6WNI= -go.opentelemetry.io/otel/bridge/opencensus v0.41.0/go.mod h1:yCQB5IKRhgjlbTLc91+ixcZc2/8BncGGJ+CS3dZJwtY= go.opentelemetry.io/otel/bridge/opencensus v0.44.0 h1:/inELPJztkn6Xx3ap9qw8i8XdeWF0B/OjGHOdRTePZ8= go.opentelemetry.io/otel/bridge/opencensus v0.44.0/go.mod h1:dQTBJVBx1xahrXEFBV1BGPAnGuXC92LCj55fxIrtj7I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0 h1:k0k7hFNDd8K4iOMJXj7s8sHaC4mhTlAeppRmZXLgZ6k= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.41.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0 h1:HgbDTD8pioFdY3NRc/YCvsWjqQPtweGyXxa32LgnTOw= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.41.0/go.mod h1:tmvt/yK5Es5d6lHYWerLSOna8lCEfrBVX/a9M0ggqss= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0 h1:iV3BOgW4fry1Riw9dwypigqlIYWXvSRVT2RJmblzo40= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.41.0/go.mod h1:7PGzqlKrxIRmbj5tlNW0nTkYZ5fHXDgk6Fy8/KjR0CI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 h1:IAtl+7gua134xcV3NieDhJHjjOVeJhXAnYf/0hswjUY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0/go.mod h1:w+pXobnBzh95MNIkeIuAKcHe/Uu/CX2PKIvBP6ipKRA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 h1:yE32ay7mJG2leczfREEhoW3VfSZIvHaB+gvVo1o8DQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0/go.mod h1:G17FHPDLt74bCI7tJ4CMitEk4BXTYG4FW6XUpkPBXa4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0 h1:6pu8ttx76BxHf+xz/H77AUZkPF3cwWzXqAUsXhVKI18= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.18.0/go.mod h1:IOmXxPrxoxFMXdNy7lfDmE8MzE61YPcurbUm0SMjerI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/prometheus v0.41.0 h1:A3/bhjP5SmELy8dcpK+uttHeh9Qrh+YnS16/VzrztRQ= -go.opentelemetry.io/otel/exporters/prometheus v0.41.0/go.mod h1:mKuXEMi9suyyNJQ99SZCO0mpWGFe0MIALtjd3r6uo7Q= go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0 h1:XzjGkawtAXs20Y+s6k1GNDMBsMDOV28TOT8cxmE42qM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.41.0/go.mod h1:HAomEgjcKZk3VJ+HHdHLnhZXeGqdzPxxNTdKYRopUXY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgYCza3PXRUGEyCB++y1sAqm6guWFesk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0 h1:hSWWvDjXHVLq9DkmB+77fl8v7+t+yYiS+eNkiplDK54= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.18.0/go.mod h1:zG7KQql1WjZCaUJd+L/ReSYx4bjbYJxg5ws9ws+mYes= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= -go.opentelemetry.io/otel/metric v1.18.0 h1:JwVzw94UYmbx3ej++CwLUQZxEODDj/pOuTCvzhtRrSQ= -go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/sdk v1.18.0 h1:e3bAB0wB3MljH38sHzpV/qWrOTCFrdZF2ct9F8rBkcY= -go.opentelemetry.io/otel/sdk v1.18.0/go.mod h1:1RCygWV7plY2KmdskZEDDBs4tJeHG92MdHZIluiYs/M= go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk/metric v0.41.0 h1:c3sAt9/pQ5fSIUfl0gPtClV3HhE18DCVzByD33R/zsk= -go.opentelemetry.io/otel/sdk/metric v0.41.0/go.mod h1:PmOmSt+iOklKtIg5O4Vz9H/ttcRFSNTgii+E1KGyn1w= go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= -go.opentelemetry.io/otel/trace v1.18.0 h1:NY+czwbHbmndxojTEKiSMHkG2ClNH2PwmcHrdo0JY10= -go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -1001,13 +818,9 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1018,10 +831,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1043,8 +854,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1087,12 +896,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1100,8 +905,6 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1118,8 +921,6 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1184,25 +985,16 @@ golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1212,17 +1004,12 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1273,10 +1060,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1299,10 +1084,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.141.0 h1:Df6vfMgDoIM6ss0m7H4MPwFwY87WNXHfBIda/Bmfl4E= -google.golang.org/api v0.141.0/go.mod h1:iZqLkdPlXKyG0b90eu6KxVSE4D/ccRF2e/doKD2CnQQ= -google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= +google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1340,18 +1123,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 h1:o4LtQxebKIJ4vkzyhtD2rfUNZ20Zf0ik5YVP5E7G7VE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1365,8 +1142,6 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= -google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1413,7 +1188,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1421,18 +1197,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= -k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= -k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= -k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= -k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= +k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= +k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= +k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= +k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= +k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= From c96ae8c84af29d82b40fd4ebe4eb6f310f3949e2 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 15:31:05 -0800 Subject: [PATCH 13/21] removing ta build from makefile --- otelcollector/opentelemetry-collector-builder/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/otelcollector/opentelemetry-collector-builder/Makefile b/otelcollector/opentelemetry-collector-builder/Makefile index 3b909ccd7..594502757 100644 --- a/otelcollector/opentelemetry-collector-builder/Makefile +++ b/otelcollector/opentelemetry-collector-builder/Makefile @@ -12,8 +12,8 @@ fluentbitplugin: promconfigvalidator: make -C ../prom-config-validator-builder -targetallocator: - make -C ../otel-allocator +# targetallocator: +# make -C ../otel-allocator configurationreader: make -C ../configuration-reader-builder \ No newline at end of file From 856a36179ddc325bcec2ff07b2a676553c030e97 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 15:47:39 -0800 Subject: [PATCH 14/21] commenting ta build from all --- otelcollector/opentelemetry-collector-builder/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/otelcollector/opentelemetry-collector-builder/Makefile b/otelcollector/opentelemetry-collector-builder/Makefile index 594502757..04860b65d 100644 --- a/otelcollector/opentelemetry-collector-builder/Makefile +++ b/otelcollector/opentelemetry-collector-builder/Makefile @@ -1,4 +1,4 @@ -all: otelcollector fluentbitplugin promconfigvalidator targetallocator +all: otelcollector fluentbitplugin promconfigvalidator #targetallocator .PHONY: otelcollector otelcollector: From 1fa1d2f50030c7097ddd4accf5eef01c9246ac0b Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 16:01:48 -0800 Subject: [PATCH 15/21] add eula statement --- otelcollector/otel-allocator/main.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/otelcollector/otel-allocator/main.go b/otelcollector/otel-allocator/main.go index b89824503..23cda8efc 100644 --- a/otelcollector/otel-allocator/main.go +++ b/otelcollector/otel-allocator/main.go @@ -19,6 +19,7 @@ import ( "fmt" "os" "os/signal" + "strings" "syscall" gokitlog "github.com/go-kit/log" @@ -65,6 +66,13 @@ func main() { interrupts = make(chan os.Signal, 1) errChan = make(chan error) ) + + // EULA statement is required for Arc extension + clusterResourceId := os.Getenv("CLUSTER") + if strings.EqualFold(clusterResourceId, "connectedclusters") { + setupLog.Info("MICROSOFT SOFTWARE LICENSE TERMS\n\nMICROSOFT Azure Arc-enabled Kubernetes\n\nThis software is licensed to you as part of your or your company's subscription license for Microsoft Azure Services. You may only use the software with Microsoft Azure Services and subject to the terms and conditions of the agreement under which you obtained Microsoft Azure Services. If you do not have an active subscription license for Microsoft Azure Services, you may not use the software. Microsoft Azure Legal Information: https://azure.microsoft.com/en-us/support/legal/") + } + cfg, configFilePath, err := config.Load() if err != nil { fmt.Printf("Failed to load config: %v", err) From 9a593e3805fec950c8205be0a35769e92fa72712 Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 16:27:22 -0800 Subject: [PATCH 16/21] delay config reader file write --- .pipelines/azure-pipeline-build.yml | 1490 ++++++++--------- .../configuration-reader-builder/main.go | 5 + 2 files changed, 750 insertions(+), 745 deletions(-) diff --git a/.pipelines/azure-pipeline-build.yml b/.pipelines/azure-pipeline-build.yml index c5143a714..c632feb16 100644 --- a/.pipelines/azure-pipeline-build.yml +++ b/.pipelines/azure-pipeline-build.yml @@ -215,7 +215,7 @@ jobs: variables: WINDOWS_REF_APP_GOLANG_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_REF_APP_GOLANG_FULL_IMAGE_NAME'] ] skipComponentGovernanceDetection: true - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + # condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) steps: - powershell: | docker build . --isolation=hyperv --file windows/Dockerfile -t $(WINDOWS_REF_APP_GOLANG_FULL_IMAGE_NAME) @@ -232,7 +232,7 @@ jobs: variables: WINDOWS_REF_APP_PYTHON_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_REF_APP_PYTHON_FULL_IMAGE_NAME'] ] skipComponentGovernanceDetection: true - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + # condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) steps: - powershell: | docker build . --isolation=hyperv --file windows/Dockerfile -t $(WINDOWS_REF_APP_PYTHON_FULL_IMAGE_NAME) @@ -241,294 +241,294 @@ jobs: displayName: "Build: build and push reference app python windows image to dev ACR" workingDirectory: $(Build.SourcesDirectory)/internal/referenceapp/python -- job: SDL_Binary_Scan - displayName: "SDL: linux binary scanning" - pool: - name: Azure-Pipelines-CI-Test-EO - steps: - - checkout: self - submodules: true - - - task: CodeQL3000Init@0 - displayName: 'SDL: init codeql' - - # - task: GoTool@0 - # displayName: "Build: specify golang version" - # inputs: - # version: '1.21' - - - bash: | - sudo apt-get install build-essential -y - make - workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ - displayName: "SDL: build otelcollector, promconfigvalidator, targetallocator, and fluent-bit plugin for scanning" - - - task: BinSkim@4 - displayName: 'SDL: run binskim' - inputs: - InputType: 'CommandLine' - # Remove - $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator for targetallocator since go 1.21 is not yet supported by build pipeline - arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' - - - task: Gosec@1 - displayName: 'SDL: run gosec' - inputs: - targetPattern: 'gosecPattern' - targetGosecPattern: '$(Build.SourcesDirectory)/otelcollector' - - - bash: | - wget https://github.com/microsoft/DevSkim/releases/download/v0.6.9/DevSkim_linux_0.6.9.zip - unzip DevSkim_linux_0.6.9.zip - chmod 775 DevSkim_linux_0.6.9/devskim - ./DevSkim_linux_0.6.9/devskim analyze $(Build.SourcesDirectory)/otelcollector --ignore-globs **/deploy/dashboard/**,**/react/static/** --severity critical,important - displayName: 'SDL: run devskim' - workingDirectory: $(Build.SourcesDirectory) - - - bash: | - sudo gem install brakeman -v 5.4.1 - brakeman $(Build.SourcesDirectory)/otelcollector/configmapparser --force - displayName: 'SDL: run brakeman' - - -- job: Linux_Prometheus_Collector - displayName: "Build: linux prometheus-collector image" - pool: - name: Azure-Pipelines-CI-Test-EO - dependsOn: Image_Tags_and_Ev2_Artifacts - variables: - LINUX_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.LINUX_FULL_IMAGE_NAME'] ] - # This is necessary because of: https://github.com/moby/moby/issues/37965 - DOCKER_BUILDKIT: 1 - steps: - - checkout: self - submodules: true - - - task: CodeQL3000Init@0 - displayName: 'SDL: init codeql' - - - task: GoTool@0 - displayName: "Build: specify golang version" - inputs: - version: '1.20' - - - bash: | - mkdir -p $(Build.ArtifactStagingDirectory)/linux - - # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx - sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static - docker system prune --volumes -y - docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - - docker buildx create --name dockerbuilder - docker buildx use dockerbuilder - docker buildx build . --platform=linux/amd64,linux/arm64 --file ./build/linux/Dockerfile -t $(LINUX_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/linux/metadata.json --push - docker pull $(LINUX_FULL_IMAGE_NAME) - workingDirectory: $(Build.SourcesDirectory)/otelcollector/ - displayName: "Build: build and push image to dev ACR" - - - bash: | - MEDIA_TYPE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') - DIGEST=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.digest') - SIZE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.size') - cat <>$(Build.ArtifactStagingDirectory)/linux/payload.json - {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} - EOF - workingDirectory: $(Build.SourcesDirectory)/otelcollector/ - displayName: "Build: Set values in payload.json for signing" - condition: eq(variables.IS_MAIN_BRANCH, true) - - - task: EsrpCodeSigning@3 - displayName: "ESRP CodeSigning for Prometheus" - inputs: - ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" - FolderPath: $(Build.ArtifactStagingDirectory)/linux/ - Pattern: "*.json" - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-469451", - "operationSetCode": "NotaryCoseSign", - "parameters": [ - { - "parameterName": "CoseFlags", - "parameterValue": "chainunprotected" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - - - bash: | - set -euxo pipefail - curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" - mkdir -p oras-install/ - tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ - sudo mv oras-install/oras /usr/local/bin/ - rm -rf oras_1.0.0_*.tar.gz oras-install/ - oras attach $(LINUX_FULL_IMAGE_NAME) \ - --artifact-type 'application/vnd.cncf.notary.signature' \ - ./payload.json:application/cose \ - -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" - workingDirectory: $(Build.ArtifactStagingDirectory)/linux/ - displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/linux/" - condition: eq(variables.IS_MAIN_BRANCH, true) - - - bash: | - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin - trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(LINUX_FULL_IMAGE_NAME) - if [ $? -ne 0 ]; then - exit 1 - fi - trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(KUBE_STATE_METRICS_IMAGE) - if [ $? -ne 0 ]; then - exit 1 - fi - trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(NODE_EXPORTER_IMAGE) - if [ $? -ne 0 ]; then - exit 1 - fi - workingDirectory: $(Build.SourcesDirectory) - displayName: "Build: run trivy scan" - - - task: CodeQL3000Finalize@0 - displayName: 'SDL: run codeql' - - - task: ComponentGovernanceComponentDetection@0 - displayName: "SDL: run component governance" - inputs: - scanType: 'Register' - verbosity: 'Verbose' - dockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' - alertWarningLevel: 'High' - sourceScanPath: '$(Build.SourcesDirectory)/otelcollector' - ignoreDirectories: '$(Build.SourcesDirectory)/mixins,$(Build.SourcesDirectory)/tools,$(Build.SourcesDirectory)/otelcollector/react' - - - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 - displayName: "Ev2: Generate image artifacts" - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) - inputs: - BuildDropPath: '$(Build.ArtifactStagingDirectory)/linux' - DockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' - - - task: SdtReport@2 - displayName: 'SDL: generate report' - inputs: - GdnExportAllTools: false - GdnExportGdnToolBinSkim: true - GdnExportGdnToolBinSkimSeverity: 'Note' - GdnExportGdnToolGosec: true - GdnExportGdnToolGosecSeverity: 'Note' - GdnExportGdnToolSemmle: true - GdnExportGdnToolSemmleSeverity: 'Note' - - - task: PublishSecurityAnalysisLogs@3 - displayName: 'SDL: publish report' - inputs: - ArtifactName: 'CodeAnalysisLogs' - ArtifactType: 'Container' - PublishProcessedResults: true - AllTools: true - ToolLogsNotFoundAction: 'Standard' - - - task: PublishBuildArtifacts@1 - displayName: "Ev2: Publish image artifacts" - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) - inputs: - pathToPublish: '$(Build.ArtifactStagingDirectory)' - artifactName: drop - - - task: PostAnalysis@2 - displayName: 'SDL: Post-Build Analysis' - inputs: - GdnBreakAllTools: false - GdnBreakGdnToolBinSkim: true - GdnBreakGdnToolBinSkimSeverity: 'Warning' - GdnBreakGdnToolGosec: true - GdnBreakGdnToolGosecSeverity: 'Warning' - GdnBreakGdnToolSemmle: true - GdnBreakGdnToolSemmleSeverity: 'Warning' - -- job: Linux_Target_Allocator - displayName: "Build: target allocator image" - pool: - name: Azure-Pipelines-CI-Test-EO - dependsOn: Image_Tags_and_Ev2_Artifacts - variables: - TARGET_ALLOCATOR_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.TARGET_ALLOCATOR_FULL_IMAGE_NAME'] ] - # This is necessary because of: https://github.com/moby/moby/issues/37965 - DOCKER_BUILDKIT: 1 - skipComponentGovernanceDetection: true - steps: - - checkout: self - persistCredentials: true - - bash: | - mkdir -p $(Build.ArtifactStagingDirectory)/targetallocator - - # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx - sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - - docker buildx create --name dockerbuilder - docker buildx use dockerbuilder - docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - docker buildx build . --platform=linux/amd64,linux/arm64 --file Dockerfile -t $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/targetallocator/metadata.json --push - docker pull $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) - MEDIA_TYPE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') - DIGEST=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.digest') - SIZE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.size') - cat <>$(Build.ArtifactStagingDirectory)/targetallocator/payload.json - {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} - EOF - workingDirectory: $(Build.SourcesDirectory)/otelcollector/otel-allocator - displayName: "Build: build and push target allocator image to dev ACR" - - - bash: | - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin - trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) - workingDirectory: $(Build.SourcesDirectory) - displayName: "Build: run trivy scan" - - - - task: EsrpCodeSigning@3 - displayName: "ESRP CodeSigning for TargetAllocator" - inputs: - ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" - FolderPath: $(Build.ArtifactStagingDirectory)/targetallocator/ - Pattern: "*.json" - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-469451", - "operationSetCode": "NotaryCoseSign", - "parameters": [ - { - "parameterName": "CoseFlags", - "parameterValue": "chainunprotected" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - - - bash: | - set -euxo pipefail - curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" - mkdir -p oras-install/ - tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ - sudo mv oras-install/oras /usr/local/bin/ - rm -rf oras_1.0.0_*.tar.gz oras-install/ - oras attach $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) \ - --artifact-type 'application/vnd.cncf.notary.signature' \ - ./payload.json:application/cose \ - -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" - workingDirectory: $(Build.ArtifactStagingDirectory)/targetallocator/ - displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/targetallocator/" - condition: eq(variables.IS_MAIN_BRANCH, true) +# - job: SDL_Binary_Scan +# displayName: "SDL: linux binary scanning" +# pool: +# name: Azure-Pipelines-CI-Test-EO +# steps: +# - checkout: self +# submodules: true + +# - task: CodeQL3000Init@0 +# displayName: 'SDL: init codeql' + +# # - task: GoTool@0 +# # displayName: "Build: specify golang version" +# # inputs: +# # version: '1.21' + +# - bash: | +# sudo apt-get install build-essential -y +# make +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ +# displayName: "SDL: build otelcollector, promconfigvalidator, targetallocator, and fluent-bit plugin for scanning" + +# - task: BinSkim@4 +# displayName: 'SDL: run binskim' +# inputs: +# InputType: 'CommandLine' +# # Remove - $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator for targetallocator since go 1.21 is not yet supported by build pipeline +# arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' + +# - task: Gosec@1 +# displayName: 'SDL: run gosec' +# inputs: +# targetPattern: 'gosecPattern' +# targetGosecPattern: '$(Build.SourcesDirectory)/otelcollector' + +# - bash: | +# wget https://github.com/microsoft/DevSkim/releases/download/v0.6.9/DevSkim_linux_0.6.9.zip +# unzip DevSkim_linux_0.6.9.zip +# chmod 775 DevSkim_linux_0.6.9/devskim +# ./DevSkim_linux_0.6.9/devskim analyze $(Build.SourcesDirectory)/otelcollector --ignore-globs **/deploy/dashboard/**,**/react/static/** --severity critical,important +# displayName: 'SDL: run devskim' +# workingDirectory: $(Build.SourcesDirectory) + +# - bash: | +# sudo gem install brakeman -v 5.4.1 +# brakeman $(Build.SourcesDirectory)/otelcollector/configmapparser --force +# displayName: 'SDL: run brakeman' + + +# - job: Linux_Prometheus_Collector +# displayName: "Build: linux prometheus-collector image" +# pool: +# name: Azure-Pipelines-CI-Test-EO +# dependsOn: Image_Tags_and_Ev2_Artifacts +# variables: +# LINUX_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.LINUX_FULL_IMAGE_NAME'] ] +# # This is necessary because of: https://github.com/moby/moby/issues/37965 +# DOCKER_BUILDKIT: 1 +# steps: +# - checkout: self +# submodules: true + +# - task: CodeQL3000Init@0 +# displayName: 'SDL: init codeql' + +# - task: GoTool@0 +# displayName: "Build: specify golang version" +# inputs: +# version: '1.20' + +# - bash: | +# mkdir -p $(Build.ArtifactStagingDirectory)/linux + +# # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx +# sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static +# docker system prune --volumes -y +# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + +# docker buildx create --name dockerbuilder +# docker buildx use dockerbuilder +# docker buildx build . --platform=linux/amd64,linux/arm64 --file ./build/linux/Dockerfile -t $(LINUX_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/linux/metadata.json --push +# docker pull $(LINUX_FULL_IMAGE_NAME) +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ +# displayName: "Build: build and push image to dev ACR" + +# - bash: | +# MEDIA_TYPE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') +# DIGEST=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.digest') +# SIZE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.size') +# cat <>$(Build.ArtifactStagingDirectory)/linux/payload.json +# {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} +# EOF +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ +# displayName: "Build: Set values in payload.json for signing" +# condition: eq(variables.IS_MAIN_BRANCH, true) + +# - task: EsrpCodeSigning@3 +# displayName: "ESRP CodeSigning for Prometheus" +# inputs: +# ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" +# FolderPath: $(Build.ArtifactStagingDirectory)/linux/ +# Pattern: "*.json" +# signConfigType: inlineSignParams +# inlineOperation: | +# [ +# { +# "keyCode": "CP-469451", +# "operationSetCode": "NotaryCoseSign", +# "parameters": [ +# { +# "parameterName": "CoseFlags", +# "parameterValue": "chainunprotected" +# } +# ], +# "toolName": "sign", +# "toolVersion": "1.0" +# } +# ] + +# - bash: | +# set -euxo pipefail +# curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" +# mkdir -p oras-install/ +# tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ +# sudo mv oras-install/oras /usr/local/bin/ +# rm -rf oras_1.0.0_*.tar.gz oras-install/ +# oras attach $(LINUX_FULL_IMAGE_NAME) \ +# --artifact-type 'application/vnd.cncf.notary.signature' \ +# ./payload.json:application/cose \ +# -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" +# workingDirectory: $(Build.ArtifactStagingDirectory)/linux/ +# displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/linux/" +# condition: eq(variables.IS_MAIN_BRANCH, true) + +# - bash: | +# curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin +# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(LINUX_FULL_IMAGE_NAME) +# if [ $? -ne 0 ]; then +# exit 1 +# fi +# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(KUBE_STATE_METRICS_IMAGE) +# if [ $? -ne 0 ]; then +# exit 1 +# fi +# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(NODE_EXPORTER_IMAGE) +# if [ $? -ne 0 ]; then +# exit 1 +# fi +# workingDirectory: $(Build.SourcesDirectory) +# displayName: "Build: run trivy scan" + +# - task: CodeQL3000Finalize@0 +# displayName: 'SDL: run codeql' + +# - task: ComponentGovernanceComponentDetection@0 +# displayName: "SDL: run component governance" +# inputs: +# scanType: 'Register' +# verbosity: 'Verbose' +# dockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' +# alertWarningLevel: 'High' +# sourceScanPath: '$(Build.SourcesDirectory)/otelcollector' +# ignoreDirectories: '$(Build.SourcesDirectory)/mixins,$(Build.SourcesDirectory)/tools,$(Build.SourcesDirectory)/otelcollector/react' + +# - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 +# displayName: "Ev2: Generate image artifacts" +# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) +# inputs: +# BuildDropPath: '$(Build.ArtifactStagingDirectory)/linux' +# DockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' + +# - task: SdtReport@2 +# displayName: 'SDL: generate report' +# inputs: +# GdnExportAllTools: false +# GdnExportGdnToolBinSkim: true +# GdnExportGdnToolBinSkimSeverity: 'Note' +# GdnExportGdnToolGosec: true +# GdnExportGdnToolGosecSeverity: 'Note' +# GdnExportGdnToolSemmle: true +# GdnExportGdnToolSemmleSeverity: 'Note' + +# - task: PublishSecurityAnalysisLogs@3 +# displayName: 'SDL: publish report' +# inputs: +# ArtifactName: 'CodeAnalysisLogs' +# ArtifactType: 'Container' +# PublishProcessedResults: true +# AllTools: true +# ToolLogsNotFoundAction: 'Standard' + +# - task: PublishBuildArtifacts@1 +# displayName: "Ev2: Publish image artifacts" +# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) +# inputs: +# pathToPublish: '$(Build.ArtifactStagingDirectory)' +# artifactName: drop + +# - task: PostAnalysis@2 +# displayName: 'SDL: Post-Build Analysis' +# inputs: +# GdnBreakAllTools: false +# GdnBreakGdnToolBinSkim: true +# GdnBreakGdnToolBinSkimSeverity: 'Warning' +# GdnBreakGdnToolGosec: true +# GdnBreakGdnToolGosecSeverity: 'Warning' +# GdnBreakGdnToolSemmle: true +# GdnBreakGdnToolSemmleSeverity: 'Warning' + +# - job: Linux_Target_Allocator +# displayName: "Build: target allocator image" +# pool: +# name: Azure-Pipelines-CI-Test-EO +# dependsOn: Image_Tags_and_Ev2_Artifacts +# variables: +# TARGET_ALLOCATOR_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.TARGET_ALLOCATOR_FULL_IMAGE_NAME'] ] +# # This is necessary because of: https://github.com/moby/moby/issues/37965 +# DOCKER_BUILDKIT: 1 +# skipComponentGovernanceDetection: true +# steps: +# - checkout: self +# persistCredentials: true +# - bash: | +# mkdir -p $(Build.ArtifactStagingDirectory)/targetallocator + +# # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx +# sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static +# docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + +# docker buildx create --name dockerbuilder +# docker buildx use dockerbuilder +# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# docker buildx build . --platform=linux/amd64,linux/arm64 --file Dockerfile -t $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/targetallocator/metadata.json --push +# docker pull $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) +# MEDIA_TYPE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') +# DIGEST=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.digest') +# SIZE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.size') +# cat <>$(Build.ArtifactStagingDirectory)/targetallocator/payload.json +# {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} +# EOF +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/otel-allocator +# displayName: "Build: build and push target allocator image to dev ACR" + +# - bash: | +# curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin +# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) +# workingDirectory: $(Build.SourcesDirectory) +# displayName: "Build: run trivy scan" + + +# - task: EsrpCodeSigning@3 +# displayName: "ESRP CodeSigning for TargetAllocator" +# inputs: +# ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" +# FolderPath: $(Build.ArtifactStagingDirectory)/targetallocator/ +# Pattern: "*.json" +# signConfigType: inlineSignParams +# inlineOperation: | +# [ +# { +# "keyCode": "CP-469451", +# "operationSetCode": "NotaryCoseSign", +# "parameters": [ +# { +# "parameterName": "CoseFlags", +# "parameterValue": "chainunprotected" +# } +# ], +# "toolName": "sign", +# "toolVersion": "1.0" +# } +# ] + +# - bash: | +# set -euxo pipefail +# curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" +# mkdir -p oras-install/ +# tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ +# sudo mv oras-install/oras /usr/local/bin/ +# rm -rf oras_1.0.0_*.tar.gz oras-install/ +# oras attach $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) \ +# --artifact-type 'application/vnd.cncf.notary.signature' \ +# ./payload.json:application/cose \ +# -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" +# workingDirectory: $(Build.ArtifactStagingDirectory)/targetallocator/ +# displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/targetallocator/" +# condition: eq(variables.IS_MAIN_BRANCH, true) - job: Linux_Config_Reader displayName: "Build: config reader image" @@ -606,458 +606,458 @@ jobs: displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/linuxcfgreader/" condition: eq(variables.IS_MAIN_BRANCH, true) -- job: Windows2019_Prometheus_Collector - displayName: "Build: windows 2019 prometheus-collector image" - pool: - name: Azure-Pipelines-Windows-CI-Test-EO - dependsOn: - - Image_Tags_and_Ev2_Artifacts - variables: - WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] - WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] - skipComponentGovernanceDetection: true - steps: - - task: GoTool@0 - displayName: "Build: specify golang version" - inputs: - version: '1.20' - - - powershell: | - ./makefile_windows.ps1 - workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ - displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" - - - powershell: | - docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2019_BASE_IMAGE_VERSION) - workingDirectory: $(Build.SourcesDirectory)/otelcollector/ - displayName: "Build: build WS2019 image" - retryCountOnTaskFailure: 2 - - - powershell: | - docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) - displayName: "Build: push image to dev ACR" - -- job: Windows2022_Prometheus_Collector - displayName: "Build: windows 2022 prometheus-collector image" - pool: - name: Azure-Pipelines-Windows-CI-Test-EO - dependsOn: - - Image_Tags_and_Ev2_Artifacts - variables: - WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] - WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] - skipComponentGovernanceDetection: true - steps: - - task: GoTool@0 - displayName: "Build: specify golang version" - inputs: - version: '1.20' - - - powershell: | - ./makefile_windows.ps1 - workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ - displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" - - - powershell: | - docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2022_BASE_IMAGE_VERSION) - workingDirectory: $(Build.SourcesDirectory)/otelcollector/ - displayName: "Build: build WS2022 image" - retryCountOnTaskFailure: 2 - - - powershell: | - docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) - displayName: "Build: push image to dev ACR" - -- job: WindowsMultiArch_Prometheus_Collector - displayName: "Build: windows multi-arch prometheus-collector image" - pool: - name: Azure-Pipelines-Windows-CI-Test-EO - dependsOn: - - Image_Tags_and_Ev2_Artifacts - - Windows2019_Prometheus_Collector - - Windows2022_Prometheus_Collector - variables: - WINDOWS_IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] - WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] - WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] - WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] - skipComponentGovernanceDetection: true - steps: - - task: GoTool@0 - displayName: "Build: specify golang version" - inputs: - version: '1.20' - - - bash: | - export ACR_REPOSITORY_VAR="$(ACR_REPOSITORY)" - export ACR_REPOSITORY_WITHOUT_SLASH="${ACR_REPOSITORY_VAR:1}" - - export WINDOWS_2019_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2019_BASE_IMAGE_VERSION)" - docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) - if [ $? -ne 0 ]; then - echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION). Checking if MCR image is published." - IMAGES_ARE_PUBLISHED=0 - for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - do - output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) - if (echo $output | grep $WINDOWS_2019_TAG) - then - echo "Images are published to mcr" - IMAGES_ARE_PUBLISHED=1 - break - fi - sleep 30 - done - if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then - echo "Images are not published to mcr within the timeout" - exit 1 - fi - - az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2019_TAG) - fi - - export WINDOWS_2022_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2022_BASE_IMAGE_VERSION)" - docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) - if [ $? -ne 0 ]; then - echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION). Checking if MCR image is published." - IMAGES_ARE_PUBLISHED=0 - for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - do - output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) - if (echo $output | grep $WINDOWS_2022_TAG) - then - echo "Images are published to mcr" - IMAGES_ARE_PUBLISHED=1 - break - fi - sleep 30 - done - if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then - echo "Images are not published to mcr within the timeout" - exit 1 - fi - - az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2022_TAG) - fi - displayName: "Build: ensure images are present in ACR" - retryCountOnTaskFailure: 3 - - - powershell: | - New-Item -Path "$(Build.ArtifactStagingDirectory)" -Name "windows" -ItemType "directory" - @{"image.name"="$(WINDOWS_FULL_IMAGE_NAME)"} | ConvertTo-Json -Compress | Out-File -Encoding ascii $(Build.ArtifactStagingDirectory)/windows/metadata.json - docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - docker manifest create $(WINDOWS_FULL_IMAGE_NAME) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) - docker manifest push $(WINDOWS_FULL_IMAGE_NAME) - workingDirectory: $(Build.SourcesDirectory)/otelcollector/ - displayName: "Build: Windows multi-arch manifest" - - - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) - displayName: "Ev2: generate image artifacts" - inputs: - BuildDropPath: '$(Build.ArtifactStagingDirectory)/windows' - DockerImagesToScan: '$(WINDOWS_FULL_IMAGE_NAME)' - - - powershell: | - $output = docker manifest inspect -v $(WINDOWS_FULL_IMAGE_NAME) | ConvertFrom-Json - $firstManifest = $output[0] - $MEDIA_TYPE = $firstManifest.Descriptor.mediaType - $DIGEST = $firstManifest.Descriptor.digest - $SIZE = $firstManifest.Descriptor.size - $payload = @{ - targetArtifact = @{ - mediaType = $MEDIA_TYPE - digest = $DIGEST - size = $SIZE - } - } | ConvertTo-Json - - $payload | Out-File -FilePath "$(Build.ArtifactStagingDirectory)/windows/payload.json" - workingDirectory: $(Build.ArtifactStagingDirectory)/windows - displayName: "Build the payload json file" - - - task: EsrpCodeSigning@3 - displayName: 'ESRP CodeSigning for Prometheus' - inputs: - ConnectedServiceName: 'ESRPServiceConnectionForPrometheusImages' - FolderPath: '$(Build.ArtifactStagingDirectory)/windows' - Pattern: '*.json' - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-469451", - "operationSetCode": "NotaryCoseSign", - "parameters": [ - { - "parameterName": "CoseFlags", - "parameterValue": "chainunprotected" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - - - powershell: | - curl.exe -sLO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_windows_amd64.zip" - $currentDirectory = Get-Location - Expand-Archive -Path $currentDirectory\oras_1.0.0_windows_amd64.zip -DestinationPath . -Force - New-Item -ItemType Directory -Force -Path $env:USERPROFILE\bin - Copy-Item -Path $currentDirectory\oras.exe -Destination "$env:USERPROFILE\bin\" - $env:PATH = "$env:USERPROFILE\bin;$env:PATH" - oras attach $(WINDOWS_FULL_IMAGE_NAME) --artifact-type application/vnd.cncf.notary.signature ./payload.json:application/cose -a io.cncf.notary.x509chain.thumbprint#S256=[\""79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\""] - workingDirectory: $(Build.ArtifactStagingDirectory)/windows - displayName: "Download, install Oras and run oras attach" - condition: eq(variables.IS_MAIN_BRANCH, true) - - - task: PublishBuildArtifacts@1 - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) - displayName: "Ev2: publish image artifacts" - inputs: - pathToPublish: '$(Build.ArtifactStagingDirectory)' - artifactName: drop - -- job: Arc_Helm_Chart - displayName: "Package: Arc helm chart" - pool: - name: Azure-Pipelines-CI-Test-EO - dependsOn: - - Image_Tags_and_Ev2_Artifacts - - Linux_Prometheus_Collector - variables: - HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] - IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] - IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] - ARC_HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.ARC_HELM_FULL_IMAGE_NAME'] ] - ARC_EXTENSION: true - skipComponentGovernanceDetection: true - steps: - - task: HelmInstaller@1 - displayName: 'Build: install Helm version' - inputs: - helmVersionToInstall: 3.12.3 - - - bash: | - export HELM_CHART_NAME=$ARC_HELM_CHART_NAME - envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml - helm version - displayName: "Build: substitute chart version in Chart.yaml and values.yaml" - - - bash: | - helm dep update - workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon - displayName: "Build: update helm dependencies" - - - bash: | - helm package ./azure-monitor-metrics-addon/ - workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ - displayName: "Build: package helm chart" - - - bash: | - helm registry login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) - helm push $(ARC_HELM_CHART_NAME)-$(HELM_SEMVER).tgz oci://$(ACR_REGISTRY)$(ACR_REPOSITORY_HELM) - mkdir -p $(Build.ArtifactStagingDirectory)/arc-chart - echo {\"image.name\":\"$(ARC_HELM_FULL_IMAGE_NAME)\"} > $(Build.ArtifactStagingDirectory)/arc-chart/metadata.json - workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ - displayName: "Build: push helm chart to dev ACR" - condition: eq(variables.IS_PR, false) - - - task: PublishBuildArtifacts@1 - displayName: "Ev2: publish helm chart artifacts" - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) - inputs: - pathToPublish: '$(Build.ArtifactStagingDirectory)' - artifactName: drop - -- job: Deploy_Chart_ARC - displayName: "Deploy: Arc dev cluster" - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) - pool: - name: Azure-Pipelines-CI-Test-EO - dependsOn: - - Image_Tags_and_Ev2_Artifacts - - Arc_Helm_Chart - variables: - HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] - skipComponentGovernanceDetection: true - steps: - - bash: | - # Create JSON request body - cat < "request.json" - { - "artifactEndpoints": [ - { - "Regions": [ - "westcentralus" - ], - "Releasetrains": [ - "pipeline" - ], - "FullPathToHelmChart": "https://mcr.microsoft.com/azuremonitor/containerinsights/cidev/ama-metrics-arc", - "ExtensionUpdateFrequencyInMinutes": 5, - "IsCustomerHidden": true, - "ReadyforRollout": true, - "RollbackVersion": null, - "PackageConfigName": "Microsoft.AzureMonitor.Containers.Metrics-Prom041823" - } - ] - } - EOF - - # Send Request - SUBSCRIPTION="b9842c7c-1a38-4385-8f39-a51314758bcf" - RESOURCE_AUDIENCE="c699bf69-fb1d-4eaf-999b-99e6b2ae4d85" - SPN_CLIENT_ID="9a4c55e9-576a-450a-88bd-53bd634db38d" - SPN_TENANT_ID="72f988bf-86f1-41af-91ab-2d7cd011db47" - METHOD="PUT" - - echo "Request parameter preparation, SUBSCRIPTION is $SUBSCRIPTION, RESOURCE_AUDIENCE is $RESOURCE_AUDIENCE, CHART_VERSION is $HELM_SEMVER, SPN_CLIENT_ID is $SPN_CLIENT_ID, SPN_TENANT_ID is $SPN_TENANT_ID" - - # MSI is not supported - echo "Login cli using spn" - az login --service-principal --username=$SPN_CLIENT_ID --password=$(ARC_SPN_SECRET) --tenant=$SPN_TENANT_ID - if [ $? -eq 0 ]; then - echo "Logged in successfully with spn" - else - echo "-e error failed to login to az with managed identity credentials" - exit 1 - fi - - ACCESS_TOKEN=$(az account get-access-token --resource $RESOURCE_AUDIENCE --query accessToken -o json) - if [ $? -eq 0 ]; then - echo "get access token from resource:$RESOURCE_AUDIENCE successfully." - else - echo "-e error get access token from resource:$RESOURCE_AUDIENCE failed." - exit 1 - fi - ACCESS_TOKEN=$(echo $ACCESS_TOKEN | tr -d '"' | tr -d '"\r\n') - - ARC_API_URL="https://eastus2euap.dp.kubernetesconfiguration.azure.com" - EXTENSION_NAME="microsoft.azuremonitor.containers.metrics" - API_VERSION="2021-05-01" - - echo "start send request" - az rest --method $METHOD --headers "{\"Authorization\": \"Bearer $ACCESS_TOKEN\", \"Content-Type\": \"application/json\"}" --body @request.json --uri $ARC_API_URL/subscriptions/$SUBSCRIPTION/extensionTypeRegistrations/$EXTENSION_NAME/versions/$HELM_SEMVER?api-version=$API_VERSION - if [ $? -eq 0 ]; then - echo "arc extension registered successfully" - else - echo "-e error failed to register arc extension" - exit 1 - fi - displayName: "Deploy: Release to dev release train" - - - task: AzureCLI@2 - displayName: "Deploy: wait for ci-dev-arc-wcus cluster to be ready" - inputs: - azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' - scriptType: 'bash' - scriptLocation: 'inlineScript' - inlineScript: | - for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - do - state=$(az k8s-extension show --name azuremonitor-metrics --cluster-name ci-dev-arc-wcus --resource-group ci-dev-arc-wcus --cluster-type connectedClusters | jq -r '.provisioningState') - if [ $state = "Succeeded" ] - then - echo "Cluster is ready to install extension" - exit 0 - fi - sleep 30 - done - echo "Cluster is installing a different version of the extension" - exit 1 - retryCountOnTaskFailure: 5 - - - task: AzureCLI@2 - displayName: "Deploy: ci-dev-arc-wcus cluster" - inputs: - azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' - scriptType: 'bash' - scriptLocation: 'inlineScript' - inlineScript: | - az config set extension.use_dynamic_install=yes_without_prompt - az k8s-extension update --name azuremonitor-metrics --resource-group ci-dev-arc-wcus --cluster-name ci-dev-arc-wcus --cluster-type connectedClusters --version $HELM_SEMVER --release-train pipeline - -- job: Deploy_AKS_Chart - displayName: "Deploy: AKS dev cluster" - pool: - name: Azure-Pipelines-CI-Test-EO - condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) - dependsOn: - - Image_Tags_and_Ev2_Artifacts - - Linux_Prometheus_Collector - - WindowsMultiArch_Prometheus_Collector - variables: - HELM_CHART_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_CHART_NAME'] ] - HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] - IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] - IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] - HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_FULL_IMAGE_NAME'] ] - skipComponentGovernanceDetection: true - steps: - - checkout: self - submodules: true - persistCredentials: true - - - bash: | - git config --global user.name "AzureDevOps Agent" - git tag "v$(HELM_SEMVER)" - git push origin "v$(HELM_SEMVER)" - displayName: Tag commit with semver - - - task: HelmInstaller@1 - displayName: Install Helm version - inputs: - helmVersionToInstall: 3.12.3 - - bash: | - for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - do - sleep 30 - echo $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG_WINDOWS) - echo $(MCR_REGISTRY)$(MCR_REPOSITORY_HELM):$(IMAGE_TAG) - - output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) - if (echo $output | grep $(IMAGE_TAG_WINDOWS)) && (echo $output | grep $(IMAGE_TAG)) - then - echo "Images are published to mcr" - exit 0 - fi - done - echo "Images are not published to mcr within the timeout" - exit 1 - displayName: "Check images are pushed to dev MCR" - retryCountOnTaskFailure: 5 - - - bash: | - helm pull oci://$(MCR_REGISTRY)$(MCR_REPOSITORY_HELM) --version $(HELM_SEMVER) - workingDirectory: $(Build.StagingDirectory) - displayName: "Pull helm chart from dev MCR" - - - bash: | - export AKS_REGION="eastus" - export AKS_RESOURCE_ID="/subscriptions/9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb/resourceGroups/ci-dev-aks-mac-eus-rg/providers/Microsoft.ContainerService/managedClusters/ci-dev-aks-mac-eus" - export ARC_EXTENSION="false" - envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml - ls $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon - cd $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon - helm dependency update - displayName: "Build: substitute chart version for 3p in Chart.yaml and values.yaml" - - - task: HelmDeploy@0 - displayName: "Deploy: ci-dev-aks-mac-eus cluster" - inputs: - connectionType: 'Azure Resource Manager' - azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' - azureResourceGroup: 'ci-dev-aks-mac-eus-rg' - kubernetesCluster: 'ci-dev-aks-mac-eus' - namespace: 'default' - command: 'upgrade' - chartType: 'FilePath' - chartPath: '$(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/' - releaseName: 'ama-metrics' - waitForExecution: false - arguments: --dependency-update --values $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml +# - job: Windows2019_Prometheus_Collector +# displayName: "Build: windows 2019 prometheus-collector image" +# pool: +# name: Azure-Pipelines-Windows-CI-Test-EO +# dependsOn: +# - Image_Tags_and_Ev2_Artifacts +# variables: +# WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] +# WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] +# skipComponentGovernanceDetection: true +# steps: +# - task: GoTool@0 +# displayName: "Build: specify golang version" +# inputs: +# version: '1.20' + +# - powershell: | +# ./makefile_windows.ps1 +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ +# displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" + +# - powershell: | +# docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2019_BASE_IMAGE_VERSION) +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ +# displayName: "Build: build WS2019 image" +# retryCountOnTaskFailure: 2 + +# - powershell: | +# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) +# displayName: "Build: push image to dev ACR" + +# - job: Windows2022_Prometheus_Collector +# displayName: "Build: windows 2022 prometheus-collector image" +# pool: +# name: Azure-Pipelines-Windows-CI-Test-EO +# dependsOn: +# - Image_Tags_and_Ev2_Artifacts +# variables: +# WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] +# WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] +# skipComponentGovernanceDetection: true +# steps: +# - task: GoTool@0 +# displayName: "Build: specify golang version" +# inputs: +# version: '1.20' + +# - powershell: | +# ./makefile_windows.ps1 +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ +# displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" + +# - powershell: | +# docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2022_BASE_IMAGE_VERSION) +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ +# displayName: "Build: build WS2022 image" +# retryCountOnTaskFailure: 2 + +# - powershell: | +# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) +# displayName: "Build: push image to dev ACR" + +# - job: WindowsMultiArch_Prometheus_Collector +# displayName: "Build: windows multi-arch prometheus-collector image" +# pool: +# name: Azure-Pipelines-Windows-CI-Test-EO +# dependsOn: +# - Image_Tags_and_Ev2_Artifacts +# - Windows2019_Prometheus_Collector +# - Windows2022_Prometheus_Collector +# variables: +# WINDOWS_IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] +# WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] +# WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] +# WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] +# skipComponentGovernanceDetection: true +# steps: +# - task: GoTool@0 +# displayName: "Build: specify golang version" +# inputs: +# version: '1.20' + +# - bash: | +# export ACR_REPOSITORY_VAR="$(ACR_REPOSITORY)" +# export ACR_REPOSITORY_WITHOUT_SLASH="${ACR_REPOSITORY_VAR:1}" + +# export WINDOWS_2019_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2019_BASE_IMAGE_VERSION)" +# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) +# if [ $? -ne 0 ]; then +# echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION). Checking if MCR image is published." +# IMAGES_ARE_PUBLISHED=0 +# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +# do +# output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) +# if (echo $output | grep $WINDOWS_2019_TAG) +# then +# echo "Images are published to mcr" +# IMAGES_ARE_PUBLISHED=1 +# break +# fi +# sleep 30 +# done +# if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then +# echo "Images are not published to mcr within the timeout" +# exit 1 +# fi + +# az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2019_TAG) +# fi + +# export WINDOWS_2022_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2022_BASE_IMAGE_VERSION)" +# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) +# if [ $? -ne 0 ]; then +# echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION). Checking if MCR image is published." +# IMAGES_ARE_PUBLISHED=0 +# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +# do +# output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) +# if (echo $output | grep $WINDOWS_2022_TAG) +# then +# echo "Images are published to mcr" +# IMAGES_ARE_PUBLISHED=1 +# break +# fi +# sleep 30 +# done +# if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then +# echo "Images are not published to mcr within the timeout" +# exit 1 +# fi + +# az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2022_TAG) +# fi +# displayName: "Build: ensure images are present in ACR" +# retryCountOnTaskFailure: 3 + +# - powershell: | +# New-Item -Path "$(Build.ArtifactStagingDirectory)" -Name "windows" -ItemType "directory" +# @{"image.name"="$(WINDOWS_FULL_IMAGE_NAME)"} | ConvertTo-Json -Compress | Out-File -Encoding ascii $(Build.ArtifactStagingDirectory)/windows/metadata.json +# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# docker manifest create $(WINDOWS_FULL_IMAGE_NAME) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) +# docker manifest push $(WINDOWS_FULL_IMAGE_NAME) +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ +# displayName: "Build: Windows multi-arch manifest" + +# - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 +# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) +# displayName: "Ev2: generate image artifacts" +# inputs: +# BuildDropPath: '$(Build.ArtifactStagingDirectory)/windows' +# DockerImagesToScan: '$(WINDOWS_FULL_IMAGE_NAME)' + +# - powershell: | +# $output = docker manifest inspect -v $(WINDOWS_FULL_IMAGE_NAME) | ConvertFrom-Json +# $firstManifest = $output[0] +# $MEDIA_TYPE = $firstManifest.Descriptor.mediaType +# $DIGEST = $firstManifest.Descriptor.digest +# $SIZE = $firstManifest.Descriptor.size +# $payload = @{ +# targetArtifact = @{ +# mediaType = $MEDIA_TYPE +# digest = $DIGEST +# size = $SIZE +# } +# } | ConvertTo-Json + +# $payload | Out-File -FilePath "$(Build.ArtifactStagingDirectory)/windows/payload.json" +# workingDirectory: $(Build.ArtifactStagingDirectory)/windows +# displayName: "Build the payload json file" + +# - task: EsrpCodeSigning@3 +# displayName: 'ESRP CodeSigning for Prometheus' +# inputs: +# ConnectedServiceName: 'ESRPServiceConnectionForPrometheusImages' +# FolderPath: '$(Build.ArtifactStagingDirectory)/windows' +# Pattern: '*.json' +# signConfigType: inlineSignParams +# inlineOperation: | +# [ +# { +# "keyCode": "CP-469451", +# "operationSetCode": "NotaryCoseSign", +# "parameters": [ +# { +# "parameterName": "CoseFlags", +# "parameterValue": "chainunprotected" +# } +# ], +# "toolName": "sign", +# "toolVersion": "1.0" +# } +# ] + +# - powershell: | +# curl.exe -sLO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_windows_amd64.zip" +# $currentDirectory = Get-Location +# Expand-Archive -Path $currentDirectory\oras_1.0.0_windows_amd64.zip -DestinationPath . -Force +# New-Item -ItemType Directory -Force -Path $env:USERPROFILE\bin +# Copy-Item -Path $currentDirectory\oras.exe -Destination "$env:USERPROFILE\bin\" +# $env:PATH = "$env:USERPROFILE\bin;$env:PATH" +# oras attach $(WINDOWS_FULL_IMAGE_NAME) --artifact-type application/vnd.cncf.notary.signature ./payload.json:application/cose -a io.cncf.notary.x509chain.thumbprint#S256=[\""79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\""] +# workingDirectory: $(Build.ArtifactStagingDirectory)/windows +# displayName: "Download, install Oras and run oras attach" +# condition: eq(variables.IS_MAIN_BRANCH, true) + +# - task: PublishBuildArtifacts@1 +# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) +# displayName: "Ev2: publish image artifacts" +# inputs: +# pathToPublish: '$(Build.ArtifactStagingDirectory)' +# artifactName: drop + +# - job: Arc_Helm_Chart +# displayName: "Package: Arc helm chart" +# pool: +# name: Azure-Pipelines-CI-Test-EO +# dependsOn: +# - Image_Tags_and_Ev2_Artifacts +# - Linux_Prometheus_Collector +# variables: +# HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] +# IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] +# IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] +# ARC_HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.ARC_HELM_FULL_IMAGE_NAME'] ] +# ARC_EXTENSION: true +# skipComponentGovernanceDetection: true +# steps: +# - task: HelmInstaller@1 +# displayName: 'Build: install Helm version' +# inputs: +# helmVersionToInstall: 3.12.3 + +# - bash: | +# export HELM_CHART_NAME=$ARC_HELM_CHART_NAME +# envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml +# helm version +# displayName: "Build: substitute chart version in Chart.yaml and values.yaml" + +# - bash: | +# helm dep update +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon +# displayName: "Build: update helm dependencies" + +# - bash: | +# helm package ./azure-monitor-metrics-addon/ +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ +# displayName: "Build: package helm chart" + +# - bash: | +# helm registry login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) +# helm push $(ARC_HELM_CHART_NAME)-$(HELM_SEMVER).tgz oci://$(ACR_REGISTRY)$(ACR_REPOSITORY_HELM) +# mkdir -p $(Build.ArtifactStagingDirectory)/arc-chart +# echo {\"image.name\":\"$(ARC_HELM_FULL_IMAGE_NAME)\"} > $(Build.ArtifactStagingDirectory)/arc-chart/metadata.json +# workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ +# displayName: "Build: push helm chart to dev ACR" +# condition: eq(variables.IS_PR, false) + +# - task: PublishBuildArtifacts@1 +# displayName: "Ev2: publish helm chart artifacts" +# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) +# inputs: +# pathToPublish: '$(Build.ArtifactStagingDirectory)' +# artifactName: drop + +# - job: Deploy_Chart_ARC +# displayName: "Deploy: Arc dev cluster" +# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) +# pool: +# name: Azure-Pipelines-CI-Test-EO +# dependsOn: +# - Image_Tags_and_Ev2_Artifacts +# - Arc_Helm_Chart +# variables: +# HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] +# skipComponentGovernanceDetection: true +# steps: +# - bash: | +# # Create JSON request body +# cat < "request.json" +# { +# "artifactEndpoints": [ +# { +# "Regions": [ +# "westcentralus" +# ], +# "Releasetrains": [ +# "pipeline" +# ], +# "FullPathToHelmChart": "https://mcr.microsoft.com/azuremonitor/containerinsights/cidev/ama-metrics-arc", +# "ExtensionUpdateFrequencyInMinutes": 5, +# "IsCustomerHidden": true, +# "ReadyforRollout": true, +# "RollbackVersion": null, +# "PackageConfigName": "Microsoft.AzureMonitor.Containers.Metrics-Prom041823" +# } +# ] +# } +# EOF + +# # Send Request +# SUBSCRIPTION="b9842c7c-1a38-4385-8f39-a51314758bcf" +# RESOURCE_AUDIENCE="c699bf69-fb1d-4eaf-999b-99e6b2ae4d85" +# SPN_CLIENT_ID="9a4c55e9-576a-450a-88bd-53bd634db38d" +# SPN_TENANT_ID="72f988bf-86f1-41af-91ab-2d7cd011db47" +# METHOD="PUT" + +# echo "Request parameter preparation, SUBSCRIPTION is $SUBSCRIPTION, RESOURCE_AUDIENCE is $RESOURCE_AUDIENCE, CHART_VERSION is $HELM_SEMVER, SPN_CLIENT_ID is $SPN_CLIENT_ID, SPN_TENANT_ID is $SPN_TENANT_ID" + +# # MSI is not supported +# echo "Login cli using spn" +# az login --service-principal --username=$SPN_CLIENT_ID --password=$(ARC_SPN_SECRET) --tenant=$SPN_TENANT_ID +# if [ $? -eq 0 ]; then +# echo "Logged in successfully with spn" +# else +# echo "-e error failed to login to az with managed identity credentials" +# exit 1 +# fi + +# ACCESS_TOKEN=$(az account get-access-token --resource $RESOURCE_AUDIENCE --query accessToken -o json) +# if [ $? -eq 0 ]; then +# echo "get access token from resource:$RESOURCE_AUDIENCE successfully." +# else +# echo "-e error get access token from resource:$RESOURCE_AUDIENCE failed." +# exit 1 +# fi +# ACCESS_TOKEN=$(echo $ACCESS_TOKEN | tr -d '"' | tr -d '"\r\n') + +# ARC_API_URL="https://eastus2euap.dp.kubernetesconfiguration.azure.com" +# EXTENSION_NAME="microsoft.azuremonitor.containers.metrics" +# API_VERSION="2021-05-01" + +# echo "start send request" +# az rest --method $METHOD --headers "{\"Authorization\": \"Bearer $ACCESS_TOKEN\", \"Content-Type\": \"application/json\"}" --body @request.json --uri $ARC_API_URL/subscriptions/$SUBSCRIPTION/extensionTypeRegistrations/$EXTENSION_NAME/versions/$HELM_SEMVER?api-version=$API_VERSION +# if [ $? -eq 0 ]; then +# echo "arc extension registered successfully" +# else +# echo "-e error failed to register arc extension" +# exit 1 +# fi +# displayName: "Deploy: Release to dev release train" + +# - task: AzureCLI@2 +# displayName: "Deploy: wait for ci-dev-arc-wcus cluster to be ready" +# inputs: +# azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' +# scriptType: 'bash' +# scriptLocation: 'inlineScript' +# inlineScript: | +# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +# do +# state=$(az k8s-extension show --name azuremonitor-metrics --cluster-name ci-dev-arc-wcus --resource-group ci-dev-arc-wcus --cluster-type connectedClusters | jq -r '.provisioningState') +# if [ $state = "Succeeded" ] +# then +# echo "Cluster is ready to install extension" +# exit 0 +# fi +# sleep 30 +# done +# echo "Cluster is installing a different version of the extension" +# exit 1 +# retryCountOnTaskFailure: 5 + +# - task: AzureCLI@2 +# displayName: "Deploy: ci-dev-arc-wcus cluster" +# inputs: +# azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' +# scriptType: 'bash' +# scriptLocation: 'inlineScript' +# inlineScript: | +# az config set extension.use_dynamic_install=yes_without_prompt +# az k8s-extension update --name azuremonitor-metrics --resource-group ci-dev-arc-wcus --cluster-name ci-dev-arc-wcus --cluster-type connectedClusters --version $HELM_SEMVER --release-train pipeline + +# - job: Deploy_AKS_Chart +# displayName: "Deploy: AKS dev cluster" +# pool: +# name: Azure-Pipelines-CI-Test-EO +# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) +# dependsOn: +# - Image_Tags_and_Ev2_Artifacts +# - Linux_Prometheus_Collector +# - WindowsMultiArch_Prometheus_Collector +# variables: +# HELM_CHART_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_CHART_NAME'] ] +# HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] +# IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] +# IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] +# HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_FULL_IMAGE_NAME'] ] +# skipComponentGovernanceDetection: true +# steps: +# - checkout: self +# submodules: true +# persistCredentials: true + +# - bash: | +# git config --global user.name "AzureDevOps Agent" +# git tag "v$(HELM_SEMVER)" +# git push origin "v$(HELM_SEMVER)" +# displayName: Tag commit with semver + +# - task: HelmInstaller@1 +# displayName: Install Helm version +# inputs: +# helmVersionToInstall: 3.12.3 +# - bash: | +# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +# do +# sleep 30 +# echo $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG_WINDOWS) +# echo $(MCR_REGISTRY)$(MCR_REPOSITORY_HELM):$(IMAGE_TAG) + +# output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) +# if (echo $output | grep $(IMAGE_TAG_WINDOWS)) && (echo $output | grep $(IMAGE_TAG)) +# then +# echo "Images are published to mcr" +# exit 0 +# fi +# done +# echo "Images are not published to mcr within the timeout" +# exit 1 +# displayName: "Check images are pushed to dev MCR" +# retryCountOnTaskFailure: 5 + +# - bash: | +# helm pull oci://$(MCR_REGISTRY)$(MCR_REPOSITORY_HELM) --version $(HELM_SEMVER) +# workingDirectory: $(Build.StagingDirectory) +# displayName: "Pull helm chart from dev MCR" + +# - bash: | +# export AKS_REGION="eastus" +# export AKS_RESOURCE_ID="/subscriptions/9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb/resourceGroups/ci-dev-aks-mac-eus-rg/providers/Microsoft.ContainerService/managedClusters/ci-dev-aks-mac-eus" +# export ARC_EXTENSION="false" +# envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml +# ls $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon +# cd $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon +# helm dependency update +# displayName: "Build: substitute chart version for 3p in Chart.yaml and values.yaml" + +# - task: HelmDeploy@0 +# displayName: "Deploy: ci-dev-aks-mac-eus cluster" +# inputs: +# connectionType: 'Azure Resource Manager' +# azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' +# azureResourceGroup: 'ci-dev-aks-mac-eus-rg' +# kubernetesCluster: 'ci-dev-aks-mac-eus' +# namespace: 'default' +# command: 'upgrade' +# chartType: 'FilePath' +# chartPath: '$(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/' +# releaseName: 'ama-metrics' +# waitForExecution: false +# arguments: --dependency-update --values $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml diff --git a/otelcollector/configuration-reader-builder/main.go b/otelcollector/configuration-reader-builder/main.go index dbfb53458..6e2129d61 100644 --- a/otelcollector/configuration-reader-builder/main.go +++ b/otelcollector/configuration-reader-builder/main.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "log" + "time" "os" @@ -79,6 +80,10 @@ func updateTAConfigFile(configFilePath string) { } targetAllocatorConfigYaml, _ := yaml.Marshal(targetAllocatorConfig) + // adding intentional delay to test out + log.Println("Sleeping for 1 minute intentionally") + time.Sleep(1 * time.Minute) + log.Println("Done sleeping") if err := os.WriteFile(taConfigFilePath, targetAllocatorConfigYaml, 0644); err != nil { logFatalError(fmt.Sprintf("config-reader::Unable to write to: %s - %v\n", taConfigFilePath, err)) os.Exit(1) From cecf4b39973d3c053476d42ac2c3df29960118da Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Wed, 3 Jan 2024 17:19:38 -0800 Subject: [PATCH 17/21] cleaning up for PR --- .pipelines/azure-pipeline-build.yml | 1490 ++++++++--------- .../configuration-reader-builder/main.go | 5 - .../ama-metrics-targetallocator.yaml | 1 + .../opentelemetry-collector-builder/Makefile | 1 + 4 files changed, 747 insertions(+), 750 deletions(-) diff --git a/.pipelines/azure-pipeline-build.yml b/.pipelines/azure-pipeline-build.yml index c632feb16..81ce6300f 100644 --- a/.pipelines/azure-pipeline-build.yml +++ b/.pipelines/azure-pipeline-build.yml @@ -215,7 +215,7 @@ jobs: variables: WINDOWS_REF_APP_GOLANG_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_REF_APP_GOLANG_FULL_IMAGE_NAME'] ] skipComponentGovernanceDetection: true - # condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) steps: - powershell: | docker build . --isolation=hyperv --file windows/Dockerfile -t $(WINDOWS_REF_APP_GOLANG_FULL_IMAGE_NAME) @@ -232,7 +232,7 @@ jobs: variables: WINDOWS_REF_APP_PYTHON_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_REF_APP_PYTHON_FULL_IMAGE_NAME'] ] skipComponentGovernanceDetection: true - # condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) steps: - powershell: | docker build . --isolation=hyperv --file windows/Dockerfile -t $(WINDOWS_REF_APP_PYTHON_FULL_IMAGE_NAME) @@ -241,294 +241,294 @@ jobs: displayName: "Build: build and push reference app python windows image to dev ACR" workingDirectory: $(Build.SourcesDirectory)/internal/referenceapp/python -# - job: SDL_Binary_Scan -# displayName: "SDL: linux binary scanning" -# pool: -# name: Azure-Pipelines-CI-Test-EO -# steps: -# - checkout: self -# submodules: true - -# - task: CodeQL3000Init@0 -# displayName: 'SDL: init codeql' - -# # - task: GoTool@0 -# # displayName: "Build: specify golang version" -# # inputs: -# # version: '1.21' - -# - bash: | -# sudo apt-get install build-essential -y -# make -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ -# displayName: "SDL: build otelcollector, promconfigvalidator, targetallocator, and fluent-bit plugin for scanning" - -# - task: BinSkim@4 -# displayName: 'SDL: run binskim' -# inputs: -# InputType: 'CommandLine' -# # Remove - $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator for targetallocator since go 1.21 is not yet supported by build pipeline -# arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' - -# - task: Gosec@1 -# displayName: 'SDL: run gosec' -# inputs: -# targetPattern: 'gosecPattern' -# targetGosecPattern: '$(Build.SourcesDirectory)/otelcollector' - -# - bash: | -# wget https://github.com/microsoft/DevSkim/releases/download/v0.6.9/DevSkim_linux_0.6.9.zip -# unzip DevSkim_linux_0.6.9.zip -# chmod 775 DevSkim_linux_0.6.9/devskim -# ./DevSkim_linux_0.6.9/devskim analyze $(Build.SourcesDirectory)/otelcollector --ignore-globs **/deploy/dashboard/**,**/react/static/** --severity critical,important -# displayName: 'SDL: run devskim' -# workingDirectory: $(Build.SourcesDirectory) - -# - bash: | -# sudo gem install brakeman -v 5.4.1 -# brakeman $(Build.SourcesDirectory)/otelcollector/configmapparser --force -# displayName: 'SDL: run brakeman' - - -# - job: Linux_Prometheus_Collector -# displayName: "Build: linux prometheus-collector image" -# pool: -# name: Azure-Pipelines-CI-Test-EO -# dependsOn: Image_Tags_and_Ev2_Artifacts -# variables: -# LINUX_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.LINUX_FULL_IMAGE_NAME'] ] -# # This is necessary because of: https://github.com/moby/moby/issues/37965 -# DOCKER_BUILDKIT: 1 -# steps: -# - checkout: self -# submodules: true - -# - task: CodeQL3000Init@0 -# displayName: 'SDL: init codeql' - -# - task: GoTool@0 -# displayName: "Build: specify golang version" -# inputs: -# version: '1.20' - -# - bash: | -# mkdir -p $(Build.ArtifactStagingDirectory)/linux - -# # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx -# sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static -# docker system prune --volumes -y -# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - -# docker buildx create --name dockerbuilder -# docker buildx use dockerbuilder -# docker buildx build . --platform=linux/amd64,linux/arm64 --file ./build/linux/Dockerfile -t $(LINUX_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/linux/metadata.json --push -# docker pull $(LINUX_FULL_IMAGE_NAME) -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ -# displayName: "Build: build and push image to dev ACR" - -# - bash: | -# MEDIA_TYPE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') -# DIGEST=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.digest') -# SIZE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.size') -# cat <>$(Build.ArtifactStagingDirectory)/linux/payload.json -# {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} -# EOF -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ -# displayName: "Build: Set values in payload.json for signing" -# condition: eq(variables.IS_MAIN_BRANCH, true) - -# - task: EsrpCodeSigning@3 -# displayName: "ESRP CodeSigning for Prometheus" -# inputs: -# ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" -# FolderPath: $(Build.ArtifactStagingDirectory)/linux/ -# Pattern: "*.json" -# signConfigType: inlineSignParams -# inlineOperation: | -# [ -# { -# "keyCode": "CP-469451", -# "operationSetCode": "NotaryCoseSign", -# "parameters": [ -# { -# "parameterName": "CoseFlags", -# "parameterValue": "chainunprotected" -# } -# ], -# "toolName": "sign", -# "toolVersion": "1.0" -# } -# ] - -# - bash: | -# set -euxo pipefail -# curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" -# mkdir -p oras-install/ -# tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ -# sudo mv oras-install/oras /usr/local/bin/ -# rm -rf oras_1.0.0_*.tar.gz oras-install/ -# oras attach $(LINUX_FULL_IMAGE_NAME) \ -# --artifact-type 'application/vnd.cncf.notary.signature' \ -# ./payload.json:application/cose \ -# -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" -# workingDirectory: $(Build.ArtifactStagingDirectory)/linux/ -# displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/linux/" -# condition: eq(variables.IS_MAIN_BRANCH, true) - -# - bash: | -# curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin -# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(LINUX_FULL_IMAGE_NAME) -# if [ $? -ne 0 ]; then -# exit 1 -# fi -# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(KUBE_STATE_METRICS_IMAGE) -# if [ $? -ne 0 ]; then -# exit 1 -# fi -# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(NODE_EXPORTER_IMAGE) -# if [ $? -ne 0 ]; then -# exit 1 -# fi -# workingDirectory: $(Build.SourcesDirectory) -# displayName: "Build: run trivy scan" - -# - task: CodeQL3000Finalize@0 -# displayName: 'SDL: run codeql' - -# - task: ComponentGovernanceComponentDetection@0 -# displayName: "SDL: run component governance" -# inputs: -# scanType: 'Register' -# verbosity: 'Verbose' -# dockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' -# alertWarningLevel: 'High' -# sourceScanPath: '$(Build.SourcesDirectory)/otelcollector' -# ignoreDirectories: '$(Build.SourcesDirectory)/mixins,$(Build.SourcesDirectory)/tools,$(Build.SourcesDirectory)/otelcollector/react' - -# - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 -# displayName: "Ev2: Generate image artifacts" -# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) -# inputs: -# BuildDropPath: '$(Build.ArtifactStagingDirectory)/linux' -# DockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' - -# - task: SdtReport@2 -# displayName: 'SDL: generate report' -# inputs: -# GdnExportAllTools: false -# GdnExportGdnToolBinSkim: true -# GdnExportGdnToolBinSkimSeverity: 'Note' -# GdnExportGdnToolGosec: true -# GdnExportGdnToolGosecSeverity: 'Note' -# GdnExportGdnToolSemmle: true -# GdnExportGdnToolSemmleSeverity: 'Note' - -# - task: PublishSecurityAnalysisLogs@3 -# displayName: 'SDL: publish report' -# inputs: -# ArtifactName: 'CodeAnalysisLogs' -# ArtifactType: 'Container' -# PublishProcessedResults: true -# AllTools: true -# ToolLogsNotFoundAction: 'Standard' - -# - task: PublishBuildArtifacts@1 -# displayName: "Ev2: Publish image artifacts" -# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) -# inputs: -# pathToPublish: '$(Build.ArtifactStagingDirectory)' -# artifactName: drop - -# - task: PostAnalysis@2 -# displayName: 'SDL: Post-Build Analysis' -# inputs: -# GdnBreakAllTools: false -# GdnBreakGdnToolBinSkim: true -# GdnBreakGdnToolBinSkimSeverity: 'Warning' -# GdnBreakGdnToolGosec: true -# GdnBreakGdnToolGosecSeverity: 'Warning' -# GdnBreakGdnToolSemmle: true -# GdnBreakGdnToolSemmleSeverity: 'Warning' - -# - job: Linux_Target_Allocator -# displayName: "Build: target allocator image" -# pool: -# name: Azure-Pipelines-CI-Test-EO -# dependsOn: Image_Tags_and_Ev2_Artifacts -# variables: -# TARGET_ALLOCATOR_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.TARGET_ALLOCATOR_FULL_IMAGE_NAME'] ] -# # This is necessary because of: https://github.com/moby/moby/issues/37965 -# DOCKER_BUILDKIT: 1 -# skipComponentGovernanceDetection: true -# steps: -# - checkout: self -# persistCredentials: true -# - bash: | -# mkdir -p $(Build.ArtifactStagingDirectory)/targetallocator - -# # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx -# sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static -# docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - -# docker buildx create --name dockerbuilder -# docker buildx use dockerbuilder -# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# docker buildx build . --platform=linux/amd64,linux/arm64 --file Dockerfile -t $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/targetallocator/metadata.json --push -# docker pull $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) -# MEDIA_TYPE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') -# DIGEST=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.digest') -# SIZE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.size') -# cat <>$(Build.ArtifactStagingDirectory)/targetallocator/payload.json -# {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} -# EOF -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/otel-allocator -# displayName: "Build: build and push target allocator image to dev ACR" - -# - bash: | -# curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin -# trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) -# workingDirectory: $(Build.SourcesDirectory) -# displayName: "Build: run trivy scan" - - -# - task: EsrpCodeSigning@3 -# displayName: "ESRP CodeSigning for TargetAllocator" -# inputs: -# ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" -# FolderPath: $(Build.ArtifactStagingDirectory)/targetallocator/ -# Pattern: "*.json" -# signConfigType: inlineSignParams -# inlineOperation: | -# [ -# { -# "keyCode": "CP-469451", -# "operationSetCode": "NotaryCoseSign", -# "parameters": [ -# { -# "parameterName": "CoseFlags", -# "parameterValue": "chainunprotected" -# } -# ], -# "toolName": "sign", -# "toolVersion": "1.0" -# } -# ] - -# - bash: | -# set -euxo pipefail -# curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" -# mkdir -p oras-install/ -# tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ -# sudo mv oras-install/oras /usr/local/bin/ -# rm -rf oras_1.0.0_*.tar.gz oras-install/ -# oras attach $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) \ -# --artifact-type 'application/vnd.cncf.notary.signature' \ -# ./payload.json:application/cose \ -# -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" -# workingDirectory: $(Build.ArtifactStagingDirectory)/targetallocator/ -# displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/targetallocator/" -# condition: eq(variables.IS_MAIN_BRANCH, true) +- job: SDL_Binary_Scan + displayName: "SDL: linux binary scanning" + pool: + name: Azure-Pipelines-CI-Test-EO + steps: + - checkout: self + submodules: true + + - task: CodeQL3000Init@0 + displayName: 'SDL: init codeql' + + - task: GoTool@0 + displayName: "Build: specify golang version" + inputs: + version: '1.20' + + - bash: | + sudo apt-get install build-essential -y + make + workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ + displayName: "SDL: build otelcollector, promconfigvalidator, targetallocator, and fluent-bit plugin for scanning" + + - task: BinSkim@4 + displayName: 'SDL: run binskim' + inputs: + InputType: 'CommandLine' + # Remove - $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator for targetallocator since go 1.21 is not yet supported by build pipeline, add this back once 1.21 is supported + arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' + + - task: Gosec@1 + displayName: 'SDL: run gosec' + inputs: + targetPattern: 'gosecPattern' + targetGosecPattern: '$(Build.SourcesDirectory)/otelcollector' + + - bash: | + wget https://github.com/microsoft/DevSkim/releases/download/v0.6.9/DevSkim_linux_0.6.9.zip + unzip DevSkim_linux_0.6.9.zip + chmod 775 DevSkim_linux_0.6.9/devskim + ./DevSkim_linux_0.6.9/devskim analyze $(Build.SourcesDirectory)/otelcollector --ignore-globs **/deploy/dashboard/**,**/react/static/** --severity critical,important + displayName: 'SDL: run devskim' + workingDirectory: $(Build.SourcesDirectory) + + - bash: | + sudo gem install brakeman -v 5.4.1 + brakeman $(Build.SourcesDirectory)/otelcollector/configmapparser --force + displayName: 'SDL: run brakeman' + + +- job: Linux_Prometheus_Collector + displayName: "Build: linux prometheus-collector image" + pool: + name: Azure-Pipelines-CI-Test-EO + dependsOn: Image_Tags_and_Ev2_Artifacts + variables: + LINUX_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.LINUX_FULL_IMAGE_NAME'] ] + # This is necessary because of: https://github.com/moby/moby/issues/37965 + DOCKER_BUILDKIT: 1 + steps: + - checkout: self + submodules: true + + - task: CodeQL3000Init@0 + displayName: 'SDL: init codeql' + + - task: GoTool@0 + displayName: "Build: specify golang version" + inputs: + version: '1.20' + + - bash: | + mkdir -p $(Build.ArtifactStagingDirectory)/linux + + # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx + sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static + docker system prune --volumes -y + docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + + docker buildx create --name dockerbuilder + docker buildx use dockerbuilder + docker buildx build . --platform=linux/amd64,linux/arm64 --file ./build/linux/Dockerfile -t $(LINUX_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/linux/metadata.json --push + docker pull $(LINUX_FULL_IMAGE_NAME) + workingDirectory: $(Build.SourcesDirectory)/otelcollector/ + displayName: "Build: build and push image to dev ACR" + + - bash: | + MEDIA_TYPE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') + DIGEST=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.digest') + SIZE=$(docker manifest inspect -v $(LINUX_FULL_IMAGE_NAME) | jq '.Descriptor.size') + cat <>$(Build.ArtifactStagingDirectory)/linux/payload.json + {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} + EOF + workingDirectory: $(Build.SourcesDirectory)/otelcollector/ + displayName: "Build: Set values in payload.json for signing" + condition: eq(variables.IS_MAIN_BRANCH, true) + + - task: EsrpCodeSigning@3 + displayName: "ESRP CodeSigning for Prometheus" + inputs: + ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" + FolderPath: $(Build.ArtifactStagingDirectory)/linux/ + Pattern: "*.json" + signConfigType: inlineSignParams + inlineOperation: | + [ + { + "keyCode": "CP-469451", + "operationSetCode": "NotaryCoseSign", + "parameters": [ + { + "parameterName": "CoseFlags", + "parameterValue": "chainunprotected" + } + ], + "toolName": "sign", + "toolVersion": "1.0" + } + ] + + - bash: | + set -euxo pipefail + curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" + mkdir -p oras-install/ + tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ + sudo mv oras-install/oras /usr/local/bin/ + rm -rf oras_1.0.0_*.tar.gz oras-install/ + oras attach $(LINUX_FULL_IMAGE_NAME) \ + --artifact-type 'application/vnd.cncf.notary.signature' \ + ./payload.json:application/cose \ + -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" + workingDirectory: $(Build.ArtifactStagingDirectory)/linux/ + displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/linux/" + condition: eq(variables.IS_MAIN_BRANCH, true) + + - bash: | + curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin + trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(LINUX_FULL_IMAGE_NAME) + if [ $? -ne 0 ]; then + exit 1 + fi + trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(KUBE_STATE_METRICS_IMAGE) + if [ $? -ne 0 ]; then + exit 1 + fi + trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(NODE_EXPORTER_IMAGE) + if [ $? -ne 0 ]; then + exit 1 + fi + workingDirectory: $(Build.SourcesDirectory) + displayName: "Build: run trivy scan" + + - task: CodeQL3000Finalize@0 + displayName: 'SDL: run codeql' + + - task: ComponentGovernanceComponentDetection@0 + displayName: "SDL: run component governance" + inputs: + scanType: 'Register' + verbosity: 'Verbose' + dockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' + alertWarningLevel: 'High' + sourceScanPath: '$(Build.SourcesDirectory)/otelcollector' + ignoreDirectories: '$(Build.SourcesDirectory)/mixins,$(Build.SourcesDirectory)/tools,$(Build.SourcesDirectory)/otelcollector/react' + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: "Ev2: Generate image artifacts" + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + inputs: + BuildDropPath: '$(Build.ArtifactStagingDirectory)/linux' + DockerImagesToScan: '$(LINUX_FULL_IMAGE_NAME)' + + - task: SdtReport@2 + displayName: 'SDL: generate report' + inputs: + GdnExportAllTools: false + GdnExportGdnToolBinSkim: true + GdnExportGdnToolBinSkimSeverity: 'Note' + GdnExportGdnToolGosec: true + GdnExportGdnToolGosecSeverity: 'Note' + GdnExportGdnToolSemmle: true + GdnExportGdnToolSemmleSeverity: 'Note' + + - task: PublishSecurityAnalysisLogs@3 + displayName: 'SDL: publish report' + inputs: + ArtifactName: 'CodeAnalysisLogs' + ArtifactType: 'Container' + PublishProcessedResults: true + AllTools: true + ToolLogsNotFoundAction: 'Standard' + + - task: PublishBuildArtifacts@1 + displayName: "Ev2: Publish image artifacts" + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + inputs: + pathToPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: drop + + - task: PostAnalysis@2 + displayName: 'SDL: Post-Build Analysis' + inputs: + GdnBreakAllTools: false + GdnBreakGdnToolBinSkim: true + GdnBreakGdnToolBinSkimSeverity: 'Warning' + GdnBreakGdnToolGosec: true + GdnBreakGdnToolGosecSeverity: 'Warning' + GdnBreakGdnToolSemmle: true + GdnBreakGdnToolSemmleSeverity: 'Warning' + +- job: Linux_Target_Allocator + displayName: "Build: target allocator image" + pool: + name: Azure-Pipelines-CI-Test-EO + dependsOn: Image_Tags_and_Ev2_Artifacts + variables: + TARGET_ALLOCATOR_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.TARGET_ALLOCATOR_FULL_IMAGE_NAME'] ] + # This is necessary because of: https://github.com/moby/moby/issues/37965 + DOCKER_BUILDKIT: 1 + skipComponentGovernanceDetection: true + steps: + - checkout: self + persistCredentials: true + - bash: | + mkdir -p $(Build.ArtifactStagingDirectory)/targetallocator + + # Necessary due to necessary due to https://stackoverflow.com/questions/60080264/docker-cannot-build-multi-platform-images-with-docker-buildx + sudo apt-get update && sudo apt-get -y install qemu binfmt-support qemu-user-static + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + + docker buildx create --name dockerbuilder + docker buildx use dockerbuilder + docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + docker buildx build . --platform=linux/amd64,linux/arm64 --file Dockerfile -t $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) --metadata-file $(Build.ArtifactStagingDirectory)/targetallocator/metadata.json --push + docker pull $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) + MEDIA_TYPE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.mediaType') + DIGEST=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.digest') + SIZE=$(docker manifest inspect -v $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) | jq '.Descriptor.size') + cat <>$(Build.ArtifactStagingDirectory)/targetallocator/payload.json + {"targetArtifact":{"mediaType":$MEDIA_TYPE,"digest":$DIGEST,"size":$SIZE}} + EOF + workingDirectory: $(Build.SourcesDirectory)/otelcollector/otel-allocator + displayName: "Build: build and push target allocator image to dev ACR" + + - bash: | + curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin + trivy image --ignore-unfixed --no-progress --severity HIGH,CRITICAL,MEDIUM --exit-code 1 $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) + workingDirectory: $(Build.SourcesDirectory) + displayName: "Build: run trivy scan" + + + - task: EsrpCodeSigning@3 + displayName: "ESRP CodeSigning for TargetAllocator" + inputs: + ConnectedServiceName: "ESRPServiceConnectionForPrometheusImages" + FolderPath: $(Build.ArtifactStagingDirectory)/targetallocator/ + Pattern: "*.json" + signConfigType: inlineSignParams + inlineOperation: | + [ + { + "keyCode": "CP-469451", + "operationSetCode": "NotaryCoseSign", + "parameters": [ + { + "parameterName": "CoseFlags", + "parameterValue": "chainunprotected" + } + ], + "toolName": "sign", + "toolVersion": "1.0" + } + ] + + - bash: | + set -euxo pipefail + curl -LO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_linux_amd64.tar.gz" + mkdir -p oras-install/ + tar -zxf oras_1.0.0_*.tar.gz -C oras-install/ + sudo mv oras-install/oras /usr/local/bin/ + rm -rf oras_1.0.0_*.tar.gz oras-install/ + oras attach $(TARGET_ALLOCATOR_FULL_IMAGE_NAME) \ + --artifact-type 'application/vnd.cncf.notary.signature' \ + ./payload.json:application/cose \ + -a "io.cncf.notary.x509chain.thumbprint#S256=[\"79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\"]" + workingDirectory: $(Build.ArtifactStagingDirectory)/targetallocator/ + displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/targetallocator/" + condition: eq(variables.IS_MAIN_BRANCH, true) - job: Linux_Config_Reader displayName: "Build: config reader image" @@ -606,458 +606,458 @@ jobs: displayName: "ORAS Push Artifacts in $(Build.ArtifactStagingDirectory)/linuxcfgreader/" condition: eq(variables.IS_MAIN_BRANCH, true) -# - job: Windows2019_Prometheus_Collector -# displayName: "Build: windows 2019 prometheus-collector image" -# pool: -# name: Azure-Pipelines-Windows-CI-Test-EO -# dependsOn: -# - Image_Tags_and_Ev2_Artifacts -# variables: -# WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] -# WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] -# skipComponentGovernanceDetection: true -# steps: -# - task: GoTool@0 -# displayName: "Build: specify golang version" -# inputs: -# version: '1.20' - -# - powershell: | -# ./makefile_windows.ps1 -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ -# displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" - -# - powershell: | -# docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2019_BASE_IMAGE_VERSION) -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ -# displayName: "Build: build WS2019 image" -# retryCountOnTaskFailure: 2 - -# - powershell: | -# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) -# displayName: "Build: push image to dev ACR" - -# - job: Windows2022_Prometheus_Collector -# displayName: "Build: windows 2022 prometheus-collector image" -# pool: -# name: Azure-Pipelines-Windows-CI-Test-EO -# dependsOn: -# - Image_Tags_and_Ev2_Artifacts -# variables: -# WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] -# WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] -# skipComponentGovernanceDetection: true -# steps: -# - task: GoTool@0 -# displayName: "Build: specify golang version" -# inputs: -# version: '1.20' - -# - powershell: | -# ./makefile_windows.ps1 -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ -# displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" - -# - powershell: | -# docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2022_BASE_IMAGE_VERSION) -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ -# displayName: "Build: build WS2022 image" -# retryCountOnTaskFailure: 2 - -# - powershell: | -# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) -# displayName: "Build: push image to dev ACR" - -# - job: WindowsMultiArch_Prometheus_Collector -# displayName: "Build: windows multi-arch prometheus-collector image" -# pool: -# name: Azure-Pipelines-Windows-CI-Test-EO -# dependsOn: -# - Image_Tags_and_Ev2_Artifacts -# - Windows2019_Prometheus_Collector -# - Windows2022_Prometheus_Collector -# variables: -# WINDOWS_IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] -# WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] -# WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] -# WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] -# skipComponentGovernanceDetection: true -# steps: -# - task: GoTool@0 -# displayName: "Build: specify golang version" -# inputs: -# version: '1.20' - -# - bash: | -# export ACR_REPOSITORY_VAR="$(ACR_REPOSITORY)" -# export ACR_REPOSITORY_WITHOUT_SLASH="${ACR_REPOSITORY_VAR:1}" - -# export WINDOWS_2019_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2019_BASE_IMAGE_VERSION)" -# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) -# if [ $? -ne 0 ]; then -# echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION). Checking if MCR image is published." -# IMAGES_ARE_PUBLISHED=0 -# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -# do -# output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) -# if (echo $output | grep $WINDOWS_2019_TAG) -# then -# echo "Images are published to mcr" -# IMAGES_ARE_PUBLISHED=1 -# break -# fi -# sleep 30 -# done -# if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then -# echo "Images are not published to mcr within the timeout" -# exit 1 -# fi - -# az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2019_TAG) -# fi - -# export WINDOWS_2022_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2022_BASE_IMAGE_VERSION)" -# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) -# if [ $? -ne 0 ]; then -# echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION). Checking if MCR image is published." -# IMAGES_ARE_PUBLISHED=0 -# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -# do -# output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) -# if (echo $output | grep $WINDOWS_2022_TAG) -# then -# echo "Images are published to mcr" -# IMAGES_ARE_PUBLISHED=1 -# break -# fi -# sleep 30 -# done -# if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then -# echo "Images are not published to mcr within the timeout" -# exit 1 -# fi - -# az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2022_TAG) -# fi -# displayName: "Build: ensure images are present in ACR" -# retryCountOnTaskFailure: 3 - -# - powershell: | -# New-Item -Path "$(Build.ArtifactStagingDirectory)" -Name "windows" -ItemType "directory" -# @{"image.name"="$(WINDOWS_FULL_IMAGE_NAME)"} | ConvertTo-Json -Compress | Out-File -Encoding ascii $(Build.ArtifactStagingDirectory)/windows/metadata.json -# docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# docker manifest create $(WINDOWS_FULL_IMAGE_NAME) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) -# docker manifest push $(WINDOWS_FULL_IMAGE_NAME) -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/ -# displayName: "Build: Windows multi-arch manifest" - -# - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 -# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) -# displayName: "Ev2: generate image artifacts" -# inputs: -# BuildDropPath: '$(Build.ArtifactStagingDirectory)/windows' -# DockerImagesToScan: '$(WINDOWS_FULL_IMAGE_NAME)' - -# - powershell: | -# $output = docker manifest inspect -v $(WINDOWS_FULL_IMAGE_NAME) | ConvertFrom-Json -# $firstManifest = $output[0] -# $MEDIA_TYPE = $firstManifest.Descriptor.mediaType -# $DIGEST = $firstManifest.Descriptor.digest -# $SIZE = $firstManifest.Descriptor.size -# $payload = @{ -# targetArtifact = @{ -# mediaType = $MEDIA_TYPE -# digest = $DIGEST -# size = $SIZE -# } -# } | ConvertTo-Json - -# $payload | Out-File -FilePath "$(Build.ArtifactStagingDirectory)/windows/payload.json" -# workingDirectory: $(Build.ArtifactStagingDirectory)/windows -# displayName: "Build the payload json file" - -# - task: EsrpCodeSigning@3 -# displayName: 'ESRP CodeSigning for Prometheus' -# inputs: -# ConnectedServiceName: 'ESRPServiceConnectionForPrometheusImages' -# FolderPath: '$(Build.ArtifactStagingDirectory)/windows' -# Pattern: '*.json' -# signConfigType: inlineSignParams -# inlineOperation: | -# [ -# { -# "keyCode": "CP-469451", -# "operationSetCode": "NotaryCoseSign", -# "parameters": [ -# { -# "parameterName": "CoseFlags", -# "parameterValue": "chainunprotected" -# } -# ], -# "toolName": "sign", -# "toolVersion": "1.0" -# } -# ] - -# - powershell: | -# curl.exe -sLO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_windows_amd64.zip" -# $currentDirectory = Get-Location -# Expand-Archive -Path $currentDirectory\oras_1.0.0_windows_amd64.zip -DestinationPath . -Force -# New-Item -ItemType Directory -Force -Path $env:USERPROFILE\bin -# Copy-Item -Path $currentDirectory\oras.exe -Destination "$env:USERPROFILE\bin\" -# $env:PATH = "$env:USERPROFILE\bin;$env:PATH" -# oras attach $(WINDOWS_FULL_IMAGE_NAME) --artifact-type application/vnd.cncf.notary.signature ./payload.json:application/cose -a io.cncf.notary.x509chain.thumbprint#S256=[\""79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\""] -# workingDirectory: $(Build.ArtifactStagingDirectory)/windows -# displayName: "Download, install Oras and run oras attach" -# condition: eq(variables.IS_MAIN_BRANCH, true) - -# - task: PublishBuildArtifacts@1 -# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) -# displayName: "Ev2: publish image artifacts" -# inputs: -# pathToPublish: '$(Build.ArtifactStagingDirectory)' -# artifactName: drop - -# - job: Arc_Helm_Chart -# displayName: "Package: Arc helm chart" -# pool: -# name: Azure-Pipelines-CI-Test-EO -# dependsOn: -# - Image_Tags_and_Ev2_Artifacts -# - Linux_Prometheus_Collector -# variables: -# HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] -# IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] -# IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] -# ARC_HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.ARC_HELM_FULL_IMAGE_NAME'] ] -# ARC_EXTENSION: true -# skipComponentGovernanceDetection: true -# steps: -# - task: HelmInstaller@1 -# displayName: 'Build: install Helm version' -# inputs: -# helmVersionToInstall: 3.12.3 - -# - bash: | -# export HELM_CHART_NAME=$ARC_HELM_CHART_NAME -# envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml -# helm version -# displayName: "Build: substitute chart version in Chart.yaml and values.yaml" - -# - bash: | -# helm dep update -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon -# displayName: "Build: update helm dependencies" - -# - bash: | -# helm package ./azure-monitor-metrics-addon/ -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ -# displayName: "Build: package helm chart" - -# - bash: | -# helm registry login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) -# helm push $(ARC_HELM_CHART_NAME)-$(HELM_SEMVER).tgz oci://$(ACR_REGISTRY)$(ACR_REPOSITORY_HELM) -# mkdir -p $(Build.ArtifactStagingDirectory)/arc-chart -# echo {\"image.name\":\"$(ARC_HELM_FULL_IMAGE_NAME)\"} > $(Build.ArtifactStagingDirectory)/arc-chart/metadata.json -# workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ -# displayName: "Build: push helm chart to dev ACR" -# condition: eq(variables.IS_PR, false) - -# - task: PublishBuildArtifacts@1 -# displayName: "Ev2: publish helm chart artifacts" -# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) -# inputs: -# pathToPublish: '$(Build.ArtifactStagingDirectory)' -# artifactName: drop - -# - job: Deploy_Chart_ARC -# displayName: "Deploy: Arc dev cluster" -# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) -# pool: -# name: Azure-Pipelines-CI-Test-EO -# dependsOn: -# - Image_Tags_and_Ev2_Artifacts -# - Arc_Helm_Chart -# variables: -# HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] -# skipComponentGovernanceDetection: true -# steps: -# - bash: | -# # Create JSON request body -# cat < "request.json" -# { -# "artifactEndpoints": [ -# { -# "Regions": [ -# "westcentralus" -# ], -# "Releasetrains": [ -# "pipeline" -# ], -# "FullPathToHelmChart": "https://mcr.microsoft.com/azuremonitor/containerinsights/cidev/ama-metrics-arc", -# "ExtensionUpdateFrequencyInMinutes": 5, -# "IsCustomerHidden": true, -# "ReadyforRollout": true, -# "RollbackVersion": null, -# "PackageConfigName": "Microsoft.AzureMonitor.Containers.Metrics-Prom041823" -# } -# ] -# } -# EOF - -# # Send Request -# SUBSCRIPTION="b9842c7c-1a38-4385-8f39-a51314758bcf" -# RESOURCE_AUDIENCE="c699bf69-fb1d-4eaf-999b-99e6b2ae4d85" -# SPN_CLIENT_ID="9a4c55e9-576a-450a-88bd-53bd634db38d" -# SPN_TENANT_ID="72f988bf-86f1-41af-91ab-2d7cd011db47" -# METHOD="PUT" - -# echo "Request parameter preparation, SUBSCRIPTION is $SUBSCRIPTION, RESOURCE_AUDIENCE is $RESOURCE_AUDIENCE, CHART_VERSION is $HELM_SEMVER, SPN_CLIENT_ID is $SPN_CLIENT_ID, SPN_TENANT_ID is $SPN_TENANT_ID" - -# # MSI is not supported -# echo "Login cli using spn" -# az login --service-principal --username=$SPN_CLIENT_ID --password=$(ARC_SPN_SECRET) --tenant=$SPN_TENANT_ID -# if [ $? -eq 0 ]; then -# echo "Logged in successfully with spn" -# else -# echo "-e error failed to login to az with managed identity credentials" -# exit 1 -# fi - -# ACCESS_TOKEN=$(az account get-access-token --resource $RESOURCE_AUDIENCE --query accessToken -o json) -# if [ $? -eq 0 ]; then -# echo "get access token from resource:$RESOURCE_AUDIENCE successfully." -# else -# echo "-e error get access token from resource:$RESOURCE_AUDIENCE failed." -# exit 1 -# fi -# ACCESS_TOKEN=$(echo $ACCESS_TOKEN | tr -d '"' | tr -d '"\r\n') - -# ARC_API_URL="https://eastus2euap.dp.kubernetesconfiguration.azure.com" -# EXTENSION_NAME="microsoft.azuremonitor.containers.metrics" -# API_VERSION="2021-05-01" - -# echo "start send request" -# az rest --method $METHOD --headers "{\"Authorization\": \"Bearer $ACCESS_TOKEN\", \"Content-Type\": \"application/json\"}" --body @request.json --uri $ARC_API_URL/subscriptions/$SUBSCRIPTION/extensionTypeRegistrations/$EXTENSION_NAME/versions/$HELM_SEMVER?api-version=$API_VERSION -# if [ $? -eq 0 ]; then -# echo "arc extension registered successfully" -# else -# echo "-e error failed to register arc extension" -# exit 1 -# fi -# displayName: "Deploy: Release to dev release train" - -# - task: AzureCLI@2 -# displayName: "Deploy: wait for ci-dev-arc-wcus cluster to be ready" -# inputs: -# azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' -# scriptType: 'bash' -# scriptLocation: 'inlineScript' -# inlineScript: | -# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -# do -# state=$(az k8s-extension show --name azuremonitor-metrics --cluster-name ci-dev-arc-wcus --resource-group ci-dev-arc-wcus --cluster-type connectedClusters | jq -r '.provisioningState') -# if [ $state = "Succeeded" ] -# then -# echo "Cluster is ready to install extension" -# exit 0 -# fi -# sleep 30 -# done -# echo "Cluster is installing a different version of the extension" -# exit 1 -# retryCountOnTaskFailure: 5 - -# - task: AzureCLI@2 -# displayName: "Deploy: ci-dev-arc-wcus cluster" -# inputs: -# azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' -# scriptType: 'bash' -# scriptLocation: 'inlineScript' -# inlineScript: | -# az config set extension.use_dynamic_install=yes_without_prompt -# az k8s-extension update --name azuremonitor-metrics --resource-group ci-dev-arc-wcus --cluster-name ci-dev-arc-wcus --cluster-type connectedClusters --version $HELM_SEMVER --release-train pipeline - -# - job: Deploy_AKS_Chart -# displayName: "Deploy: AKS dev cluster" -# pool: -# name: Azure-Pipelines-CI-Test-EO -# condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) -# dependsOn: -# - Image_Tags_and_Ev2_Artifacts -# - Linux_Prometheus_Collector -# - WindowsMultiArch_Prometheus_Collector -# variables: -# HELM_CHART_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_CHART_NAME'] ] -# HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] -# IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] -# IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] -# HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_FULL_IMAGE_NAME'] ] -# skipComponentGovernanceDetection: true -# steps: -# - checkout: self -# submodules: true -# persistCredentials: true - -# - bash: | -# git config --global user.name "AzureDevOps Agent" -# git tag "v$(HELM_SEMVER)" -# git push origin "v$(HELM_SEMVER)" -# displayName: Tag commit with semver - -# - task: HelmInstaller@1 -# displayName: Install Helm version -# inputs: -# helmVersionToInstall: 3.12.3 -# - bash: | -# for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -# do -# sleep 30 -# echo $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG_WINDOWS) -# echo $(MCR_REGISTRY)$(MCR_REPOSITORY_HELM):$(IMAGE_TAG) - -# output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) -# if (echo $output | grep $(IMAGE_TAG_WINDOWS)) && (echo $output | grep $(IMAGE_TAG)) -# then -# echo "Images are published to mcr" -# exit 0 -# fi -# done -# echo "Images are not published to mcr within the timeout" -# exit 1 -# displayName: "Check images are pushed to dev MCR" -# retryCountOnTaskFailure: 5 - -# - bash: | -# helm pull oci://$(MCR_REGISTRY)$(MCR_REPOSITORY_HELM) --version $(HELM_SEMVER) -# workingDirectory: $(Build.StagingDirectory) -# displayName: "Pull helm chart from dev MCR" - -# - bash: | -# export AKS_REGION="eastus" -# export AKS_RESOURCE_ID="/subscriptions/9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb/resourceGroups/ci-dev-aks-mac-eus-rg/providers/Microsoft.ContainerService/managedClusters/ci-dev-aks-mac-eus" -# export ARC_EXTENSION="false" -# envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml -# ls $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon -# cd $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon -# helm dependency update -# displayName: "Build: substitute chart version for 3p in Chart.yaml and values.yaml" - -# - task: HelmDeploy@0 -# displayName: "Deploy: ci-dev-aks-mac-eus cluster" -# inputs: -# connectionType: 'Azure Resource Manager' -# azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' -# azureResourceGroup: 'ci-dev-aks-mac-eus-rg' -# kubernetesCluster: 'ci-dev-aks-mac-eus' -# namespace: 'default' -# command: 'upgrade' -# chartType: 'FilePath' -# chartPath: '$(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/' -# releaseName: 'ama-metrics' -# waitForExecution: false -# arguments: --dependency-update --values $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml +- job: Windows2019_Prometheus_Collector + displayName: "Build: windows 2019 prometheus-collector image" + pool: + name: Azure-Pipelines-Windows-CI-Test-EO + dependsOn: + - Image_Tags_and_Ev2_Artifacts + variables: + WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] + WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] + skipComponentGovernanceDetection: true + steps: + - task: GoTool@0 + displayName: "Build: specify golang version" + inputs: + version: '1.20' + + - powershell: | + ./makefile_windows.ps1 + workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ + displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" + + - powershell: | + docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2019_BASE_IMAGE_VERSION) + workingDirectory: $(Build.SourcesDirectory)/otelcollector/ + displayName: "Build: build WS2019 image" + retryCountOnTaskFailure: 2 + + - powershell: | + docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) + displayName: "Build: push image to dev ACR" + +- job: Windows2022_Prometheus_Collector + displayName: "Build: windows 2022 prometheus-collector image" + pool: + name: Azure-Pipelines-Windows-CI-Test-EO + dependsOn: + - Image_Tags_and_Ev2_Artifacts + variables: + WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] + WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] + skipComponentGovernanceDetection: true + steps: + - task: GoTool@0 + displayName: "Build: specify golang version" + inputs: + version: '1.20' + + - powershell: | + ./makefile_windows.ps1 + workingDirectory: $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/ + displayName: "Build: build otelcollector, promconfigvalidator, and fluent-bit plugin" + + - powershell: | + docker build . --isolation=hyperv --file ./build/windows/Dockerfile -t $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) --build-arg WINDOWS_VERSION=$(WINDOWS_2022_BASE_IMAGE_VERSION) + workingDirectory: $(Build.SourcesDirectory)/otelcollector/ + displayName: "Build: build WS2022 image" + retryCountOnTaskFailure: 2 + + - powershell: | + docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + docker push $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) + displayName: "Build: push image to dev ACR" + +- job: WindowsMultiArch_Prometheus_Collector + displayName: "Build: windows multi-arch prometheus-collector image" + pool: + name: Azure-Pipelines-Windows-CI-Test-EO + dependsOn: + - Image_Tags_and_Ev2_Artifacts + - Windows2019_Prometheus_Collector + - Windows2022_Prometheus_Collector + variables: + WINDOWS_IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] + WINDOWS_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_FULL_IMAGE_NAME'] ] + WINDOWS_2019_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2019_BASE_IMAGE_VERSION'] ] + WINDOWS_2022_BASE_IMAGE_VERSION: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_2022_BASE_IMAGE_VERSION'] ] + skipComponentGovernanceDetection: true + steps: + - task: GoTool@0 + displayName: "Build: specify golang version" + inputs: + version: '1.20' + + - bash: | + export ACR_REPOSITORY_VAR="$(ACR_REPOSITORY)" + export ACR_REPOSITORY_WITHOUT_SLASH="${ACR_REPOSITORY_VAR:1}" + + export WINDOWS_2019_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2019_BASE_IMAGE_VERSION)" + docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) + if [ $? -ne 0 ]; then + echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION). Checking if MCR image is published." + IMAGES_ARE_PUBLISHED=0 + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + do + output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) + if (echo $output | grep $WINDOWS_2019_TAG) + then + echo "Images are published to mcr" + IMAGES_ARE_PUBLISHED=1 + break + fi + sleep 30 + done + if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then + echo "Images are not published to mcr within the timeout" + exit 1 + fi + + az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2019_TAG) + fi + + export WINDOWS_2022_TAG="$(WINDOWS_IMAGE_TAG)-$(WINDOWS_2022_BASE_IMAGE_VERSION)" + docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + docker pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) + if [ $? -ne 0 ]; then + echo "Failed to pull $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION). Checking if MCR image is published." + IMAGES_ARE_PUBLISHED=0 + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + do + output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) + if (echo $output | grep $WINDOWS_2022_TAG) + then + echo "Images are published to mcr" + IMAGES_ARE_PUBLISHED=1 + break + fi + sleep 30 + done + if [ IMAGES_ARE_PUBLISHED -eq 0 ]; then + echo "Images are not published to mcr within the timeout" + exit 1 + fi + + az acr import --name $(ACR_REGISTRY) --source $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG) --image $(ACR_REPOSITORY_WITHOUT_SLASH):$(WINDOWS_2022_TAG) + fi + displayName: "Build: ensure images are present in ACR" + retryCountOnTaskFailure: 3 + + - powershell: | + New-Item -Path "$(Build.ArtifactStagingDirectory)" -Name "windows" -ItemType "directory" + @{"image.name"="$(WINDOWS_FULL_IMAGE_NAME)"} | ConvertTo-Json -Compress | Out-File -Encoding ascii $(Build.ArtifactStagingDirectory)/windows/metadata.json + docker login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + docker manifest create $(WINDOWS_FULL_IMAGE_NAME) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2019_BASE_IMAGE_VERSION) $(WINDOWS_FULL_IMAGE_NAME)-$(WINDOWS_2022_BASE_IMAGE_VERSION) + docker manifest push $(WINDOWS_FULL_IMAGE_NAME) + workingDirectory: $(Build.SourcesDirectory)/otelcollector/ + displayName: "Build: Windows multi-arch manifest" + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + displayName: "Ev2: generate image artifacts" + inputs: + BuildDropPath: '$(Build.ArtifactStagingDirectory)/windows' + DockerImagesToScan: '$(WINDOWS_FULL_IMAGE_NAME)' + + - powershell: | + $output = docker manifest inspect -v $(WINDOWS_FULL_IMAGE_NAME) | ConvertFrom-Json + $firstManifest = $output[0] + $MEDIA_TYPE = $firstManifest.Descriptor.mediaType + $DIGEST = $firstManifest.Descriptor.digest + $SIZE = $firstManifest.Descriptor.size + $payload = @{ + targetArtifact = @{ + mediaType = $MEDIA_TYPE + digest = $DIGEST + size = $SIZE + } + } | ConvertTo-Json + + $payload | Out-File -FilePath "$(Build.ArtifactStagingDirectory)/windows/payload.json" + workingDirectory: $(Build.ArtifactStagingDirectory)/windows + displayName: "Build the payload json file" + + - task: EsrpCodeSigning@3 + displayName: 'ESRP CodeSigning for Prometheus' + inputs: + ConnectedServiceName: 'ESRPServiceConnectionForPrometheusImages' + FolderPath: '$(Build.ArtifactStagingDirectory)/windows' + Pattern: '*.json' + signConfigType: inlineSignParams + inlineOperation: | + [ + { + "keyCode": "CP-469451", + "operationSetCode": "NotaryCoseSign", + "parameters": [ + { + "parameterName": "CoseFlags", + "parameterValue": "chainunprotected" + } + ], + "toolName": "sign", + "toolVersion": "1.0" + } + ] + + - powershell: | + curl.exe -sLO "https://github.com/oras-project/oras/releases/download/v1.0.0/oras_1.0.0_windows_amd64.zip" + $currentDirectory = Get-Location + Expand-Archive -Path $currentDirectory\oras_1.0.0_windows_amd64.zip -DestinationPath . -Force + New-Item -ItemType Directory -Force -Path $env:USERPROFILE\bin + Copy-Item -Path $currentDirectory\oras.exe -Destination "$env:USERPROFILE\bin\" + $env:PATH = "$env:USERPROFILE\bin;$env:PATH" + oras attach $(WINDOWS_FULL_IMAGE_NAME) --artifact-type application/vnd.cncf.notary.signature ./payload.json:application/cose -a io.cncf.notary.x509chain.thumbprint#S256=[\""79E6A702361E1F60DAA84AEEC4CBF6F6420DE6BA\""] + workingDirectory: $(Build.ArtifactStagingDirectory)/windows + displayName: "Download, install Oras and run oras attach" + condition: eq(variables.IS_MAIN_BRANCH, true) + + - task: PublishBuildArtifacts@1 + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + displayName: "Ev2: publish image artifacts" + inputs: + pathToPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: drop + +- job: Arc_Helm_Chart + displayName: "Package: Arc helm chart" + pool: + name: Azure-Pipelines-CI-Test-EO + dependsOn: + - Image_Tags_and_Ev2_Artifacts + - Linux_Prometheus_Collector + variables: + HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] + IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] + IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] + ARC_HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.ARC_HELM_FULL_IMAGE_NAME'] ] + ARC_EXTENSION: true + skipComponentGovernanceDetection: true + steps: + - task: HelmInstaller@1 + displayName: 'Build: install Helm version' + inputs: + helmVersionToInstall: 3.12.3 + + - bash: | + export HELM_CHART_NAME=$ARC_HELM_CHART_NAME + envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml + helm version + displayName: "Build: substitute chart version in Chart.yaml and values.yaml" + + - bash: | + helm dep update + workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon + displayName: "Build: update helm dependencies" + + - bash: | + helm package ./azure-monitor-metrics-addon/ + workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ + displayName: "Build: package helm chart" + + - bash: | + helm registry login containerinsightsprod.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) + helm push $(ARC_HELM_CHART_NAME)-$(HELM_SEMVER).tgz oci://$(ACR_REGISTRY)$(ACR_REPOSITORY_HELM) + mkdir -p $(Build.ArtifactStagingDirectory)/arc-chart + echo {\"image.name\":\"$(ARC_HELM_FULL_IMAGE_NAME)\"} > $(Build.ArtifactStagingDirectory)/arc-chart/metadata.json + workingDirectory: $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/ + displayName: "Build: push helm chart to dev ACR" + condition: eq(variables.IS_PR, false) + + - task: PublishBuildArtifacts@1 + displayName: "Ev2: publish helm chart artifacts" + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + inputs: + pathToPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: drop + +- job: Deploy_Chart_ARC + displayName: "Deploy: Arc dev cluster" + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + pool: + name: Azure-Pipelines-CI-Test-EO + dependsOn: + - Image_Tags_and_Ev2_Artifacts + - Arc_Helm_Chart + variables: + HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] + skipComponentGovernanceDetection: true + steps: + - bash: | + # Create JSON request body + cat < "request.json" + { + "artifactEndpoints": [ + { + "Regions": [ + "westcentralus" + ], + "Releasetrains": [ + "pipeline" + ], + "FullPathToHelmChart": "https://mcr.microsoft.com/azuremonitor/containerinsights/cidev/ama-metrics-arc", + "ExtensionUpdateFrequencyInMinutes": 5, + "IsCustomerHidden": true, + "ReadyforRollout": true, + "RollbackVersion": null, + "PackageConfigName": "Microsoft.AzureMonitor.Containers.Metrics-Prom041823" + } + ] + } + EOF + + # Send Request + SUBSCRIPTION="b9842c7c-1a38-4385-8f39-a51314758bcf" + RESOURCE_AUDIENCE="c699bf69-fb1d-4eaf-999b-99e6b2ae4d85" + SPN_CLIENT_ID="9a4c55e9-576a-450a-88bd-53bd634db38d" + SPN_TENANT_ID="72f988bf-86f1-41af-91ab-2d7cd011db47" + METHOD="PUT" + + echo "Request parameter preparation, SUBSCRIPTION is $SUBSCRIPTION, RESOURCE_AUDIENCE is $RESOURCE_AUDIENCE, CHART_VERSION is $HELM_SEMVER, SPN_CLIENT_ID is $SPN_CLIENT_ID, SPN_TENANT_ID is $SPN_TENANT_ID" + + # MSI is not supported + echo "Login cli using spn" + az login --service-principal --username=$SPN_CLIENT_ID --password=$(ARC_SPN_SECRET) --tenant=$SPN_TENANT_ID + if [ $? -eq 0 ]; then + echo "Logged in successfully with spn" + else + echo "-e error failed to login to az with managed identity credentials" + exit 1 + fi + + ACCESS_TOKEN=$(az account get-access-token --resource $RESOURCE_AUDIENCE --query accessToken -o json) + if [ $? -eq 0 ]; then + echo "get access token from resource:$RESOURCE_AUDIENCE successfully." + else + echo "-e error get access token from resource:$RESOURCE_AUDIENCE failed." + exit 1 + fi + ACCESS_TOKEN=$(echo $ACCESS_TOKEN | tr -d '"' | tr -d '"\r\n') + + ARC_API_URL="https://eastus2euap.dp.kubernetesconfiguration.azure.com" + EXTENSION_NAME="microsoft.azuremonitor.containers.metrics" + API_VERSION="2021-05-01" + + echo "start send request" + az rest --method $METHOD --headers "{\"Authorization\": \"Bearer $ACCESS_TOKEN\", \"Content-Type\": \"application/json\"}" --body @request.json --uri $ARC_API_URL/subscriptions/$SUBSCRIPTION/extensionTypeRegistrations/$EXTENSION_NAME/versions/$HELM_SEMVER?api-version=$API_VERSION + if [ $? -eq 0 ]; then + echo "arc extension registered successfully" + else + echo "-e error failed to register arc extension" + exit 1 + fi + displayName: "Deploy: Release to dev release train" + + - task: AzureCLI@2 + displayName: "Deploy: wait for ci-dev-arc-wcus cluster to be ready" + inputs: + azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + do + state=$(az k8s-extension show --name azuremonitor-metrics --cluster-name ci-dev-arc-wcus --resource-group ci-dev-arc-wcus --cluster-type connectedClusters | jq -r '.provisioningState') + if [ $state = "Succeeded" ] + then + echo "Cluster is ready to install extension" + exit 0 + fi + sleep 30 + done + echo "Cluster is installing a different version of the extension" + exit 1 + retryCountOnTaskFailure: 5 + + - task: AzureCLI@2 + displayName: "Deploy: ci-dev-arc-wcus cluster" + inputs: + azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' + scriptType: 'bash' + scriptLocation: 'inlineScript' + inlineScript: | + az config set extension.use_dynamic_install=yes_without_prompt + az k8s-extension update --name azuremonitor-metrics --resource-group ci-dev-arc-wcus --cluster-name ci-dev-arc-wcus --cluster-type connectedClusters --version $HELM_SEMVER --release-train pipeline + +- job: Deploy_AKS_Chart + displayName: "Deploy: AKS dev cluster" + pool: + name: Azure-Pipelines-CI-Test-EO + condition: and(eq(variables.IS_PR, false), eq(variables.IS_MAIN_BRANCH, true)) + dependsOn: + - Image_Tags_and_Ev2_Artifacts + - Linux_Prometheus_Collector + - WindowsMultiArch_Prometheus_Collector + variables: + HELM_CHART_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_CHART_NAME'] ] + HELM_SEMVER: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] + IMAGE_TAG: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.SEMVER'] ] + IMAGE_TAG_WINDOWS: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.WINDOWS_IMAGE_TAG'] ] + HELM_FULL_IMAGE_NAME: $[ dependencies.Image_Tags_and_Ev2_Artifacts.outputs['setup.HELM_FULL_IMAGE_NAME'] ] + skipComponentGovernanceDetection: true + steps: + - checkout: self + submodules: true + persistCredentials: true + + - bash: | + git config --global user.name "AzureDevOps Agent" + git tag "v$(HELM_SEMVER)" + git push origin "v$(HELM_SEMVER)" + displayName: Tag commit with semver + + - task: HelmInstaller@1 + displayName: Install Helm version + inputs: + helmVersionToInstall: 3.12.3 + - bash: | + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + do + sleep 30 + echo $(MCR_REGISTRY)$(MCR_REPOSITORY):$(IMAGE_TAG_WINDOWS) + echo $(MCR_REGISTRY)$(MCR_REPOSITORY_HELM):$(IMAGE_TAG) + + output=$(curl -s https://$(MCR_REGISTRY)/v2$(MCR_REPOSITORY)/tags/list) + if (echo $output | grep $(IMAGE_TAG_WINDOWS)) && (echo $output | grep $(IMAGE_TAG)) + then + echo "Images are published to mcr" + exit 0 + fi + done + echo "Images are not published to mcr within the timeout" + exit 1 + displayName: "Check images are pushed to dev MCR" + retryCountOnTaskFailure: 5 + + - bash: | + helm pull oci://$(MCR_REGISTRY)$(MCR_REPOSITORY_HELM) --version $(HELM_SEMVER) + workingDirectory: $(Build.StagingDirectory) + displayName: "Pull helm chart from dev MCR" + + - bash: | + export AKS_REGION="eastus" + export AKS_RESOURCE_ID="/subscriptions/9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb/resourceGroups/ci-dev-aks-mac-eus-rg/providers/Microsoft.ContainerService/managedClusters/ci-dev-aks-mac-eus" + export ARC_EXTENSION="false" + envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/Chart.yaml && envsubst < $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values-template.yaml > $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml + ls $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon + cd $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon + helm dependency update + displayName: "Build: substitute chart version for 3p in Chart.yaml and values.yaml" + + - task: HelmDeploy@0 + displayName: "Deploy: ci-dev-aks-mac-eus cluster" + inputs: + connectionType: 'Azure Resource Manager' + azureSubscription: 'ContainerInsights_Build_Subscription(9b96ebbd-c57a-42d1-bbe9-b69296e4c7fb)' + azureResourceGroup: 'ci-dev-aks-mac-eus-rg' + kubernetesCluster: 'ci-dev-aks-mac-eus' + namespace: 'default' + command: 'upgrade' + chartType: 'FilePath' + chartPath: '$(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/' + releaseName: 'ama-metrics' + waitForExecution: false + arguments: --dependency-update --values $(Build.SourcesDirectory)/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/values.yaml diff --git a/otelcollector/configuration-reader-builder/main.go b/otelcollector/configuration-reader-builder/main.go index 6e2129d61..dbfb53458 100644 --- a/otelcollector/configuration-reader-builder/main.go +++ b/otelcollector/configuration-reader-builder/main.go @@ -4,7 +4,6 @@ import ( "flag" "fmt" "log" - "time" "os" @@ -80,10 +79,6 @@ func updateTAConfigFile(configFilePath string) { } targetAllocatorConfigYaml, _ := yaml.Marshal(targetAllocatorConfig) - // adding intentional delay to test out - log.Println("Sleeping for 1 minute intentionally") - time.Sleep(1 * time.Minute) - log.Println("Done sleeping") if err := os.WriteFile(taConfigFilePath, targetAllocatorConfigYaml, 0644); err != nil { logFatalError(fmt.Sprintf("config-reader::Unable to write to: %s - %v\n", taConfigFilePath, err)) os.Exit(1) diff --git a/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/templates/ama-metrics-targetallocator.yaml b/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/templates/ama-metrics-targetallocator.yaml index 39542534b..11b698f33 100644 --- a/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/templates/ama-metrics-targetallocator.yaml +++ b/otelcollector/deploy/addon-chart/azure-monitor-metrics-addon/templates/ama-metrics-targetallocator.yaml @@ -31,6 +31,7 @@ spec: - name: targetallocator args: - --enable-prometheus-cr-watcher + - --reload-config image: "mcr.microsoft.com{{ .Values.AzureMonitorMetrics.ImageRepository }}:{{ .Values.AzureMonitorMetrics.ImageTagTargetAllocator }}" imagePullPolicy: IfNotPresent resources: diff --git a/otelcollector/opentelemetry-collector-builder/Makefile b/otelcollector/opentelemetry-collector-builder/Makefile index 04860b65d..b8a064392 100644 --- a/otelcollector/opentelemetry-collector-builder/Makefile +++ b/otelcollector/opentelemetry-collector-builder/Makefile @@ -12,6 +12,7 @@ fluentbitplugin: promconfigvalidator: make -C ../prom-config-validator-builder +# add this back once golang 1.21 is supported in ado builds # targetallocator: # make -C ../otel-allocator From 6a405ec6348658d55b0704a1bbe0da55dc5bdc2b Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Thu, 4 Jan 2024 10:10:13 -0800 Subject: [PATCH 18/21] adding ta back to sdl with 1.21 --- .pipelines/azure-pipeline-build.yml | 4 ++-- otelcollector/opentelemetry-collector-builder/Makefile | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.pipelines/azure-pipeline-build.yml b/.pipelines/azure-pipeline-build.yml index 81ce6300f..33974baaa 100644 --- a/.pipelines/azure-pipeline-build.yml +++ b/.pipelines/azure-pipeline-build.yml @@ -255,7 +255,7 @@ jobs: - task: GoTool@0 displayName: "Build: specify golang version" inputs: - version: '1.20' + version: '1.21.0' - bash: | sudo apt-get install build-essential -y @@ -268,7 +268,7 @@ jobs: inputs: InputType: 'CommandLine' # Remove - $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator for targetallocator since go 1.21 is not yet supported by build pipeline, add this back once 1.21 is supported - arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' + arguments: 'analyze --rich-return-code $(Build.SourcesDirectory)/otelcollector/opentelemetry-collector-builder/otelcollector $(Build.SourcesDirectory)/otelcollector/prom-config-validator-builder/promconfigvalidator $(Build.SourcesDirectory)/otelcollector/otel-allocator/targetallocator $(Build.SourcesDirectory)/otelcollector/fluent-bit/src/out_appinsights.so' - task: Gosec@1 displayName: 'SDL: run gosec' diff --git a/otelcollector/opentelemetry-collector-builder/Makefile b/otelcollector/opentelemetry-collector-builder/Makefile index b8a064392..d194c8c73 100644 --- a/otelcollector/opentelemetry-collector-builder/Makefile +++ b/otelcollector/opentelemetry-collector-builder/Makefile @@ -1,4 +1,4 @@ -all: otelcollector fluentbitplugin promconfigvalidator #targetallocator +all: otelcollector fluentbitplugin promconfigvalidator targetallocator .PHONY: otelcollector otelcollector: @@ -13,8 +13,8 @@ promconfigvalidator: make -C ../prom-config-validator-builder # add this back once golang 1.21 is supported in ado builds -# targetallocator: -# make -C ../otel-allocator +targetallocator: + make -C ../otel-allocator configurationreader: make -C ../configuration-reader-builder \ No newline at end of file From 14ead7a98f34ec7a39aa36092bdef9bf3d9afbab Mon Sep 17 00:00:00 2001 From: Rashmi Chandrashekar Date: Thu, 4 Jan 2024 11:07:58 -0800 Subject: [PATCH 19/21] cleaning up unwanted files - secure supply chain --- .../prometheus-operator/bundle.yaml | 42057 ---------------- .../example/admission-webhook/deployment.yaml | 77 - .../example/non-rbac/prometheus-operator.yaml | 48 - .../prometheus-operator-deployment.yaml | 55 - .../shards/example-app-deployment.yaml | 20 - .../example/thanos/query-deployment.yaml | 32 - .../example-app-deployment.yaml | 20 - .../resources/basic-auth-app-deployment.yaml | 25 - 8 files changed, 42334 deletions(-) delete mode 100644 otelcollector/otel-allocator/prometheus-operator/bundle.yaml delete mode 100644 otelcollector/otel-allocator/prometheus-operator/example/admission-webhook/deployment.yaml delete mode 100644 otelcollector/otel-allocator/prometheus-operator/example/non-rbac/prometheus-operator.yaml delete mode 100644 otelcollector/otel-allocator/prometheus-operator/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml delete mode 100644 otelcollector/otel-allocator/prometheus-operator/example/shards/example-app-deployment.yaml delete mode 100644 otelcollector/otel-allocator/prometheus-operator/example/thanos/query-deployment.yaml delete mode 100644 otelcollector/otel-allocator/prometheus-operator/example/user-guides/getting-started/example-app-deployment.yaml delete mode 100644 otelcollector/otel-allocator/prometheus-operator/test/framework/resources/basic-auth-app-deployment.yaml diff --git a/otelcollector/otel-allocator/prometheus-operator/bundle.yaml b/otelcollector/otel-allocator/prometheus-operator/bundle.yaml deleted file mode 100644 index c5038807e..000000000 --- a/otelcollector/otel-allocator/prometheus-operator/bundle.yaml +++ /dev/null @@ -1,42057 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.11.1 - operator.prometheus.io/version: 0.69.1 - creationTimestamp: null - name: alertmanagerconfigs.monitoring.coreos.com -spec: - group: monitoring.coreos.com - names: - categories: - - prometheus-operator - kind: AlertmanagerConfig - listKind: AlertmanagerConfigList - plural: alertmanagerconfigs - shortNames: - - amcfg - singular: alertmanagerconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AlertmanagerConfig configures the Prometheus Alertmanager, specifying - how alerts should be grouped, inhibited and notified to external systems. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AlertmanagerConfigSpec is a specification of the desired - behavior of the Alertmanager configuration. By definition, the Alertmanager - configuration only applies to alerts for which the `namespace` label - is equal to the namespace of the AlertmanagerConfig resource. - properties: - inhibitRules: - description: List of inhibition rules. The rules will only apply to - alerts matching the resource's namespace. - items: - description: InhibitRule defines an inhibition rule that allows - to mute alerts when other alerts are already firing. See https://prometheus.io/docs/alerting/latest/configuration/#inhibit_rule - properties: - equal: - description: Labels that must have an equal value in the source - and target alert for the inhibition to take effect. - items: - type: string - type: array - sourceMatch: - description: Matchers for which one or more alerts have to exist - for the inhibition to take effect. The operator enforces that - the alert matches the resource's namespace. - items: - description: Matcher defines how to match on alert's labels. - properties: - matchType: - description: Match operation available with AlertManager - >= v0.22.0 and takes precedence over Regex (deprecated) - if non-empty. - enum: - - '!=' - - = - - =~ - - '!~' - type: string - name: - description: Label to match. - minLength: 1 - type: string - regex: - description: Whether to match on equality (false) or regular-expression - (true). Deprecated as of AlertManager >= v0.22.0 where - a user should use MatchType instead. - type: boolean - value: - description: Label value to match. - type: string - required: - - name - type: object - type: array - targetMatch: - description: Matchers that have to be fulfilled in the alerts - to be muted. The operator enforces that the alert matches - the resource's namespace. - items: - description: Matcher defines how to match on alert's labels. - properties: - matchType: - description: Match operation available with AlertManager - >= v0.22.0 and takes precedence over Regex (deprecated) - if non-empty. - enum: - - '!=' - - = - - =~ - - '!~' - type: string - name: - description: Label to match. - minLength: 1 - type: string - regex: - description: Whether to match on equality (false) or regular-expression - (true). Deprecated as of AlertManager >= v0.22.0 where - a user should use MatchType instead. - type: boolean - value: - description: Label value to match. - type: string - required: - - name - type: object - type: array - type: object - type: array - muteTimeIntervals: - description: List of MuteTimeInterval specifying when the routes should - be muted. - items: - description: MuteTimeInterval specifies the periods in time when - notifications will be muted - properties: - name: - description: Name of the time interval - type: string - timeIntervals: - description: TimeIntervals is a list of TimeInterval - items: - description: TimeInterval describes intervals of time - properties: - daysOfMonth: - description: DaysOfMonth is a list of DayOfMonthRange - items: - description: DayOfMonthRange is an inclusive range of - days of the month beginning at 1 - properties: - end: - description: End of the inclusive range - maximum: 31 - minimum: -31 - type: integer - start: - description: Start of the inclusive range - maximum: 31 - minimum: -31 - type: integer - type: object - type: array - months: - description: Months is a list of MonthRange - items: - description: MonthRange is an inclusive range of months - of the year beginning in January Months can be specified - by name (e.g 'January') by numerical month (e.g '1') - or as an inclusive range (e.g 'January:March', '1:3', - '1:March') - pattern: ^((?i)january|february|march|april|may|june|july|august|september|october|november|december|[1-12])(?:((:((?i)january|february|march|april|may|june|july|august|september|october|november|december|[1-12]))$)|$) - type: string - type: array - times: - description: Times is a list of TimeRange - items: - description: TimeRange defines a start and end time - in 24hr format - properties: - endTime: - description: EndTime is the end time in 24hr format. - pattern: ^((([01][0-9])|(2[0-3])):[0-5][0-9])$|(^24:00$) - type: string - startTime: - description: StartTime is the start time in 24hr - format. - pattern: ^((([01][0-9])|(2[0-3])):[0-5][0-9])$|(^24:00$) - type: string - type: object - type: array - weekdays: - description: Weekdays is a list of WeekdayRange - items: - description: WeekdayRange is an inclusive range of days - of the week beginning on Sunday Days can be specified - by name (e.g 'Sunday') or as an inclusive range (e.g - 'Monday:Friday') - pattern: ^((?i)sun|mon|tues|wednes|thurs|fri|satur)day(?:((:(sun|mon|tues|wednes|thurs|fri|satur)day)$)|$) - type: string - type: array - years: - description: Years is a list of YearRange - items: - description: YearRange is an inclusive range of years - pattern: ^2\d{3}(?::2\d{3}|$) - type: string - type: array - type: object - type: array - type: object - type: array - receivers: - description: List of receivers. - items: - description: Receiver defines one or more notification integrations. - properties: - discordConfigs: - description: List of Discord configurations. - items: - description: DiscordConfig configures notifications via Discord. - See https://prometheus.io/docs/alerting/latest/configuration/#discord_config - properties: - apiURL: - description: The secret's key that contains the Discord - webhook URL. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: The template of the message's body. - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - title: - description: The template of the message's title. - type: string - required: - - apiURL - type: object - type: array - emailConfigs: - description: List of Email configurations. - items: - description: EmailConfig configures notifications via Email. - properties: - authIdentity: - description: The identity to use for authentication. - type: string - authPassword: - description: The secret's key that contains the password - to use for authentication. The secret needs to be in - the same namespace as the AlertmanagerConfig object - and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - authSecret: - description: The secret's key that contains the CRAM-MD5 - secret. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - authUsername: - description: The username to use for authentication. - type: string - from: - description: The sender address. - type: string - headers: - description: Further headers email header key/value pairs. - Overrides any headers previously set by the notification - implementation. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - hello: - description: The hostname to identify to the SMTP server. - type: string - html: - description: The HTML body of the email notification. - type: string - requireTLS: - description: The SMTP TLS requirement. Note that Go does - not support unencrypted connections to remote SMTP endpoints. - type: boolean - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - smarthost: - description: The SMTP host and port through which emails - are sent. E.g. example.com:25 - type: string - text: - description: The text body of the email notification. - type: string - tlsConfig: - description: TLS configuration - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to use - for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for - the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when doing - client-authentication. - properties: - configMap: - description: ConfigMap containing data to use - for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for - the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key file - for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the targets. - type: string - type: object - to: - description: The email address to send notifications to. - type: string - type: object - type: array - msteamsConfigs: - description: List of MSTeams configurations. It requires Alertmanager - >= 0.26.0. - items: - description: MSTeamsConfig configures notifications via Microsoft - Teams. It requires Alertmanager >= 0.26.0. - properties: - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - sendResolved: - description: Whether to notify about resolved alerts. - type: boolean - text: - description: Message body template. - type: string - title: - description: Message title template. - type: string - webhookUrl: - description: MSTeams webhook URL. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - required: - - webhookUrl - type: object - type: array - name: - description: Name of the receiver. Must be unique across all - items from the list. - minLength: 1 - type: string - opsgenieConfigs: - description: List of OpsGenie configurations. - items: - description: OpsGenieConfig configures notifications via OpsGenie. - See https://prometheus.io/docs/alerting/latest/configuration/#opsgenie_config - properties: - actions: - description: Comma separated list of actions that will - be available for the alert. - type: string - apiKey: - description: The secret's key that contains the OpsGenie - API key. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - apiURL: - description: The URL to send OpsGenie API requests to. - type: string - description: - description: Description of the incident. - type: string - details: - description: A set of arbitrary key/value pairs that provide - further detail about the incident. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entity: - description: Optional field that can be used to specify - which domain alert is related to. - type: string - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: Alert text limited to 130 characters. - type: string - note: - description: Additional alert note. - type: string - priority: - description: Priority level of alert. Possible values - are P1, P2, P3, P4, and P5. - type: string - responders: - description: List of responders responsible for notifications. - items: - description: OpsGenieConfigResponder defines a responder - to an incident. One of `id`, `name` or `username` - has to be defined. - properties: - id: - description: ID of the responder. - type: string - name: - description: Name of the responder. - type: string - type: - description: Type of responder. - enum: - - team - - teams - - user - - escalation - - schedule - minLength: 1 - type: string - username: - description: Username of the responder. - type: string - required: - - type - type: object - type: array - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - source: - description: Backlink to the sender of the notification. - type: string - tags: - description: Comma separated list of tags attached to - the notifications. - type: string - updateAlerts: - description: Whether to update message and description - of the alert in OpsGenie if it already exists By default, - the alert is never updated in OpsGenie, the new message - only appears in activity log. - type: boolean - type: object - type: array - pagerdutyConfigs: - description: List of PagerDuty configurations. - items: - description: PagerDutyConfig configures notifications via - PagerDuty. See https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config - properties: - class: - description: The class/type of the event. - type: string - client: - description: Client identification. - type: string - clientURL: - description: Backlink to the sender of notification. - type: string - component: - description: The part or component of the affected system - that is broken. - type: string - description: - description: Description of the incident. - type: string - details: - description: Arbitrary key/value pairs that provide further - detail about the incident. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - group: - description: A cluster or grouping of sources. - type: string - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - pagerDutyImageConfigs: - description: A list of image details to attach that provide - further detail about an incident. - items: - description: PagerDutyImageConfig attaches images to - an incident - properties: - alt: - description: Alt is the optional alternative text - for the image. - type: string - href: - description: Optional URL; makes the image a clickable - link. - type: string - src: - description: Src of the image being attached to - the incident - type: string - type: object - type: array - pagerDutyLinkConfigs: - description: A list of link details to attach that provide - further detail about an incident. - items: - description: PagerDutyLinkConfig attaches text links - to an incident - properties: - alt: - description: Text that describes the purpose of - the link, and can be used as the link's text. - type: string - href: - description: Href is the URL of the link to be attached - type: string - type: object - type: array - routingKey: - description: The secret's key that contains the PagerDuty - integration key (when using Events API v2). Either this - field or `serviceKey` needs to be defined. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - serviceKey: - description: The secret's key that contains the PagerDuty - service key (when using integration type "Prometheus"). - Either this field or `routingKey` needs to be defined. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - severity: - description: Severity of the incident. - type: string - url: - description: The URL to send requests to. - type: string - type: object - type: array - pushoverConfigs: - description: List of Pushover configurations. - items: - description: PushoverConfig configures notifications via Pushover. - See https://prometheus.io/docs/alerting/latest/configuration/#pushover_config - properties: - expire: - description: How long your notification will continue - to be retried for, unless the user acknowledges the - notification. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ - type: string - html: - description: Whether notification message is HTML or plain - text. - type: boolean - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: Notification message. - type: string - priority: - description: Priority, see https://pushover.net/api#priority - type: string - retry: - description: How often the Pushover servers will send - the same notification to the user. Must be at least - 30 seconds. - pattern: ^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$ - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - sound: - description: The name of one of the sounds supported by - device clients to override the user's default sound - choice - type: string - title: - description: Notification title. - type: string - token: - description: The secret's key that contains the registered - application's API token, see https://pushover.net/apps. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. Either `token` or `tokenFile` is required. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - tokenFile: - description: The token file that contains the registered - application's API token, see https://pushover.net/apps. - Either `token` or `tokenFile` is required. It requires - Alertmanager >= v0.26.0. - type: string - url: - description: A supplementary URL shown alongside the message. - type: string - urlTitle: - description: A title for supplementary URL, otherwise - just the URL is shown - type: string - userKey: - description: The secret's key that contains the recipient - user's user key. The secret needs to be in the same - namespace as the AlertmanagerConfig object and accessible - by the Prometheus Operator. Either `userKey` or `userKeyFile` - is required. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - userKeyFile: - description: The user key file that contains the recipient - user's user key. Either `userKey` or `userKeyFile` is - required. It requires Alertmanager >= v0.26.0. - type: string - type: object - type: array - slackConfigs: - description: List of Slack configurations. - items: - description: SlackConfig configures notifications via Slack. - See https://prometheus.io/docs/alerting/latest/configuration/#slack_config - properties: - actions: - description: A list of Slack actions that are sent with - each notification. - items: - description: SlackAction configures a single Slack action - that is sent with each notification. See https://api.slack.com/docs/message-attachments#action_fields - and https://api.slack.com/docs/message-buttons for - more information. - properties: - confirm: - description: SlackConfirmationField protect users - from destructive actions or particularly distinguished - decisions by asking them to confirm their button - click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields - for more information. - properties: - dismissText: - type: string - okText: - type: string - text: - minLength: 1 - type: string - title: - type: string - required: - - text - type: object - name: - type: string - style: - type: string - text: - minLength: 1 - type: string - type: - minLength: 1 - type: string - url: - type: string - value: - type: string - required: - - text - - type - type: object - type: array - apiURL: - description: The secret's key that contains the Slack - webhook URL. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - callbackId: - type: string - channel: - description: The channel or user to send notifications - to. - type: string - color: - type: string - fallback: - type: string - fields: - description: A list of Slack fields that are sent with - each notification. - items: - description: SlackField configures a single Slack field - that is sent with each notification. Each field must - contain a title, value, and optionally, a boolean - value to indicate if the field is short enough to - be displayed next to other fields designated as short. - See https://api.slack.com/docs/message-attachments#fields - for more information. - properties: - short: - type: boolean - title: - minLength: 1 - type: string - value: - minLength: 1 - type: string - required: - - title - - value - type: object - type: array - footer: - type: string - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - iconEmoji: - type: string - iconURL: - type: string - imageURL: - type: string - linkNames: - type: boolean - mrkdwnIn: - items: - type: string - type: array - pretext: - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - shortFields: - type: boolean - text: - type: string - thumbURL: - type: string - title: - type: string - titleLink: - type: string - username: - type: string - type: object - type: array - snsConfigs: - description: List of SNS configurations - items: - description: SNSConfig configures notifications via AWS SNS. - See https://prometheus.io/docs/alerting/latest/configuration/#sns_configs - properties: - apiURL: - description: The SNS API URL i.e. https://sns.us-east-2.amazonaws.com. - If not specified, the SNS API URL from the SNS SDK will - be used. - type: string - attributes: - additionalProperties: - type: string - description: SNS message attributes. - type: object - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: The message content of the SNS notification. - type: string - phoneNumber: - description: Phone number if message is delivered via - SMS in E.164 format. If you don't specify this value, - you must specify a value for the TopicARN or TargetARN. - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - sigv4: - description: Configures AWS's Signature Verification 4 - signing process to sign requests. - properties: - accessKey: - description: AccessKey is the AWS API key. If not - specified, the environment variable `AWS_ACCESS_KEY_ID` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - profile: - description: Profile is the named AWS profile used - to authenticate. - type: string - region: - description: Region is the AWS region. If blank, the - region from the default credentials chain used. - type: string - roleArn: - description: RoleArn is the named AWS profile used - to authenticate. - type: string - secretKey: - description: SecretKey is the AWS API secret. If not - specified, the environment variable `AWS_SECRET_ACCESS_KEY` - is used. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - subject: - description: Subject line when the message is delivered - to email endpoints. - type: string - targetARN: - description: The mobile platform endpoint ARN if message - is delivered via mobile notifications. If you don't - specify this value, you must specify a value for the - topic_arn or PhoneNumber. - type: string - topicARN: - description: SNS topic ARN, i.e. arn:aws:sns:us-east-2:698519295917:My-Topic - If you don't specify this value, you must specify a - value for the PhoneNumber or TargetARN. - type: string - type: object - type: array - telegramConfigs: - description: List of Telegram configurations. - items: - description: TelegramConfig configures notifications via Telegram. - See https://prometheus.io/docs/alerting/latest/configuration/#telegram_config - properties: - apiURL: - description: The Telegram API URL i.e. https://api.telegram.org. - If not specified, default API URL will be used. - type: string - botToken: - description: "Telegram bot token. It is mutually exclusive - with `botTokenFile`. The secret needs to be in the same - namespace as the AlertmanagerConfig object and accessible - by the Prometheus Operator. \n Either `botToken` or - `botTokenFile` is required." - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - botTokenFile: - description: "File to read the Telegram bot token from. - It is mutually exclusive with `botToken`. Either `botToken` - or `botTokenFile` is required. \n It requires Alertmanager - >= v0.26.0." - type: string - chatID: - description: The Telegram chat ID. - format: int64 - type: integer - disableNotifications: - description: Disable telegram notifications - type: boolean - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: Message template - type: string - parseMode: - description: Parse mode for telegram message - enum: - - MarkdownV2 - - Markdown - - HTML - type: string - sendResolved: - description: Whether to notify about resolved alerts. - type: boolean - type: object - type: array - victoropsConfigs: - description: List of VictorOps configurations. - items: - description: VictorOpsConfig configures notifications via - VictorOps. See https://prometheus.io/docs/alerting/latest/configuration/#victorops_config - properties: - apiKey: - description: The secret's key that contains the API key - to use when talking to the VictorOps API. The secret - needs to be in the same namespace as the AlertmanagerConfig - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - apiUrl: - description: The VictorOps API URL. - type: string - customFields: - description: Additional custom fields for notification. - items: - description: KeyValue defines a (key, value) tuple. - properties: - key: - description: Key of the tuple. - minLength: 1 - type: string - value: - description: Value of the tuple. - type: string - required: - - key - - value - type: object - type: array - entityDisplayName: - description: Contains summary of the alerted problem. - type: string - httpConfig: - description: The HTTP client's configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - messageType: - description: Describes the behavior of the alert (CRITICAL, - WARNING, INFO). - type: string - monitoringTool: - description: The monitoring tool the state message is - from. - type: string - routingKey: - description: A key used to map the alert to a team. - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - stateMessage: - description: Contains long explanation of the alerted - problem. - type: string - type: object - type: array - webexConfigs: - description: List of Webex configurations. - items: - description: WebexConfig configures notification via Cisco - Webex See https://prometheus.io/docs/alerting/latest/configuration/#webex_config - properties: - apiURL: - description: The Webex Teams API URL i.e. https://webexapis.com/v1/messages - Provide if different from the default API URL. - pattern: ^https?://.+$ - type: string - httpConfig: - description: The HTTP client's configuration. You must - supply the bot token via the `httpConfig.authorization` - field. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: Message template - type: string - roomID: - description: ID of the Webex Teams room where to send - the messages. - minLength: 1 - type: string - sendResolved: - description: Whether to notify about resolved alerts. - type: boolean - required: - - roomID - type: object - type: array - webhookConfigs: - description: List of webhook configurations. - items: - description: WebhookConfig configures notifications via a - generic receiver supporting the webhook payload. See https://prometheus.io/docs/alerting/latest/configuration/#webhook_config - properties: - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - maxAlerts: - description: Maximum number of alerts to be sent per webhook - message. When 0, all alerts are included. - format: int32 - minimum: 0 - type: integer - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - url: - description: The URL to send HTTP POST requests to. `urlSecret` - takes precedence over `url`. One of `urlSecret` and - `url` should be defined. - type: string - urlSecret: - description: The secret's key that contains the webhook - URL to send HTTP requests to. `urlSecret` takes precedence - over `url`. One of `urlSecret` and `url` should be defined. - The secret needs to be in the same namespace as the - AlertmanagerConfig object and accessible by the Prometheus - Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - type: object - type: array - wechatConfigs: - description: List of WeChat configurations. - items: - description: WeChatConfig configures notifications via WeChat. - See https://prometheus.io/docs/alerting/latest/configuration/#wechat_config - properties: - agentID: - type: string - apiSecret: - description: The secret's key that contains the WeChat - API key. The secret needs to be in the same namespace - as the AlertmanagerConfig object and accessible by the - Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - apiURL: - description: The WeChat API URL. - type: string - corpID: - description: The corp id for authentication. - type: string - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for - the client. This is mutually exclusive with BasicAuth - and is only available starting from Alertmanager - v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the - namespace that contains the credentials for - authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. - The value is case-insensitive. \n \"Basic\" - is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, - BasicAuth takes precedence. - properties: - password: - description: The secret in the service monitor - namespace that contains the password for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor - namespace that contains the username for authentication. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. - The secret needs to be in the same namespace as - the AlertmanagerConfig object and accessible by - the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - followRedirects: - description: FollowRedirects specifies whether the - client should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch - a token for the targets. - properties: - clientId: - description: The secret or configmap containing - the OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 - client secret - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token - URL - type: object - scopes: - description: OAuth2 scopes used for the token - request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when - doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to - use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use - for the targets. - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key - file for the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the - targets. - type: string - type: object - type: object - message: - description: API request data as defined by the WeChat - API. - type: string - messageType: - type: string - sendResolved: - description: Whether or not to notify about resolved alerts. - type: boolean - toParty: - type: string - toTag: - type: string - toUser: - type: string - type: object - type: array - required: - - name - type: object - type: array - route: - description: The Alertmanager route definition for alerts matching - the resource's namespace. If present, it will be added to the generated - Alertmanager configuration as a first-level route. - properties: - activeTimeIntervals: - description: ActiveTimeIntervals is a list of MuteTimeInterval - names when this route should be active. - items: - type: string - type: array - continue: - description: Boolean indicating whether an alert should continue - matching subsequent sibling nodes. It will always be overridden - to true for the first-level route by the Prometheus operator. - type: boolean - groupBy: - description: List of labels to group by. Labels must not be repeated - (unique list). Special label "..." (aggregate by all possible - labels), if provided, must be the only element in the list. - items: - type: string - type: array - groupInterval: - description: 'How long to wait before sending an updated notification. - Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` - Example: "5m"' - type: string - groupWait: - description: 'How long to wait before sending the initial notification. - Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` - Example: "30s"' - type: string - matchers: - description: 'List of matchers that the alert''s labels should - match. For the first level route, the operator removes any existing - equality and regexp matcher on the `namespace` label and adds - a `namespace: ` matcher.' - items: - description: Matcher defines how to match on alert's labels. - properties: - matchType: - description: Match operation available with AlertManager - >= v0.22.0 and takes precedence over Regex (deprecated) - if non-empty. - enum: - - '!=' - - = - - =~ - - '!~' - type: string - name: - description: Label to match. - minLength: 1 - type: string - regex: - description: Whether to match on equality (false) or regular-expression - (true). Deprecated as of AlertManager >= v0.22.0 where - a user should use MatchType instead. - type: boolean - value: - description: Label value to match. - type: string - required: - - name - type: object - type: array - muteTimeIntervals: - description: 'Note: this comment applies to the field definition - above but appears below otherwise it gets included in the generated - manifest. CRD schema doesn''t support self-referential types - for now (see https://github.com/kubernetes/kubernetes/issues/62872). - We have to use an alternative type to circumvent the limitation. - The downside is that the Kube API can''t validate the data beyond - the fact that it is a valid JSON representation. MuteTimeIntervals - is a list of MuteTimeInterval names that will mute this route - when matched,' - items: - type: string - type: array - receiver: - description: Name of the receiver for this route. If not empty, - it should be listed in the `receivers` field. - type: string - repeatInterval: - description: 'How long to wait before repeating the last notification. - Must match the regular expression`^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$` - Example: "4h"' - type: string - routes: - description: Child routes. - items: - x-kubernetes-preserve-unknown-fields: true - type: array - type: object - type: object - required: - - spec - type: object - served: true - storage: true ---- ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.11.1 - operator.prometheus.io/version: 0.69.1 - creationTimestamp: null - name: alertmanagers.monitoring.coreos.com -spec: - group: monitoring.coreos.com - names: - categories: - - prometheus-operator - kind: Alertmanager - listKind: AlertmanagerList - plural: alertmanagers - shortNames: - - am - singular: alertmanager - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The version of Alertmanager - jsonPath: .spec.version - name: Version - type: string - - description: The number of desired replicas - jsonPath: .spec.replicas - name: Replicas - type: integer - - description: The number of ready replicas - jsonPath: .status.availableReplicas - name: Ready - type: integer - - jsonPath: .status.conditions[?(@.type == 'Reconciled')].status - name: Reconciled - type: string - - jsonPath: .status.conditions[?(@.type == 'Available')].status - name: Available - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Whether the resource reconciliation is paused or not - jsonPath: .status.paused - name: Paused - priority: 1 - type: boolean - name: v1 - schema: - openAPIV3Schema: - description: Alertmanager describes an Alertmanager cluster. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: 'Specification of the desired behavior of the Alertmanager - cluster. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - additionalPeers: - description: AdditionalPeers allows injecting a set of additional - Alertmanagers to peer with to form a highly available cluster. - items: - type: string - type: array - affinity: - description: If specified, the pod's scheduling constraints. - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the - pod. - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the affinity expressions specified by - this field, but it may choose a node that violates one or - more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node matches - the corresponding matchExpressions; the node(s) with the - highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches - all objects with implicit weight 0 (i.e. it's a no-op). - A null preferred scheduling term matches no objects (i.e. - is also a no-op). - properties: - preference: - description: A node selector term, associated with the - corresponding weight. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - x-kubernetes-map-type: atomic - weight: - description: Weight associated with matching the corresponding - nodeSelectorTerm, in the range 1-100. - format: int32 - type: integer - required: - - preference - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not be - scheduled onto the node. If the affinity requirements specified - by this field cease to be met at some point during pod execution - (e.g. due to an update), the system may or may not try to - eventually evict the pod from its node. - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. - The terms are ORed. - items: - description: A null or empty node selector term matches - no objects. The requirements of them are ANDed. The - TopologySelectorTerm type implements a subset of the - NodeSelectorTerm. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - x-kubernetes-map-type: atomic - type: array - required: - - nodeSelectorTerms - type: object - x-kubernetes-map-type: atomic - type: object - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate - this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the affinity expressions specified by - this field, but it may choose a node that violates one or - more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node has - pods which matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied - to the union of the namespaces selected by this - field and the ones listed in the namespaces field. - null selector and null or empty namespaces list - means "this pod's namespace". An empty selector - ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list - of namespace names that the term applies to. The - term is applied to the union of the namespaces - listed in this field and the ones selected by - namespaceSelector. null or empty namespaces list - and null namespaceSelector means "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not be - scheduled onto the node. If the affinity requirements specified - by this field cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may or may - not try to eventually evict the pod from its node. When - there are multiple elements, the lists of nodes corresponding - to each podAffinityTerm are intersected, i.e. all terms - must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which a pod of the set of - pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied to the - union of the namespaces selected by this field and - the ones listed in the namespaces field. null selector - and null or empty namespaces list means "this pod's - namespace". An empty selector ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace - names that the term applies to. The term is applied - to the union of the namespaces listed in this field - and the ones selected by namespaceSelector. null or - empty namespaces list and null namespaceSelector means - "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods matching - the labelSelector in the specified namespaces, where - co-located is defined as running on a node whose value - of the label with key topologyKey matches that of - any node on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. - avoid putting this pod in the same node, zone, etc. as some - other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the anti-affinity expressions specified - by this field, but it may choose a node that violates one - or more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling anti-affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node has - pods which matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied - to the union of the namespaces selected by this - field and the ones listed in the namespaces field. - null selector and null or empty namespaces list - means "this pod's namespace". An empty selector - ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list - of namespace names that the term applies to. The - term is applied to the union of the namespaces - listed in this field and the ones selected by - namespaceSelector. null or empty namespaces list - and null namespaceSelector means "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by - this field are not met at scheduling time, the pod will - not be scheduled onto the node. If the anti-affinity requirements - specified by this field cease to be met at some point during - pod execution (e.g. due to a pod label update), the system - may or may not try to eventually evict the pod from its - node. When there are multiple elements, the lists of nodes - corresponding to each podAffinityTerm are intersected, i.e. - all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which a pod of the set of - pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied to the - union of the namespaces selected by this field and - the ones listed in the namespaces field. null selector - and null or empty namespaces list means "this pod's - namespace". An empty selector ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace - names that the term applies to. The term is applied - to the union of the namespaces listed in this field - and the ones selected by namespaceSelector. null or - empty namespaces list and null namespaceSelector means - "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods matching - the labelSelector in the specified namespaces, where - co-located is defined as running on a node whose value - of the label with key topologyKey matches that of - any node on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - type: object - alertmanagerConfigMatcherStrategy: - description: The AlertmanagerConfigMatcherStrategy defines how AlertmanagerConfig - objects match the alerts. In the future more options may be added. - properties: - type: - default: OnNamespace - description: If set to `OnNamespace`, the operator injects a label - matcher matching the namespace of the AlertmanagerConfig object - for all its routes and inhibition rules. `None` will not add - any additional matchers other than the ones specified in the - AlertmanagerConfig. Default is `OnNamespace`. - enum: - - OnNamespace - - None - type: string - type: object - alertmanagerConfigNamespaceSelector: - description: Namespaces to be selected for AlertmanagerConfig discovery. - If nil, only check own namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: key is the label key that the selector applies - to. - type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - alertmanagerConfigSelector: - description: AlertmanagerConfigs to be selected for to merge and configure - Alertmanager with. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: key is the label key that the selector applies - to. - type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - alertmanagerConfiguration: - description: 'EXPERIMENTAL: alertmanagerConfiguration specifies the - configuration of Alertmanager. If defined, it takes precedence over - the `configSecret` field. This field may change in future releases.' - properties: - global: - description: Defines the global parameters of the Alertmanager - configuration. - properties: - httpConfig: - description: HTTP client configuration. - properties: - authorization: - description: Authorization header configuration for the - client. This is mutually exclusive with BasicAuth and - is only available starting from Alertmanager v0.22+. - properties: - credentials: - description: Selects a key of a Secret in the namespace - that contains the credentials for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. The - value is case-insensitive. \n \"Basic\" is not a - supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: BasicAuth for the client. This is mutually - exclusive with Authorization. If both are defined, BasicAuth - takes precedence. - properties: - password: - description: The secret in the service monitor namespace - that contains the password for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor namespace - that contains the username for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: The secret's key that contains the bearer - token to be used by the client for authentication. The - secret needs to be in the same namespace as the Alertmanager - object and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - followRedirects: - description: FollowRedirects specifies whether the client - should follow HTTP 3xx redirects. - type: boolean - oauth2: - description: OAuth2 client credentials used to fetch a - token for the targets. - properties: - clientId: - description: The secret or configmap containing the - OAuth2 client id - properties: - configMap: - description: ConfigMap containing data to use - for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for - the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 client - secret - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token URL - type: object - scopes: - description: OAuth2 scopes used for the token request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - proxyURL: - description: Optional proxy URL. - type: string - tlsConfig: - description: TLS configuration for the client. - properties: - ca: - description: Certificate authority used when verifying - server certificates. - properties: - configMap: - description: ConfigMap containing data to use - for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for - the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when doing - client-authentication. - properties: - configMap: - description: ConfigMap containing data to use - for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for - the targets. - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key file - for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the targets. - type: string - type: object - type: object - opsGenieApiKey: - description: The default OpsGenie API Key. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - opsGenieApiUrl: - description: The default OpsGenie API URL. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - pagerdutyUrl: - description: The default Pagerduty URL. - type: string - resolveTimeout: - description: ResolveTimeout is the default value used by alertmanager - if the alert does not include EndsAt, after this time passes - it can declare the alert as resolved if it has not been - updated. This has no impact on alerts from Prometheus, as - they always include EndsAt. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - slackApiUrl: - description: The default Slack API URL. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - smtp: - description: Configures global SMTP parameters. - properties: - authIdentity: - description: SMTP Auth using PLAIN - type: string - authPassword: - description: SMTP Auth using LOGIN and PLAIN. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - authSecret: - description: SMTP Auth using CRAM-MD5. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - authUsername: - description: SMTP Auth using CRAM-MD5, LOGIN and PLAIN. - If empty, Alertmanager doesn't authenticate to the SMTP - server. - type: string - from: - description: The default SMTP From header field. - type: string - hello: - description: The default hostname to identify to the SMTP - server. - type: string - requireTLS: - description: The default SMTP TLS requirement. Note that - Go does not support unencrypted connections to remote - SMTP endpoints. - type: boolean - smartHost: - description: The default SMTP smarthost used for sending - emails. - properties: - host: - description: Defines the host's address, it can be - a DNS name or a literal IP address. - minLength: 1 - type: string - port: - description: Defines the host's port, it can be a - literal port number or a port name. - minLength: 1 - type: string - required: - - host - - port - type: object - type: object - type: object - name: - description: The name of the AlertmanagerConfig resource which - is used to generate the Alertmanager configuration. It must - be defined in the same namespace as the Alertmanager object. - The operator will not enforce a `namespace` label for routes - and inhibition rules. - minLength: 1 - type: string - templates: - description: Custom notification templates. - items: - description: SecretOrConfigMap allows to specify data as a Secret - or ConfigMap. Fields are mutually exclusive. - properties: - configMap: - description: ConfigMap containing data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - type: array - type: object - automountServiceAccountToken: - description: 'AutomountServiceAccountToken indicates whether a service - account token should be automatically mounted in the pod. If the - service account has `automountServiceAccountToken: true`, set the - field to `false` to opt out of automounting API credentials.' - type: boolean - baseImage: - description: 'Base image that is used to deploy pods, without tag. - Deprecated: use ''image'' instead' - type: string - clusterAdvertiseAddress: - description: 'ClusterAdvertiseAddress is the explicit address to advertise - in cluster. Needs to be provided for non RFC1918 [1] (public) addresses. - [1] RFC1918: https://tools.ietf.org/html/rfc1918' - type: string - clusterGossipInterval: - description: Interval between gossip attempts. - pattern: ^(0|(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - clusterPeerTimeout: - description: Timeout for cluster peering. - pattern: ^(0|(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - clusterPushpullInterval: - description: Interval between pushpull attempts. - pattern: ^(0|(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - configMaps: - description: ConfigMaps is a list of ConfigMaps in the same namespace - as the Alertmanager object, which shall be mounted into the Alertmanager - Pods. Each ConfigMap is added to the StatefulSet definition as a - volume named `configmap-`. The ConfigMaps are mounted - into `/etc/alertmanager/configmaps/` in the 'alertmanager' - container. - items: - type: string - type: array - configSecret: - description: "ConfigSecret is the name of a Kubernetes Secret in the - same namespace as the Alertmanager object, which contains the configuration - for this Alertmanager instance. If empty, it defaults to `alertmanager-`. - \n The Alertmanager configuration should be available under the - `alertmanager.yaml` key. Additional keys from the original secret - are copied to the generated secret and mounted into the `/etc/alertmanager/config` - directory in the `alertmanager` container. \n If either the secret - or the `alertmanager.yaml` key is missing, the operator provisions - a minimal Alertmanager configuration with one empty receiver (effectively - dropping alert notifications)." - type: string - containers: - description: 'Containers allows injecting additional containers. This - is meant to allow adding an authentication proxy to an Alertmanager - pod. Containers described here modify an operator generated container - if they share the same name and modifications are done via a strategic - merge patch. The current container names are: `alertmanager` and - `config-reloader`. Overriding containers is entirely outside the - scope of what the maintainers will support and by doing so, you - accept that this behaviour may break at any time without notice.' - items: - description: A single application container that you want to run - within a pod. - properties: - args: - description: 'Arguments to the entrypoint. The container image''s - CMD is used if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If a variable - cannot be resolved, the reference in the input string will - be unchanged. Double $$ are reduced to a single $, which allows - for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will - produce the string literal "$(VAR_NAME)". Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - command: - description: 'Entrypoint array. Not executed within a shell. - The container image''s ENTRYPOINT is used if this is not provided. - Variable references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) syntax: - i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". - Escaped references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - env: - description: List of environment variables to set in the container. - Cannot be updated. - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must be - a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in the - input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) - syntax: i.e. "$$(VAR_NAME)" will produce the string - literal "$(VAR_NAME)". Escaped references will never - be expanded, regardless of whether the variable exists - or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, limits.ephemeral-storage, requests.cpu, - requests.memory and requests.ephemeral-storage) - are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must be - a C_IDENTIFIER. All invalid keys will be reported as an event - when the container is starting. When a key exists in multiple - sources, the value associated with the last source will take - precedence. Values defined by an Env with a duplicate key - will take precedence. Cannot be updated. - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap must be - defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - description: 'Container image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management system should take - in response to container lifecycle events. Cannot be updated. - properties: - postStart: - description: 'PostStart is called immediately after a container - is created. If the handler fails, the container is terminated - and restarted according to its restart policy. Other management - of the container blocks until the hook completes. More - info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - preStop: - description: 'PreStop is called immediately before a container - is terminated due to an API request or management event - such as liveness/startup probe failure, preemption, resource - contention, etc. The handler is not called if the container - crashes or exits. The Pod''s termination grace period - countdown begins before the PreStop hook is executed. - Regardless of the outcome of the handler, the container - will eventually terminate within the Pod''s termination - grace period (unless delayed by finalizers). Other management - of the container blocks until the hook completes or until - the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - type: object - livenessProbe: - description: 'Periodic probe of container liveness. Container - will be restarted if the probe fails. Cannot be updated. More - info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - ports: - description: List of ports to expose from the container. Not - specifying a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from the network. - Modifying this array with strategic merge patch may corrupt - the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. - Cannot be updated. - items: - description: ContainerPort represents a network port in a - single container. - properties: - containerPort: - description: Number of port to expose on the pod's IP - address. This must be a valid port number, 0 < x < 65536. - format: int32 - type: integer - hostIP: - description: What host IP to bind the external port to. - type: string - hostPort: - description: Number of port to expose on the host. If - specified, this must be a valid port number, 0 < x < - 65536. If HostNetwork is specified, this must match - ContainerPort. Most containers do not need this. - format: int32 - type: integer - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a pod - must have a unique name. Name for the port that can - be referred to by services. - type: string - protocol: - default: TCP - description: Protocol for port. Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - required: - - containerPort - type: object - type: array - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container service readiness. - Container will be removed from service endpoints if the probe - fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - resizePolicy: - description: Resources resize policy for the container. - items: - description: ContainerResizePolicy represents resource resize - policy for the container. - properties: - resourceName: - description: 'Name of the resource to which this resource - resize policy applies. Supported values: cpu, memory.' - type: string - restartPolicy: - description: Restart policy to apply when specified resource - is resized. If not specified, it defaults to NotRequired. - type: string - required: - - resourceName - - restartPolicy - type: object - type: array - x-kubernetes-list-type: atomic - resources: - description: 'Compute Resources required by this container. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - properties: - claims: - description: "Claims lists the names of resources, defined - in spec.resourceClaims, that are used by this container. - \n This is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It can only - be set for containers." - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of one entry - in pod.spec.resourceClaims of the Pod where this - field is used. It makes that resource available - inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests - cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - restartPolicy: - description: 'RestartPolicy defines the restart behavior of - individual containers in a pod. This field may only be set - for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, - the restart behavior is defined by the Pod''s restart policy - and the container type. Setting the RestartPolicy as "Always" - for the init container will have the following effect: this - init container will be continually restarted on exit until - all regular containers have terminated. Once all regular containers - have completed, all init containers with restartPolicy "Always" - will be shut down. This lifecycle differs from normal init - containers and is often referred to as a "sidecar" container. - Although this init container still starts in the init container - sequence, it does not wait for the container to complete before - proceeding to the next init container. Instead, the next init - container starts immediately after this init container is - started, or after any startupProbe has successfully completed.' - type: string - securityContext: - description: 'SecurityContext defines the security options the - container should be run with. If set, the fields of SecurityContext - override the equivalent fields of PodSecurityContext. More - info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag will - be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN Note that this field cannot be set - when spec.os.name is windows.' - type: boolean - capabilities: - description: The capabilities to add/drop when running containers. - Defaults to the default set of capabilities granted by - the container runtime. Note that this field cannot be - set when spec.os.name is windows. - properties: - add: - description: Added capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - drop: - description: Removed capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - type: object - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent to - root on the host. Defaults to false. Note that this field - cannot be set when spec.os.name is windows. - type: boolean - procMount: - description: procMount denotes the type of proc mount to - use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. Note that this field cannot - be set when spec.os.name is windows. - type: string - readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. Note that this field cannot - be set when spec.os.name is windows. - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as a - non-root user. If true, the Kubelet will validate the - image at runtime to ensure that it does not run as UID - 0 (root) and fail to start the container if it does. If - unset or false, no such validation will be performed. - May also be set in PodSecurityContext. If set in both - SecurityContext and PodSecurityContext, the value specified - in SecurityContext takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. Note - that this field cannot be set when spec.os.name is windows. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to the container. - If unspecified, the container runtime will allocate a - random SELinux context for each container. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - properties: - level: - description: Level is SELinux level label that applies - to the container. - type: string - role: - description: Role is a SELinux role label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - type: object - seccompProfile: - description: The seccomp options to use by this container. - If seccomp options are provided at both the pod & container - level, the container options override the pod options. - Note that this field cannot be set when spec.os.name is - windows. - properties: - localhostProfile: - description: localhostProfile indicates a profile defined - in a file on the node should be used. The profile - must be preconfigured on the node to work. Must be - a descending path, relative to the kubelet's configured - seccomp profile location. Must be set if type is "Localhost". - Must NOT be set for any other type. - type: string - type: - description: "type indicates which kind of seccomp profile - will be applied. Valid options are: \n Localhost - - a profile defined in a file on the node should be - used. RuntimeDefault - the container runtime default - profile should be used. Unconfined - no profile should - be applied." - type: string - required: - - type - type: object - windowsOptions: - description: The Windows specific settings applied to all - containers. If unspecified, the options from the PodSecurityContext - will be used. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - Note that this field cannot be set when spec.os.name is - linux. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. - type: string - hostProcess: - description: HostProcess determines if a container should - be run as a 'Host Process' container. All of a Pod's - containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess - containers and non-HostProcess containers). In addition, - if HostProcess is true then HostNetwork must also - be set to true. - type: boolean - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: string - type: object - type: object - startupProbe: - description: 'StartupProbe indicates that the Pod has successfully - initialized. If specified, no other probes are executed until - this completes successfully. If this probe fails, the Pod - will be restarted, just as if the livenessProbe failed. This - can be used to provide different probe parameters at the beginning - of a Pod''s lifecycle, when it might take a long time to load - data or warm a cache, than during steady-state operation. - This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, reads - from stdin in the container will always result in EOF. Default - is false. - type: boolean - stdinOnce: - description: Whether the container runtime should close the - stdin channel after it has been opened by a single attach. - When stdin is true the stdin stream will remain open across - multiple attach sessions. If stdinOnce is set to true, stdin - is opened on container start, is empty until the first client - attaches to stdin, and then remains open and accepts data - until the client disconnects, at which time stdin is closed - and remains closed until the container is restarted. If this - flag is false, a container processes that reads from stdin - will never receive an EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which the file to which the - container''s termination message will be written is mounted - into the container''s filesystem. Message written is intended - to be brief final status, such as an assertion failure message. - Will be truncated by the node if greater than 4096 bytes. - The total message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot be updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination message should be - populated. File will use the contents of terminationMessagePath - to populate the container status message on both success and - failure. FallbackToLogsOnError will use the last chunk of - container log output if the termination message file is empty - and the container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is smaller. Defaults - to File. Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY for - itself, also requires 'stdin' to be true. Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the list of block devices to be - used by the container. - items: - description: volumeDevice describes a mapping of a raw block - device within a container. - properties: - devicePath: - description: devicePath is the path inside of the container - that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - type: object - type: array - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other - way around. When not set, MountPropagationNone is used. - This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - required: - - mountPath - - name - type: object - type: array - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string - required: - - name - type: object - type: array - externalUrl: - description: The external URL the Alertmanager instances will be available - under. This is necessary to generate correct URLs. This is necessary - if Alertmanager is not served from root of a DNS name. - type: string - forceEnableClusterMode: - description: ForceEnableClusterMode ensures Alertmanager does not - deactivate the cluster mode when running with a single replica. - Use case is e.g. spanning an Alertmanager cluster across Kubernetes - clusters with a single replica in each. - type: boolean - hostAliases: - description: Pods' hostAliases configuration - items: - description: HostAlias holds the mapping between IP and hostnames - that will be injected as an entry in the pod's hosts file. - properties: - hostnames: - description: Hostnames for the above IP address. - items: - type: string - type: array - ip: - description: IP address of the host file entry. - type: string - required: - - hostnames - - ip - type: object - type: array - x-kubernetes-list-map-keys: - - ip - x-kubernetes-list-type: map - image: - description: Image if specified has precedence over baseImage, tag - and sha combinations. Specifying the version is still necessary - to ensure the Prometheus Operator knows what version of Alertmanager - is being configured. - type: string - imagePullPolicy: - description: Image pull policy for the 'alertmanager', 'init-config-reloader' - and 'config-reloader' containers. See https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy - for more details. - enum: - - "" - - Always - - Never - - IfNotPresent - type: string - imagePullSecrets: - description: An optional list of references to secrets in the same - namespace to use for pulling prometheus and alertmanager images - from registries see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - type: array - initContainers: - description: 'InitContainers allows adding initContainers to the pod - definition. Those can be used to e.g. fetch secrets for injection - into the Alertmanager configuration from external sources. Any errors - during the execution of an initContainer will lead to a restart - of the Pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ - InitContainers described here modify an operator generated init - containers if they share the same name and modifications are done - via a strategic merge patch. The current init container name is: - `init-config-reloader`. Overriding init containers is entirely outside - the scope of what the maintainers will support and by doing so, - you accept that this behaviour may break at any time without notice.' - items: - description: A single application container that you want to run - within a pod. - properties: - args: - description: 'Arguments to the entrypoint. The container image''s - CMD is used if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If a variable - cannot be resolved, the reference in the input string will - be unchanged. Double $$ are reduced to a single $, which allows - for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will - produce the string literal "$(VAR_NAME)". Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - command: - description: 'Entrypoint array. Not executed within a shell. - The container image''s ENTRYPOINT is used if this is not provided. - Variable references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) syntax: - i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". - Escaped references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - env: - description: List of environment variables to set in the container. - Cannot be updated. - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must be - a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in the - input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) - syntax: i.e. "$$(VAR_NAME)" will produce the string - literal "$(VAR_NAME)". Escaped references will never - be expanded, regardless of whether the variable exists - or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, limits.ephemeral-storage, requests.cpu, - requests.memory and requests.ephemeral-storage) - are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must be - a C_IDENTIFIER. All invalid keys will be reported as an event - when the container is starting. When a key exists in multiple - sources, the value associated with the last source will take - precedence. Values defined by an Env with a duplicate key - will take precedence. Cannot be updated. - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap must be - defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - description: 'Container image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management system should take - in response to container lifecycle events. Cannot be updated. - properties: - postStart: - description: 'PostStart is called immediately after a container - is created. If the handler fails, the container is terminated - and restarted according to its restart policy. Other management - of the container blocks until the hook completes. More - info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - preStop: - description: 'PreStop is called immediately before a container - is terminated due to an API request or management event - such as liveness/startup probe failure, preemption, resource - contention, etc. The handler is not called if the container - crashes or exits. The Pod''s termination grace period - countdown begins before the PreStop hook is executed. - Regardless of the outcome of the handler, the container - will eventually terminate within the Pod''s termination - grace period (unless delayed by finalizers). Other management - of the container blocks until the hook completes or until - the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - type: object - livenessProbe: - description: 'Periodic probe of container liveness. Container - will be restarted if the probe fails. Cannot be updated. More - info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - ports: - description: List of ports to expose from the container. Not - specifying a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from the network. - Modifying this array with strategic merge patch may corrupt - the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. - Cannot be updated. - items: - description: ContainerPort represents a network port in a - single container. - properties: - containerPort: - description: Number of port to expose on the pod's IP - address. This must be a valid port number, 0 < x < 65536. - format: int32 - type: integer - hostIP: - description: What host IP to bind the external port to. - type: string - hostPort: - description: Number of port to expose on the host. If - specified, this must be a valid port number, 0 < x < - 65536. If HostNetwork is specified, this must match - ContainerPort. Most containers do not need this. - format: int32 - type: integer - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a pod - must have a unique name. Name for the port that can - be referred to by services. - type: string - protocol: - default: TCP - description: Protocol for port. Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - required: - - containerPort - type: object - type: array - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container service readiness. - Container will be removed from service endpoints if the probe - fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - resizePolicy: - description: Resources resize policy for the container. - items: - description: ContainerResizePolicy represents resource resize - policy for the container. - properties: - resourceName: - description: 'Name of the resource to which this resource - resize policy applies. Supported values: cpu, memory.' - type: string - restartPolicy: - description: Restart policy to apply when specified resource - is resized. If not specified, it defaults to NotRequired. - type: string - required: - - resourceName - - restartPolicy - type: object - type: array - x-kubernetes-list-type: atomic - resources: - description: 'Compute Resources required by this container. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - properties: - claims: - description: "Claims lists the names of resources, defined - in spec.resourceClaims, that are used by this container. - \n This is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It can only - be set for containers." - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of one entry - in pod.spec.resourceClaims of the Pod where this - field is used. It makes that resource available - inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests - cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - restartPolicy: - description: 'RestartPolicy defines the restart behavior of - individual containers in a pod. This field may only be set - for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, - the restart behavior is defined by the Pod''s restart policy - and the container type. Setting the RestartPolicy as "Always" - for the init container will have the following effect: this - init container will be continually restarted on exit until - all regular containers have terminated. Once all regular containers - have completed, all init containers with restartPolicy "Always" - will be shut down. This lifecycle differs from normal init - containers and is often referred to as a "sidecar" container. - Although this init container still starts in the init container - sequence, it does not wait for the container to complete before - proceeding to the next init container. Instead, the next init - container starts immediately after this init container is - started, or after any startupProbe has successfully completed.' - type: string - securityContext: - description: 'SecurityContext defines the security options the - container should be run with. If set, the fields of SecurityContext - override the equivalent fields of PodSecurityContext. More - info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag will - be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN Note that this field cannot be set - when spec.os.name is windows.' - type: boolean - capabilities: - description: The capabilities to add/drop when running containers. - Defaults to the default set of capabilities granted by - the container runtime. Note that this field cannot be - set when spec.os.name is windows. - properties: - add: - description: Added capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - drop: - description: Removed capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - type: object - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent to - root on the host. Defaults to false. Note that this field - cannot be set when spec.os.name is windows. - type: boolean - procMount: - description: procMount denotes the type of proc mount to - use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. Note that this field cannot - be set when spec.os.name is windows. - type: string - readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. Note that this field cannot - be set when spec.os.name is windows. - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as a - non-root user. If true, the Kubelet will validate the - image at runtime to ensure that it does not run as UID - 0 (root) and fail to start the container if it does. If - unset or false, no such validation will be performed. - May also be set in PodSecurityContext. If set in both - SecurityContext and PodSecurityContext, the value specified - in SecurityContext takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. Note - that this field cannot be set when spec.os.name is windows. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to the container. - If unspecified, the container runtime will allocate a - random SELinux context for each container. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - properties: - level: - description: Level is SELinux level label that applies - to the container. - type: string - role: - description: Role is a SELinux role label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - type: object - seccompProfile: - description: The seccomp options to use by this container. - If seccomp options are provided at both the pod & container - level, the container options override the pod options. - Note that this field cannot be set when spec.os.name is - windows. - properties: - localhostProfile: - description: localhostProfile indicates a profile defined - in a file on the node should be used. The profile - must be preconfigured on the node to work. Must be - a descending path, relative to the kubelet's configured - seccomp profile location. Must be set if type is "Localhost". - Must NOT be set for any other type. - type: string - type: - description: "type indicates which kind of seccomp profile - will be applied. Valid options are: \n Localhost - - a profile defined in a file on the node should be - used. RuntimeDefault - the container runtime default - profile should be used. Unconfined - no profile should - be applied." - type: string - required: - - type - type: object - windowsOptions: - description: The Windows specific settings applied to all - containers. If unspecified, the options from the PodSecurityContext - will be used. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - Note that this field cannot be set when spec.os.name is - linux. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. - type: string - hostProcess: - description: HostProcess determines if a container should - be run as a 'Host Process' container. All of a Pod's - containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess - containers and non-HostProcess containers). In addition, - if HostProcess is true then HostNetwork must also - be set to true. - type: boolean - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: string - type: object - type: object - startupProbe: - description: 'StartupProbe indicates that the Pod has successfully - initialized. If specified, no other probes are executed until - this completes successfully. If this probe fails, the Pod - will be restarted, just as if the livenessProbe failed. This - can be used to provide different probe parameters at the beginning - of a Pod''s lifecycle, when it might take a long time to load - data or warm a cache, than during steady-state operation. - This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, reads - from stdin in the container will always result in EOF. Default - is false. - type: boolean - stdinOnce: - description: Whether the container runtime should close the - stdin channel after it has been opened by a single attach. - When stdin is true the stdin stream will remain open across - multiple attach sessions. If stdinOnce is set to true, stdin - is opened on container start, is empty until the first client - attaches to stdin, and then remains open and accepts data - until the client disconnects, at which time stdin is closed - and remains closed until the container is restarted. If this - flag is false, a container processes that reads from stdin - will never receive an EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which the file to which the - container''s termination message will be written is mounted - into the container''s filesystem. Message written is intended - to be brief final status, such as an assertion failure message. - Will be truncated by the node if greater than 4096 bytes. - The total message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot be updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination message should be - populated. File will use the contents of terminationMessagePath - to populate the container status message on both success and - failure. FallbackToLogsOnError will use the last chunk of - container log output if the termination message file is empty - and the container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is smaller. Defaults - to File. Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY for - itself, also requires 'stdin' to be true. Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the list of block devices to be - used by the container. - items: - description: volumeDevice describes a mapping of a raw block - device within a container. - properties: - devicePath: - description: devicePath is the path inside of the container - that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - type: object - type: array - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other - way around. When not set, MountPropagationNone is used. - This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - required: - - mountPath - - name - type: object - type: array - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string - required: - - name - type: object - type: array - listenLocal: - description: ListenLocal makes the Alertmanager server listen on loopback, - so that it does not bind against the Pod IP. Note this is only for - the Alertmanager UI, not the gossip communication. - type: boolean - logFormat: - description: Log format for Alertmanager to be configured with. - enum: - - "" - - logfmt - - json - type: string - logLevel: - description: Log level for Alertmanager to be configured with. - enum: - - "" - - debug - - info - - warn - - error - type: string - minReadySeconds: - description: Minimum number of seconds for which a newly created pod - should be ready without any of its container crashing for it to - be considered available. Defaults to 0 (pod will be considered available - as soon as it is ready) This is an alpha field from kubernetes 1.22 - until 1.24 which requires enabling the StatefulSetMinReadySeconds - feature gate. - format: int32 - type: integer - nodeSelector: - additionalProperties: - type: string - description: Define which Nodes the Pods are scheduled on. - type: object - paused: - description: If set to true all actions on the underlying managed - objects are not goint to be performed, except for delete actions. - type: boolean - podMetadata: - description: "PodMetadata configures labels and annotations which - are propagated to the Alertmanager pods. \n The following items - are reserved and cannot be overridden: * \"alertmanager\" label, - set to the name of the Alertmanager instance. * \"app.kubernetes.io/instance\" - label, set to the name of the Alertmanager instance. * \"app.kubernetes.io/managed-by\" - label, set to \"prometheus-operator\". * \"app.kubernetes.io/name\" - label, set to \"alertmanager\". * \"app.kubernetes.io/version\" - label, set to the Alertmanager version. * \"kubectl.kubernetes.io/default-container\" - annotation, set to \"alertmanager\"." - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored - with a resource that may be set by external tools to store and - retrieve arbitrary metadata. They are not queryable and should - be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to - organize and categorize (scope and select) objects. May match - selectors of replication controllers and services. More info: - http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: 'Name must be unique within a namespace. Is required - when creating resources, although some resources may allow a - client to request the generation of an appropriate name automatically. - Name is primarily intended for creation idempotence and configuration - definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - type: object - portName: - default: web - description: Port name used for the pods and governing service. Defaults - to `web`. - type: string - priorityClassName: - description: Priority class assigned to the Pods - type: string - replicas: - description: Size is the expected size of the alertmanager cluster. - The controller will eventually make the size of the running cluster - equal to the expected size. - format: int32 - type: integer - resources: - description: Define resources requests and limits for single Pods. - properties: - claims: - description: "Claims lists the names of resources, defined in - spec.resourceClaims, that are used by this container. \n This - is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It can only be set - for containers." - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of one entry in pod.spec.resourceClaims - of the Pod where this field is used. It makes that resource - available inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute resources - allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. Requests cannot exceed Limits. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - retention: - default: 120h - description: Time duration Alertmanager shall retain data for. Default - is '120h', and must match the regular expression `[0-9]+(ms|s|m|h)` - (milliseconds seconds minutes hours). - pattern: ^(0|(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - routePrefix: - description: The route prefix Alertmanager registers HTTP handlers - for. This is useful, if using ExternalURL and a proxy is rewriting - HTTP routes of a request, and the actual ExternalURL is still true, - but the server serves requests under a different route prefix. For - example for use with `kubectl proxy`. - type: string - secrets: - description: Secrets is a list of Secrets in the same namespace as - the Alertmanager object, which shall be mounted into the Alertmanager - Pods. Each Secret is added to the StatefulSet definition as a volume - named `secret-`. The Secrets are mounted into `/etc/alertmanager/secrets/` - in the 'alertmanager' container. - items: - type: string - type: array - securityContext: - description: SecurityContext holds pod-level security attributes and - common container settings. This defaults to the default PodSecurityContext. - properties: - fsGroup: - description: "A special supplemental group that applies to all - containers in a pod. Some volume types allow the Kubelet to - change the ownership of that volume to be owned by the pod: - \n 1. The owning GID will be the FSGroup 2. The setgid bit is - set (new files created in the volume will be owned by FSGroup) - 3. The permission bits are OR'd with rw-rw---- \n If unset, - the Kubelet will not modify the ownership and permissions of - any volume. Note that this field cannot be set when spec.os.name - is windows." - format: int64 - type: integer - fsGroupChangePolicy: - description: 'fsGroupChangePolicy defines behavior of changing - ownership and permission of the volume before being exposed - inside Pod. This field will only apply to volume types which - support fsGroup based ownership(and permissions). It will have - no effect on ephemeral volume types such as: secret, configmaps - and emptydir. Valid values are "OnRootMismatch" and "Always". - If not specified, "Always" is used. Note that this field cannot - be set when spec.os.name is windows.' - type: string - runAsGroup: - description: The GID to run the entrypoint of the container process. - Uses runtime default if unset. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, the value - specified in SecurityContext takes precedence for that container. - Note that this field cannot be set when spec.os.name is windows. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as a non-root - user. If true, the Kubelet will validate the image at runtime - to ensure that it does not run as UID 0 (root) and fail to start - the container if it does. If unset or false, no such validation - will be performed. May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, the value specified - in SecurityContext takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container process. - Defaults to user specified in image metadata if unspecified. - May also be set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence for that container. Note that this field cannot - be set when spec.os.name is windows. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to all containers. - If unspecified, the container runtime will allocate a random - SELinux context for each container. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, the value - specified in SecurityContext takes precedence for that container. - Note that this field cannot be set when spec.os.name is windows. - properties: - level: - description: Level is SELinux level label that applies to - the container. - type: string - role: - description: Role is a SELinux role label that applies to - the container. - type: string - type: - description: Type is a SELinux type label that applies to - the container. - type: string - user: - description: User is a SELinux user label that applies to - the container. - type: string - type: object - seccompProfile: - description: The seccomp options to use by the containers in this - pod. Note that this field cannot be set when spec.os.name is - windows. - properties: - localhostProfile: - description: localhostProfile indicates a profile defined - in a file on the node should be used. The profile must be - preconfigured on the node to work. Must be a descending - path, relative to the kubelet's configured seccomp profile - location. Must be set if type is "Localhost". Must NOT be - set for any other type. - type: string - type: - description: "type indicates which kind of seccomp profile - will be applied. Valid options are: \n Localhost - a profile - defined in a file on the node should be used. RuntimeDefault - - the container runtime default profile should be used. - Unconfined - no profile should be applied." - type: string - required: - - type - type: object - supplementalGroups: - description: A list of groups applied to the first process run - in each container, in addition to the container's primary GID, - the fsGroup (if specified), and group memberships defined in - the container image for the uid of the container process. If - unspecified, no additional groups are added to any container. - Note that group memberships defined in the container image for - the uid of the container process are still effective, even if - they are not included in this list. Note that this field cannot - be set when spec.os.name is windows. - items: - format: int64 - type: integer - type: array - sysctls: - description: Sysctls hold a list of namespaced sysctls used for - the pod. Pods with unsupported sysctls (by the container runtime) - might fail to launch. Note that this field cannot be set when - spec.os.name is windows. - items: - description: Sysctl defines a kernel parameter to be set - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - type: object - type: array - windowsOptions: - description: The Windows specific settings applied to all containers. - If unspecified, the options within a container's SecurityContext - will be used. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. Note - that this field cannot be set when spec.os.name is linux. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named by - the GMSACredentialSpecName field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of the GMSA - credential spec to use. - type: string - hostProcess: - description: HostProcess determines if a container should - be run as a 'Host Process' container. All of a Pod's containers - must have the same effective HostProcess value (it is not - allowed to have a mix of HostProcess containers and non-HostProcess - containers). In addition, if HostProcess is true then HostNetwork - must also be set to true. - type: boolean - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set in PodSecurityContext. - If set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. - type: string - type: object - type: object - serviceAccountName: - description: ServiceAccountName is the name of the ServiceAccount - to use to run the Prometheus Pods. - type: string - sha: - description: 'SHA of Alertmanager container image to be deployed. - Defaults to the value of `version`. Similar to a tag, but the SHA - explicitly deploys an immutable container image. Version and Tag - are ignored if SHA is set. Deprecated: use ''image'' instead. The - image digest can be specified as part of the image URL.' - type: string - storage: - description: Storage is the definition of how storage will be used - by the Alertmanager instances. - properties: - disableMountSubPath: - description: '*Deprecated: subPath usage will be removed in a - future release.*' - type: boolean - emptyDir: - description: 'EmptyDirVolumeSource to be used by the StatefulSet. - If specified, it takes precedence over `ephemeral` and `volumeClaimTemplate`. - More info: https://kubernetes.io/docs/concepts/storage/volumes/#emptydir' - properties: - medium: - description: 'medium represents what type of storage medium - should back this directory. The default is "" which means - to use the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - anyOf: - - type: integer - - type: string - description: 'sizeLimit is the total amount of local storage - required for this EmptyDir volume. The size limit is also - applicable for memory medium. The maximum usage on memory - medium EmptyDir would be the minimum value between the SizeLimit - specified here and the sum of memory limits of all containers - in a pod. The default is nil which means that the limit - is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - ephemeral: - description: 'EphemeralVolumeSource to be used by the StatefulSet. - This is a beta field in k8s 1.21 and GA in 1.15. For lower versions, - starting with k8s 1.19, it requires enabling the GenericEphemeralVolume - feature gate. More info: https://kubernetes.io/docs/concepts/storage/ephemeral-volumes/#generic-ephemeral-volumes' - properties: - volumeClaimTemplate: - description: "Will be used to create a stand-alone PVC to - provision the volume. The pod in which this EphemeralVolumeSource - is embedded will be the owner of the PVC, i.e. the PVC will - be deleted together with the pod. The name of the PVC will - be `-` where `` is the - name from the `PodSpec.Volumes` array entry. Pod validation - will reject the pod if the concatenated name is not valid - for a PVC (for example, too long). \n An existing PVC with - that name that is not owned by the pod will *not* be used - for the pod to avoid using an unrelated volume by mistake. - Starting the pod is then blocked until the unrelated PVC - is removed. If such a pre-created PVC is meant to be used - by the pod, the PVC has to updated with an owner reference - to the pod once the pod exists. Normally this should not - be necessary, but it may be useful when manually reconstructing - a broken cluster. \n This field is read-only and no changes - will be made by Kubernetes to the PVC after it has been - created. \n Required, must not be nil." - properties: - metadata: - description: May contain labels and annotations that will - be copied into the PVC when creating it. No other fields - are allowed and will be rejected during validation. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - The entire content is copied unchanged into the PVC - that gets created from this template. The same fields - as in a PersistentVolumeClaim are also valid here. - properties: - accessModes: - description: 'accessModes contains the desired access - modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - items: - type: string - type: array - dataSource: - description: 'dataSource field can be used to specify - either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) If the - provisioner or an external controller can support - the specified data source, it will create a new - volume based on the contents of the specified data - source. When the AnyVolumeDataSource feature gate - is enabled, dataSource contents will be copied to - dataSourceRef, and dataSourceRef contents will be - copied to dataSource when dataSourceRef.namespace - is not specified. If the namespace is specified, - then dataSourceRef will not be copied to dataSource.' - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API group. - For any other third-party types, APIGroup is - required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: 'dataSourceRef specifies the object from - which to populate the volume with data, if a non-empty - volume is desired. This may be any object from a - non-empty API group (non core object) or a PersistentVolumeClaim - object. When this field is specified, volume binding - will only succeed if the type of the specified object - matches some installed volume populator or dynamic - provisioner. This field will replace the functionality - of the dataSource field and as such if both fields - are non-empty, they must have the same value. For - backwards compatibility, when namespace isn''t specified - in dataSourceRef, both fields (dataSource and dataSourceRef) - will be set to the same value automatically if one - of them is empty and the other is non-empty. When - namespace is specified in dataSourceRef, dataSource - isn''t set to the same value and must be empty. - There are three important differences between dataSource - and dataSourceRef: * While dataSource only allows - two specific types of objects, dataSourceRef allows - any non-core object, as well as PersistentVolumeClaim - objects. * While dataSource ignores disallowed values - (dropping them), dataSourceRef preserves all values, - and generates an error if a disallowed value is - specified. * While dataSource only allows local - objects, dataSourceRef allows objects in any namespaces. - (Beta) Using this field requires the AnyVolumeDataSource - feature gate to be enabled. (Alpha) Using the namespace - field of dataSourceRef requires the CrossNamespaceVolumeDataSource - feature gate to be enabled.' - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API group. - For any other third-party types, APIGroup is - required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - namespace: - description: Namespace is the namespace of resource - being referenced Note that when a namespace - is specified, a gateway.networking.k8s.io/ReferenceGrant - object is required in the referent namespace - to allow that namespace's owner to accept the - reference. See the ReferenceGrant documentation - for details. (Alpha) This field requires the - CrossNamespaceVolumeDataSource feature gate - to be enabled. - type: string - required: - - kind - - name - type: object - resources: - description: 'resources represents the minimum resources - the volume should have. If RecoverVolumeExpansionFailure - feature is enabled users are allowed to specify - resource requirements that are lower than previous - value but must still be higher than capacity recorded - in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' - properties: - claims: - description: "Claims lists the names of resources, - defined in spec.resourceClaims, that are used - by this container. \n This is an alpha field - and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It - can only be set for containers." - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of - one entry in pod.spec.resourceClaims of - the Pod where this field is used. It makes - that resource available inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. Requests cannot - exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - selector: - description: selector is a label query over volumes - to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. This array - is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: 'storageClassName is the name of the - StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of volume - is required by the claim. Value of Filesystem is - implied when not included in claim spec. - type: string - volumeName: - description: volumeName is the binding reference to - the PersistentVolume backing this claim. - type: string - type: object - required: - - spec - type: object - type: object - volumeClaimTemplate: - description: Defines the PVC spec to be used by the Prometheus - StatefulSets. The easiest way to use a volume that cannot be - automatically provisioned is to use a label selector alongside - manually created PersistentVolumes. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - description: EmbeddedMetadata contains metadata relevant to - an EmbeddedResource. - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value - map stored with a resource that may be set by external - tools to store and retrieve arbitrary metadata. They - are not queryable and should be preserved when modifying - objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be - used to organize and categorize (scope and select) objects. - May match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: 'Name must be unique within a namespace. - Is required when creating resources, although some resources - may allow a client to request the generation of an appropriate - name automatically. Name is primarily intended for creation - idempotence and configuration definition. Cannot be - updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - type: object - spec: - description: 'Defines the desired characteristics of a volume - requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - properties: - accessModes: - description: 'accessModes contains the desired access - modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - items: - type: string - type: array - dataSource: - description: 'dataSource field can be used to specify - either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) If the provisioner - or an external controller can support the specified - data source, it will create a new volume based on the - contents of the specified data source. When the AnyVolumeDataSource - feature gate is enabled, dataSource contents will be - copied to dataSourceRef, and dataSourceRef contents - will be copied to dataSource when dataSourceRef.namespace - is not specified. If the namespace is specified, then - dataSourceRef will not be copied to dataSource.' - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: 'dataSourceRef specifies the object from - which to populate the volume with data, if a non-empty - volume is desired. This may be any object from a non-empty - API group (non core object) or a PersistentVolumeClaim - object. When this field is specified, volume binding - will only succeed if the type of the specified object - matches some installed volume populator or dynamic provisioner. - This field will replace the functionality of the dataSource - field and as such if both fields are non-empty, they - must have the same value. For backwards compatibility, - when namespace isn''t specified in dataSourceRef, both - fields (dataSource and dataSourceRef) will be set to - the same value automatically if one of them is empty - and the other is non-empty. When namespace is specified - in dataSourceRef, dataSource isn''t set to the same - value and must be empty. There are three important differences - between dataSource and dataSourceRef: * While dataSource - only allows two specific types of objects, dataSourceRef - allows any non-core object, as well as PersistentVolumeClaim - objects. * While dataSource ignores disallowed values - (dropping them), dataSourceRef preserves all values, - and generates an error if a disallowed value is specified. - * While dataSource only allows local objects, dataSourceRef - allows objects in any namespaces. (Beta) Using this - field requires the AnyVolumeDataSource feature gate - to be enabled. (Alpha) Using the namespace field of - dataSourceRef requires the CrossNamespaceVolumeDataSource - feature gate to be enabled.' - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - namespace: - description: Namespace is the namespace of resource - being referenced Note that when a namespace is specified, - a gateway.networking.k8s.io/ReferenceGrant object - is required in the referent namespace to allow that - namespace's owner to accept the reference. See the - ReferenceGrant documentation for details. (Alpha) - This field requires the CrossNamespaceVolumeDataSource - feature gate to be enabled. - type: string - required: - - kind - - name - type: object - resources: - description: 'resources represents the minimum resources - the volume should have. If RecoverVolumeExpansionFailure - feature is enabled users are allowed to specify resource - requirements that are lower than previous value but - must still be higher than capacity recorded in the status - field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' - properties: - claims: - description: "Claims lists the names of resources, - defined in spec.resourceClaims, that are used by - this container. \n This is an alpha field and requires - enabling the DynamicResourceAllocation feature gate. - \n This field is immutable. It can only be set for - containers." - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of one - entry in pod.spec.resourceClaims of the Pod - where this field is used. It makes that resource - available inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount - of compute resources required. If Requests is omitted - for a container, it defaults to Limits if that is - explicitly specified, otherwise to an implementation-defined - value. Requests cannot exceed Limits. More info: - https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - selector: - description: selector is a label query over volumes to - consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, - NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values - array must be non-empty. If the operator is - Exists or DoesNotExist, the values array must - be empty. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field - is "key", the operator is "In", and the values array - contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: 'storageClassName is the name of the StorageClass - required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of volume is - required by the claim. Value of Filesystem is implied - when not included in claim spec. - type: string - volumeName: - description: volumeName is the binding reference to the - PersistentVolume backing this claim. - type: string - type: object - status: - description: '*Deprecated: this field is never set.*' - properties: - accessModes: - description: 'accessModes contains the actual access modes - the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - items: - type: string - type: array - allocatedResourceStatuses: - additionalProperties: - description: When a controller receives persistentvolume - claim update with ClaimResourceStatus for a resource - that it does not recognizes, then it should ignore - that update and let other controllers handle it. - type: string - description: "allocatedResourceStatuses stores status - of resource being resized for the given PVC. Key names - follow standard Kubernetes label syntax. Valid values - are either: * Un-prefixed keys: - storage - the capacity - of the volume. * Custom resources must use implementation-defined - prefixed names such as \"example.com/my-custom-resource\" - Apart from above values - keys that are unprefixed or - have kubernetes.io prefix are considered reserved and - hence may not be used. \n ClaimResourceStatus can be - in any of following states: - ControllerResizeInProgress: - State set when resize controller starts resizing the - volume in control-plane. - ControllerResizeFailed: State - set when resize has failed in resize controller with - a terminal error. - NodeResizePending: State set when - resize controller has finished resizing the volume but - further resizing of volume is needed on the node. - - NodeResizeInProgress: State set when kubelet starts - resizing the volume. - NodeResizeFailed: State set when - resizing has failed in kubelet with a terminal error. - Transient errors don't set NodeResizeFailed. For example: - if expanding a PVC for more capacity - this field can - be one of the following states: - pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeFailed\" When this field is not set, it - means that no resize operation is in progress for the - given PVC. \n A controller that receives PVC update - with previously unknown resourceName or ClaimResourceStatus - should ignore the update for the purpose it was designed. - For example - a controller that only is responsible - for resizing capacity of the volume, should ignore PVC - updates that change other valid resources associated - with PVC. \n This is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature." - type: object - x-kubernetes-map-type: granular - allocatedResources: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: "allocatedResources tracks the resources - allocated to a PVC including its capacity. Key names - follow standard Kubernetes label syntax. Valid values - are either: * Un-prefixed keys: - storage - the capacity - of the volume. * Custom resources must use implementation-defined - prefixed names such as \"example.com/my-custom-resource\" - Apart from above values - keys that are unprefixed or - have kubernetes.io prefix are considered reserved and - hence may not be used. \n Capacity reported here may - be larger than the actual capacity when a volume expansion - operation is requested. For storage quota, the larger - value from allocatedResources and PVC.spec.resources - is used. If allocatedResources is not set, PVC.spec.resources - alone is used for quota calculation. If a volume expansion - capacity request is lowered, allocatedResources is only - lowered if there are no expansion operations in progress - and if the actual volume capacity is equal or lower - than the requested capacity. \n A controller that receives - PVC update with previously unknown resourceName should - ignore the update for the purpose it was designed. For - example - a controller that only is responsible for - resizing capacity of the volume, should ignore PVC updates - that change other valid resources associated with PVC. - \n This is an alpha field and requires enabling RecoverVolumeExpansionFailure - feature." - type: object - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: capacity represents the actual resources - of the underlying volume. - type: object - conditions: - description: conditions is the current Condition of persistent - volume claim. If underlying persistent volume is being - resized then the Condition will be set to 'ResizeStarted'. - items: - description: PersistentVolumeClaimCondition contains - details about state of pvc - properties: - lastProbeTime: - description: lastProbeTime is the time we probed - the condition. - format: date-time - type: string - lastTransitionTime: - description: lastTransitionTime is the time the - condition transitioned from one status to another. - format: date-time - type: string - message: - description: message is the human-readable message - indicating details about last transition. - type: string - reason: - description: reason is a unique, this should be - a short, machine understandable string that gives - the reason for condition's last transition. If - it reports "ResizeStarted" that means the underlying - persistent volume is being resized. - type: string - status: - type: string - type: - description: PersistentVolumeClaimConditionType - is a valid value of PersistentVolumeClaimCondition.Type - type: string - required: - - status - - type - type: object - type: array - phase: - description: phase represents the current phase of PersistentVolumeClaim. - type: string - type: object - type: object - type: object - tag: - description: 'Tag of Alertmanager container image to be deployed. - Defaults to the value of `version`. Version is ignored if Tag is - set. Deprecated: use ''image'' instead. The image tag can be specified - as part of the image URL.' - type: string - tolerations: - description: If specified, the pod's tolerations. - items: - description: The pod this Toleration is attached to tolerates any - taint that matches the triple using the matching - operator . - properties: - effect: - description: Effect indicates the taint effect to match. Empty - means match all taint effects. When specified, allowed values - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match all - values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the - value. Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod - can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time - the toleration (which must be of effect NoExecute, otherwise - this field is ignored) tolerates the taint. By default, it - is not set, which means tolerate the taint forever (do not - evict). Zero and negative values will be treated as 0 (evict - immediately) by the system. - format: int64 - type: integer - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string - type: object - type: array - topologySpreadConstraints: - description: If specified, the pod's topology spread constraints. - items: - description: TopologySpreadConstraint specifies how to spread matching - pods among the given topology. - properties: - labelSelector: - description: LabelSelector is used to find matching pods. Pods - that match this label selector are counted to determine the - number of pods in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. This - array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: "MatchLabelKeys is a set of pod label keys to select - the pods over which spreading will be calculated. The keys - are used to lookup values from the incoming pod labels, those - key-value labels are ANDed with labelSelector to select the - group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in - both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot - be set when LabelSelector isn't set. Keys that don't exist - in the incoming pod labels will be ignored. A null or empty - list means only match against labelSelector. \n This is a - beta field and requires the MatchLabelKeysInPodTopologySpread - feature gate to be enabled (enabled by default)." - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: 'MaxSkew describes the degree to which pods may - be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, - it is the maximum permitted difference between the number - of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods - in an eligible domain or zero if the number of eligible domains - is less than MinDomains. For example, in a 3-zone cluster, - MaxSkew is set to 1, and pods with the same labelSelector - spread as 2/2/1: In this case, the global minimum is 1. | - zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew - is 1, incoming pod can only be scheduled to zone3 to become - 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) - on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming - pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, - it is used to give higher precedence to topologies that satisfy - it. It''s a required field. Default value is 1 and 0 is not - allowed.' - format: int32 - type: integer - minDomains: - description: "MinDomains indicates a minimum number of eligible - domains. When the number of eligible domains with matching - topology keys is less than minDomains, Pod Topology Spread - treats \"global minimum\" as 0, and then the calculation of - Skew is performed. And when the number of eligible domains - with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. As a result, when - the number of eligible domains is less than minDomains, scheduler - won't schedule more than maxSkew Pods to those domains. If - value is nil, the constraint behaves as if MinDomains is equal - to 1. Valid values are integers greater than 0. When value - is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For - example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains - is set to 5 and pods with the same labelSelector spread as - 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | - The number of domains is less than 5(MinDomains), so \"global - minimum\" is treated as 0. In this situation, new pod with - the same labelSelector cannot be scheduled, because computed - skew will be 3(3 - 0) if new Pod is scheduled to any of the - three zones, it will violate MaxSkew. \n This is a beta field - and requires the MinDomainsInPodTopologySpread feature gate - to be enabled (enabled by default)." - format: int32 - type: integer - nodeAffinityPolicy: - description: "NodeAffinityPolicy indicates how we will treat - Pod's nodeAffinity/nodeSelector when calculating pod topology - spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector - are included in the calculations. - Ignore: nodeAffinity/nodeSelector - are ignored. All nodes are included in the calculations. \n - If this value is nil, the behavior is equivalent to the Honor - policy. This is a beta-level feature default enabled by the - NodeInclusionPolicyInPodTopologySpread feature flag." - type: string - nodeTaintsPolicy: - description: "NodeTaintsPolicy indicates how we will treat node - taints when calculating pod topology spread skew. Options - are: - Honor: nodes without taints, along with tainted nodes - for which the incoming pod has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - \n If this value is nil, the behavior is equivalent to the - Ignore policy. This is a beta-level feature default enabled - by the NodeInclusionPolicyInPodTopologySpread feature flag." - type: string - topologyKey: - description: TopologyKey is the key of node labels. Nodes that - have a label with this key and identical values are considered - to be in the same topology. We consider each - as a "bucket", and try to put balanced number of pods into - each bucket. We define a domain as a particular instance of - a topology. Also, we define an eligible domain as a domain - whose nodes meet the requirements of nodeAffinityPolicy and - nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", - each Node is a domain of that topology. And, if TopologyKey - is "topology.kubernetes.io/zone", each zone is a domain of - that topology. It's a required field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates how to deal with a - pod if it doesn''t satisfy the spread constraint. - DoNotSchedule - (default) tells the scheduler not to schedule it. - ScheduleAnyway - tells the scheduler to schedule the pod in any location, but - giving higher precedence to topologies that would help reduce - the skew. A constraint is considered "Unsatisfiable" for an - incoming pod if and only if every possible node assignment - for that pod would violate "MaxSkew" on some topology. For - example, in a 3-zone cluster, MaxSkew is set to 1, and pods - with the same labelSelector spread as 3/1/1: | zone1 | zone2 - | zone3 | | P P P | P | P | If WhenUnsatisfiable is - set to DoNotSchedule, incoming pod can only be scheduled to - zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on - zone2(zone3) satisfies MaxSkew(1). In other words, the cluster - can still be imbalanced, but scheduler won''t make it *more* - imbalanced. It''s a required field.' - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - type: array - version: - description: Version the cluster should be on. - type: string - volumeMounts: - description: VolumeMounts allows configuration of additional VolumeMounts - on the output StatefulSet definition. VolumeMounts specified will - be appended to other VolumeMounts in the alertmanager container, - that are generated as a result of StorageSpec objects. - items: - description: VolumeMount describes a mounting of a Volume within - a container. - properties: - mountPath: - description: Path within the container at which the volume should - be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are propagated - from the host to container and the other way around. When - not set, MountPropagationNone is used. This field is beta - in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which the - container's volume should be mounted. Behaves similarly to - SubPath but environment variable references $(VAR_NAME) are - expanded using the container's environment. Defaults to "" - (volume's root). SubPathExpr and SubPath are mutually exclusive. - type: string - required: - - mountPath - - name - type: object - type: array - volumes: - description: Volumes allows configuration of additional volumes on - the output StatefulSet definition. Volumes specified will be appended - to other volumes that are generated as a result of StorageSpec objects. - items: - description: Volume represents a named volume in a pod that may - be accessed by any container in the pod. - properties: - awsElasticBlockStore: - description: 'awsElasticBlockStore represents an AWS Disk resource - that is attached to a kubelet''s host machine and then exposed - to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - properties: - fsType: - description: 'fsType is the filesystem type of the volume - that you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'partition is the partition in the volume that - you want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property empty).' - format: int32 - type: integer - readOnly: - description: 'readOnly value true will force the readOnly - setting in VolumeMounts. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: boolean - volumeID: - description: 'volumeID is unique ID of the persistent disk - resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' - type: string - required: - - volumeID - type: object - azureDisk: - description: azureDisk represents an Azure Data Disk mount on - the host and bind mount to the pod. - properties: - cachingMode: - description: 'cachingMode is the Host Caching mode: None, - Read Only, Read Write.' - type: string - diskName: - description: diskName is the Name of the data disk in the - blob storage - type: string - diskURI: - description: diskURI is the URI of data disk in the blob - storage - type: string - fsType: - description: fsType is Filesystem type to mount. Must be - a filesystem type supported by the host operating system. - Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. - type: string - kind: - description: 'kind expected values are Shared: multiple - blob disks per storage account Dedicated: single blob - disk per storage account Managed: azure managed data - disk (only in managed availability set). defaults to shared' - type: string - readOnly: - description: readOnly Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - required: - - diskName - - diskURI - type: object - azureFile: - description: azureFile represents an Azure File Service mount - on the host and bind mount to the pod. - properties: - readOnly: - description: readOnly defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretName: - description: secretName is the name of secret that contains - Azure Storage Account Name and Key - type: string - shareName: - description: shareName is the azure share Name - type: string - required: - - secretName - - shareName - type: object - cephfs: - description: cephFS represents a Ceph FS mount on the host that - shares a pod's lifetime - properties: - monitors: - description: 'monitors is Required: Monitors is a collection - of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - items: - type: string - type: array - path: - description: 'path is Optional: Used as the mounted root, - rather than the full Ceph tree, default is /' - type: string - readOnly: - description: 'readOnly is Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: boolean - secretFile: - description: 'secretFile is Optional: SecretFile is the - path to key ring for User, default is /etc/ceph/user.secret - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - secretRef: - description: 'secretRef is Optional: SecretRef is reference - to the authentication secret for User, default is empty. - More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - user: - description: 'user is optional: User is the rados user name, - default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' - type: string - required: - - monitors - type: object - cinder: - description: 'cinder represents a cinder volume attached and - mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - properties: - fsType: - description: 'fsType is the filesystem type to mount. Must - be a filesystem type supported by the host operating system. - Examples: "ext4", "xfs", "ntfs". Implicitly inferred to - be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - readOnly: - description: 'readOnly defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: boolean - secretRef: - description: 'secretRef is optional: points to a secret - object containing parameters used to connect to OpenStack.' - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - volumeID: - description: 'volumeID used to identify the volume in cinder. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md' - type: string - required: - - volumeID - type: object - configMap: - description: configMap represents a configMap that should populate - this volume - properties: - defaultMode: - description: 'defaultMode is optional: mode bits used to - set permissions on created files by default. Must be an - octal value between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults to - 0644. Directories within the path are not affected by - this setting. This might be in conflict with other options - that affect the file mode, like fsGroup, and the result - can be other mode bits set.' - format: int32 - type: integer - items: - description: items if unspecified, each key-value pair in - the Data field of the referenced ConfigMap will be projected - into the volume as a file whose name is the key and content - is the value. If specified, the listed keys will be projected - into the specified paths, and unlisted keys will not be - present. If a key is specified which is not present in - the ConfigMap, the volume setup will error unless it is - marked optional. Paths must be relative and may not contain - the '..' path or start with '..'. - items: - description: Maps a string key to a path within a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits used to - set permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. If not - specified, the volume defaultMode will be used. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set.' - format: int32 - type: integer - path: - description: path is the relative path of the file - to map the key to. May not be an absolute path. - May not contain the path element '..'. May not start - with the string '..'. - type: string - required: - - key - - path - type: object - type: array - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: optional specify whether the ConfigMap or its - keys must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - csi: - description: csi (Container Storage Interface) represents ephemeral - storage that is handled by certain external CSI drivers (Beta - feature). - properties: - driver: - description: driver is the name of the CSI driver that handles - this volume. Consult with your admin for the correct name - as registered in the cluster. - type: string - fsType: - description: fsType to mount. Ex. "ext4", "xfs", "ntfs". - If not provided, the empty value is passed to the associated - CSI driver which will determine the default filesystem - to apply. - type: string - nodePublishSecretRef: - description: nodePublishSecretRef is a reference to the - secret object containing sensitive information to pass - to the CSI driver to complete the CSI NodePublishVolume - and NodeUnpublishVolume calls. This field is optional, - and may be empty if no secret is required. If the secret - object contains more than one secret, all secret references - are passed. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - readOnly: - description: readOnly specifies a read-only configuration - for the volume. Defaults to false (read/write). - type: boolean - volumeAttributes: - additionalProperties: - type: string - description: volumeAttributes stores driver-specific properties - that are passed to the CSI driver. Consult your driver's - documentation for supported values. - type: object - required: - - driver - type: object - downwardAPI: - description: downwardAPI represents downward API about the pod - that should populate this volume - properties: - defaultMode: - description: 'Optional: mode bits to use on created files - by default. Must be a Optional: mode bits used to set - permissions on created files by default. Must be an octal - value between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults to - 0644. Directories within the path are not affected by - this setting. This might be in conflict with other options - that affect the file mode, like fsGroup, and the result - can be other mode bits set.' - format: int32 - type: integer - items: - description: Items is a list of downward API volume file - items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field - properties: - fieldRef: - description: 'Required: Selects a field of the pod: - only annotations, labels, name and namespace are - supported.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - mode: - description: 'Optional: mode bits used to set permissions - on this file, must be an octal value between 0000 - and 0777 or a decimal value between 0 and 511. YAML - accepts both octal and decimal values, JSON requires - decimal values for mode bits. If not specified, - the volume defaultMode will be used. This might - be in conflict with other options that affect the - file mode, like fsGroup, and the result can be other - mode bits set.' - format: int32 - type: integer - path: - description: 'Required: Path is the relative path - name of the file to be created. Must not be absolute - or contain the ''..'' path. Must be utf-8 encoded. - The first item of the relative path must not start - with ''..''' - type: string - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, requests.cpu and requests.memory) - are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - required: - - path - type: object - type: array - type: object - emptyDir: - description: 'emptyDir represents a temporary directory that - shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - properties: - medium: - description: 'medium represents what type of storage medium - should back this directory. The default is "" which means - to use the node''s default medium. Must be an empty string - (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - type: string - sizeLimit: - anyOf: - - type: integer - - type: string - description: 'sizeLimit is the total amount of local storage - required for this EmptyDir volume. The size limit is also - applicable for memory medium. The maximum usage on memory - medium EmptyDir would be the minimum value between the - SizeLimit specified here and the sum of memory limits - of all containers in a pod. The default is nil which means - that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - ephemeral: - description: "ephemeral represents a volume that is handled - by a cluster storage driver. The volume's lifecycle is tied - to the pod that defines it - it will be created before the - pod starts, and deleted when the pod is removed. \n Use this - if: a) the volume is only needed while the pod runs, b) features - of normal volumes like restoring from snapshot or capacity - tracking are needed, c) the storage driver is specified through - a storage class, and d) the storage driver supports dynamic - volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource - for more information on the connection between this volume - type and PersistentVolumeClaim). \n Use PersistentVolumeClaim - or one of the vendor-specific APIs for volumes that persist - for longer than the lifecycle of an individual pod. \n Use - CSI for light-weight local ephemeral volumes if the CSI driver - is meant to be used that way - see the documentation of the - driver for more information. \n A pod can use both types of - ephemeral volumes and persistent volumes at the same time." - properties: - volumeClaimTemplate: - description: "Will be used to create a stand-alone PVC to - provision the volume. The pod in which this EphemeralVolumeSource - is embedded will be the owner of the PVC, i.e. the PVC - will be deleted together with the pod. The name of the - PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. - Pod validation will reject the pod if the concatenated - name is not valid for a PVC (for example, too long). \n - An existing PVC with that name that is not owned by the - pod will *not* be used for the pod to avoid using an unrelated - volume by mistake. Starting the pod is then blocked until - the unrelated PVC is removed. If such a pre-created PVC - is meant to be used by the pod, the PVC has to updated - with an owner reference to the pod once the pod exists. - Normally this should not be necessary, but it may be useful - when manually reconstructing a broken cluster. \n This - field is read-only and no changes will be made by Kubernetes - to the PVC after it has been created. \n Required, must - not be nil." - properties: - metadata: - description: May contain labels and annotations that - will be copied into the PVC when creating it. No other - fields are allowed and will be rejected during validation. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - The entire content is copied unchanged into the PVC - that gets created from this template. The same fields - as in a PersistentVolumeClaim are also valid here. - properties: - accessModes: - description: 'accessModes contains the desired access - modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' - items: - type: string - type: array - dataSource: - description: 'dataSource field can be used to specify - either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) If the - provisioner or an external controller can support - the specified data source, it will create a new - volume based on the contents of the specified - data source. When the AnyVolumeDataSource feature - gate is enabled, dataSource contents will be copied - to dataSourceRef, and dataSourceRef contents will - be copied to dataSource when dataSourceRef.namespace - is not specified. If the namespace is specified, - then dataSourceRef will not be copied to dataSource.' - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API - group. For any other third-party types, APIGroup - is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: 'dataSourceRef specifies the object - from which to populate the volume with data, if - a non-empty volume is desired. This may be any - object from a non-empty API group (non core object) - or a PersistentVolumeClaim object. When this field - is specified, volume binding will only succeed - if the type of the specified object matches some - installed volume populator or dynamic provisioner. - This field will replace the functionality of the - dataSource field and as such if both fields are - non-empty, they must have the same value. For - backwards compatibility, when namespace isn''t - specified in dataSourceRef, both fields (dataSource - and dataSourceRef) will be set to the same value - automatically if one of them is empty and the - other is non-empty. When namespace is specified - in dataSourceRef, dataSource isn''t set to the - same value and must be empty. There are three - important differences between dataSource and dataSourceRef: - * While dataSource only allows two specific types - of objects, dataSourceRef allows any non-core - object, as well as PersistentVolumeClaim objects. - * While dataSource ignores disallowed values (dropping - them), dataSourceRef preserves all values, and - generates an error if a disallowed value is specified. - * While dataSource only allows local objects, - dataSourceRef allows objects in any namespaces. - (Beta) Using this field requires the AnyVolumeDataSource - feature gate to be enabled. (Alpha) Using the - namespace field of dataSourceRef requires the - CrossNamespaceVolumeDataSource feature gate to - be enabled.' - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API - group. For any other third-party types, APIGroup - is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - namespace: - description: Namespace is the namespace of resource - being referenced Note that when a namespace - is specified, a gateway.networking.k8s.io/ReferenceGrant - object is required in the referent namespace - to allow that namespace's owner to accept - the reference. See the ReferenceGrant documentation - for details. (Alpha) This field requires the - CrossNamespaceVolumeDataSource feature gate - to be enabled. - type: string - required: - - kind - - name - type: object - resources: - description: 'resources represents the minimum resources - the volume should have. If RecoverVolumeExpansionFailure - feature is enabled users are allowed to specify - resource requirements that are lower than previous - value but must still be higher than capacity recorded - in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' - properties: - claims: - description: "Claims lists the names of resources, - defined in spec.resourceClaims, that are used - by this container. \n This is an alpha field - and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. - It can only be set for containers." - items: - description: ResourceClaim references one - entry in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name - of one entry in pod.spec.resourceClaims - of the Pod where this field is used. - It makes that resource available inside - a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum - amount of compute resources required. If Requests - is omitted for a container, it defaults to - Limits if that is explicitly specified, otherwise - to an implementation-defined value. Requests - cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - selector: - description: selector is a label query over volumes - to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: 'storageClassName is the name of the - StorageClass required by the claim. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' - type: string - volumeMode: - description: volumeMode defines what type of volume - is required by the claim. Value of Filesystem - is implied when not included in claim spec. - type: string - volumeName: - description: volumeName is the binding reference - to the PersistentVolume backing this claim. - type: string - type: object - required: - - spec - type: object - type: object - fc: - description: fc represents a Fibre Channel resource that is - attached to a kubelet's host machine and then exposed to the - pod. - properties: - fsType: - description: 'fsType is the filesystem type to mount. Must - be a filesystem type supported by the host operating system. - Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. TODO: how do we prevent errors in the - filesystem from compromising the machine' - type: string - lun: - description: 'lun is Optional: FC target lun number' - format: int32 - type: integer - readOnly: - description: 'readOnly is Optional: Defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - targetWWNs: - description: 'targetWWNs is Optional: FC target worldwide - names (WWNs)' - items: - type: string - type: array - wwids: - description: 'wwids Optional: FC volume world wide identifiers - (wwids) Either wwids or combination of targetWWNs and - lun must be set, but not both simultaneously.' - items: - type: string - type: array - type: object - flexVolume: - description: flexVolume represents a generic volume resource - that is provisioned/attached using an exec based plugin. - properties: - driver: - description: driver is the name of the driver to use for - this volume. - type: string - fsType: - description: fsType is the filesystem type to mount. Must - be a filesystem type supported by the host operating system. - Ex. "ext4", "xfs", "ntfs". The default filesystem depends - on FlexVolume script. - type: string - options: - additionalProperties: - type: string - description: 'options is Optional: this field holds extra - command options if any.' - type: object - readOnly: - description: 'readOnly is Optional: defaults to false (read/write). - ReadOnly here will force the ReadOnly setting in VolumeMounts.' - type: boolean - secretRef: - description: 'secretRef is Optional: secretRef is reference - to the secret object containing sensitive information - to pass to the plugin scripts. This may be empty if no - secret object is specified. If the secret object contains - more than one secret, all secrets are passed to the plugin - scripts.' - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - driver - type: object - flocker: - description: flocker represents a Flocker volume attached to - a kubelet's host machine. This depends on the Flocker control - service being running - properties: - datasetName: - description: datasetName is Name of the dataset stored as - metadata -> name on the dataset for Flocker should be - considered as deprecated - type: string - datasetUUID: - description: datasetUUID is the UUID of the dataset. This - is unique identifier of a Flocker dataset - type: string - type: object - gcePersistentDisk: - description: 'gcePersistentDisk represents a GCE Disk resource - that is attached to a kubelet''s host machine and then exposed - to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - properties: - fsType: - description: 'fsType is filesystem type of the volume that - you want to mount. Tip: Ensure that the filesystem type - is supported by the host operating system. Examples: "ext4", - "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - partition: - description: 'partition is the partition in the volume that - you want to mount. If omitted, the default is to mount - by volume name. Examples: For volume /dev/sda1, you specify - the partition as "1". Similarly, the volume partition - for /dev/sda is "0" (or you can leave the property empty). - More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - format: int32 - type: integer - pdName: - description: 'pdName is unique name of the PD resource in - GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: string - readOnly: - description: 'readOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' - type: boolean - required: - - pdName - type: object - gitRepo: - description: 'gitRepo represents a git repository at a particular - revision. DEPRECATED: GitRepo is deprecated. To provision - a container with a git repo, mount an EmptyDir into an InitContainer - that clones the repo using git, then mount the EmptyDir into - the Pod''s container.' - properties: - directory: - description: directory is the target directory name. Must - not contain or start with '..'. If '.' is supplied, the - volume directory will be the git repository. Otherwise, - if specified, the volume will contain the git repository - in the subdirectory with the given name. - type: string - repository: - description: repository is the URL - type: string - revision: - description: revision is the commit hash for the specified - revision. - type: string - required: - - repository - type: object - glusterfs: - description: 'glusterfs represents a Glusterfs mount on the - host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' - properties: - endpoints: - description: 'endpoints is the endpoint name that details - Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - path: - description: 'path is the Glusterfs volume path. More info: - https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: string - readOnly: - description: 'readOnly here will force the Glusterfs volume - to be mounted with read-only permissions. Defaults to - false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' - type: boolean - required: - - endpoints - - path - type: object - hostPath: - description: 'hostPath represents a pre-existing file or directory - on the host machine that is directly exposed to the container. - This is generally used for system agents or other privileged - things that are allowed to see the host machine. Most containers - will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - --- TODO(jonesdl) We need to restrict who can use host directory - mounts and who can/can not mount host directories as read/write.' - properties: - path: - description: 'path of the directory on the host. If the - path is a symlink, it will follow the link to the real - path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - type: - description: 'type for HostPath Volume Defaults to "" More - info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' - type: string - required: - - path - type: object - iscsi: - description: 'iscsi represents an ISCSI Disk resource that is - attached to a kubelet''s host machine and then exposed to - the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' - properties: - chapAuthDiscovery: - description: chapAuthDiscovery defines whether support iSCSI - Discovery CHAP authentication - type: boolean - chapAuthSession: - description: chapAuthSession defines whether support iSCSI - Session CHAP authentication - type: boolean - fsType: - description: 'fsType is the filesystem type of the volume - that you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - initiatorName: - description: initiatorName is the custom iSCSI Initiator - Name. If initiatorName is specified with iscsiInterface - simultaneously, new iSCSI interface : will be created for the connection. - type: string - iqn: - description: iqn is the target iSCSI Qualified Name. - type: string - iscsiInterface: - description: iscsiInterface is the interface Name that uses - an iSCSI transport. Defaults to 'default' (tcp). - type: string - lun: - description: lun represents iSCSI Target Lun number. - format: int32 - type: integer - portals: - description: portals is the iSCSI Target Portal List. The - portal is either an IP or ip_addr:port if the port is - other than default (typically TCP ports 860 and 3260). - items: - type: string - type: array - readOnly: - description: readOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. - type: boolean - secretRef: - description: secretRef is the CHAP Secret for iSCSI target - and initiator authentication - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - targetPortal: - description: targetPortal is iSCSI Target Portal. The Portal - is either an IP or ip_addr:port if the port is other than - default (typically TCP ports 860 and 3260). - type: string - required: - - iqn - - lun - - targetPortal - type: object - name: - description: 'name of the volume. Must be a DNS_LABEL and unique - within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - nfs: - description: 'nfs represents an NFS mount on the host that shares - a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - properties: - path: - description: 'path that is exported by the NFS server. More - info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - readOnly: - description: 'readOnly here will force the NFS export to - be mounted with read-only permissions. Defaults to false. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: boolean - server: - description: 'server is the hostname or IP address of the - NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' - type: string - required: - - path - - server - type: object - persistentVolumeClaim: - description: 'persistentVolumeClaimVolumeSource represents a - reference to a PersistentVolumeClaim in the same namespace. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - properties: - claimName: - description: 'claimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - readOnly: - description: readOnly Will force the ReadOnly setting in - VolumeMounts. Default false. - type: boolean - required: - - claimName - type: object - photonPersistentDisk: - description: photonPersistentDisk represents a PhotonController - persistent disk attached and mounted on kubelets host machine - properties: - fsType: - description: fsType is the filesystem type to mount. Must - be a filesystem type supported by the host operating system. - Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. - type: string - pdID: - description: pdID is the ID that identifies Photon Controller - persistent disk - type: string - required: - - pdID - type: object - portworxVolume: - description: portworxVolume represents a portworx volume attached - and mounted on kubelets host machine - properties: - fsType: - description: fSType represents the filesystem type to mount - Must be a filesystem type supported by the host operating - system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" - if unspecified. - type: string - readOnly: - description: readOnly defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - volumeID: - description: volumeID uniquely identifies a Portworx volume - type: string - required: - - volumeID - type: object - projected: - description: projected items for all in one resources secrets, - configmaps, and downward API - properties: - defaultMode: - description: defaultMode are the mode bits used to set permissions - on created files by default. Must be an octal value between - 0000 and 0777 or a decimal value between 0 and 511. YAML - accepts both octal and decimal values, JSON requires decimal - values for mode bits. Directories within the path are - not affected by this setting. This might be in conflict - with other options that affect the file mode, like fsGroup, - and the result can be other mode bits set. - format: int32 - type: integer - sources: - description: sources is the list of volume projections - items: - description: Projection that may be projected along with - other supported volume types - properties: - configMap: - description: configMap information about the configMap - data to project - properties: - items: - description: items if unspecified, each key-value - pair in the Data field of the referenced ConfigMap - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the ConfigMap, the volume - setup will error unless it is marked optional. - Paths must be relative and may not contain the - '..' path or start with '..'. - items: - description: Maps a string key to a path within - a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits - used to set permissions on this file. - Must be an octal value between 0000 and - 0777 or a decimal value between 0 and - 511. YAML accepts both octal and decimal - values, JSON requires decimal values for - mode bits. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' - format: int32 - type: integer - path: - description: path is the relative path of - the file to map the key to. May not be - an absolute path. May not contain the - path element '..'. May not start with - the string '..'. - type: string - required: - - key - - path - type: object - type: array - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: optional specify whether the ConfigMap - or its keys must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - downwardAPI: - description: downwardAPI information about the downwardAPI - data to project - properties: - items: - description: Items is a list of DownwardAPIVolume - file - items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - properties: - fieldRef: - description: 'Required: Selects a field - of the pod: only annotations, labels, - name and namespace are supported.' - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - mode: - description: 'Optional: mode bits used to - set permissions on this file, must be - an octal value between 0000 and 0777 or - a decimal value between 0 and 511. YAML - accepts both octal and decimal values, - JSON requires decimal values for mode - bits. If not specified, the volume defaultMode - will be used. This might be in conflict - with other options that affect the file - mode, like fsGroup, and the result can - be other mode bits set.' - format: int32 - type: integer - path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' - path. Must be utf-8 encoded. The first - item of the relative path must not start - with ''..''' - type: string - resourceFieldRef: - description: 'Selects a resource of the - container: only resources limits and requests - (limits.cpu, limits.memory, requests.cpu - and requests.memory) are currently supported.' - properties: - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults - to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to - select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - required: - - path - type: object - type: array - type: object - secret: - description: secret information about the secret data - to project - properties: - items: - description: items if unspecified, each key-value - pair in the Data field of the referenced Secret - will be projected into the volume as a file - whose name is the key and content is the value. - If specified, the listed keys will be projected - into the specified paths, and unlisted keys - will not be present. If a key is specified which - is not present in the Secret, the volume setup - will error unless it is marked optional. Paths - must be relative and may not contain the '..' - path or start with '..'. - items: - description: Maps a string key to a path within - a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits - used to set permissions on this file. - Must be an octal value between 0000 and - 0777 or a decimal value between 0 and - 511. YAML accepts both octal and decimal - values, JSON requires decimal values for - mode bits. If not specified, the volume - defaultMode will be used. This might be - in conflict with other options that affect - the file mode, like fsGroup, and the result - can be other mode bits set.' - format: int32 - type: integer - path: - description: path is the relative path of - the file to map the key to. May not be - an absolute path. May not contain the - path element '..'. May not start with - the string '..'. - type: string - required: - - key - - path - type: object - type: array - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: optional field specify whether the - Secret or its key must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - serviceAccountToken: - description: serviceAccountToken is information about - the serviceAccountToken data to project - properties: - audience: - description: audience is the intended audience - of the token. A recipient of a token must identify - itself with an identifier specified in the audience - of the token, and otherwise should reject the - token. The audience defaults to the identifier - of the apiserver. - type: string - expirationSeconds: - description: expirationSeconds is the requested - duration of validity of the service account - token. As the token approaches expiration, the - kubelet volume plugin will proactively rotate - the service account token. The kubelet will - start trying to rotate the token if the token - is older than 80 percent of its time to live - or if the token is older than 24 hours.Defaults - to 1 hour and must be at least 10 minutes. - format: int64 - type: integer - path: - description: path is the path relative to the - mount point of the file to project the token - into. - type: string - required: - - path - type: object - type: object - type: array - type: object - quobyte: - description: quobyte represents a Quobyte mount on the host - that shares a pod's lifetime - properties: - group: - description: group to map volume access to Default is no - group - type: string - readOnly: - description: readOnly here will force the Quobyte volume - to be mounted with read-only permissions. Defaults to - false. - type: boolean - registry: - description: registry represents a single or multiple Quobyte - Registry services specified as a string as host:port pair - (multiple entries are separated with commas) which acts - as the central registry for volumes - type: string - tenant: - description: tenant owning the given Quobyte volume in the - Backend Used with dynamically provisioned Quobyte volumes, - value is set by the plugin - type: string - user: - description: user to map volume access to Defaults to serivceaccount - user - type: string - volume: - description: volume is a string that references an already - created Quobyte volume by name. - type: string - required: - - registry - - volume - type: object - rbd: - description: 'rbd represents a Rados Block Device mount on the - host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' - properties: - fsType: - description: 'fsType is the filesystem type of the volume - that you want to mount. Tip: Ensure that the filesystem - type is supported by the host operating system. Examples: - "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd - TODO: how do we prevent errors in the filesystem from - compromising the machine' - type: string - image: - description: 'image is the rados image name. More info: - https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - keyring: - description: 'keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - monitors: - description: 'monitors is a collection of Ceph monitors. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - items: - type: string - type: array - pool: - description: 'pool is the rados pool name. Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - readOnly: - description: 'readOnly here will force the ReadOnly setting - in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: boolean - secretRef: - description: 'secretRef is name of the authentication secret - for RBDUser. If provided overrides keyring. Default is - nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - user: - description: 'user is the rados user name. Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' - type: string - required: - - image - - monitors - type: object - scaleIO: - description: scaleIO represents a ScaleIO persistent volume - attached and mounted on Kubernetes nodes. - properties: - fsType: - description: fsType is the filesystem type to mount. Must - be a filesystem type supported by the host operating system. - Ex. "ext4", "xfs", "ntfs". Default is "xfs". - type: string - gateway: - description: gateway is the host address of the ScaleIO - API Gateway. - type: string - protectionDomain: - description: protectionDomain is the name of the ScaleIO - Protection Domain for the configured storage. - type: string - readOnly: - description: readOnly Defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: secretRef references to the secret for ScaleIO - user and other sensitive information. If this is not provided, - Login operation will fail. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - sslEnabled: - description: sslEnabled Flag enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: storageMode indicates whether the storage for - a volume should be ThickProvisioned or ThinProvisioned. - Default is ThinProvisioned. - type: string - storagePool: - description: storagePool is the ScaleIO Storage Pool associated - with the protection domain. - type: string - system: - description: system is the name of the storage system as - configured in ScaleIO. - type: string - volumeName: - description: volumeName is the name of a volume already - created in the ScaleIO system that is associated with - this volume source. - type: string - required: - - gateway - - secretRef - - system - type: object - secret: - description: 'secret represents a secret that should populate - this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - properties: - defaultMode: - description: 'defaultMode is Optional: mode bits used to - set permissions on created files by default. Must be an - octal value between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. Defaults to - 0644. Directories within the path are not affected by - this setting. This might be in conflict with other options - that affect the file mode, like fsGroup, and the result - can be other mode bits set.' - format: int32 - type: integer - items: - description: items If unspecified, each key-value pair in - the Data field of the referenced Secret will be projected - into the volume as a file whose name is the key and content - is the value. If specified, the listed keys will be projected - into the specified paths, and unlisted keys will not be - present. If a key is specified which is not present in - the Secret, the volume setup will error unless it is marked - optional. Paths must be relative and may not contain the - '..' path or start with '..'. - items: - description: Maps a string key to a path within a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits used to - set permissions on this file. Must be an octal value - between 0000 and 0777 or a decimal value between - 0 and 511. YAML accepts both octal and decimal values, - JSON requires decimal values for mode bits. If not - specified, the volume defaultMode will be used. - This might be in conflict with other options that - affect the file mode, like fsGroup, and the result - can be other mode bits set.' - format: int32 - type: integer - path: - description: path is the relative path of the file - to map the key to. May not be an absolute path. - May not contain the path element '..'. May not start - with the string '..'. - type: string - required: - - key - - path - type: object - type: array - optional: - description: optional field specify whether the Secret or - its keys must be defined - type: boolean - secretName: - description: 'secretName is the name of the secret in the - pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' - type: string - type: object - storageos: - description: storageOS represents a StorageOS volume attached - and mounted on Kubernetes nodes. - properties: - fsType: - description: fsType is the filesystem type to mount. Must - be a filesystem type supported by the host operating system. - Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. - type: string - readOnly: - description: readOnly defaults to false (read/write). ReadOnly - here will force the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: secretRef specifies the secret to use for obtaining - the StorageOS API credentials. If not specified, default - values will be attempted. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - volumeName: - description: volumeName is the human-readable name of the - StorageOS volume. Volume names are only unique within - a namespace. - type: string - volumeNamespace: - description: volumeNamespace specifies the scope of the - volume within StorageOS. If no namespace is specified - then the Pod's namespace will be used. This allows the - Kubernetes name scoping to be mirrored within StorageOS - for tighter integration. Set VolumeName to any name to - override the default behaviour. Set to "default" if you - are not using namespaces within StorageOS. Namespaces - that do not pre-exist within StorageOS will be created. - type: string - type: object - vsphereVolume: - description: vsphereVolume represents a vSphere volume attached - and mounted on kubelets host machine - properties: - fsType: - description: fsType is filesystem type to mount. Must be - a filesystem type supported by the host operating system. - Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" - if unspecified. - type: string - storagePolicyID: - description: storagePolicyID is the storage Policy Based - Management (SPBM) profile ID associated with the StoragePolicyName. - type: string - storagePolicyName: - description: storagePolicyName is the storage Policy Based - Management (SPBM) profile name. - type: string - volumePath: - description: volumePath is the path that identifies vSphere - volume vmdk - type: string - required: - - volumePath - type: object - required: - - name - type: object - type: array - web: - description: Defines the web command line flags when starting Alertmanager. - properties: - getConcurrency: - description: Maximum number of GET requests processed concurrently. - This corresponds to the Alertmanager's `--web.get-concurrency` - flag. - format: int32 - type: integer - httpConfig: - description: Defines HTTP parameters for web server. - properties: - headers: - description: List of headers that can be added to HTTP responses. - properties: - contentSecurityPolicy: - description: Set the Content-Security-Policy header to - HTTP responses. Unset if blank. - type: string - strictTransportSecurity: - description: Set the Strict-Transport-Security header - to HTTP responses. Unset if blank. Please make sure - that you use this with care as this header might force - browsers to load Prometheus and the other applications - hosted on the same domain and subdomains over HTTPS. - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security - type: string - xContentTypeOptions: - description: Set the X-Content-Type-Options header to - HTTP responses. Unset if blank. Accepted value is nosniff. - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options - enum: - - "" - - NoSniff - type: string - xFrameOptions: - description: Set the X-Frame-Options header to HTTP responses. - Unset if blank. Accepted values are deny and sameorigin. - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options - enum: - - "" - - Deny - - SameOrigin - type: string - xXSSProtection: - description: Set the X-XSS-Protection header to all responses. - Unset if blank. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection - type: string - type: object - http2: - description: Enable HTTP/2 support. Note that HTTP/2 is only - supported with TLS. When TLSConfig is not configured, HTTP/2 - will be disabled. Whenever the value of the field changes, - a rolling update will be triggered. - type: boolean - type: object - timeout: - description: Timeout for HTTP requests. This corresponds to the - Alertmanager's `--web.timeout` flag. - format: int32 - type: integer - tlsConfig: - description: Defines the TLS parameters for HTTPS. - properties: - cert: - description: Contains the TLS certificate for the server. - properties: - configMap: - description: ConfigMap containing data to use for the - targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cipherSuites: - description: 'List of supported cipher suites for TLS versions - up to TLS 1.2. If empty, Go default cipher suites are used. - Available cipher suites are documented in the go documentation: - https://golang.org/pkg/crypto/tls/#pkg-constants' - items: - type: string - type: array - client_ca: - description: Contains the CA certificate for client certificate - authentication to the server. - properties: - configMap: - description: ConfigMap containing data to use for the - targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientAuthType: - description: 'Server policy for client authentication. Maps - to ClientAuth Policies. For more detail on clientAuth options: - https://golang.org/pkg/crypto/tls/#ClientAuthType' - type: string - curvePreferences: - description: 'Elliptic curves that will be used in an ECDHE - handshake, in preference order. Available curves are documented - in the go documentation: https://golang.org/pkg/crypto/tls/#CurveID' - items: - type: string - type: array - keySecret: - description: Secret containing the TLS key for the server. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - maxVersion: - description: Maximum TLS version that is acceptable. Defaults - to TLS13. - type: string - minVersion: - description: Minimum TLS version that is acceptable. Defaults - to TLS12. - type: string - preferServerCipherSuites: - description: Controls whether the server selects the client's - most preferred cipher suite, or the server's most preferred - cipher suite. If true then the server's preference, as expressed - in the order of elements in cipherSuites, is used. - type: boolean - required: - - cert - - keySecret - type: object - type: object - type: object - status: - description: 'Most recent observed status of the Alertmanager cluster. - Read-only. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - availableReplicas: - description: Total number of available pods (ready for at least minReadySeconds) - targeted by this Alertmanager cluster. - format: int32 - type: integer - conditions: - description: The current state of the Alertmanager object. - items: - description: Condition represents the state of the resources associated - with the Prometheus, Alertmanager or ThanosRuler resource. - properties: - lastTransitionTime: - description: lastTransitionTime is the time of the last update - to the current status property. - format: date-time - type: string - message: - description: Human-readable message indicating details for the - condition's last transition. - type: string - observedGeneration: - description: ObservedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if `.metadata.generation` - is currently 12, but the `.status.conditions[].observedGeneration` - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - type: integer - reason: - description: Reason for the condition's last transition. - type: string - status: - description: Status of the condition. - type: string - type: - description: Type of the condition being reported. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - paused: - description: Represents whether any actions on the underlying managed - objects are being performed. Only delete actions will be performed. - type: boolean - replicas: - description: Total number of non-terminated pods targeted by this - Alertmanager object (their labels match the selector). - format: int32 - type: integer - unavailableReplicas: - description: Total number of unavailable pods targeted by this Alertmanager - object. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated pods targeted by this - Alertmanager object that have the desired version spec. - format: int32 - type: integer - required: - - availableReplicas - - paused - - replicas - - unavailableReplicas - - updatedReplicas - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.11.1 - operator.prometheus.io/version: 0.69.1 - creationTimestamp: null - name: podmonitors.monitoring.coreos.com -spec: - group: monitoring.coreos.com - names: - categories: - - prometheus-operator - kind: PodMonitor - listKind: PodMonitorList - plural: podmonitors - shortNames: - - pmon - singular: podmonitor - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: PodMonitor defines monitoring for a set of pods. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Specification of desired Pod selection for target discovery - by Prometheus. - properties: - attachMetadata: - description: Attaches node metadata to discovered targets. Requires - Prometheus v2.35.0 and above. - properties: - node: - description: When set to true, Prometheus must have permissions - to get Nodes. - type: boolean - type: object - jobLabel: - description: The label to use to retrieve the job name from. - type: string - keepDroppedTargets: - description: "Per-scrape limit on the number of targets dropped by - relabeling that will be kept in memory. 0 means no limit. \n It - requires Prometheus >= v2.47.0." - format: int64 - type: integer - labelLimit: - description: Per-scrape limit on number of labels that will be accepted - for a sample. Only valid in Prometheus versions 2.27.0 and newer. - format: int64 - type: integer - labelNameLengthLimit: - description: Per-scrape limit on length of labels name that will be - accepted for a sample. Only valid in Prometheus versions 2.27.0 - and newer. - format: int64 - type: integer - labelValueLengthLimit: - description: Per-scrape limit on length of labels value that will - be accepted for a sample. Only valid in Prometheus versions 2.27.0 - and newer. - format: int64 - type: integer - namespaceSelector: - description: Selector to select which namespaces the Endpoints objects - are discovered from. - properties: - any: - description: Boolean describing whether all namespaces are selected - in contrast to a list restricting them. - type: boolean - matchNames: - description: List of namespace names to select from. - items: - type: string - type: array - type: object - podMetricsEndpoints: - description: A list of endpoints allowed as part of this PodMonitor. - items: - description: PodMetricsEndpoint defines a scrapeable endpoint of - a Kubernetes Pod serving Prometheus metrics. - properties: - authorization: - description: Authorization section for this endpoint - properties: - credentials: - description: Selects a key of a Secret in the namespace - that contains the credentials for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. The value - is case-insensitive. \n \"Basic\" is not a supported value. - \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: 'BasicAuth allow an endpoint to authenticate over - basic authentication. More info: https://prometheus.io/docs/operating/configuration/#endpoint' - properties: - password: - description: The secret in the service monitor namespace - that contains the password for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor namespace - that contains the username for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: Secret to mount to read bearer token for scraping - targets. The secret needs to be in the same namespace as the - pod monitor and accessible by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - enableHttp2: - description: Whether to enable HTTP2. - type: boolean - filterRunning: - description: 'Drop pods that are not running. (Failed, Succeeded). - Enabled by default. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase' - type: boolean - followRedirects: - description: FollowRedirects configures whether scrape requests - follow HTTP 3xx redirects. - type: boolean - honorLabels: - description: HonorLabels chooses the metric's labels on collisions - with target labels. - type: boolean - honorTimestamps: - description: HonorTimestamps controls whether Prometheus respects - the timestamps present in scraped data. - type: boolean - interval: - description: Interval at which metrics should be scraped If - not specified Prometheus' global scrape interval is used. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - metricRelabelings: - description: MetricRelabelConfigs to apply to samples before - ingestion. - items: - description: "RelabelConfig allows dynamic rewriting of the - label set for targets, alerts, scraped samples and remote - write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" - properties: - action: - default: replace - description: "Action to perform based on the regex matching. - \n `Uppercase` and `Lowercase` actions require Prometheus - >= v2.36.0. `DropEqual` and `KeepEqual` actions require - Prometheus >= v2.41.0. \n Default: \"Replace\"" - enum: - - replace - - Replace - - keep - - Keep - - drop - - Drop - - hashmod - - HashMod - - labelmap - - LabelMap - - labeldrop - - LabelDrop - - labelkeep - - LabelKeep - - lowercase - - Lowercase - - uppercase - - Uppercase - - keepequal - - KeepEqual - - dropequal - - DropEqual - type: string - modulus: - description: "Modulus to take of the hash of the source - label values. \n Only applicable when the action is - `HashMod`." - format: int64 - type: integer - regex: - description: Regular expression against which the extracted - value is matched. - type: string - replacement: - description: "Replacement value against which a Replace - action is performed if the regular expression matches. - \n Regex capture groups are available." - type: string - separator: - description: Separator is the string between concatenated - SourceLabels. - type: string - sourceLabels: - description: The source labels select values from existing - labels. Their content is concatenated using the configured - Separator and matched against the configured regular - expression. - items: - description: LabelName is a valid Prometheus label name - which may only contain ASCII letters, numbers, as - well as underscores. - pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ - type: string - type: array - targetLabel: - description: "Label to which the resulting string is written - in a replacement. \n It is mandatory for `Replace`, - `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and - `DropEqual` actions. \n Regex capture groups are available." - type: string - type: object - type: array - oauth2: - description: OAuth2 for the URL. Only valid in Prometheus versions - 2.27.0 and newer. - properties: - clientId: - description: The secret or configmap containing the OAuth2 - client id - properties: - configMap: - description: ConfigMap containing data to use for the - targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 client secret - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token URL - type: object - scopes: - description: OAuth2 scopes used for the token request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - params: - additionalProperties: - items: - type: string - type: array - description: Optional HTTP URL parameters - type: object - path: - description: HTTP path to scrape for metrics. If empty, Prometheus - uses the default value (e.g. `/metrics`). - type: string - port: - description: Name of the pod port this endpoint refers to. Mutually - exclusive with targetPort. - type: string - proxyUrl: - description: ProxyURL eg http://proxyserver:2195 Directs scrapes - to proxy through this endpoint. - type: string - relabelings: - description: 'RelabelConfigs to apply to samples before scraping. - Prometheus Operator automatically adds relabelings for a few - standard Kubernetes fields. The original scrape job''s name - is available via the `__tmp_prometheus_job_name` label. More - info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' - items: - description: "RelabelConfig allows dynamic rewriting of the - label set for targets, alerts, scraped samples and remote - write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" - properties: - action: - default: replace - description: "Action to perform based on the regex matching. - \n `Uppercase` and `Lowercase` actions require Prometheus - >= v2.36.0. `DropEqual` and `KeepEqual` actions require - Prometheus >= v2.41.0. \n Default: \"Replace\"" - enum: - - replace - - Replace - - keep - - Keep - - drop - - Drop - - hashmod - - HashMod - - labelmap - - LabelMap - - labeldrop - - LabelDrop - - labelkeep - - LabelKeep - - lowercase - - Lowercase - - uppercase - - Uppercase - - keepequal - - KeepEqual - - dropequal - - DropEqual - type: string - modulus: - description: "Modulus to take of the hash of the source - label values. \n Only applicable when the action is - `HashMod`." - format: int64 - type: integer - regex: - description: Regular expression against which the extracted - value is matched. - type: string - replacement: - description: "Replacement value against which a Replace - action is performed if the regular expression matches. - \n Regex capture groups are available." - type: string - separator: - description: Separator is the string between concatenated - SourceLabels. - type: string - sourceLabels: - description: The source labels select values from existing - labels. Their content is concatenated using the configured - Separator and matched against the configured regular - expression. - items: - description: LabelName is a valid Prometheus label name - which may only contain ASCII letters, numbers, as - well as underscores. - pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ - type: string - type: array - targetLabel: - description: "Label to which the resulting string is written - in a replacement. \n It is mandatory for `Replace`, - `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and - `DropEqual` actions. \n Regex capture groups are available." - type: string - type: object - type: array - scheme: - description: HTTP scheme to use for scraping. `http` and `https` - are the expected values unless you rewrite the `__scheme__` - label via relabeling. If empty, Prometheus uses the default - value `http`. - enum: - - http - - https - type: string - scrapeTimeout: - description: Timeout after which the scrape is ended If not - specified, the Prometheus global scrape interval is used. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - targetPort: - anyOf: - - type: integer - - type: string - description: 'Deprecated: Use ''port'' instead.' - x-kubernetes-int-or-string: true - tlsConfig: - description: TLS configuration to use when scraping the endpoint. - properties: - ca: - description: Certificate authority used when verifying server - certificates. - properties: - configMap: - description: ConfigMap containing data to use for the - targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to use for the - targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key file for the - targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the targets. - type: string - type: object - type: object - type: array - podTargetLabels: - description: PodTargetLabels transfers labels on the Kubernetes Pod - onto the target. - items: - type: string - type: array - sampleLimit: - description: SampleLimit defines per-scrape limit on number of scraped - samples that will be accepted. - format: int64 - type: integer - selector: - description: Selector to select Pod objects. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: key is the label key that the selector applies - to. - type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - targetLimit: - description: TargetLimit defines a limit on the number of scraped - targets that will be accepted. - format: int64 - type: integer - required: - - podMetricsEndpoints - - selector - type: object - required: - - spec - type: object - served: true - storage: true ---- ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.11.1 - operator.prometheus.io/version: 0.69.1 - creationTimestamp: null - name: probes.monitoring.coreos.com -spec: - group: monitoring.coreos.com - names: - categories: - - prometheus-operator - kind: Probe - listKind: ProbeList - plural: probes - shortNames: - - prb - singular: probe - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: Probe defines monitoring for a set of static targets or ingresses. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Specification of desired Ingress selection for target discovery - by Prometheus. - properties: - authorization: - description: Authorization section for this endpoint - properties: - credentials: - description: Selects a key of a Secret in the namespace that contains - the credentials for authentication. - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: - description: "Defines the authentication type. The value is case-insensitive. - \n \"Basic\" is not a supported value. \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: 'BasicAuth allow an endpoint to authenticate over basic - authentication. More info: https://prometheus.io/docs/operating/configuration/#endpoint' - properties: - password: - description: The secret in the service monitor namespace that - contains the password for authentication. - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor namespace that - contains the username for authentication. - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerTokenSecret: - description: Secret to mount to read bearer token for scraping targets. - The secret needs to be in the same namespace as the probe and accessible - by the Prometheus Operator. - properties: - key: - description: The key of the secret to select from. Must be a - valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - interval: - description: Interval at which targets are probed using the configured - prober. If not specified Prometheus' global scrape interval is used. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - jobName: - description: The job name assigned to scraped metrics by default. - type: string - keepDroppedTargets: - description: "Per-scrape limit on the number of targets dropped by - relabeling that will be kept in memory. 0 means no limit. \n It - requires Prometheus >= v2.47.0." - format: int64 - type: integer - labelLimit: - description: Per-scrape limit on number of labels that will be accepted - for a sample. Only valid in Prometheus versions 2.27.0 and newer. - format: int64 - type: integer - labelNameLengthLimit: - description: Per-scrape limit on length of labels name that will be - accepted for a sample. Only valid in Prometheus versions 2.27.0 - and newer. - format: int64 - type: integer - labelValueLengthLimit: - description: Per-scrape limit on length of labels value that will - be accepted for a sample. Only valid in Prometheus versions 2.27.0 - and newer. - format: int64 - type: integer - metricRelabelings: - description: MetricRelabelConfigs to apply to samples before ingestion. - items: - description: "RelabelConfig allows dynamic rewriting of the label - set for targets, alerts, scraped samples and remote write samples. - \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" - properties: - action: - default: replace - description: "Action to perform based on the regex matching. - \n `Uppercase` and `Lowercase` actions require Prometheus - >= v2.36.0. `DropEqual` and `KeepEqual` actions require Prometheus - >= v2.41.0. \n Default: \"Replace\"" - enum: - - replace - - Replace - - keep - - Keep - - drop - - Drop - - hashmod - - HashMod - - labelmap - - LabelMap - - labeldrop - - LabelDrop - - labelkeep - - LabelKeep - - lowercase - - Lowercase - - uppercase - - Uppercase - - keepequal - - KeepEqual - - dropequal - - DropEqual - type: string - modulus: - description: "Modulus to take of the hash of the source label - values. \n Only applicable when the action is `HashMod`." - format: int64 - type: integer - regex: - description: Regular expression against which the extracted - value is matched. - type: string - replacement: - description: "Replacement value against which a Replace action - is performed if the regular expression matches. \n Regex capture - groups are available." - type: string - separator: - description: Separator is the string between concatenated SourceLabels. - type: string - sourceLabels: - description: The source labels select values from existing labels. - Their content is concatenated using the configured Separator - and matched against the configured regular expression. - items: - description: LabelName is a valid Prometheus label name which - may only contain ASCII letters, numbers, as well as underscores. - pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ - type: string - type: array - targetLabel: - description: "Label to which the resulting string is written - in a replacement. \n It is mandatory for `Replace`, `HashMod`, - `Lowercase`, `Uppercase`, `KeepEqual` and `DropEqual` actions. - \n Regex capture groups are available." - type: string - type: object - type: array - module: - description: 'The module to use for probing specifying how to probe - the target. Example module configuring in the blackbox exporter: - https://github.com/prometheus/blackbox_exporter/blob/master/example.yml' - type: string - oauth2: - description: OAuth2 for the URL. Only valid in Prometheus versions - 2.27.0 and newer. - properties: - clientId: - description: The secret or configmap containing the OAuth2 client - id - properties: - configMap: - description: ConfigMap containing data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - clientSecret: - description: The secret containing the OAuth2 client secret - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - endpointParams: - additionalProperties: - type: string - description: Parameters to append to the token URL - type: object - scopes: - description: OAuth2 scopes used for the token request - items: - type: string - type: array - tokenUrl: - description: The URL to fetch the token from - minLength: 1 - type: string - required: - - clientId - - clientSecret - - tokenUrl - type: object - prober: - description: Specification for the prober to use for probing targets. - The prober.URL parameter is required. Targets cannot be probed if - left empty. - properties: - path: - default: /probe - description: Path to collect metrics from. Defaults to `/probe`. - type: string - proxyUrl: - description: Optional ProxyURL. - type: string - scheme: - description: HTTP scheme to use for scraping. `http` and `https` - are the expected values unless you rewrite the `__scheme__` - label via relabeling. If empty, Prometheus uses the default - value `http`. - enum: - - http - - https - type: string - url: - description: Mandatory URL of the prober. - type: string - required: - - url - type: object - sampleLimit: - description: SampleLimit defines per-scrape limit on number of scraped - samples that will be accepted. - format: int64 - type: integer - scrapeTimeout: - description: Timeout for scraping metrics from the Prometheus exporter. - If not specified, the Prometheus global scrape timeout is used. - pattern: ^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$ - type: string - targetLimit: - description: TargetLimit defines a limit on the number of scraped - targets that will be accepted. - format: int64 - type: integer - targets: - description: Targets defines a set of static or dynamically discovered - targets to probe. - properties: - ingress: - description: ingress defines the Ingress objects to probe and - the relabeling configuration. If `staticConfig` is also defined, - `staticConfig` takes precedence. - properties: - namespaceSelector: - description: From which namespaces to select Ingress objects. - properties: - any: - description: Boolean describing whether all namespaces - are selected in contrast to a list restricting them. - type: boolean - matchNames: - description: List of namespace names to select from. - items: - type: string - type: array - type: object - relabelingConfigs: - description: 'RelabelConfigs to apply to the label set of - the target before it gets scraped. The original ingress - address is available via the `__tmp_prometheus_ingress_address` - label. It can be used to customize the probed URL. The original - scrape job''s name is available via the `__tmp_prometheus_job_name` - label. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' - items: - description: "RelabelConfig allows dynamic rewriting of - the label set for targets, alerts, scraped samples and - remote write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" - properties: - action: - default: replace - description: "Action to perform based on the regex matching. - \n `Uppercase` and `Lowercase` actions require Prometheus - >= v2.36.0. `DropEqual` and `KeepEqual` actions require - Prometheus >= v2.41.0. \n Default: \"Replace\"" - enum: - - replace - - Replace - - keep - - Keep - - drop - - Drop - - hashmod - - HashMod - - labelmap - - LabelMap - - labeldrop - - LabelDrop - - labelkeep - - LabelKeep - - lowercase - - Lowercase - - uppercase - - Uppercase - - keepequal - - KeepEqual - - dropequal - - DropEqual - type: string - modulus: - description: "Modulus to take of the hash of the source - label values. \n Only applicable when the action is - `HashMod`." - format: int64 - type: integer - regex: - description: Regular expression against which the extracted - value is matched. - type: string - replacement: - description: "Replacement value against which a Replace - action is performed if the regular expression matches. - \n Regex capture groups are available." - type: string - separator: - description: Separator is the string between concatenated - SourceLabels. - type: string - sourceLabels: - description: The source labels select values from existing - labels. Their content is concatenated using the configured - Separator and matched against the configured regular - expression. - items: - description: LabelName is a valid Prometheus label - name which may only contain ASCII letters, numbers, - as well as underscores. - pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ - type: string - type: array - targetLabel: - description: "Label to which the resulting string is - written in a replacement. \n It is mandatory for `Replace`, - `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and - `DropEqual` actions. \n Regex capture groups are available." - type: string - type: object - type: array - selector: - description: Selector to select the Ingress objects. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. - This array is replaced during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - staticConfig: - description: 'staticConfig defines the static list of targets - to probe and the relabeling configuration. If `ingress` is also - defined, `staticConfig` takes precedence. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#static_config.' - properties: - labels: - additionalProperties: - type: string - description: Labels assigned to all metrics scraped from the - targets. - type: object - relabelingConfigs: - description: 'RelabelConfigs to apply to the label set of - the targets before it gets scraped. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config' - items: - description: "RelabelConfig allows dynamic rewriting of - the label set for targets, alerts, scraped samples and - remote write samples. \n More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config" - properties: - action: - default: replace - description: "Action to perform based on the regex matching. - \n `Uppercase` and `Lowercase` actions require Prometheus - >= v2.36.0. `DropEqual` and `KeepEqual` actions require - Prometheus >= v2.41.0. \n Default: \"Replace\"" - enum: - - replace - - Replace - - keep - - Keep - - drop - - Drop - - hashmod - - HashMod - - labelmap - - LabelMap - - labeldrop - - LabelDrop - - labelkeep - - LabelKeep - - lowercase - - Lowercase - - uppercase - - Uppercase - - keepequal - - KeepEqual - - dropequal - - DropEqual - type: string - modulus: - description: "Modulus to take of the hash of the source - label values. \n Only applicable when the action is - `HashMod`." - format: int64 - type: integer - regex: - description: Regular expression against which the extracted - value is matched. - type: string - replacement: - description: "Replacement value against which a Replace - action is performed if the regular expression matches. - \n Regex capture groups are available." - type: string - separator: - description: Separator is the string between concatenated - SourceLabels. - type: string - sourceLabels: - description: The source labels select values from existing - labels. Their content is concatenated using the configured - Separator and matched against the configured regular - expression. - items: - description: LabelName is a valid Prometheus label - name which may only contain ASCII letters, numbers, - as well as underscores. - pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$ - type: string - type: array - targetLabel: - description: "Label to which the resulting string is - written in a replacement. \n It is mandatory for `Replace`, - `HashMod`, `Lowercase`, `Uppercase`, `KeepEqual` and - `DropEqual` actions. \n Regex capture groups are available." - type: string - type: object - type: array - static: - description: The list of hosts to probe. - items: - type: string - type: array - type: object - type: object - tlsConfig: - description: TLS configuration to use when scraping the endpoint. - properties: - ca: - description: Certificate authority used when verifying server - certificates. - properties: - configMap: - description: ConfigMap containing data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - cert: - description: Client certificate to present when doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to use for the targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keySecret: - description: Secret containing the client key file for the targets. - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the targets. - type: string - type: object - type: object - required: - - spec - type: object - served: true - storage: true ---- ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.11.1 - operator.prometheus.io/version: 0.69.1 - creationTimestamp: null - name: prometheusagents.monitoring.coreos.com -spec: - group: monitoring.coreos.com - names: - categories: - - prometheus-operator - kind: PrometheusAgent - listKind: PrometheusAgentList - plural: prometheusagents - shortNames: - - promagent - singular: prometheusagent - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The version of Prometheus agent - jsonPath: .spec.version - name: Version - type: string - - description: The number of desired replicas - jsonPath: .spec.replicas - name: Desired - type: integer - - description: The number of ready replicas - jsonPath: .status.availableReplicas - name: Ready - type: integer - - jsonPath: .status.conditions[?(@.type == 'Reconciled')].status - name: Reconciled - type: string - - jsonPath: .status.conditions[?(@.type == 'Available')].status - name: Available - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Whether the resource reconciliation is paused or not - jsonPath: .status.paused - name: Paused - priority: 1 - type: boolean - name: v1alpha1 - schema: - openAPIV3Schema: - description: PrometheusAgent defines a Prometheus agent deployment. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: 'Specification of the desired behavior of the Prometheus - agent. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - additionalArgs: - description: "AdditionalArgs allows setting additional arguments for - the 'prometheus' container. \n It is intended for e.g. activating - hidden flags which are not supported by the dedicated configuration - options yet. The arguments are passed as-is to the Prometheus container - which may cause issues if they are invalid or not supported by the - given Prometheus version. \n In case of an argument conflict (e.g. - an argument which is already set by the operator itself) or when - providing an invalid argument, the reconciliation will fail and - an error will be logged." - items: - description: Argument as part of the AdditionalArgs list. - properties: - name: - description: Name of the argument, e.g. "scrape.discovery-reload-interval". - minLength: 1 - type: string - value: - description: Argument value, e.g. 30s. Can be empty for name-only - arguments (e.g. --storage.tsdb.no-lockfile) - type: string - required: - - name - type: object - type: array - additionalScrapeConfigs: - description: 'AdditionalScrapeConfigs allows specifying a key of a - Secret containing additional Prometheus scrape configurations. Scrape - configurations specified are appended to the configurations generated - by the Prometheus Operator. Job configurations specified must have - the form as specified in the official Prometheus documentation: - https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config. - As scrape configs are appended, the user is responsible to make - sure it is valid. Note that using this feature may expose the possibility - to break upgrades of Prometheus. It is advised to review Prometheus - release notes to ensure that no incompatible scrape configs are - going to break Prometheus after the upgrade.' - properties: - key: - description: The key of the secret to select from. Must be a - valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - affinity: - description: Defines the Pods' affinity scheduling rules if specified. - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the - pod. - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the affinity expressions specified by - this field, but it may choose a node that violates one or - more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node matches - the corresponding matchExpressions; the node(s) with the - highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches - all objects with implicit weight 0 (i.e. it's a no-op). - A null preferred scheduling term matches no objects (i.e. - is also a no-op). - properties: - preference: - description: A node selector term, associated with the - corresponding weight. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - x-kubernetes-map-type: atomic - weight: - description: Weight associated with matching the corresponding - nodeSelectorTerm, in the range 1-100. - format: int32 - type: integer - required: - - preference - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not be - scheduled onto the node. If the affinity requirements specified - by this field cease to be met at some point during pod execution - (e.g. due to an update), the system may or may not try to - eventually evict the pod from its node. - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. - The terms are ORed. - items: - description: A null or empty node selector term matches - no objects. The requirements of them are ANDed. The - TopologySelectorTerm type implements a subset of the - NodeSelectorTerm. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - x-kubernetes-map-type: atomic - type: array - required: - - nodeSelectorTerms - type: object - x-kubernetes-map-type: atomic - type: object - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate - this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the affinity expressions specified by - this field, but it may choose a node that violates one or - more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node has - pods which matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied - to the union of the namespaces selected by this - field and the ones listed in the namespaces field. - null selector and null or empty namespaces list - means "this pod's namespace". An empty selector - ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list - of namespace names that the term applies to. The - term is applied to the union of the namespaces - listed in this field and the ones selected by - namespaceSelector. null or empty namespaces list - and null namespaceSelector means "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not be - scheduled onto the node. If the affinity requirements specified - by this field cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may or may - not try to eventually evict the pod from its node. When - there are multiple elements, the lists of nodes corresponding - to each podAffinityTerm are intersected, i.e. all terms - must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which a pod of the set of - pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied to the - union of the namespaces selected by this field and - the ones listed in the namespaces field. null selector - and null or empty namespaces list means "this pod's - namespace". An empty selector ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace - names that the term applies to. The term is applied - to the union of the namespaces listed in this field - and the ones selected by namespaceSelector. null or - empty namespaces list and null namespaceSelector means - "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods matching - the labelSelector in the specified namespaces, where - co-located is defined as running on a node whose value - of the label with key topologyKey matches that of - any node on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. - avoid putting this pod in the same node, zone, etc. as some - other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the anti-affinity expressions specified - by this field, but it may choose a node that violates one - or more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling anti-affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node has - pods which matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied - to the union of the namespaces selected by this - field and the ones listed in the namespaces field. - null selector and null or empty namespaces list - means "this pod's namespace". An empty selector - ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list - of namespace names that the term applies to. The - term is applied to the union of the namespaces - listed in this field and the ones selected by - namespaceSelector. null or empty namespaces list - and null namespaceSelector means "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by - this field are not met at scheduling time, the pod will - not be scheduled onto the node. If the anti-affinity requirements - specified by this field cease to be met at some point during - pod execution (e.g. due to a pod label update), the system - may or may not try to eventually evict the pod from its - node. When there are multiple elements, the lists of nodes - corresponding to each podAffinityTerm are intersected, i.e. - all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which a pod of the set of - pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied to the - union of the namespaces selected by this field and - the ones listed in the namespaces field. null selector - and null or empty namespaces list means "this pod's - namespace". An empty selector ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace - names that the term applies to. The term is applied - to the union of the namespaces listed in this field - and the ones selected by namespaceSelector. null or - empty namespaces list and null namespaceSelector means - "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods matching - the labelSelector in the specified namespaces, where - co-located is defined as running on a node whose value - of the label with key topologyKey matches that of - any node on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - type: object - apiserverConfig: - description: 'APIServerConfig allows specifying a host and auth methods - to access the Kuberntees API server. If null, Prometheus is assumed - to run inside of the cluster: it will discover the API servers automatically - and use the Pod''s CA certificate and bearer token file at /var/run/secrets/kubernetes.io/serviceaccount/.' - properties: - authorization: - description: "Authorization section for the API server. \n Cannot - be set at the same time as `basicAuth`, `bearerToken`, or `bearerTokenFile`." - properties: - credentials: - description: Selects a key of a Secret in the namespace that - contains the credentials for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - credentialsFile: - description: File to read a secret from, mutually exclusive - with `credentials`. - type: string - type: - description: "Defines the authentication type. The value is - case-insensitive. \n \"Basic\" is not a supported value. - \n Default: \"Bearer\"" - type: string - type: object - basicAuth: - description: "BasicAuth configuration for the API server. \n Cannot - be set at the same time as `authorization`, `bearerToken`, or - `bearerTokenFile`." - properties: - password: - description: The secret in the service monitor namespace that - contains the password for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - username: - description: The secret in the service monitor namespace that - contains the username for authentication. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - bearerToken: - description: "*Warning: this field shouldn't be used because the - token value appears in clear-text. Prefer using `authorization`.* - \n *Deprecated: this will be removed in a future release.*" - type: string - bearerTokenFile: - description: "File to read bearer token for accessing apiserver. - \n Cannot be set at the same time as `basicAuth`, `authorization`, - or `bearerToken`. \n *Deprecated: this will be removed in a - future release. Prefer using `authorization`.*" - type: string - host: - description: Kubernetes API address consisting of a hostname or - IP address followed by an optional port number. - type: string - tlsConfig: - description: TLS Config to use for the API server. - properties: - ca: - description: Certificate authority used when verifying server - certificates. - properties: - configMap: - description: ConfigMap containing data to use for the - targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - caFile: - description: Path to the CA cert in the Prometheus container - to use for the targets. - type: string - cert: - description: Client certificate to present when doing client-authentication. - properties: - configMap: - description: ConfigMap containing data to use for the - targets. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - secret: - description: Secret containing data to use for the targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - certFile: - description: Path to the client cert file in the Prometheus - container for the targets. - type: string - insecureSkipVerify: - description: Disable target certificate validation. - type: boolean - keyFile: - description: Path to the client key file in the Prometheus - container for the targets. - type: string - keySecret: - description: Secret containing the client key file for the - targets. - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must - be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - serverName: - description: Used to verify the hostname for the targets. - type: string - type: object - required: - - host - type: object - arbitraryFSAccessThroughSMs: - description: When true, ServiceMonitor, PodMonitor and Probe object - are forbidden to reference arbitrary files on the file system of - the 'prometheus' container. When a ServiceMonitor's endpoint specifies - a `bearerTokenFile` value (e.g. '/var/run/secrets/kubernetes.io/serviceaccount/token'), - a malicious target can get access to the Prometheus service account's - token in the Prometheus' scrape request. Setting `spec.arbitraryFSAccessThroughSM` - to 'true' would prevent the attack. Users should instead provide - the credentials using the `spec.bearerTokenSecret` field. - properties: - deny: - type: boolean - type: object - bodySizeLimit: - description: BodySizeLimit defines per-scrape on response body size. - Only valid in Prometheus versions 2.45.0 and newer. - pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ - type: string - configMaps: - description: ConfigMaps is a list of ConfigMaps in the same namespace - as the Prometheus object, which shall be mounted into the Prometheus - Pods. Each ConfigMap is added to the StatefulSet definition as a - volume named `configmap-`. The ConfigMaps are mounted - into /etc/prometheus/configmaps/ in the 'prometheus' - container. - items: - type: string - type: array - containers: - description: "Containers allows injecting additional containers or - modifying operator generated containers. This can be used to allow - adding an authentication proxy to the Pods or to change the behavior - of an operator generated container. Containers described here modify - an operator generated container if they share the same name and - modifications are done via a strategic merge patch. \n The names - of containers managed by the operator are: * `prometheus` * `config-reloader` - * `thanos-sidecar` \n Overriding containers is entirely outside - the scope of what the maintainers will support and by doing so, - you accept that this behaviour may break at any time without notice." - items: - description: A single application container that you want to run - within a pod. - properties: - args: - description: 'Arguments to the entrypoint. The container image''s - CMD is used if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If a variable - cannot be resolved, the reference in the input string will - be unchanged. Double $$ are reduced to a single $, which allows - for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will - produce the string literal "$(VAR_NAME)". Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - command: - description: 'Entrypoint array. Not executed within a shell. - The container image''s ENTRYPOINT is used if this is not provided. - Variable references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) syntax: - i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". - Escaped references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - env: - description: List of environment variables to set in the container. - Cannot be updated. - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must be - a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in the - input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) - syntax: i.e. "$$(VAR_NAME)" will produce the string - literal "$(VAR_NAME)". Escaped references will never - be expanded, regardless of whether the variable exists - or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, limits.ephemeral-storage, requests.cpu, - requests.memory and requests.ephemeral-storage) - are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must be - a C_IDENTIFIER. All invalid keys will be reported as an event - when the container is starting. When a key exists in multiple - sources, the value associated with the last source will take - precedence. Values defined by an Env with a duplicate key - will take precedence. Cannot be updated. - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap must be - defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - description: 'Container image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management system should take - in response to container lifecycle events. Cannot be updated. - properties: - postStart: - description: 'PostStart is called immediately after a container - is created. If the handler fails, the container is terminated - and restarted according to its restart policy. Other management - of the container blocks until the hook completes. More - info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - preStop: - description: 'PreStop is called immediately before a container - is terminated due to an API request or management event - such as liveness/startup probe failure, preemption, resource - contention, etc. The handler is not called if the container - crashes or exits. The Pod''s termination grace period - countdown begins before the PreStop hook is executed. - Regardless of the outcome of the handler, the container - will eventually terminate within the Pod''s termination - grace period (unless delayed by finalizers). Other management - of the container blocks until the hook completes or until - the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - type: object - livenessProbe: - description: 'Periodic probe of container liveness. Container - will be restarted if the probe fails. Cannot be updated. More - info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - ports: - description: List of ports to expose from the container. Not - specifying a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from the network. - Modifying this array with strategic merge patch may corrupt - the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. - Cannot be updated. - items: - description: ContainerPort represents a network port in a - single container. - properties: - containerPort: - description: Number of port to expose on the pod's IP - address. This must be a valid port number, 0 < x < 65536. - format: int32 - type: integer - hostIP: - description: What host IP to bind the external port to. - type: string - hostPort: - description: Number of port to expose on the host. If - specified, this must be a valid port number, 0 < x < - 65536. If HostNetwork is specified, this must match - ContainerPort. Most containers do not need this. - format: int32 - type: integer - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a pod - must have a unique name. Name for the port that can - be referred to by services. - type: string - protocol: - default: TCP - description: Protocol for port. Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - required: - - containerPort - type: object - type: array - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container service readiness. - Container will be removed from service endpoints if the probe - fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - resizePolicy: - description: Resources resize policy for the container. - items: - description: ContainerResizePolicy represents resource resize - policy for the container. - properties: - resourceName: - description: 'Name of the resource to which this resource - resize policy applies. Supported values: cpu, memory.' - type: string - restartPolicy: - description: Restart policy to apply when specified resource - is resized. If not specified, it defaults to NotRequired. - type: string - required: - - resourceName - - restartPolicy - type: object - type: array - x-kubernetes-list-type: atomic - resources: - description: 'Compute Resources required by this container. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - properties: - claims: - description: "Claims lists the names of resources, defined - in spec.resourceClaims, that are used by this container. - \n This is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It can only - be set for containers." - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of one entry - in pod.spec.resourceClaims of the Pod where this - field is used. It makes that resource available - inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests - cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - restartPolicy: - description: 'RestartPolicy defines the restart behavior of - individual containers in a pod. This field may only be set - for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, - the restart behavior is defined by the Pod''s restart policy - and the container type. Setting the RestartPolicy as "Always" - for the init container will have the following effect: this - init container will be continually restarted on exit until - all regular containers have terminated. Once all regular containers - have completed, all init containers with restartPolicy "Always" - will be shut down. This lifecycle differs from normal init - containers and is often referred to as a "sidecar" container. - Although this init container still starts in the init container - sequence, it does not wait for the container to complete before - proceeding to the next init container. Instead, the next init - container starts immediately after this init container is - started, or after any startupProbe has successfully completed.' - type: string - securityContext: - description: 'SecurityContext defines the security options the - container should be run with. If set, the fields of SecurityContext - override the equivalent fields of PodSecurityContext. More - info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag will - be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN Note that this field cannot be set - when spec.os.name is windows.' - type: boolean - capabilities: - description: The capabilities to add/drop when running containers. - Defaults to the default set of capabilities granted by - the container runtime. Note that this field cannot be - set when spec.os.name is windows. - properties: - add: - description: Added capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - drop: - description: Removed capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - type: object - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent to - root on the host. Defaults to false. Note that this field - cannot be set when spec.os.name is windows. - type: boolean - procMount: - description: procMount denotes the type of proc mount to - use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. Note that this field cannot - be set when spec.os.name is windows. - type: string - readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. Note that this field cannot - be set when spec.os.name is windows. - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as a - non-root user. If true, the Kubelet will validate the - image at runtime to ensure that it does not run as UID - 0 (root) and fail to start the container if it does. If - unset or false, no such validation will be performed. - May also be set in PodSecurityContext. If set in both - SecurityContext and PodSecurityContext, the value specified - in SecurityContext takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. Note - that this field cannot be set when spec.os.name is windows. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to the container. - If unspecified, the container runtime will allocate a - random SELinux context for each container. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - properties: - level: - description: Level is SELinux level label that applies - to the container. - type: string - role: - description: Role is a SELinux role label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - type: object - seccompProfile: - description: The seccomp options to use by this container. - If seccomp options are provided at both the pod & container - level, the container options override the pod options. - Note that this field cannot be set when spec.os.name is - windows. - properties: - localhostProfile: - description: localhostProfile indicates a profile defined - in a file on the node should be used. The profile - must be preconfigured on the node to work. Must be - a descending path, relative to the kubelet's configured - seccomp profile location. Must be set if type is "Localhost". - Must NOT be set for any other type. - type: string - type: - description: "type indicates which kind of seccomp profile - will be applied. Valid options are: \n Localhost - - a profile defined in a file on the node should be - used. RuntimeDefault - the container runtime default - profile should be used. Unconfined - no profile should - be applied." - type: string - required: - - type - type: object - windowsOptions: - description: The Windows specific settings applied to all - containers. If unspecified, the options from the PodSecurityContext - will be used. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - Note that this field cannot be set when spec.os.name is - linux. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. - type: string - hostProcess: - description: HostProcess determines if a container should - be run as a 'Host Process' container. All of a Pod's - containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess - containers and non-HostProcess containers). In addition, - if HostProcess is true then HostNetwork must also - be set to true. - type: boolean - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: string - type: object - type: object - startupProbe: - description: 'StartupProbe indicates that the Pod has successfully - initialized. If specified, no other probes are executed until - this completes successfully. If this probe fails, the Pod - will be restarted, just as if the livenessProbe failed. This - can be used to provide different probe parameters at the beginning - of a Pod''s lifecycle, when it might take a long time to load - data or warm a cache, than during steady-state operation. - This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, reads - from stdin in the container will always result in EOF. Default - is false. - type: boolean - stdinOnce: - description: Whether the container runtime should close the - stdin channel after it has been opened by a single attach. - When stdin is true the stdin stream will remain open across - multiple attach sessions. If stdinOnce is set to true, stdin - is opened on container start, is empty until the first client - attaches to stdin, and then remains open and accepts data - until the client disconnects, at which time stdin is closed - and remains closed until the container is restarted. If this - flag is false, a container processes that reads from stdin - will never receive an EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which the file to which the - container''s termination message will be written is mounted - into the container''s filesystem. Message written is intended - to be brief final status, such as an assertion failure message. - Will be truncated by the node if greater than 4096 bytes. - The total message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot be updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination message should be - populated. File will use the contents of terminationMessagePath - to populate the container status message on both success and - failure. FallbackToLogsOnError will use the last chunk of - container log output if the termination message file is empty - and the container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is smaller. Defaults - to File. Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY for - itself, also requires 'stdin' to be true. Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the list of block devices to be - used by the container. - items: - description: volumeDevice describes a mapping of a raw block - device within a container. - properties: - devicePath: - description: devicePath is the path inside of the container - that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - type: object - type: array - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other - way around. When not set, MountPropagationNone is used. - This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - required: - - mountPath - - name - type: object - type: array - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string - required: - - name - type: object - type: array - enableFeatures: - description: "Enable access to Prometheus feature flags. By default, - no features are enabled. \n Enabling features which are disabled - by default is entirely outside the scope of what the maintainers - will support and by doing so, you accept that this behaviour may - break at any time without notice. \n For more information see https://prometheus.io/docs/prometheus/latest/feature_flags/" - items: - type: string - type: array - enableRemoteWriteReceiver: - description: "Enable Prometheus to be used as a receiver for the Prometheus - remote write protocol. \n WARNING: This is not considered an efficient - way of ingesting samples. Use it with caution for specific low-volume - use cases. It is not suitable for replacing the ingestion via scraping - and turning Prometheus into a push-based metrics collection system. - For more information see https://prometheus.io/docs/prometheus/latest/querying/api/#remote-write-receiver - \n It requires Prometheus >= v2.33.0." - type: boolean - enforcedBodySizeLimit: - description: "When defined, enforcedBodySizeLimit specifies a global - limit on the size of uncompressed response body that will be accepted - by Prometheus. Targets responding with a body larger than this many - bytes will cause the scrape to fail. \n It requires Prometheus >= - v2.28.0." - pattern: (^0|([0-9]*[.])?[0-9]+((K|M|G|T|E|P)i?)?B)$ - type: string - enforcedKeepDroppedTargets: - description: "When defined, enforcedKeepDroppedTargets specifies a - global limit on the number of targets dropped by relabeling that - will be kept in memory. The value overrides any `spec.keepDroppedTargets` - set by ServiceMonitor, PodMonitor, Probe objects unless `spec.keepDroppedTargets` - is greater than zero and less than `spec.enforcedKeepDroppedTargets`. - \n It requires Prometheus >= v2.47.0." - format: int64 - type: integer - enforcedLabelLimit: - description: "When defined, enforcedLabelLimit specifies a global - limit on the number of labels per sample. The value overrides any - `spec.labelLimit` set by ServiceMonitor, PodMonitor, Probe objects - unless `spec.labelLimit` is greater than zero and less than `spec.enforcedLabelLimit`. - \n It requires Prometheus >= v2.27.0." - format: int64 - type: integer - enforcedLabelNameLengthLimit: - description: "When defined, enforcedLabelNameLengthLimit specifies - a global limit on the length of labels name per sample. The value - overrides any `spec.labelNameLengthLimit` set by ServiceMonitor, - PodMonitor, Probe objects unless `spec.labelNameLengthLimit` is - greater than zero and less than `spec.enforcedLabelNameLengthLimit`. - \n It requires Prometheus >= v2.27.0." - format: int64 - type: integer - enforcedLabelValueLengthLimit: - description: "When not null, enforcedLabelValueLengthLimit defines - a global limit on the length of labels value per sample. The value - overrides any `spec.labelValueLengthLimit` set by ServiceMonitor, - PodMonitor, Probe objects unless `spec.labelValueLengthLimit` is - greater than zero and less than `spec.enforcedLabelValueLengthLimit`. - \n It requires Prometheus >= v2.27.0." - format: int64 - type: integer - enforcedNamespaceLabel: - description: "When not empty, a label will be added to \n 1. All metrics - scraped from `ServiceMonitor`, `PodMonitor`, `Probe` and `ScrapeConfig` - objects. 2. All metrics generated from recording rules defined in - `PrometheusRule` objects. 3. All alerts generated from alerting - rules defined in `PrometheusRule` objects. 4. All vector selectors - of PromQL expressions defined in `PrometheusRule` objects. \n The - label will not added for objects referenced in `spec.excludedFromEnforcement`. - \n The label's name is this field's value. The label's value is - the namespace of the `ServiceMonitor`, `PodMonitor`, `Probe` or - `PrometheusRule` object." - type: string - enforcedSampleLimit: - description: "When defined, enforcedSampleLimit specifies a global - limit on the number of scraped samples that will be accepted. This - overrides any `spec.sampleLimit` set by ServiceMonitor, PodMonitor, - Probe objects unless `spec.sampleLimit` is greater than zero and - less than than `spec.enforcedSampleLimit`. \n It is meant to be - used by admins to keep the overall number of samples/series under - a desired limit." - format: int64 - type: integer - enforcedTargetLimit: - description: "When defined, enforcedTargetLimit specifies a global - limit on the number of scraped targets. The value overrides any - `spec.targetLimit` set by ServiceMonitor, PodMonitor, Probe objects - unless `spec.targetLimit` is greater than zero and less than `spec.enforcedTargetLimit`. - \n It is meant to be used by admins to to keep the overall number - of targets under a desired limit." - format: int64 - type: integer - excludedFromEnforcement: - description: "List of references to PodMonitor, ServiceMonitor, Probe - and PrometheusRule objects to be excluded from enforcing a namespace - label of origin. \n It is only applicable if `spec.enforcedNamespaceLabel` - set to true." - items: - description: ObjectReference references a PodMonitor, ServiceMonitor, - Probe or PrometheusRule object. - properties: - group: - default: monitoring.coreos.com - description: Group of the referent. When not specified, it defaults - to `monitoring.coreos.com` - enum: - - monitoring.coreos.com - type: string - name: - description: Name of the referent. When not set, all resources - in the namespace are matched. - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - minLength: 1 - type: string - resource: - description: Resource of the referent. - enum: - - prometheusrules - - servicemonitors - - podmonitors - - probes - - scrapeconfigs - type: string - required: - - namespace - - resource - type: object - type: array - externalLabels: - additionalProperties: - type: string - description: The labels to add to any time series or alerts when communicating - with external systems (federation, remote storage, Alertmanager). - Labels defined by `spec.replicaExternalLabelName` and `spec.prometheusExternalLabelName` - take precedence over this list. - type: object - externalUrl: - description: The external URL under which the Prometheus service is - externally available. This is necessary to generate correct URLs - (for instance if Prometheus is accessible behind an Ingress resource). - type: string - hostAliases: - description: Optional list of hosts and IPs that will be injected - into the Pod's hosts file if specified. - items: - description: HostAlias holds the mapping between IP and hostnames - that will be injected as an entry in the pod's hosts file. - properties: - hostnames: - description: Hostnames for the above IP address. - items: - type: string - type: array - ip: - description: IP address of the host file entry. - type: string - required: - - hostnames - - ip - type: object - type: array - x-kubernetes-list-map-keys: - - ip - x-kubernetes-list-type: map - hostNetwork: - description: "Use the host's network namespace if true. \n Make sure - to understand the security implications if you want to enable it - (https://kubernetes.io/docs/concepts/configuration/overview/). \n - When hostNetwork is enabled, this will set the DNS policy to `ClusterFirstWithHostNet` - automatically." - type: boolean - ignoreNamespaceSelectors: - description: When true, `spec.namespaceSelector` from all PodMonitor, - ServiceMonitor and Probe objects will be ignored. They will only - discover targets within the namespace of the PodMonitor, ServiceMonitor - and Probe object. - type: boolean - image: - description: "Container image name for Prometheus. If specified, it - takes precedence over the `spec.baseImage`, `spec.tag` and `spec.sha` - fields. \n Specifying `spec.version` is still necessary to ensure - the Prometheus Operator knows which version of Prometheus is being - configured. \n If neither `spec.image` nor `spec.baseImage` are - defined, the operator will use the latest upstream version of Prometheus - available at the time when the operator was released." - type: string - imagePullPolicy: - description: Image pull policy for the 'prometheus', 'init-config-reloader' - and 'config-reloader' containers. See https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy - for more details. - enum: - - "" - - Always - - Never - - IfNotPresent - type: string - imagePullSecrets: - description: An optional list of references to Secrets in the same - namespace to use for pulling images from registries. See http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - type: array - initContainers: - description: "InitContainers allows injecting initContainers to the - Pod definition. Those can be used to e.g. fetch secrets for injection - into the Prometheus configuration from external sources. Any errors - during the execution of an initContainer will lead to a restart - of the Pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ - InitContainers described here modify an operator generated init - containers if they share the same name and modifications are done - via a strategic merge patch. \n The names of init container name - managed by the operator are: * `init-config-reloader`. \n Overriding - init containers is entirely outside the scope of what the maintainers - will support and by doing so, you accept that this behaviour may - break at any time without notice." - items: - description: A single application container that you want to run - within a pod. - properties: - args: - description: 'Arguments to the entrypoint. The container image''s - CMD is used if this is not provided. Variable references $(VAR_NAME) - are expanded using the container''s environment. If a variable - cannot be resolved, the reference in the input string will - be unchanged. Double $$ are reduced to a single $, which allows - for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will - produce the string literal "$(VAR_NAME)". Escaped references - will never be expanded, regardless of whether the variable - exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - command: - description: 'Entrypoint array. Not executed within a shell. - The container image''s ENTRYPOINT is used if this is not provided. - Variable references $(VAR_NAME) are expanded using the container''s - environment. If a variable cannot be resolved, the reference - in the input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) syntax: - i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". - Escaped references will never be expanded, regardless of whether - the variable exists or not. Cannot be updated. More info: - https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' - items: - type: string - type: array - env: - description: List of environment variables to set in the container. - Cannot be updated. - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must be - a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in - the container and any service environment variables. - If a variable cannot be resolved, the reference in the - input string will be unchanged. Double $$ are reduced - to a single $, which allows for escaping the $(VAR_NAME) - syntax: i.e. "$$(VAR_NAME)" will produce the string - literal "$(VAR_NAME)". Escaped references will never - be expanded, regardless of whether the variable exists - or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: 'Selects a resource of the container: - only resources limits and requests (limits.cpu, - limits.memory, limits.ephemeral-storage, requests.cpu, - requests.memory and requests.ephemeral-storage) - are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - description: List of sources to populate environment variables - in the container. The keys defined within a source must be - a C_IDENTIFIER. All invalid keys will be reported as an event - when the container is starting. When a key exists in multiple - sources, the value associated with the last source will take - precedence. Values defined by an Env with a duplicate key - will take precedence. Cannot be updated. - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap must be - defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - description: 'Container image name. More info: https://kubernetes.io/docs/concepts/containers/images - This field is optional to allow higher level config management - to default or override container images in workload controllers - like Deployments and StatefulSets.' - type: string - imagePullPolicy: - description: 'Image pull policy. One of Always, Never, IfNotPresent. - Defaults to Always if :latest tag is specified, or IfNotPresent - otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' - type: string - lifecycle: - description: Actions that the management system should take - in response to container lifecycle events. Cannot be updated. - properties: - postStart: - description: 'PostStart is called immediately after a container - is created. If the handler fails, the container is terminated - and restarted according to its restart policy. Other management - of the container blocks until the hook completes. More - info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - preStop: - description: 'PreStop is called immediately before a container - is terminated due to an API request or management event - such as liveness/startup probe failure, preemption, resource - contention, etc. The handler is not called if the container - crashes or exits. The Pod''s termination grace period - countdown begins before the PreStop hook is executed. - Regardless of the outcome of the handler, the container - will eventually terminate within the Pod''s termination - grace period (unless delayed by finalizers). Other management - of the container blocks until the hook completes or until - the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for - the command is root ('/') in the container's - filesystem. The command is simply exec'd, it is - not run inside a shell, so traditional shell instructions - ('|', etc) won't work. To use a shell, you need - to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is - unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to - the pod IP. You probably want to set "Host" in - httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: Deprecated. TCPSocket is NOT supported - as a LifecycleHandler and kept for the backward compatibility. - There are no validation of this field and lifecycle - hooks will fail in runtime when tcp handler is specified. - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - type: object - livenessProbe: - description: 'Periodic probe of container liveness. Container - will be restarted if the probe fails. Cannot be updated. More - info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - name: - description: Name of the container specified as a DNS_LABEL. - Each container in a pod must have a unique name (DNS_LABEL). - Cannot be updated. - type: string - ports: - description: List of ports to expose from the container. Not - specifying a port here DOES NOT prevent that port from being - exposed. Any port which is listening on the default "0.0.0.0" - address inside a container will be accessible from the network. - Modifying this array with strategic merge patch may corrupt - the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. - Cannot be updated. - items: - description: ContainerPort represents a network port in a - single container. - properties: - containerPort: - description: Number of port to expose on the pod's IP - address. This must be a valid port number, 0 < x < 65536. - format: int32 - type: integer - hostIP: - description: What host IP to bind the external port to. - type: string - hostPort: - description: Number of port to expose on the host. If - specified, this must be a valid port number, 0 < x < - 65536. If HostNetwork is specified, this must match - ContainerPort. Most containers do not need this. - format: int32 - type: integer - name: - description: If specified, this must be an IANA_SVC_NAME - and unique within the pod. Each named port in a pod - must have a unique name. Name for the port that can - be referred to by services. - type: string - protocol: - default: TCP - description: Protocol for port. Must be UDP, TCP, or SCTP. - Defaults to "TCP". - type: string - required: - - containerPort - type: object - type: array - x-kubernetes-list-map-keys: - - containerPort - - protocol - x-kubernetes-list-type: map - readinessProbe: - description: 'Periodic probe of container service readiness. - Container will be removed from service endpoints if the probe - fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - resizePolicy: - description: Resources resize policy for the container. - items: - description: ContainerResizePolicy represents resource resize - policy for the container. - properties: - resourceName: - description: 'Name of the resource to which this resource - resize policy applies. Supported values: cpu, memory.' - type: string - restartPolicy: - description: Restart policy to apply when specified resource - is resized. If not specified, it defaults to NotRequired. - type: string - required: - - resourceName - - restartPolicy - type: object - type: array - x-kubernetes-list-type: atomic - resources: - description: 'Compute Resources required by this container. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - properties: - claims: - description: "Claims lists the names of resources, defined - in spec.resourceClaims, that are used by this container. - \n This is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It can only - be set for containers." - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of one entry - in pod.spec.resourceClaims of the Pod where this - field is used. It makes that resource available - inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests - cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - restartPolicy: - description: 'RestartPolicy defines the restart behavior of - individual containers in a pod. This field may only be set - for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, - the restart behavior is defined by the Pod''s restart policy - and the container type. Setting the RestartPolicy as "Always" - for the init container will have the following effect: this - init container will be continually restarted on exit until - all regular containers have terminated. Once all regular containers - have completed, all init containers with restartPolicy "Always" - will be shut down. This lifecycle differs from normal init - containers and is often referred to as a "sidecar" container. - Although this init container still starts in the init container - sequence, it does not wait for the container to complete before - proceeding to the next init container. Instead, the next init - container starts immediately after this init container is - started, or after any startupProbe has successfully completed.' - type: string - securityContext: - description: 'SecurityContext defines the security options the - container should be run with. If set, the fields of SecurityContext - override the equivalent fields of PodSecurityContext. More - info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' - properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls whether - a process can gain more privileges than its parent process. - This bool directly controls if the no_new_privs flag will - be set on the container process. AllowPrivilegeEscalation - is true always when the container is: 1) run as Privileged - 2) has CAP_SYS_ADMIN Note that this field cannot be set - when spec.os.name is windows.' - type: boolean - capabilities: - description: The capabilities to add/drop when running containers. - Defaults to the default set of capabilities granted by - the container runtime. Note that this field cannot be - set when spec.os.name is windows. - properties: - add: - description: Added capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - drop: - description: Removed capabilities - items: - description: Capability represent POSIX capabilities - type - type: string - type: array - type: object - privileged: - description: Run container in privileged mode. Processes - in privileged containers are essentially equivalent to - root on the host. Defaults to false. Note that this field - cannot be set when spec.os.name is windows. - type: boolean - procMount: - description: procMount denotes the type of proc mount to - use for the containers. The default is DefaultProcMount - which uses the container runtime defaults for readonly - paths and masked paths. This requires the ProcMountType - feature flag to be enabled. Note that this field cannot - be set when spec.os.name is windows. - type: string - readOnlyRootFilesystem: - description: Whether this container has a read-only root - filesystem. Default is false. Note that this field cannot - be set when spec.os.name is windows. - type: boolean - runAsGroup: - description: The GID to run the entrypoint of the container - process. Uses runtime default if unset. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as a - non-root user. If true, the Kubelet will validate the - image at runtime to ensure that it does not run as UID - 0 (root) and fail to start the container if it does. If - unset or false, no such validation will be performed. - May also be set in PodSecurityContext. If set in both - SecurityContext and PodSecurityContext, the value specified - in SecurityContext takes precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint of the container - process. Defaults to user specified in image metadata - if unspecified. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, the - value specified in SecurityContext takes precedence. Note - that this field cannot be set when spec.os.name is windows. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to the container. - If unspecified, the container runtime will allocate a - random SELinux context for each container. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. Note that this field cannot be set when - spec.os.name is windows. - properties: - level: - description: Level is SELinux level label that applies - to the container. - type: string - role: - description: Role is a SELinux role label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - type: object - seccompProfile: - description: The seccomp options to use by this container. - If seccomp options are provided at both the pod & container - level, the container options override the pod options. - Note that this field cannot be set when spec.os.name is - windows. - properties: - localhostProfile: - description: localhostProfile indicates a profile defined - in a file on the node should be used. The profile - must be preconfigured on the node to work. Must be - a descending path, relative to the kubelet's configured - seccomp profile location. Must be set if type is "Localhost". - Must NOT be set for any other type. - type: string - type: - description: "type indicates which kind of seccomp profile - will be applied. Valid options are: \n Localhost - - a profile defined in a file on the node should be - used. RuntimeDefault - the container runtime default - profile should be used. Unconfined - no profile should - be applied." - type: string - required: - - type - type: object - windowsOptions: - description: The Windows specific settings applied to all - containers. If unspecified, the options from the PodSecurityContext - will be used. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes precedence. - Note that this field cannot be set when spec.os.name is - linux. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the GMSA admission - webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential spec named - by the GMSACredentialSpecName field. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. - type: string - hostProcess: - description: HostProcess determines if a container should - be run as a 'Host Process' container. All of a Pod's - containers must have the same effective HostProcess - value (it is not allowed to have a mix of HostProcess - containers and non-HostProcess containers). In addition, - if HostProcess is true then HostNetwork must also - be set to true. - type: boolean - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. Defaults to the user specified - in image metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified in SecurityContext - takes precedence. - type: string - type: object - type: object - startupProbe: - description: 'StartupProbe indicates that the Pod has successfully - initialized. If specified, no other probes are executed until - this completes successfully. If this probe fails, the Pod - will be restarted, just as if the livenessProbe failed. This - can be used to provide different probe parameters at the beginning - of a Pod''s lifecycle, when it might take a long time to load - data or warm a cache, than during steady-state operation. - This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - properties: - exec: - description: Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory for the - command is root ('/') in the container's filesystem. - The command is simply exec'd, it is not run inside - a shell, so traditional shell instructions ('|', etc) - won't work. To use a shell, you need to explicitly - call out to that shell. Exit status of 0 is treated - as live/healthy and non-zero is unhealthy. - items: - type: string - type: array - type: object - failureThreshold: - description: Minimum consecutive failures for the probe - to be considered failed after having succeeded. Defaults - to 3. Minimum value is 1. - format: int32 - type: integer - grpc: - description: GRPC specifies an action involving a GRPC port. - properties: - port: - description: Port number of the gRPC service. Number - must be in the range 1 to 65535. - format: int32 - type: integer - service: - description: "Service is the name of the service to - place in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). - \n If this is not specified, the default behavior - is defined by gRPC." - type: string - required: - - port - type: object - httpGet: - description: HTTPGet specifies the http request to perform. - properties: - host: - description: Host name to connect to, defaults to the - pod IP. You probably want to set "Host" in httpHeaders - instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name. This will - be canonicalized upon output, so case-variant - names will be understood as the same header. - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. - Defaults to HTTP. - type: string - required: - - port - type: object - initialDelaySeconds: - description: 'Number of seconds after the container has - started before liveness probes are initiated. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform the probe. - Default to 10 seconds. Minimum value is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for the probe - to be considered successful after having failed. Defaults - to 1. Must be 1 for liveness and startup. Minimum value - is 1. - format: int32 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP - port. - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on - the container. Number must be in the range 1 to 65535. - Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - terminationGracePeriodSeconds: - description: Optional duration in seconds the pod needs - to terminate gracefully upon probe failure. The grace - period is the duration in seconds after the processes - running in the pod are sent a termination signal and the - time when the processes are forcibly halted with a kill - signal. Set this value longer than the expected cleanup - time for your process. If this value is nil, the pod's - terminationGracePeriodSeconds will be used. Otherwise, - this value overrides the value provided by the pod spec. - Value must be non-negative integer. The value zero indicates - stop immediately via the kill signal (no opportunity to - shut down). This is a beta field and requires enabling - ProbeTerminationGracePeriod feature gate. Minimum value - is 1. spec.terminationGracePeriodSeconds is used if unset. - format: int64 - type: integer - timeoutSeconds: - description: 'Number of seconds after which the probe times - out. Defaults to 1 second. Minimum value is 1. More info: - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - stdin: - description: Whether this container should allocate a buffer - for stdin in the container runtime. If this is not set, reads - from stdin in the container will always result in EOF. Default - is false. - type: boolean - stdinOnce: - description: Whether the container runtime should close the - stdin channel after it has been opened by a single attach. - When stdin is true the stdin stream will remain open across - multiple attach sessions. If stdinOnce is set to true, stdin - is opened on container start, is empty until the first client - attaches to stdin, and then remains open and accepts data - until the client disconnects, at which time stdin is closed - and remains closed until the container is restarted. If this - flag is false, a container processes that reads from stdin - will never receive an EOF. Default is false - type: boolean - terminationMessagePath: - description: 'Optional: Path at which the file to which the - container''s termination message will be written is mounted - into the container''s filesystem. Message written is intended - to be brief final status, such as an assertion failure message. - Will be truncated by the node if greater than 4096 bytes. - The total message length across all containers will be limited - to 12kb. Defaults to /dev/termination-log. Cannot be updated.' - type: string - terminationMessagePolicy: - description: Indicate how the termination message should be - populated. File will use the contents of terminationMessagePath - to populate the container status message on both success and - failure. FallbackToLogsOnError will use the last chunk of - container log output if the termination message file is empty - and the container exited with an error. The log output is - limited to 2048 bytes or 80 lines, whichever is smaller. Defaults - to File. Cannot be updated. - type: string - tty: - description: Whether this container should allocate a TTY for - itself, also requires 'stdin' to be true. Default is false. - type: boolean - volumeDevices: - description: volumeDevices is the list of block devices to be - used by the container. - items: - description: volumeDevice describes a mapping of a raw block - device within a container. - properties: - devicePath: - description: devicePath is the path inside of the container - that the device will be mapped to. - type: string - name: - description: name must match the name of a persistentVolumeClaim - in the pod - type: string - required: - - devicePath - - name - type: object - type: array - volumeMounts: - description: Pod volumes to mount into the container's filesystem. - Cannot be updated. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: Path within the container at which the volume - should be mounted. Must not contain ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts are - propagated from the host to container and the other - way around. When not set, MountPropagationNone is used. - This field is beta in 1.10. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: Mounted read-only if true, read-write otherwise - (false or unspecified). Defaults to false. - type: boolean - subPath: - description: Path within the volume from which the container's - volume should be mounted. Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. Behaves similarly - to SubPath but environment variable references $(VAR_NAME) - are expanded using the container's environment. Defaults - to "" (volume's root). SubPathExpr and SubPath are mutually - exclusive. - type: string - required: - - mountPath - - name - type: object - type: array - workingDir: - description: Container's working directory. If not specified, - the container runtime's default will be used, which might - be configured in the container image. Cannot be updated. - type: string - required: - - name - type: object - type: array - keepDroppedTargets: - description: "Per-scrape limit on the number of targets dropped by - relabeling that will be kept in memory. 0 means no limit. \n It - requires Prometheus >= v2.47.0." - format: int64 - type: integer - labelLimit: - description: Per-scrape limit on number of labels that will be accepted - for a sample. Only valid in Prometheus versions 2.45.0 and newer. - format: int64 - type: integer - labelNameLengthLimit: - description: Per-scrape limit on length of labels name that will be - accepted for a sample. Only valid in Prometheus versions 2.45.0 - and newer. - format: int64 - type: integer - labelValueLengthLimit: - description: Per-scrape limit on length of labels value that will - be accepted for a sample. Only valid in Prometheus versions 2.45.0 - and newer. - format: int64 - type: integer - listenLocal: - description: When true, the Prometheus server listens on the loopback - address instead of the Pod IP's address. - type: boolean - logFormat: - description: Log format for Log level for Prometheus and the config-reloader - sidecar. - enum: - - "" - - logfmt - - json - type: string - logLevel: - description: Log level for Prometheus and the config-reloader sidecar. - enum: - - "" - - debug - - info - - warn - - error - type: string - minReadySeconds: - description: "Minimum number of seconds for which a newly created - Pod should be ready without any of its container crashing for it - to be considered available. Defaults to 0 (pod will be considered - available as soon as it is ready) \n This is an alpha field from - kubernetes 1.22 until 1.24 which requires enabling the StatefulSetMinReadySeconds - feature gate." - format: int32 - type: integer - nodeSelector: - additionalProperties: - type: string - description: Defines on which Nodes the Pods are scheduled. - type: object - overrideHonorLabels: - description: When true, Prometheus resolves label conflicts by renaming - the labels in the scraped data to "exported_