fix(spanner): snapshot EnableOpenTelemetryMetrics value on client creation #11496
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #9740
The problem with the recordGFELatencyMetricsOT function is
that it dynamically checks the value of the mutable
openTelemetryMetricsEnabled global variable, instead of
exclusively relying on immutable state. This is how we end
up in weird states where otConfig isn't fully initialized,
but somehow otel metrics are enabled, causing panics.
This PR fixes this by loading the global
openTelemetryMetricsEnabled variable exactly once on each
client's creation (i.e. snapshot the value), and then from
that point on, the client relies on the snapshotted
value for its entire lifetime: either otel metrics are
enabled and otConfig is fully initialized, or otel metrics
are disabled and otConfig isn't used. Basically, it's a bug
to call IsOpenTelemetryMetricsEnabled() more than once per
client, since the value can change between calls.
Includes a regression test, which I verified panics without
this fix: