Skip to content

builder: avoid duplicate CLI error logging in generated main#14317

Merged
bogdandrutu merged 7 commits intoopen-telemetry:mainfrom
Syedowais312:fix/ocb-duplicate-cli-error-log
Jan 8, 2026
Merged

builder: avoid duplicate CLI error logging in generated main#14317
bogdandrutu merged 7 commits intoopen-telemetry:mainfrom
Syedowais312:fix/ocb-duplicate-cli-error-log

Conversation

@Syedowais312
Copy link
Contributor

@Syedowais312 Syedowais312 commented Dec 21, 2025

Problem

When running an invalid CLI command (for example otelcorecol foo), Cobra already prints a user-facing error message.

However, the builder-generated main.go also logs the same error using log.Fatalf, which results in duplicate error output.

Solution

This change updates the builder template to:

  • remove log.Fatalf from main()
  • exit with a non-zero status using os.Exit(1)
  • allow Cobra to fully own CLI error output

Result

Before

Error: unknown command "foo" for "otelcorecol"
Run 'otelcorecol --help' for usage.
collector server run finished with error: unknown command "foo" for "otelcorecol"

After

Error: unknown command "foo" for "otelcorecol"
Run 'otelcorecol --help' for usage.

Notes

  • Change is limited to cmd/builder/internal/builder/templates/main.go.tmpl
  • No behavior change for successful execution paths
  • Exit code behavior remains unchanged

Closes: #14302

@Syedowais312 Syedowais312 requested a review from a team as a code owner December 21, 2025 10:29
@linux-foundation-easycla
Copy link

linux-foundation-easycla bot commented Dec 21, 2025

CLA Signed

The committers listed above are authorized under a signed CLA.

  • ✅ login: Syedowais312 / name: syed owais (bd3991a)

Copy link
Contributor

@axw axw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, I suggest adding a comment to make it clear that we're intentionally not logging the error though.

@axw
Copy link
Contributor

axw commented Jan 5, 2026

@Syedowais312 can you please add a changelog entry? It's a small change, but still worthy of an enhancement changelog IMO.

@Syedowais312
Copy link
Contributor Author

@axw I’ve added a changelog entry and a comment in main.go.tmpl explaining the intentional omission of error logging. let me know if any further changes are needed.

