[mdatagen] Underscores in anchor tag in metadata key semantic_convention: ref: url causes generation error (original) (raw)

Component(s)

cmd/mdatagen

What happened?

Describe the bug

When using the optional key semantic_convention: in the metadata.yaml schema and running make generate, for example in otel-collector-contrib (this uses mdatagen), an error is thrown if there is an underscore in the anchor tag in the ref url.

Steps to reproduce

https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/system/system-metrics.md#metric-systemdiskio_time

Causes this error:

Error: failed loading /home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper/metadata.yaml: metric "system.disk.io_time": invalid semantic-conventions URL: want https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/*#metric-systemdiskiotime, got "https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/system/system-metrics.md#metric-systemdiskio_time" Error: failed loading /home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper/metadata.yaml: metric "system.disk.io_time": invalid semantic-conventions URL: want https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/*#metric-systemdiskiotime, got "https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/system/system-metrics.md#metric-systemdiskio_time" make[1]: *** [../../../../../Makefile.Common:264: mdatagen] Error 1 make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper' internal/scraper/diskscraper/doc.go:4: running "make": exit status 2

What did you expect to see?

We expect the generation to complete without any errors

What did you see instead?

An error occured:

Error: failed loading /home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper/metadata.yaml: metric "system.disk.io_time": invalid semantic-conventions URL: want https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/*#metric-systemdiskiotime, got "https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/system/system-metrics.md#metric-systemdiskio_time" Error: failed loading /home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper/metadata.yaml: metric "system.disk.io_time": invalid semantic-conventions URL: want https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/*#metric-systemdiskiotime, got "https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/system/system-metrics.md#metric-systemdiskio_time" make[1]: *** [../../../../../Makefile.Common:264: mdatagen] Error 1 make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper' internal/scraper/diskscraper/doc.go:4: running "make": exit status 2

Fix

This should be a simple fix, in cmd/mdatagen/internal/metrics.go we have:

var reNonAlnum = regexp.MustCompile([^a-z0-9]+)

To fix the issue we just have to add an underscore to the regexp:

var reNonAlnum = regexp.MustCompile([^a-z0-9_]+)

Collector version

a810b2d

Environment information

Environment

OS: (Operating System: Arch Linux, Kernel: Linux 6.17.9-arch1-1)
Compiler(go version go1.25.5 X:nodwarf5 linux/amd64)

OpenTelemetry Collector configuration

receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 hostmetrics: collection_interval: 5s scrapers: cpu: memory: metrics: system.memory.limit: enabled: true disk:

processors: batch: exporters: debug: verbosity: detailed otlp/jaeger: endpoint: localhost:14317 tls: insecure: true prometheus: endpoint: 0.0.0.0:8889 service: pipelines: metrics: receivers: [otlp, hostmetrics] processors: [batch] exporters: [debug]

Log output

…/receiver/hostmetricsreceiver main  ❯ make generate cd /home/dos/Documents/opentelemetry-collector-contrib/internal/tools && GOOS="" GOARCH="" go build -o /home/dos/Documents/opentelemetry-collector-contrib/.tools/genqlient -trimpath github.com/Khan/genqlient PATH="/home/dos/Documents/opentelemetry-collector-contrib/.tools:$PATH" go generate ./... make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/cpuscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper' Error: failed loading /home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper/metadata.yaml: metric "system.disk.io_time": invalid semantic-conventions URL: want https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/*#metric-systemdiskiotime, got "https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/system/system-metrics.md#metric-systemdiskio_time" Error: failed loading /home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper/metadata.yaml: metric "system.disk.io_time": invalid semantic-conventions URL: want https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/*#metric-systemdiskiotime, got "https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/system/system-metrics.md#metric-systemdiskio_time" make[1]: *** [../../../../../Makefile.Common:264: mdatagen] Error 1 make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper' internal/scraper/diskscraper/doc.go:4: running "make": exit status 2 make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/loadscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/loadscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/memoryscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/memoryscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/networkscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/networkscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/nfsscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/nfsscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/pagingscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/pagingscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/processesscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/processesscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/processscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/processscraper' make[1]: Entering directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/systemscraper' make[1]: Leaving directory '/home/dos/Documents/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/systemscraper' make: *** [../../Makefile.Common:282: generate] Error 1

Additional context

No response

Tip

React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1 or me too, to help us triage it. Learn more here.