Skip to content

Commit c05a471

Browse files
[chore][cmd/mdatagen] Use metadata.yaml as a schema source for references (#15272)
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue. Ex. Adding a feature - Explain what this achieves.--> #### Description Previously, the schemagen loader used `config.schema.yaml` as the standalone file format for schema references. This PR changes the source of truth for cross-component schema references to `metadata.yaml` — the same file that already exists in every component directory. Instead of parsing a bare ConfigMetadata JSON-schema object, the loader now reads the config: section from a component's `metadata.yaml`, matching the structure that mdatagen already generates for every component. The generated output is likewise renamed to metadata.yaml (placed under internal/metadata/) and wrapped with the standard `metadata.yaml` envelope (type, status, config), so it is usable as a reference target by other components in the same way. <!-- Issue number if applicable --> #### Link to tracking issue Fixes #15259 <!--Describe what testing was performed and which tests were added.--> #### Testing Existing unit tests in `internal/schemagen` and `cmd/mdatagen/internal` were updated to reflect the new file name and Metadata wrapper format. The persistToFile test was strengthened to verify a full round-trip through loadFromFile. All tests pass.
1 parent 495f2c5 commit c05a471

21 files changed

Lines changed: 318 additions & 1733 deletions

File tree

cmd/mdatagen/go.mod

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ require (
88
github.com/stretchr/testify v1.11.1
99
go.opentelemetry.io/collector/component v1.58.0
1010
go.opentelemetry.io/collector/component/componenttest v0.152.0
11-
go.opentelemetry.io/collector/config/confighttp v0.152.0
1211
go.opentelemetry.io/collector/config/configoptional v1.58.0
1312
go.opentelemetry.io/collector/confmap v1.58.0
1413
go.opentelemetry.io/collector/confmap/provider/fileprovider v1.58.0
@@ -34,7 +33,6 @@ require (
3433
go.opentelemetry.io/collector/receiver/receivertest v0.152.0
3534
go.opentelemetry.io/collector/receiver/xreceiver v0.152.0
3635
go.opentelemetry.io/collector/scraper v0.152.0
37-
go.opentelemetry.io/collector/scraper/scraperhelper v0.152.0
3836
go.opentelemetry.io/collector/scraper/scrapertest v0.152.0
3937
go.opentelemetry.io/collector/scraper/xscraper v0.152.0
4038
go.opentelemetry.io/collector/service/hostcapabilities v0.152.0
@@ -50,56 +48,34 @@ require (
5048
)
5149

5250
require (
53-
github.com/Microsoft/go-winio v0.6.2 // indirect
5451
github.com/cespare/xxhash/v2 v2.3.0 // indirect
5552
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
56-
github.com/felixge/httpsnoop v1.0.4 // indirect
57-
github.com/foxboron/go-tpm-keyfiles v0.0.0-20251226215517-609e4778396f // indirect
58-
github.com/fsnotify/fsnotify v1.10.1 // indirect
5953
github.com/go-logr/logr v1.4.3 // indirect
6054
github.com/go-logr/stdr v1.2.2 // indirect
6155
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
6256
github.com/gobwas/glob v0.2.3 // indirect
63-
github.com/golang/snappy v1.0.0 // indirect
64-
github.com/google/go-tpm v0.9.8 // indirect
6557
github.com/google/uuid v1.6.0 // indirect
6658
github.com/hashicorp/go-version v1.9.0 // indirect
6759
github.com/inconshreveable/mousetrap v1.1.0 // indirect
6860
github.com/json-iterator/go v1.1.12 // indirect
69-
github.com/klauspost/compress v1.18.6 // indirect
7061
github.com/knadh/koanf/maps v0.1.2 // indirect
7162
github.com/knadh/koanf/providers/confmap v1.0.0 // indirect
7263
github.com/knadh/koanf/v2 v2.3.4 // indirect
7364
github.com/mitchellh/copystructure v1.2.0 // indirect
7465
github.com/mitchellh/reflectwalk v1.0.2 // indirect
7566
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
7667
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
77-
github.com/pierrec/lz4/v4 v4.1.26 // indirect
7868
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
79-
github.com/rs/cors v1.11.1 // indirect
8069
github.com/spf13/pflag v1.0.10 // indirect
8170
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
82-
go.opentelemetry.io/collector/client v1.58.0 // indirect
8371
go.opentelemetry.io/collector/component/componentstatus v0.152.0 // indirect
84-
go.opentelemetry.io/collector/config/configauth v1.58.0 // indirect
85-
go.opentelemetry.io/collector/config/configcompression v1.58.0 // indirect
86-
go.opentelemetry.io/collector/config/configmiddleware v1.58.0 // indirect
87-
go.opentelemetry.io/collector/config/confignet v1.58.0 // indirect
88-
go.opentelemetry.io/collector/config/configopaque v1.58.0 // indirect
89-
go.opentelemetry.io/collector/config/configtls v1.58.0 // indirect
9072
go.opentelemetry.io/collector/consumer/consumererror v0.152.0 // indirect
91-
go.opentelemetry.io/collector/extension/extensionauth v1.58.0 // indirect
92-
go.opentelemetry.io/collector/extension/extensionmiddleware v0.152.0 // indirect
9373
go.opentelemetry.io/collector/internal/componentalias v0.152.0 // indirect
9474
go.opentelemetry.io/collector/internal/fanoutconsumer v0.152.0 // indirect
9575
go.opentelemetry.io/collector/pdata/testdata v0.152.0 // indirect
96-
go.opentelemetry.io/collector/receiver/receiverhelper v0.152.0 // indirect
9776
go.opentelemetry.io/collector/service v0.152.0 // indirect
98-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect
9977
go.opentelemetry.io/otel/sdk v1.43.0 // indirect
100-
golang.org/x/crypto v0.51.0 // indirect
10178
golang.org/x/mod v0.36.0 // indirect
102-
golang.org/x/net v0.54.0 // indirect
10379
golang.org/x/sync v0.20.0 // indirect
10480
golang.org/x/sys v0.44.0 // indirect
10581
golang.org/x/tools v0.45.0 // indirect
@@ -239,8 +215,4 @@ replace go.opentelemetry.io/collector/internal/componentalias => ../../internal/
239215

240216
replace go.opentelemetry.io/collector/config/confignet => ../../config/confignet
241217

242-
replace go.opentelemetry.io/collector/receiver/receiverhelper => ../../receiver/receiverhelper
243-
244-
replace go.opentelemetry.io/collector/scraper/scraperhelper => ../../scraper/scraperhelper
245-
246218
replace go.opentelemetry.io/collector/scraper/xscraper => ../../scraper/xscraper

cmd/mdatagen/go.sum

Lines changed: 0 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/mdatagen/internal/command.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"fmt"
1010
"go/format"
1111
"io/fs"
12+
"maps"
1213
"os"
1314
"path/filepath"
1415
"regexp"
@@ -194,7 +195,6 @@ func run(ymlPath string) error {
194195
toGenerate[filepath.Join(tmplDir, "testdata", "config.yaml.tmpl")] = filepath.Join(testdataDir, "config.yaml")
195196
toGenerate[filepath.Join(tmplDir, "config.go.tmpl")] = filepath.Join(codeDir, "generated_config.go")
196197
toGenerate[filepath.Join(tmplDir, "config_test.go.tmpl")] = filepath.Join(codeDir, "generated_config_test.go")
197-
toGenerate[filepath.Join(tmplDir, "config.schema.yaml.tmpl")] = filepath.Join(codeDir, "config.schema.yaml")
198198
}
199199

200200
if len(md.ResourceAttributes) > 0 { // only generate resource files if resource attributes are configured
@@ -542,8 +542,42 @@ func validateYAMLKeyOrder(raw []byte) error {
542542
return nil
543543
}
544544

545+
func injectInternalMetadataDefs(md Metadata, mdDir string, src *cfggen.ConfigMetadata) error {
546+
if len(md.Metrics) == 0 && len(md.Events) == 0 && len(md.ResourceAttributes) == 0 {
547+
return nil
548+
}
549+
importRootPath, err := helpers.RootPackage(mdDir)
550+
if err != nil {
551+
return fmt.Errorf("unable to determine import root path: %w", err)
552+
}
553+
tmplFile := filepath.Join("templates", "config.schema.yaml.tmpl")
554+
raw, err := executeTemplate(tmplFile, md, "metadata", importRootPath, getTemplateFuncMap(md, importRootPath))
555+
if err != nil {
556+
return fmt.Errorf("failed to render internal metadata defs: %w", err)
557+
}
558+
return mergeInternalMetadataDefs(raw, src)
559+
}
560+
561+
func mergeInternalMetadataDefs(raw []byte, src *cfggen.ConfigMetadata) error {
562+
var config cfggen.ConfigMetadata
563+
if err := yaml.Unmarshal(raw, &config); err != nil {
564+
return fmt.Errorf("failed to parse internal metadata defs: %w", err)
565+
}
566+
if len(config.Defs) == 0 {
567+
return nil
568+
}
569+
if src.Defs == nil {
570+
src.Defs = make(map[string]*cfggen.ConfigMetadata)
571+
}
572+
maps.Copy(src.Defs, config.Defs)
573+
return nil
574+
}
575+
545576
func generateConfigFiles(md Metadata, mdDir, _ string) error {
546577
if md.Config != nil {
578+
if err := injectInternalMetadataDefs(md, mdDir, md.Config); err != nil {
579+
return err
580+
}
547581
resolver := cfggen.NewResolver(md.PackageName, md.Status.Class, md.Type, mdDir)
548582
resolvedSchema, err := resolver.ResolveSchema(md.Config)
549583
if err != nil {

0 commit comments

Comments
 (0)