@Syedowais312 Syedowais312 requested a review from axw January 5, 2026 16:18
CHANGELOG.md Outdated
- `cmd/mdatagen`: Add lint/ordering validation for metadata.yaml (#13781)
- `pdata/xpdata`: Refactor JSON marshaling and unmarshaling to use `pcommon.Value` instead of `AnyValue`. (#13837)
- `pkg/exporterhelper`: Expose `MergeCtx` in exporterhelper's queue batch settings` (#13742)
- `cmd/builder`: Avoid duplicate CLI error logging in generated collector binaries by relying on cobra's error handling. (#14317)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Syedowais312 Syedowais312 force-pushed the fix/ocb-duplicate-cli-error-log branch from 18b3e17 to 70644ec Compare January 6, 2026 08:16
@Syedowais312
Copy link
Contributor Author

@axw Thanks for the pointer ,fixed the chloggen entry by removing empty optional fields, validated with make chlog-validate, and updated the PR. Please let me know if anything else is needed.

@Syedowais312 Syedowais312 requested a review from axw January 6, 2026 08:18
@codecov
Copy link

codecov bot commented Jan 7, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.10%. Comparing base (c216239) to head (bd3991a).
⚠️ Report is 12 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #14317   +/-   ##
=======================================
  Coverage   92.10%   92.10%           
=======================================
  Files         668      668           
  Lines       41379    41379           
=======================================
  Hits        38114    38114           
  Misses       2227     2227           
  Partials     1038     1038           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@axw axw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks @Syedowais312. CI is failing because the generated code in otelcorecol will need changing.

@bogdandrutu bogdandrutu added this pull request to the merge queue Jan 8, 2026
Merged via the queue into open-telemetry:main with commit 4b6b865 Jan 8, 2026
62 checks passed
@otelbot
Copy link
Contributor

otelbot bot commented Jan 8, 2026

Thank you for your contribution @Syedowais312! 🎉 We would like to hear from you about your experience contributing to OpenTelemetry by taking a few minutes to fill out this survey.

Syedowais312 added a commit to Syedowais312/opentelemetry-collector that referenced this pull request Jan 14, 2026
…lemetry#14317)

### Problem

When running an invalid CLI command (for example `otelcorecol foo`),
Cobra already prints a user-facing error message.

However, the builder-generated `main.go` also logs the same error using
`log.Fatalf`, which results in duplicate error output.

### Solution

This change updates the builder template to:
- remove `log.Fatalf` from `main()`
- exit with a non-zero status using `os.Exit(1)`
- allow Cobra to fully own CLI error output

### Result

**Before**

```
Error: unknown command "foo" for "otelcorecol"
Run 'otelcorecol --help' for usage.
collector server run finished with error: unknown command "foo" for "otelcorecol"
```

**After**
```
Error: unknown command "foo" for "otelcorecol"
Run 'otelcorecol --help' for usage.
```

### Notes

- Change is limited to
`cmd/builder/internal/builder/templates/main.go.tmpl`
- No behavior change for successful execution paths
- Exit code behavior remains unchanged

**Closes:** open-telemetry#14302
Syedowais312 added a commit to Syedowais312/opentelemetry-collector that referenced this pull request Jan 15, 2026
…lemetry#14317)

### Problem

When running an invalid CLI command (for example `otelcorecol foo`),
Cobra already prints a user-facing error message.

However, the builder-generated `main.go` also logs the same error using
`log.Fatalf`, which results in duplicate error output.

### Solution

This change updates the builder template to:
- remove `log.Fatalf` from `main()`
- exit with a non-zero status using `os.Exit(1)`
- allow Cobra to fully own CLI error output

### Result

**Before**

```
Error: unknown command "foo" for "otelcorecol"
Run 'otelcorecol --help' for usage.
collector server run finished with error: unknown command "foo" for "otelcorecol"
```

**After**
```
Error: unknown command "foo" for "otelcorecol"
Run 'otelcorecol --help' for usage.
```

### Notes

- Change is limited to
`cmd/builder/internal/builder/templates/main.go.tmpl`
- No behavior change for successful execution paths
- Exit code behavior remains unchanged

**Closes:** open-telemetry#14302
TimoBehrendt pushed a commit to TimoBehrendt/tracebasedlogsampler that referenced this pull request Feb 9, 2026
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [go.opentelemetry.io/collector/component](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v1.45.0` → `v1.50.0` | `v1.51.0` |
| [go.opentelemetry.io/collector/component/componenttest](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v0.139.0` → `v0.144.0` | `v0.145.0` |
| [go.opentelemetry.io/collector/confmap](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v1.45.0` → `v1.50.0` | `v1.51.0` |
| [go.opentelemetry.io/collector/consumer](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v1.45.0` → `v1.50.0` | `v1.51.0` |
| [go.opentelemetry.io/collector/consumer/consumertest](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v0.139.0` → `v0.144.0` | `v0.145.0` |
| [go.opentelemetry.io/collector/pdata](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v1.45.0` → `v1.50.0` | `v1.51.0` |
| [go.opentelemetry.io/collector/processor](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v1.45.0` → `v1.50.0` | `v1.51.0` |
| [go.opentelemetry.io/collector/processor/processortest](https://github.com/open-telemetry/opentelemetry-collector) | require | minor | `v0.139.0` → `v0.144.0` | `v0.145.0` |
| [go.uber.org/zap](https://github.com/uber-go/zap) | require | patch | `v1.27.0` → `v1.27.1` |  |

---

### Release Notes

<details>
<summary>open-telemetry/opentelemetry-collector (go.opentelemetry.io/collector/component)</summary>

### [`v1.50.0`](https://github.com/open-telemetry/opentelemetry-collector/blob/HEAD/CHANGELOG.md#v1500v01440)

##### 🛑 Breaking changes 🛑

- `pkg/exporterhelper`: Change verbosity level for otelcol\_exporter\_queue\_batch\_send\_size metric to detailed. ([#&#8203;14278](open-telemetry/opentelemetry-collector#14278))
- `pkg/service`: Remove deprecated `telemetry.disableHighCardinalityMetrics` feature gate. ([#&#8203;14373](open-telemetry/opentelemetry-collector#14373))
- `pkg/service`: Remove deprecated `service.noopTracerProvider` feature gate. ([#&#8203;14374](open-telemetry/opentelemetry-collector#14374))

##### 🚩 Deprecations 🚩

- `exporter/otlp_grpc`: Rename `otlp` exporter to `otlp_grpc` exporter and add deprecated alias `otlp`. ([#&#8203;14403](open-telemetry/opentelemetry-collector#14403))
- `exporter/otlp_http`: Rename `otlphttp` exporter to `otlp_http` exporter and add deprecated alias `otlphttp`. ([#&#8203;14396](open-telemetry/opentelemetry-collector#14396))

##### 💡 Enhancements 💡

- `cmd/builder`: Avoid duplicate CLI error logging in generated collector binaries by relying on cobra's error handling. ([#&#8203;14317](open-telemetry/opentelemetry-collector#14317))

- `cmd/mdatagen`: Add the ability to disable attributes at the metric level and re-aggregate data points based off of these new dimensions ([#&#8203;10726](open-telemetry/opentelemetry-collector#10726))

- `cmd/mdatagen`: Add optional `display_name` and `description` fields to metadata.yaml for human-readable component names ([#&#8203;14114](open-telemetry/opentelemetry-collector#14114))
  The `display_name` field allows components to specify a human-readable name in metadata.yaml.
  When provided, this name is used as the title in generated README files.
  The `description` field allows components to include a brief description in generated README files.

- `cmd/mdatagen`: Validate stability level for entities ([#&#8203;14425](open-telemetry/opentelemetry-collector#14425))

- `pkg/xexporterhelper`: Reenable batching for profiles ([#&#8203;14313](open-telemetry/opentelemetry-collector#14313))

- `receiver/nop`: add profiles signal support ([#&#8203;14253](open-telemetry/opentelemetry-collector#14253))

##### 🧰 Bug fixes 🧰

- `pkg/exporterhelper`: Fix reference count bug in partition batcher ([#&#8203;14444](open-telemetry/opentelemetry-collector#14444))

<!-- previous-version -->

### [`v1.49.0`](https://github.com/open-telemetry/opentelemetry-collector/blob/HEAD/CHANGELOG.md#v1490v01430)

##### 💡 Enhancements 💡

- `all`: Update semconv import to 1.38.0 ([#&#8203;14305](open-telemetry/opentelemetry-collector#14305))
- `exporter/nop`: Add profiles support to nop exporter ([#&#8203;14331](open-telemetry/opentelemetry-collector#14331))
- `pkg/pdata`: Optimize the size and pointer bytes for pdata structs ([#&#8203;14339](open-telemetry/opentelemetry-collector#14339))
- `pkg/pdata`: Avoid using interfaces/oneof like style for optional fields ([#&#8203;14333](open-telemetry/opentelemetry-collector#14333))

<!-- previous-version -->

### [`v1.48.0`](https://github.com/open-telemetry/opentelemetry-collector/blob/HEAD/CHANGELOG.md#v1480v01420)

##### 💡 Enhancements 💡

- `exporter/debug`: Add logging of dropped attributes, events, and links counts in detailed verbosity ([#&#8203;14202](open-telemetry/opentelemetry-collector#14202))

- `extension/memory_limiter`: The memorylimiter extension can be used as an HTTP/GRPC middleware. ([#&#8203;14081](open-telemetry/opentelemetry-collector#14081))

- `pkg/config/configgrpc`: Statically validate gRPC endpoint ([#&#8203;10451](open-telemetry/opentelemetry-collector#10451))
  This validation was already done in the OTLP exporter. It will now be applied to any gRPC client.

- `pkg/service`: Add support to disabling adding resource attributes as zap fields in internal logging ([#&#8203;13869](open-telemetry/opentelemetry-collector#13869))
  Note that this does not affect logs exported through OTLP.

<!-- previous-version -->

### [`v1.47.0`](https://github.com/open-telemetry/opentelemetry-collector/blob/HEAD/CHANGELOG.md#v1470v01410)

##### 🛑 Breaking changes 🛑

- `pkg/config/confighttp`: Use configoptional.Optional for confighttp.ClientConfig.Cookies field ([#&#8203;14021](open-telemetry/opentelemetry-collector#14021))

##### 💡 Enhancements 💡

- `pkg/config/confighttp`: Setting `compression_algorithms` to an empty list now disables automatic decompression, ignoring Content-Encoding ([#&#8203;14131](open-telemetry/opentelemetry-collector#14131))
- `pkg/service`: Update semantic conventions from internal telemetry to v1.37.0 ([#&#8203;14232](open-telemetry/opentelemetry-collector#14232))
- `pkg/xscraper`: Implement xscraper for Profiles. ([#&#8203;13915](open-telemetry/opentelemetry-collector#13915))

##### 🧰 Bug fixes 🧰

- `pkg/config/configoptional`: Ensure that configoptional.None values resulting from unmarshaling are equivalent to configoptional.Optional zero value. ([#&#8203;14218](open-telemetry/opentelemetry-collector#14218))

<!-- previous-version -->

### [`v1.46.0`](https://github.com/open-telemetry/opentelemetry-collector/blob/HEAD/CHANGELOG.md#v1460v01400)

##### 💡 Enhancements 💡

- `cmd/mdatagen`: `metadata.yaml` now supports an optional `entities` section to organize resource attributes into logical entities with identity and description attributes ([#&#8203;14051](open-telemetry/opentelemetry-collector#14051))
  When entities are defined, mdatagen generates `AssociateWith{EntityType}()` methods on ResourceBuilder
  that associate resources with entity types using the entity refs API. The entities section is backward
  compatible - existing metadata.yaml files without entities continue to work as before.

- `cmd/mdatagen`: Add semconv reference for metrics ([#&#8203;13920](open-telemetry/opentelemetry-collector#13920))

- `connector/forward`: Add support for Profiles to Profiles ([#&#8203;14092](open-telemetry/opentelemetry-collector#14092))

- `exporter/debug`: Disable sending queue by default ([#&#8203;14138](open-telemetry/opentelemetry-collector#14138))
  The recently added sending queue configuration in Debug exporter was enabled by default and had a problematic default size of 1.
  This change disables the sending queue by default.
  Users can enable and configure the sending queue if needed.

- `pkg/config/configoptional`: Mark `configoptional.AddEnabledField` as beta ([#&#8203;14021](open-telemetry/opentelemetry-collector#14021))

- `pkg/otelcol`: This feature has been improved and tested; secure-by-default redacts configopaque values ([#&#8203;12369](open-telemetry/opentelemetry-collector#12369))

##### 🧰 Bug fixes 🧰

- `all`: Ensure service service.instance.id is the same for all the signals when it is autogenerated. ([#&#8203;14140](open-telemetry/opentelemetry-collector#14140))

<!-- previous-version -->

</details>

<details>
<summary>uber-go/zap (go.uber.org/zap)</summary>

### [`v1.27.1`](https://github.com/uber-go/zap/releases/tag/v1.27.1)

[Compare Source](uber-go/zap@v1.27.0...v1.27.1)

Enhancements:

- [#&#8203;1501][]: prevent `Object` from panicking on nils
- [#&#8203;1511][]: Fix a race condition in `WithLazy`.

Thanks to [@&#8203;rabbbit](https://github.com/rabbbit), [@&#8203;alshopov](https://github.com/alshopov), [@&#8203;jquirke](https://github.com/jquirke), [@&#8203;arukiidou](https://github.com/arukiidou) for their contributions to this release.

[#&#8203;1501]: uber-go/zap#1501

[#&#8203;1511]: uber-go/zap#1511

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xMC41IiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: https://gitea.t000-n.de/t.behrendt/tracebasedlogsampler/pulls/25
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
github-merge-queue bot pushed a commit that referenced this pull request Feb 23, 2026
Cobra already prints the user-facing error and usage on Execute()
failure.
Using cobra.CheckErr(cmd.Execute()) causes duplicate error output.

This change aligns cmd/builder and cmd/mdatagen with the previously
accepted pattern (PR #14317): let Cobra own CLI messaging and have
main() only control the exit code.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants