From 818012221ad69a6becbca723ec0020a0a2e0b691 Mon Sep 17 00:00:00 2001 From: machadovilaca Date: Tue, 26 Mar 2024 10:35:12 +0000 Subject: [PATCH] Update operator-observability version Signed-off-by: machadovilaca --- .../pkg/docs/BUILD.bazel | 17 +++ .../operator-observability/pkg/docs/alerts.go | 96 +++++++++++++++ .../pkg/docs/metrics.go | 111 ++++++++++++++++++ vendor/modules.txt | 1 + 4 files changed, 225 insertions(+) create mode 100644 vendor/github.com/machadovilaca/operator-observability/pkg/docs/BUILD.bazel create mode 100644 vendor/github.com/machadovilaca/operator-observability/pkg/docs/alerts.go create mode 100644 vendor/github.com/machadovilaca/operator-observability/pkg/docs/metrics.go diff --git a/vendor/github.com/machadovilaca/operator-observability/pkg/docs/BUILD.bazel b/vendor/github.com/machadovilaca/operator-observability/pkg/docs/BUILD.bazel new file mode 100644 index 000000000000..a3465bcd41b4 --- /dev/null +++ b/vendor/github.com/machadovilaca/operator-observability/pkg/docs/BUILD.bazel @@ -0,0 +1,17 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "alerts.go", + "metrics.go", + ], + importmap = "kubevirt.io/kubevirt/vendor/github.com/machadovilaca/operator-observability/pkg/docs", + importpath = "github.com/machadovilaca/operator-observability/pkg/docs", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/machadovilaca/operator-observability/pkg/operatormetrics:go_default_library", + "//vendor/github.com/machadovilaca/operator-observability/pkg/operatorrules:go_default_library", + "//vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1:go_default_library", + ], +) diff --git a/vendor/github.com/machadovilaca/operator-observability/pkg/docs/alerts.go b/vendor/github.com/machadovilaca/operator-observability/pkg/docs/alerts.go new file mode 100644 index 000000000000..e5d65f922532 --- /dev/null +++ b/vendor/github.com/machadovilaca/operator-observability/pkg/docs/alerts.go @@ -0,0 +1,96 @@ +package docs + +import ( + "bytes" + "log" + "sort" + "text/template" + + promv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" +) + +const defaultAlertsTemplate = `# Operator Alerts + +{{- range . }} + +### {{.Name}} +**Summary:** {{ index .Annotations "summary" }}. + +**Description:** {{ index .Annotations "description" }}. + +**Severity:** {{ index .Labels "severity" }}. +{{- if .For }} + +**For:** {{ .For }}. +{{- end -}} +{{- end }} + +## Developing new alerts + +All alerts documented here are auto-generated and reflect exactly what is being +exposed. After developing new alerts or changing old ones please regenerate +this document. +` + +type alertDocs struct { + Name string + Expr string + For string + Annotations map[string]string + Labels map[string]string +} + +// BuildAlertsDocsWithCustomTemplate returns a string with the documentation +// for the given alerts, using the given template. +func BuildAlertsDocsWithCustomTemplate( + alerts []promv1.Rule, + tplString string, +) string { + + tpl, err := template.New("alerts").Parse(tplString) + if err != nil { + log.Fatalln(err) + } + + var allDocs []alertDocs + + if alerts != nil { + allDocs = append(allDocs, buildAlertsDocs(alerts)...) + } + + buf := bytes.NewBufferString("") + err = tpl.Execute(buf, allDocs) + if err != nil { + log.Fatalln(err) + } + + return buf.String() +} + +// BuildAlertsDocs returns a string with the documentation for the given +// metrics. +func BuildAlertsDocs(alerts []promv1.Rule) string { + return BuildAlertsDocsWithCustomTemplate(alerts, defaultAlertsTemplate) +} + +func buildAlertsDocs(alerts []promv1.Rule) []alertDocs { + alertsDocs := make([]alertDocs, len(alerts)) + for i, alert := range alerts { + alertsDocs[i] = alertDocs{ + Name: alert.Alert, + Expr: alert.Expr.String(), + For: string(*alert.For), + Annotations: alert.Annotations, + Labels: alert.Labels, + } + } + sortAlertsDocs(alertsDocs) + + return alertsDocs +} + +func sortAlertsDocs(alertsDocs []alertDocs) { + sort.Slice(alertsDocs, func(i, j int) bool { + return alertsDocs[i].Name < alertsDocs[j].Name + }) +} diff --git a/vendor/github.com/machadovilaca/operator-observability/pkg/docs/metrics.go b/vendor/github.com/machadovilaca/operator-observability/pkg/docs/metrics.go new file mode 100644 index 000000000000..c61db1346467 --- /dev/null +++ b/vendor/github.com/machadovilaca/operator-observability/pkg/docs/metrics.go @@ -0,0 +1,111 @@ +package docs + +import ( + "bytes" + "log" + "sort" + "strings" + "text/template" + + "github.com/machadovilaca/operator-observability/pkg/operatormetrics" + "github.com/machadovilaca/operator-observability/pkg/operatorrules" +) + +const defaultMetricsTemplate = `# Operator Metrics + +{{- range . }} + +### {{.Name}} +{{.Help}}. + +Type: {{.Type}}. +{{- end }} + +## Developing new metrics + +All metrics documented here are auto-generated and reflect exactly what is being +exposed. After developing new metrics or changing old ones please regenerate +this document. +` + +type metricDocs struct { + Name string + Help string + Type string + ExtraFields map[string]string +} + +type docOptions interface { + GetOpts() operatormetrics.MetricOpts + GetType() operatormetrics.MetricType +} + +// BuildMetricsDocsWithCustomTemplate returns a string with the documentation +// for the given metrics, using the given template. +func BuildMetricsDocsWithCustomTemplate( + metrics []operatormetrics.Metric, + recordingRules []operatorrules.RecordingRule, + tplString string, +) string { + + tpl, err := template.New("metrics").Parse(tplString) + if err != nil { + log.Fatalln(err) + } + + var allDocs []metricDocs + + if metrics != nil { + allDocs = append(allDocs, buildMetricsDocs(metrics)...) + } + + if recordingRules != nil { + allDocs = append(allDocs, buildMetricsDocs(recordingRules)...) + } + + sortMetricsDocs(allDocs) + + buf := bytes.NewBufferString("") + err = tpl.Execute(buf, allDocs) + if err != nil { + log.Fatalln(err) + } + + return buf.String() +} + +// BuildMetricsDocs returns a string with the documentation for the given +// metrics. +func BuildMetricsDocs(metrics []operatormetrics.Metric, recordingRules []operatorrules.RecordingRule) string { + return BuildMetricsDocsWithCustomTemplate(metrics, recordingRules, defaultMetricsTemplate) +} + +func buildMetricsDocs[T docOptions](items []T) []metricDocs { + uniqueNames := make(map[string]struct{}) + var metricsDocs []metricDocs + + for _, metric := range items { + metricOpts := metric.GetOpts() + if _, exists := uniqueNames[metricOpts.Name]; !exists { + uniqueNames[metricOpts.Name] = struct{}{} + metricsDocs = append(metricsDocs, metricDocs{ + Name: metricOpts.Name, + Help: metricOpts.Help, + Type: getAndConvertMetricType(metric.GetType()), + ExtraFields: metricOpts.ExtraFields, + }) + } + } + + return metricsDocs +} + +func sortMetricsDocs(metricsDocs []metricDocs) { + sort.Slice(metricsDocs, func(i, j int) bool { + return metricsDocs[i].Name < metricsDocs[j].Name + }) +} + +func getAndConvertMetricType(metricType operatormetrics.MetricType) string { + return strings.ReplaceAll(string(metricType), "Vec", "") +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 6de8abd338f9..0bc508748e84 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -243,6 +243,7 @@ github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1 github.com/kubevirt/monitoring/pkg/metrics/parser # github.com/machadovilaca/operator-observability v0.0.19 ## explicit; go 1.21 +github.com/machadovilaca/operator-observability/pkg/docs github.com/machadovilaca/operator-observability/pkg/operatormetrics github.com/machadovilaca/operator-observability/pkg/operatorrules # github.com/mailru/easyjson v0.7.7