Skip to content

sdk/trace: Fix gorountine leak in batchSpanProcessor.ForceFlush#6369

Merged
pellared merged 10 commits intoopen-telemetry:mainfrom
pellared:ff-fix
Feb 27, 2025
Merged

sdk/trace: Fix gorountine leak in batchSpanProcessor.ForceFlush#6369
pellared merged 10 commits intoopen-telemetry:mainfrom
pellared:ff-fix

Conversation

@pellared
Copy link
Copy Markdown
Member

@pellared pellared commented Feb 25, 2025

Fixes #6360

Per #6360 (comment):

So I'd fix this issue with the first proposed solution, and open an issue to change the behavior in a separate PR.

$ go test -run=TestBatchSpanProcessorForceFlushTimeout -count=1000
PASS
ok      go.opentelemetry.io/otel/sdk/trace      1.701s
$ go test -run=TestBatchSpanProcessorForceFlushTimeout -count=1000 -race
PASS
ok      go.opentelemetry.io/otel/sdk/trace      4.056s

@peterbourgon, thank you for your contribution 🏅

@pellared pellared changed the title sdk/trace: Remove gorountine leak in batchSpanProcessor.ForceFlush quickfix sdk/trace: Remove gorountine leak in batchSpanProcessor.ForceFlush Feb 25, 2025
@pellared
Copy link
Copy Markdown
Member Author

@open-telemetry/go-approvers, ready for review. The tests should pass after #6368 is merged.

@pellared pellared changed the title sdk/trace: Remove gorountine leak in batchSpanProcessor.ForceFlush sdk/trace: Fix gorountine leak in batchSpanProcessor.ForceFlush Feb 25, 2025
@pellared pellared changed the title sdk/trace: Fix gorountine leak in batchSpanProcessor.ForceFlush sdk/trace: Fix gorountine leak in batchSpanProcessor.ForceFlush Feb 25, 2025
@XSAM XSAM added this to the v1.35.0 milestone Feb 26, 2025
Copy link
Copy Markdown
Member

@XSAM XSAM left a comment

Choose a reason for hiding this comment

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

👍

@pellared pellared marked this pull request as ready for review February 26, 2025 22:52
@pellared
Copy link
Copy Markdown
Member Author

Tests are passing.

@codecov
Copy link
Copy Markdown

codecov Bot commented Feb 26, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 81.9%. Comparing base (23c76d3) to head (2f5e1af).
Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@          Coverage Diff          @@
##            main   #6369   +/-   ##
=====================================
  Coverage   81.8%   81.9%           
=====================================
  Files        283     283           
  Lines      24900   24899    -1     
=====================================
+ Hits       20393   20394    +1     
+ Misses      4104    4102    -2     
  Partials     403     403           

see 1 file with indirect coverage changes

@pellared pellared merged commit 9be18c1 into open-telemetry:main Feb 27, 2025
@pellared pellared deleted the ff-fix branch February 27, 2025 10:28
XSAM added a commit that referenced this pull request Mar 5, 2025
## Overview

This release is the last to support [Go 1.22].
The next release will require at least [Go 1.23].

### Added

- Add `ValueFromAttribute` and `KeyValueFromAttribute` in
`go.opentelemetry.io/otel/log`. (#6180)
- Add `EventName` and `SetEventName` to `Record` in
`go.opentelemetry.io/otel/log`. (#6187)
- Add `EventName` to `RecordFactory` in
`go.opentelemetry.io/otel/log/logtest`. (#6187)
- `AssertRecordEqual` in `go.opentelemetry.io/otel/log/logtest` checks
`Record.EventName`. (#6187)
- Add `EventName` and `SetEventName` to `Record` in
`go.opentelemetry.io/otel/sdk/log`. (#6193)
- Add `EventName` to `RecordFactory` in
`go.opentelemetry.io/otel/sdk/log/logtest`. (#6193)
- Emit `Record.EventName` field in
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#6211)
- Emit `Record.EventName` field in
`go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#6211)
- Emit `Record.EventName` field in
`go.opentelemetry.io/otel/exporters/stdout/stdoutlog` (#6210)
- The `go.opentelemetry.io/otel/semconv/v1.28.0` package.
The package contains semantic conventions from the `v1.28.0` version of
the OpenTelemetry Semantic Conventions.
See the [migration documentation](./semconv/v1.28.0/MIGRATION.md) for
information on how to upgrade from
`go.opentelemetry.io/otel/semconv/v1.27.0`(#6236)
- The `go.opentelemetry.io/otel/semconv/v1.30.0` package.
The package contains semantic conventions from the `v1.30.0` version of
the OpenTelemetry Semantic Conventions.
See the [migration documentation](./semconv/v1.30.0/MIGRATION.md) for
information on how to upgrade from
`go.opentelemetry.io/otel/semconv/v1.28.0`(#6240)
- Document the pitfalls of using `Resource` as a comparable type.
`Resource.Equal` and `Resource.Equivalent` should be used instead.
(#6272)
- Support [Go 1.24]. (#6304)
- Add `FilterProcessor` and `EnabledParameters` in
`go.opentelemetry.io/otel/sdk/log`.
It replaces
`go.opentelemetry.io/otel/sdk/log/internal/x.FilterProcessor`.
Compared to previous version it additionally gives the possibility to
filter by resource and instrumentation scope. (#6317)

### Changed

- Update `github.com/prometheus/common` to v0.62.0., which changes the
`NameValidationScheme` to `NoEscaping`. This allows metrics names to
keep original delimiters (e.g. `.`), rather than replacing with
underscores. This is controlled by the `Content-Type` header, or can be
reverted by setting `NameValidationScheme` to `LegacyValidation` in
`github.com/prometheus/common/model`. (#6198)

### Fixes

- Eliminate goroutine leak for the processor returned by
`NewSimpleSpanProcessor` when `Shutdown` is called and the passed `ctx`
is canceled and `SpanExporter.Shutdown` has not returned. (#6368)
- Eliminate goroutine leak for the processor returned by
`NewBatchSpanProcessor` when `ForceFlush` is called and the passed `ctx`
is canceled and `SpanExporter.Export` has not returned. (#6369)

[Go 1.23]: https://go.dev/doc/go1.23
[Go 1.22]: https://go.dev/doc/go1.22

---------

Co-authored-by: Robert Pająk <pellared@hotmail.com>
Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
go func() {
wait <- bsp.exportSpans(ctx)
close(wait)
}()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Came here from the release page. I wonder if this even needs to run in its own goroutine? Is exportSpans() supposed to stop when ctx is done? Wouldn't it be a bug/leak if it doesn't stop?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Rather not. See #6360. There was a preference to have a quick fix first. I will try to make a PR later but if you have some time we welcome contributions

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I created #6416

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.

batchSpanProcessor.ForceFlush can leak a goroutine

4 participants