-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Prometheus exporter: concurrent collect bugfix #3899
Prometheus exporter: concurrent collect bugfix #3899
Conversation
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is missing tests to validate the bug this is supposed to address is resolved.
Is this type expected to be safe for concurrent use? I don't believe we document that any exporters are safe for concurrent use. What is the scenario that causes this error to be observed? |
Neither prometheus nor opentelemetry explicitly documented anything about concurrency:
We use OpenTelemetry with Prometheus in an absolutely standard way. I think that it just happen that collector came concurrently which is very unlikely but still possible. |
Digging deeper I found out that concurrent map access isn't the only problem, there are other critical sections. So I cleaned up the code and used sync.Mutex instead of just protecting the map. Please take a look at the PR and if it's ok I'll complete it with tests. This particular collector must be concurrent safe just because there's no mechanism protecting the third-party collector on the Prometheus side, as result a couple of concurrent requests to the prometheus handler might crash the app. In the Prometheus itself the metrics map is protected by the mutex: So any Prometheus collector must be concurrent-safe. |
Codecov Report
Additional details and impacted files@@ Coverage Diff @@
## main #3899 +/- ##
=======================================
- Coverage 83.6% 83.6% -0.1%
=======================================
Files 181 181
Lines 14162 14184 +22
=======================================
+ Hits 11840 11858 +18
- Misses 2096 2098 +2
- Partials 226 228 +2
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is still missing regression tests.
@MrAlias I added a test for concurrent collect. When I ran it against the main branch it gave me exactly same panic I reported above:
PTAL |
Just curious how many more months it will take to fix several panics in this package. |
@hexdigest I am planning to merge this today as there was enough time for other contributors to review. Can you just update the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry I wasn't able to get to this sooner, i'm just getting back from leave. This is a great improvement overall, and a needed fix. Comments are non-blocking.
@hexdigest Are you able to fix the build and consider addressing @dashpole comments? |
Yep, I will |
The problem is that this is the only trick path I found to reproduce the issue in the test: And now it's being checked somewhere else I suppose, so I might just remove this test. |
I am fine with removing the test as it is a very edge case and personally I do not know how to reproduce it. |
@hexdigest I quickly checked https://github.com/prometheus/client_golang/ and tried to fix the test in browser. fcfb775 I hope it helps... I am quite busy at the moment 😬 |
@hexdigest Let us know if you do not have time or do not want to address the comments. I can merge this PR and address the comments myself by creating a new PR. |
Let's merge it now
…On Thu, Jun 29, 2023, 11:47 Robert Pająk ***@***.***> wrote:
@hexdigest <https://github.com/hexdigest> Let us know if you do not have
time or do not want to address the comments. I can merge this PR and
address the comments myself by creating a new PR.
—
Reply to this email directly, view it on GitHub
<#3899 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AALEA6BK3WWBEBG4TCJ4IMLXNUXHRANCNFSM6AAAAAAV6PG2JQ>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Co-authored-by: David Ashpole <dashpole@google.com>
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [go.opentelemetry.io/otel](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v1.16.0` -> `v1.17.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v0.39.0` -> `v0.40.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlptrace](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v1.16.0` -> `v1.17.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v1.16.0` -> `v1.17.0` | | [go.opentelemetry.io/otel/exporters/prometheus](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v0.39.0` -> `v0.40.0` | | [go.opentelemetry.io/otel/metric](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v1.16.0` -> `v1.17.0` | | [go.opentelemetry.io/otel/sdk](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v1.16.0` -> `v1.17.0` | | [go.opentelemetry.io/otel/sdk/metric](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v0.39.0` -> `v0.40.0` | | [go.opentelemetry.io/otel/trace](https://togithub.com/open-telemetry/opentelemetry-go) | require | minor | `v1.16.0` -> `v1.17.0` | --- ### Release Notes <details> <summary>open-telemetry/opentelemetry-go (go.opentelemetry.io/otel)</summary> ### [`v1.17.0`](https://togithub.com/open-telemetry/opentelemetry-go/releases/tag/v1.17.0): /v0.40.0/v0.5.0 [Compare Source](https://togithub.com/open-telemetry/opentelemetry-go/compare/v1.16.0...v1.17.0) ##### Added - Export the `ManualReader` struct in `go.opentelemetry.io/otel/sdk/metric`. ([#​4244](https://togithub.com/open-telemetry/opentelemetry-go/issues/4244)) - Export the `PeriodicReader` struct in `go.opentelemetry.io/otel/sdk/metric`. ([#​4244](https://togithub.com/open-telemetry/opentelemetry-go/issues/4244)) - Add support for exponential histogram aggregations. A histogram can be configured as an exponential histogram using a view with `"go.opentelemetry.io/otel/sdk/metric".ExponentialHistogram` as the aggregation. ([#​4245](https://togithub.com/open-telemetry/opentelemetry-go/issues/4245)) - Export the `Exporter` struct in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. ([#​4272](https://togithub.com/open-telemetry/opentelemetry-go/issues/4272)) - Export the `Exporter` struct in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. ([#​4272](https://togithub.com/open-telemetry/opentelemetry-go/issues/4272)) - The exporters in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` now support the `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` environment variable. ([#​4287](https://togithub.com/open-telemetry/opentelemetry-go/issues/4287)) - Add `WithoutCounterSuffixes` option in `go.opentelemetry.io/otel/exporters/prometheus` to disable addition of `_total` suffixes. ([#​4306](https://togithub.com/open-telemetry/opentelemetry-go/issues/4306)) - Add info and debug logging to the metric SDK in `go.opentelemetry.io/otel/sdk/metric`. ([#​4315](https://togithub.com/open-telemetry/opentelemetry-go/issues/4315)) - The `go.opentelemetry.io/otel/semconv/v1.21.0` package. The package contains semantic conventions from the `v1.21.0` version of the OpenTelemetry Semantic Conventions. ([#​4362](https://togithub.com/open-telemetry/opentelemetry-go/issues/4362)) - Accept 201 to 299 HTTP status as success in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. ([#​4365](https://togithub.com/open-telemetry/opentelemetry-go/issues/4365)) - Document the `Temporality` and `Aggregation` methods of the `"go.opentelemetry.io/otel/sdk/metric".Exporter"` need to be concurrent safe. ([#​4381](https://togithub.com/open-telemetry/opentelemetry-go/issues/4381)) - Expand the set of units supported by the Prometheus exporter, and don't add unit suffixes if they are already present in `go.opentelemetry.op/otel/exporters/prometheus` ([#​4374](https://togithub.com/open-telemetry/opentelemetry-go/issues/4374)) - Move the `Aggregation` interface and its implementations from `go.opentelemetry.io/otel/sdk/metric/aggregation` to `go.opentelemetry.io/otel/sdk/metric`. ([#​4435](https://togithub.com/open-telemetry/opentelemetry-go/issues/4435)) - The exporters in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` now support the `OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION` environment variable. ([#​4437](https://togithub.com/open-telemetry/opentelemetry-go/issues/4437)) - Add the `NewAllowKeysFilter` and `NewDenyKeysFilter` functions to `go.opentelemetry.io/otel/attribute` to allow convenient creation of allow-keys and deny-keys filters. ([#​4444](https://togithub.com/open-telemetry/opentelemetry-go/issues/4444)) ##### Changed - Starting from `v1.21.0` of semantic conventions, `go.opentelemetry.io/otel/semconv/{version}/httpconv` and `go.opentelemetry.io/otel/semconv/{version}/netconv` packages will no longer be published. ([#​4145](https://togithub.com/open-telemetry/opentelemetry-go/issues/4145)) - Log duplicate instrument conflict at a warning level instead of info in `go.opentelemetry.io/otel/sdk/metric`. ([#​4202](https://togithub.com/open-telemetry/opentelemetry-go/issues/4202)) - Return an error on the creation of new instruments in `go.opentelemetry.io/otel/sdk/metric` if their name doesn't pass regexp validation. ([#​4210](https://togithub.com/open-telemetry/opentelemetry-go/issues/4210)) - `NewManualReader` in `go.opentelemetry.io/otel/sdk/metric` returns `*ManualReader` instead of `Reader`. ([#​4244](https://togithub.com/open-telemetry/opentelemetry-go/issues/4244)) - `NewPeriodicReader` in `go.opentelemetry.io/otel/sdk/metric` returns `*PeriodicReader` instead of `Reader`. ([#​4244](https://togithub.com/open-telemetry/opentelemetry-go/issues/4244)) - Count the Collect time in the `PeriodicReader` timeout in `go.opentelemetry.io/otel/sdk/metric`. ([#​4221](https://togithub.com/open-telemetry/opentelemetry-go/issues/4221)) - The function `New` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` returns `*Exporter` instead of `"go.opentelemetry.io/otel/sdk/metric".Exporter`. ([#​4272](https://togithub.com/open-telemetry/opentelemetry-go/issues/4272)) - The function `New` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` returns `*Exporter` instead of `"go.opentelemetry.io/otel/sdk/metric".Exporter`. ([#​4272](https://togithub.com/open-telemetry/opentelemetry-go/issues/4272)) - If an attribute set is omitted from an async callback, the previous value will no longer be exported in `go.opentelemetry.io/otel/sdk/metric`. ([#​4290](https://togithub.com/open-telemetry/opentelemetry-go/issues/4290)) - If an attribute set is observed multiple times in an async callback in `go.opentelemetry.io/otel/sdk/metric`, the values will be summed instead of the last observation winning. ([#​4289](https://togithub.com/open-telemetry/opentelemetry-go/issues/4289)) - Allow the explicit bucket histogram aggregation to be used for the up-down counter, observable counter, observable up-down counter, and observable gauge in the `go.opentelemetry.io/otel/sdk/metric` package. ([#​4332](https://togithub.com/open-telemetry/opentelemetry-go/issues/4332)) - Restrict `Meter`s in `go.opentelemetry.io/otel/sdk/metric` to only register and collect instruments it created. ([#​4333](https://togithub.com/open-telemetry/opentelemetry-go/issues/4333)) - `PeriodicReader.Shutdown` and `PeriodicReader.ForceFlush` in `go.opentelemetry.io/otel/sdk/metric` now apply the periodic reader's timeout to the operation if the user provided context does not contain a deadline. ([#​4356](https://togithub.com/open-telemetry/opentelemetry-go/issues/4356), [#​4377](https://togithub.com/open-telemetry/opentelemetry-go/issues/4377)) - Upgrade all use of `go.opentelemetry.io/otel/semconv` to use `v1.21.0`. ([#​4408](https://togithub.com/open-telemetry/opentelemetry-go/issues/4408)) - Increase instrument name maximum length from 63 to 255 characters in `go.opentelemetry.io/otel/sdk/metric`. ([#​4434](https://togithub.com/open-telemetry/opentelemetry-go/issues/4434)) - Add `go.opentelemetry.op/otel/sdk/metric.WithProducer` as an `Option` for `"go.opentelemetry.io/otel/sdk/metric".NewManualReader` and `"go.opentelemetry.io/otel/sdk/metric".NewPeriodicReader`. ([#​4346](https://togithub.com/open-telemetry/opentelemetry-go/issues/4346)) ##### Removed - Remove `Reader.RegisterProducer` in `go.opentelemetry.io/otel/metric`. Use the added `WithProducer` option instead. ([#​4346](https://togithub.com/open-telemetry/opentelemetry-go/issues/4346)) - Remove `Reader.ForceFlush` in `go.opentelemetry.io/otel/metric`. Notice that `PeriodicReader.ForceFlush` is still available. ([#​4375](https://togithub.com/open-telemetry/opentelemetry-go/issues/4375)) ##### Fixed - Correctly format log messages from the `go.opentelemetry.io/otel/exporters/zipkin` exporter. ([#​4143](https://togithub.com/open-telemetry/opentelemetry-go/issues/4143)) - Log an error for calls to `NewView` in `go.opentelemetry.io/otel/sdk/metric` that have empty criteria. ([#​4307](https://togithub.com/open-telemetry/opentelemetry-go/issues/4307)) - Fix `"go.opentelemetry.io/otel/sdk/resource".WithHostID()` to not set an empty `host.id`. ([#​4317](https://togithub.com/open-telemetry/opentelemetry-go/issues/4317)) - Use the instrument identifying fields to cache aggregators and determine duplicate instrument registrations in `go.opentelemetry.io/otel/sdk/metric`. ([#​4337](https://togithub.com/open-telemetry/opentelemetry-go/issues/4337)) - Detect duplicate instruments for case-insensitive names in `go.opentelemetry.io/otel/sdk/metric`. ([#​4338](https://togithub.com/open-telemetry/opentelemetry-go/issues/4338)) - The `ManualReader` will not panic if `AggregationSelector` returns `nil` in `go.opentelemetry.io/otel/sdk/metric`. ([#​4350](https://togithub.com/open-telemetry/opentelemetry-go/issues/4350)) - If a `Reader`'s `AggregationSelector` returns `nil` or `DefaultAggregation` the pipeline will use the default aggregation. ([#​4350](https://togithub.com/open-telemetry/opentelemetry-go/issues/4350)) - Log a suggested view that fixes instrument conflicts in `go.opentelemetry.io/otel/sdk/metric`. ([#​4349](https://togithub.com/open-telemetry/opentelemetry-go/issues/4349)) - Fix possible panic, deadlock and race condition in batch span processor in `go.opentelemetry.io/otel/sdk/trace`. ([#​4353](https://togithub.com/open-telemetry/opentelemetry-go/issues/4353)) - Improve context cancellation handling in batch span processor's `ForceFlush` in `go.opentelemetry.io/otel/sdk/trace`. ([#​4369](https://togithub.com/open-telemetry/opentelemetry-go/issues/4369)) - Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` using gotmpl. ([#​4397](https://togithub.com/open-telemetry/opentelemetry-go/issues/4397), [#​3846](https://togithub.com/open-telemetry/opentelemetry-go/issues/3846)) - Decouple `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` using gotmpl. ([#​4404](https://togithub.com/open-telemetry/opentelemetry-go/issues/4404), [#​3846](https://togithub.com/open-telemetry/opentelemetry-go/issues/3846)) - Decouple `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` using gotmpl. ([#​4407](https://togithub.com/open-telemetry/opentelemetry-go/issues/4407), [#​3846](https://togithub.com/open-telemetry/opentelemetry-go/issues/3846)) - Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` using gotmpl. ([#​4400](https://togithub.com/open-telemetry/opentelemetry-go/issues/4400), [#​3846](https://togithub.com/open-telemetry/opentelemetry-go/issues/3846)) - Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` using gotmpl. ([#​4401](https://togithub.com/open-telemetry/opentelemetry-go/issues/4401), [#​3846](https://togithub.com/open-telemetry/opentelemetry-go/issues/3846)) - Do not block the metric SDK when OTLP metric exports are blocked in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. ([#​3925](https://togithub.com/open-telemetry/opentelemetry-go/issues/3925), [#​4395](https://togithub.com/open-telemetry/opentelemetry-go/issues/4395)) - Do not append `_total` if the counter already has that suffix for the Prometheus exproter in `go.opentelemetry.io/otel/exporter/prometheus`. ([#​4373](https://togithub.com/open-telemetry/opentelemetry-go/issues/4373)) - Fix resource detection data race in `go.opentelemetry.io/otel/sdk/resource`. ([#​4409](https://togithub.com/open-telemetry/opentelemetry-go/issues/4409)) - Use the first-seen instrument name during instrument name conflicts in `go.opentelemetry.io/otel/sdk/metric`. ([#​4428](https://togithub.com/open-telemetry/opentelemetry-go/issues/4428)) ##### Deprecated - The `go.opentelemetry.io/otel/exporters/jaeger` package is deprecated. OpenTelemetry dropped support for Jaeger exporter in July 2023. Use `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp` or `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` instead. ([#​4423](https://togithub.com/open-telemetry/opentelemetry-go/issues/4423)) - The `go.opentelemetry.io/otel/example/jaeger` package is deprecated. ([#​4423](https://togithub.com/open-telemetry/opentelemetry-go/issues/4423)) - The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` package is deprecated. ([#​4420](https://togithub.com/open-telemetry/opentelemetry-go/issues/4420)) - The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/oconf` package is deprecated. ([#​4420](https://togithub.com/open-telemetry/opentelemetry-go/issues/4420)) - The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/otest` package is deprecated. ([#​4420](https://togithub.com/open-telemetry/opentelemetry-go/issues/4420)) - The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/transform` package is deprecated. ([#​4420](https://togithub.com/open-telemetry/opentelemetry-go/issues/4420)) - The `go.opentelemetry.io/otel/exporters/otlp/internal` package is deprecated. ([#​4421](https://togithub.com/open-telemetry/opentelemetry-go/issues/4421)) - The `go.opentelemetry.io/otel/exporters/otlp/internal/envconfig` package is deprecated. ([#​4421](https://togithub.com/open-telemetry/opentelemetry-go/issues/4421)) - The `go.opentelemetry.io/otel/exporters/otlp/internal/retry` package is deprecated. ([#​4421](https://togithub.com/open-telemetry/opentelemetry-go/issues/4421)) - The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` package is deprecated. ([#​4425](https://togithub.com/open-telemetry/opentelemetry-go/issues/4425)) - The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/envconfig` package is deprecated. ([#​4425](https://togithub.com/open-telemetry/opentelemetry-go/issues/4425)) - The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig` package is deprecated. ([#​4425](https://togithub.com/open-telemetry/opentelemetry-go/issues/4425)) - The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlptracetest` package is deprecated. ([#​4425](https://togithub.com/open-telemetry/opentelemetry-go/issues/4425)) - The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry` package is deprecated. ([#​4425](https://togithub.com/open-telemetry/opentelemetry-go/issues/4425)) - The `go.opentelemetry.io/otel/sdk/metric/aggregation` package is deprecated. Use the aggregation types added to `go.opentelemetry.io/otel/sdk/metric` instead. ([#​4435](https://togithub.com/open-telemetry/opentelemetry-go/issues/4435)) ##### New Contributors - [@​serdarkalayci](https://togithub.com/serdarkalayci) made their first contribution in [https://github.com/open-telemetry/opentelemetry-go/pull/4129](https://togithub.com/open-telemetry/opentelemetry-go/pull/4129) - [@​Jorropo](https://togithub.com/Jorropo) made their first contribution in [https://github.com/open-telemetry/opentelemetry-go/pull/4226](https://togithub.com/open-telemetry/opentelemetry-go/pull/4226) - [@​hexdigest](https://togithub.com/hexdigest) made their first contribution in [https://github.com/open-telemetry/opentelemetry-go/pull/3899](https://togithub.com/open-telemetry/opentelemetry-go/pull/3899) - [@​gkze](https://togithub.com/gkze) made their first contribution in [https://github.com/open-telemetry/opentelemetry-go/pull/4402](https://togithub.com/open-telemetry/opentelemetry-go/pull/4402) - [@​jaredjenkins](https://togithub.com/jaredjenkins) made their first contribution in [https://github.com/open-telemetry/opentelemetry-go/pull/4409](https://togithub.com/open-telemetry/opentelemetry-go/pull/4409) - [@​utezduyar](https://togithub.com/utezduyar) made their first contribution in [https://github.com/open-telemetry/opentelemetry-go/pull/4456](https://togithub.com/open-telemetry/opentelemetry-go/pull/4456) **Full Changelog**: open-telemetry/opentelemetry-go@v1.16.0...v1.17.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **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://togithub.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 [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/open-feature/flagd). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi42Ni4wIiwidXBkYXRlZEluVmVyIjoiMzYuNjYuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> --------- Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
This PR fixes the following problem which is caused by the concurrent Collect method execution:
Also fixes #3917