Skip to content

Commit 8099e51

Browse files
authored
[mdatagen] Add Converter and Provider support (#12467)
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue. Ex. Adding a feature - Explain what this achieves.--> #### Description Adds support for confmap Converters and Providers to mdatagen, which allows us to declare stability levels for these module types. Helps unblock open-telemetry/opentelemetry-collector-releases#546.
1 parent bffc906 commit 8099e51

8 files changed

+138
-34
lines changed
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
7+
component: mdatagen
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Add `converter` and `provider` module classes
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [12467]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext:
19+
20+
# Optional: The change log or logs in which this entry should be included.
21+
# e.g. '[user]' or '[user, api]'
22+
# Include 'user' if the change is relevant to end users.
23+
# Include 'api' if there is a change to a library API.
24+
# Default: '[user]'
25+
change_logs: []

cmd/mdatagen/internal/command.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"path/filepath"
1414
"regexp"
1515
"runtime/debug"
16+
"slices"
1617
"strings"
1718
"text/template"
1819

@@ -26,6 +27,13 @@ const (
2627
statusEnd = "<!-- end autogenerated section -->"
2728
)
2829

30+
var nonComponents = []string{
31+
"cmd",
32+
"converter",
33+
"pkg",
34+
"provider",
35+
}
36+
2937
func getVersion() (string, error) {
3038
// the second returned value is a boolean, which is true if the binaries are built with module support.
3139
info, ok := debug.ReadBuildInfo()
@@ -78,7 +86,7 @@ func run(ymlPath string) error {
7886
codeDir := filepath.Join(ymlDir, "internal", md.GeneratedPackageName)
7987
toGenerate := map[string]string{}
8088
if md.Status != nil {
81-
if md.Status.Class != "cmd" && md.Status.Class != "pkg" {
89+
if !slices.Contains(nonComponents, md.Status.Class) {
8290
toGenerate[filepath.Join(tmplDir, "status.go.tmpl")] = filepath.Join(codeDir, "generated_status.go")
8391
if err = generateFile(filepath.Join(tmplDir, "component_test.go.tmpl"),
8492
filepath.Join(ymlDir, "generated_component_test.go"), md, packageName); err != nil {

cmd/mdatagen/internal/command_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,32 @@ Some info about a component
330330
componentClass: "extension",
331331
distros: []string{"contrib"},
332332
},
333+
{
334+
name: "readme with status for converter",
335+
markdown: `# Some component
336+
337+
<!-- status autogenerated section -->
338+
<!-- end autogenerated section -->
339+
340+
Some info about a component
341+
`,
342+
outputFile: "readme_with_status_converter.md",
343+
componentClass: "converter",
344+
distros: []string{"contrib"},
345+
},
346+
{
347+
name: "readme with status for provider",
348+
markdown: `# Some component
349+
350+
<!-- status autogenerated section -->
351+
<!-- end autogenerated section -->
352+
353+
Some info about a component
354+
`,
355+
outputFile: "readme_with_status_provider.md",
356+
componentClass: "provider",
357+
distros: []string{"contrib"},
358+
},
333359
{
334360
name: "readme with status with codeowners and seeking new",
335361
markdown: `# Some component

cmd/mdatagen/internal/status.go

+42-25
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package internal // import "go.opentelemetry.io/collector/cmd/mdatagen/internal"
66
import (
77
"errors"
88
"fmt"
9+
"slices"
910
"sort"
1011

1112
"go.opentelemetry.io/collector/component"
@@ -48,6 +49,45 @@ type Status struct {
4849
UnsupportedPlatforms []string `mapstructure:"unsupported_platforms"`
4950
}
5051

52+
var validClasses = []string{
53+
"cmd",
54+
"connector",
55+
"converter",
56+
"exporter",
57+
"extension",
58+
"pkg",
59+
"processor",
60+
"provider",
61+
"receiver",
62+
"scraper",
63+
}
64+
65+
var validStabilityKeys = []string{
66+
"converter",
67+
"extension",
68+
"logs",
69+
"logs_to_traces",
70+
"logs_to_metrics",
71+
"logs_to_logs",
72+
"logs_to_profiles",
73+
"metrics",
74+
"metrics_to_traces",
75+
"metrics_to_metrics",
76+
"metrics_to_logs",
77+
"metrics_to_profiles",
78+
"profiles",
79+
"profiles_to_profiles",
80+
"profiles_to_traces",
81+
"profiles_to_metrics",
82+
"profiles_to_logs",
83+
"provider",
84+
"traces_to_traces",
85+
"traces_to_metrics",
86+
"traces_to_logs",
87+
"traces_to_profiles",
88+
"traces",
89+
}
90+
5191
func (s *Status) SortedDistributions() []string {
5292
sorted := s.Distributions
5393
sort.Slice(sorted, func(i, j int) bool {
@@ -87,10 +127,7 @@ func (s *Status) validateClass() error {
87127
if s.Class == "" {
88128
return errors.New("missing class")
89129
}
90-
if s.Class != "receiver" && s.Class != "processor" &&
91-
s.Class != "exporter" && s.Class != "connector" &&
92-
s.Class != "extension" && s.Class != "scraper" &&
93-
s.Class != "cmd" && s.Class != "pkg" {
130+
if !slices.Contains(validClasses, s.Class) {
94131
return fmt.Errorf("invalid class: %v", s.Class)
95132
}
96133
return nil
@@ -108,27 +145,7 @@ func (ms StabilityMap) Validate() error {
108145
errs = errors.Join(errs, fmt.Errorf("missing component for stability: %v", stability))
109146
}
110147
for _, c := range cmps {
111-
if c != "metrics" &&
112-
c != "traces" &&
113-
c != "logs" &&
114-
c != "profiles" &&
115-
c != "traces_to_traces" &&
116-
c != "traces_to_metrics" &&
117-
c != "traces_to_logs" &&
118-
c != "traces_to_profiles" &&
119-
c != "metrics_to_traces" &&
120-
c != "metrics_to_metrics" &&
121-
c != "metrics_to_logs" &&
122-
c != "metrics_to_profiles" &&
123-
c != "logs_to_traces" &&
124-
c != "logs_to_metrics" &&
125-
c != "logs_to_logs" &&
126-
c != "logs_to_profiles" &&
127-
c != "profiles_to_profiles" &&
128-
c != "profiles_to_traces" &&
129-
c != "profiles_to_metrics" &&
130-
c != "profiles_to_logs" &&
131-
c != "extension" {
148+
if !slices.Contains(validStabilityKeys, c) {
132149
errs = errors.Join(errs, fmt.Errorf("invalid component: %v", c))
133150
}
134151
}

cmd/mdatagen/internal/templates/readme.md.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{{- if ne $class "connector" }}
88
{{- $idx := 0 }}
99
{{- range $stability, $value := .Status.Stability }}
10-
| {{ if not $idx }}Stability{{ else }} {{ end }} | [{{ toLowerCase $stability.String }}]{{ if ne $class "extension" }}: {{ stringsJoin $value ", " }} {{ end }} |
10+
| {{ if not $idx }}Stability{{ else }} {{ end }} | [{{ toLowerCase $stability.String }}]{{ if and (ne $class "extension") (ne $class "converter") (ne $class "provider") }}: {{ stringsJoin $value ", " }} {{ end }} |
1111
{{- $idx = inc $idx }}
1212
{{- end }}
1313
{{- end}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Some component
2+
3+
<!-- status autogenerated section -->
4+
| Status | |
5+
| ------------- |-----------|
6+
| Stability | [beta] |
7+
| Distributions | [contrib] |
8+
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aconverter%2Ffoo%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aconverter%2Ffoo) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aconverter%2Ffoo%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aconverter%2Ffoo) |
9+
10+
[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta
11+
[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib
12+
<!-- end autogenerated section -->
13+
14+
Some info about a component
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Some component
2+
3+
<!-- status autogenerated section -->
4+
| Status | |
5+
| ------------- |-----------|
6+
| Stability | [beta] |
7+
| Distributions | [contrib] |
8+
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aprovider%2Ffoo%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aprovider%2Ffoo) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aprovider%2Ffoo%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aprovider%2Ffoo) |
9+
10+
[beta]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#beta
11+
[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib
12+
<!-- end autogenerated section -->
13+
14+
Some info about a component

cmd/mdatagen/metadata-schema.yaml

+7-7
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ generated_package_name: string
1313
# Required for components (Optional for subcomponents): A high-level view of the development status and use of this component
1414
status:
1515
# Required: The class of the component (For example receiver)
16-
class: <receiver|processor|exporter|connector|extension|cmd|pkg>
16+
class: <receiver|processor|exporter|connector|extension|cmd|pkg|scraper|converter|provider>
1717
# Required: The stability of the component - See https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#stability-levels
1818
stability:
19-
development: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension>]
20-
alpha: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension>]
21-
beta: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension>]
22-
stable: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension>]
23-
deprecated: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension>]
24-
unmaintained: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension>]
19+
development: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension,converter,provider>]
20+
alpha: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension,converter,provider>]
21+
beta: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension,converter,provider>]
22+
stable: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension,converter,provider>]
23+
deprecated: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension,converter,provider>]
24+
unmaintained: [<metrics|traces|logs|traces_to_metrics|metrics_to_metrics|logs_to_metrics|extension,converter,provider>]
2525
# Optional: The distributions that this component is bundled with (For example core or contrib). See statusdata.go for a list of common distros.
2626
distributions: [string]
2727
# Optional: A list of warnings that should be brought to the attention of users looking to use this component

0 commit comments

Comments
 (0)