From 640dbacf87b4754be34b8fd0ce799a713321b54f Mon Sep 17 00:00:00 2001 From: Aviv Litman Date: Sun, 26 Feb 2023 19:12:28 +0200 Subject: [PATCH] Use go template in metricsdocs.go Signed-off-by: Aviv Litman --- .../memcached_with_customization.go | 114 ++++------------- .../monitoring/metricsdocs/metricsdocs.go | 116 +++++------------- .../monitoring/metricsdocs/metricsdocs.go | 116 +++++------------- 3 files changed, 83 insertions(+), 263 deletions(-) diff --git a/hack/generate/samples/internal/go/memcached-with-customization/memcached_with_customization.go b/hack/generate/samples/internal/go/memcached-with-customization/memcached_with_customization.go index 5c51dc445e7..d3a285c59fb 100644 --- a/hack/generate/samples/internal/go/memcached-with-customization/memcached_with_customization.go +++ b/hack/generate/samples/internal/go/memcached-with-customization/memcached_with_customization.go @@ -930,105 +930,45 @@ const metricsdocsFragment = ` package main import ( + "bytes" "fmt" "sort" + "text/template" "github.com/example/memcached-operator/monitoring" ) -// please run "make generate-metricsdocs" to run this tool and update metrics documentation -const ( - title = "# Operator Metrics\n" - background = "This document aims to help users that are not familiar with metrics exposed by this operator.\n" + - "The metrics documentation is auto-generated by the utility tool \"monitoring/metricsdocs\" and reflects all of the metrics that are exposed by the operator.\n\n" - - KVSpecificMetrics = "## Operator Metrics List\n" - - opening = title + - background + - KVSpecificMetrics - - // footer - footerHeading = "## Developing new metrics\n" - footerContent = "After developing new metrics or changing old ones, please run \"make generate-metricsdocs\" to regenerate this document.\n\n" + - "If you feel that the new metric doesn't follow these rules, please change \"monitoring/metricsdocs\" according to your needs.\n" - - footer = footerHeading + footerContent -) - -// TODO: scaffolding these helpers with operator-lib: https://github.com/operator-framework/operator-lib. - -// metricList contains the name, description, and type for each metric. func main() { - metricList := metricDescriptionListToMetricList(monitoring.ListMetrics()) - sort.Sort(metricList) - writeToStdOut(metricList) -} - -// writeToStdOut receives a list of metrics and prints them to STDOUT. -func writeToStdOut(metricsList metricList) { - fmt.Print(opening) - metricsList.writeOut() - fmt.Print(footer) -} + metricDescriptions := monitoring.ListMetrics() + sort.Slice(metricDescriptions, func(i, j int) bool { + return metricDescriptions[i].Name < metricDescriptions[j].Name + }) + + tmpl, err := template.New("Operator metrics").Parse("# Operator Metrics\n" + + "This document aims to help users that are not familiar with metrics exposed by this operator.\n" + + "The metrics documentation is auto-generated by the utility tool \"monitoring/metricsdocs\" and reflects all of the metrics that are exposed by the operator.\n\n" + + "## Operator Metrics List" + + "{{range .}}\n" + + "### {{.Name}}\n" + + "{{.Help}} " + + "Type: {{.Type}}.\n" + + "{{end}}" + + "## Developing new metrics\n" + + "After developing new metrics or changing old ones, please run \"make generate-metricsdocs\" to regenerate this document.\n\n" + + "If you feel that the new metric doesn't follow these rules, please change \"monitoring/metricsdocs\" according to your needs.") -// Metric is an exported struct that defines the metric -// name, description, and type as a new type named Metric. -type Metric struct { - name string - description string - metricType string -} - -func metricDescriptionToMetric(md monitoring.MetricDescription) Metric { - return Metric{ - name: md.Name, - description: md.Help, - metricType: md.Type, + if err != nil { + panic(err) } -} - -// writeOut receives a metric of type metric and prints -// the metric name, description, and type. -func (m Metric) writeOut() { - fmt.Println("###", m.name) - fmt.Println(m.description, "Type: "+m.metricType+".") -} - -// metricList is an array that contain metrics from type metric, -// as a new type named metricList. -type metricList []Metric -// metricDescriptionListToMetricList collects the metrics exposed by the -// operator, and inserts them into the metricList array. -func metricDescriptionListToMetricList(mdl []monitoring.MetricDescription) metricList { - res := make([]Metric, len(mdl)) - for i, md := range mdl { - res[i] = metricDescriptionToMetric(md) + // generate the template using the sorted list of metrics + var buf bytes.Buffer + if err := tmpl.Execute(&buf, metricDescriptions); err != nil { + panic(err) } - return res -} - -// Len implements sort.Interface.Len -func (m metricList) Len() int { - return len(m) -} - -// Less implements sort.Interface.Less -func (m metricList) Less(i, j int) bool { - return m[i].name < m[j].name -} - -// Swap implements sort.Interface.Swap -func (m metricList) Swap(i, j int) { - m[i], m[j] = m[j], m[i] -} - -func (m metricList) writeOut() { - for _, met := range m { - met.writeOut() - } + // print the generated metrics documentation + fmt.Println(buf.String()) } ` diff --git a/testdata/go/v3/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go b/testdata/go/v3/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go index 08fb06f0804..84ae54faf4a 100644 --- a/testdata/go/v3/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go +++ b/testdata/go/v3/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go @@ -17,103 +17,43 @@ limitations under the License. package main import ( + "bytes" "fmt" "sort" + "text/template" "github.com/example/memcached-operator/monitoring" ) -// please run "make generate-metricsdocs" to run this tool and update metrics documentation -const ( - title = "# Operator Metrics\n" - background = "This document aims to help users that are not familiar with metrics exposed by this operator.\n" + - "The metrics documentation is auto-generated by the utility tool \"monitoring/metricsdocs\" and reflects all of the metrics that are exposed by the operator.\n\n" - - KVSpecificMetrics = "## Operator Metrics List\n" - - opening = title + - background + - KVSpecificMetrics - - // footer - footerHeading = "## Developing new metrics\n" - footerContent = "After developing new metrics or changing old ones, please run \"make generate-metricsdocs\" to regenerate this document.\n\n" + - "If you feel that the new metric doesn't follow these rules, please change \"monitoring/metricsdocs\" according to your needs.\n" - - footer = footerHeading + footerContent -) - -// TODO: scaffolding these helpers with operator-lib: https://github.com/operator-framework/operator-lib. - -// metricList contains the name, description, and type for each metric. func main() { - metricList := metricDescriptionListToMetricList(monitoring.ListMetrics()) - sort.Sort(metricList) - writeToStdOut(metricList) -} - -// writeToStdOut receives a list of metrics and prints them to STDOUT. -func writeToStdOut(metricsList metricList) { - fmt.Print(opening) - metricsList.writeOut() - fmt.Print(footer) -} - -// Metric is an exported struct that defines the metric -// name, description, and type as a new type named Metric. -type Metric struct { - name string - description string - metricType string -} - -func metricDescriptionToMetric(md monitoring.MetricDescription) Metric { - return Metric{ - name: md.Name, - description: md.Help, - metricType: md.Type, + metricDescriptions := monitoring.ListMetrics() + sort.Slice(metricDescriptions, func(i, j int) bool { + return metricDescriptions[i].Name < metricDescriptions[j].Name + }) + + tmpl, err := template.New("Operator metrics").Parse("# Operator Metrics\n" + + "This document aims to help users that are not familiar with metrics exposed by this operator.\n" + + "The metrics documentation is auto-generated by the utility tool \"monitoring/metricsdocs\" and reflects all of the metrics that are exposed by the operator.\n\n" + + "## Operator Metrics List" + + "{{range .}}\n" + + "### {{.Name}}\n" + + "{{.Help}} " + + "Type: {{.Type}}.\n" + + "{{end}}" + + "## Developing new metrics\n" + + "After developing new metrics or changing old ones, please run \"make generate-metricsdocs\" to regenerate this document.\n\n" + + "If you feel that the new metric doesn't follow these rules, please change \"monitoring/metricsdocs\" according to your needs.") + + if err != nil { + panic(err) } -} - -// writeOut receives a metric of type metric and prints -// the metric name, description, and type. -func (m Metric) writeOut() { - fmt.Println("###", m.name) - fmt.Println(m.description, "Type: "+m.metricType+".") -} - -// metricList is an array that contain metrics from type metric, -// as a new type named metricList. -type metricList []Metric -// metricDescriptionListToMetricList collects the metrics exposed by the -// operator, and inserts them into the metricList array. -func metricDescriptionListToMetricList(mdl []monitoring.MetricDescription) metricList { - res := make([]Metric, len(mdl)) - for i, md := range mdl { - res[i] = metricDescriptionToMetric(md) + // generate the template using the sorted list of metrics + var buf bytes.Buffer + if err := tmpl.Execute(&buf, metricDescriptions); err != nil { + panic(err) } - return res -} - -// Len implements sort.Interface.Len -func (m metricList) Len() int { - return len(m) -} - -// Less implements sort.Interface.Less -func (m metricList) Less(i, j int) bool { - return m[i].name < m[j].name -} - -// Swap implements sort.Interface.Swap -func (m metricList) Swap(i, j int) { - m[i], m[j] = m[j], m[i] -} - -func (m metricList) writeOut() { - for _, met := range m { - met.writeOut() - } + // print the generated metrics documentation + fmt.Println(buf.String()) } diff --git a/testdata/go/v4-alpha/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go b/testdata/go/v4-alpha/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go index 08fb06f0804..84ae54faf4a 100644 --- a/testdata/go/v4-alpha/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go +++ b/testdata/go/v4-alpha/monitoring/memcached-operator/monitoring/metricsdocs/metricsdocs.go @@ -17,103 +17,43 @@ limitations under the License. package main import ( + "bytes" "fmt" "sort" + "text/template" "github.com/example/memcached-operator/monitoring" ) -// please run "make generate-metricsdocs" to run this tool and update metrics documentation -const ( - title = "# Operator Metrics\n" - background = "This document aims to help users that are not familiar with metrics exposed by this operator.\n" + - "The metrics documentation is auto-generated by the utility tool \"monitoring/metricsdocs\" and reflects all of the metrics that are exposed by the operator.\n\n" - - KVSpecificMetrics = "## Operator Metrics List\n" - - opening = title + - background + - KVSpecificMetrics - - // footer - footerHeading = "## Developing new metrics\n" - footerContent = "After developing new metrics or changing old ones, please run \"make generate-metricsdocs\" to regenerate this document.\n\n" + - "If you feel that the new metric doesn't follow these rules, please change \"monitoring/metricsdocs\" according to your needs.\n" - - footer = footerHeading + footerContent -) - -// TODO: scaffolding these helpers with operator-lib: https://github.com/operator-framework/operator-lib. - -// metricList contains the name, description, and type for each metric. func main() { - metricList := metricDescriptionListToMetricList(monitoring.ListMetrics()) - sort.Sort(metricList) - writeToStdOut(metricList) -} - -// writeToStdOut receives a list of metrics and prints them to STDOUT. -func writeToStdOut(metricsList metricList) { - fmt.Print(opening) - metricsList.writeOut() - fmt.Print(footer) -} - -// Metric is an exported struct that defines the metric -// name, description, and type as a new type named Metric. -type Metric struct { - name string - description string - metricType string -} - -func metricDescriptionToMetric(md monitoring.MetricDescription) Metric { - return Metric{ - name: md.Name, - description: md.Help, - metricType: md.Type, + metricDescriptions := monitoring.ListMetrics() + sort.Slice(metricDescriptions, func(i, j int) bool { + return metricDescriptions[i].Name < metricDescriptions[j].Name + }) + + tmpl, err := template.New("Operator metrics").Parse("# Operator Metrics\n" + + "This document aims to help users that are not familiar with metrics exposed by this operator.\n" + + "The metrics documentation is auto-generated by the utility tool \"monitoring/metricsdocs\" and reflects all of the metrics that are exposed by the operator.\n\n" + + "## Operator Metrics List" + + "{{range .}}\n" + + "### {{.Name}}\n" + + "{{.Help}} " + + "Type: {{.Type}}.\n" + + "{{end}}" + + "## Developing new metrics\n" + + "After developing new metrics or changing old ones, please run \"make generate-metricsdocs\" to regenerate this document.\n\n" + + "If you feel that the new metric doesn't follow these rules, please change \"monitoring/metricsdocs\" according to your needs.") + + if err != nil { + panic(err) } -} - -// writeOut receives a metric of type metric and prints -// the metric name, description, and type. -func (m Metric) writeOut() { - fmt.Println("###", m.name) - fmt.Println(m.description, "Type: "+m.metricType+".") -} - -// metricList is an array that contain metrics from type metric, -// as a new type named metricList. -type metricList []Metric -// metricDescriptionListToMetricList collects the metrics exposed by the -// operator, and inserts them into the metricList array. -func metricDescriptionListToMetricList(mdl []monitoring.MetricDescription) metricList { - res := make([]Metric, len(mdl)) - for i, md := range mdl { - res[i] = metricDescriptionToMetric(md) + // generate the template using the sorted list of metrics + var buf bytes.Buffer + if err := tmpl.Execute(&buf, metricDescriptions); err != nil { + panic(err) } - return res -} - -// Len implements sort.Interface.Len -func (m metricList) Len() int { - return len(m) -} - -// Less implements sort.Interface.Less -func (m metricList) Less(i, j int) bool { - return m[i].name < m[j].name -} - -// Swap implements sort.Interface.Swap -func (m metricList) Swap(i, j int) { - m[i], m[j] = m[j], m[i] -} - -func (m metricList) writeOut() { - for _, met := range m { - met.writeOut() - } + // print the generated metrics documentation + fmt.Println(buf.String()) }