fix(trace): use sync.Once to prevent multiple trace initialization #5244
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.
Description
Fixes #5242
This PR resolves an issue where the trace agent would reinitialize when running multiple servers (REST + RPC) with different trace endpoints, causing the global
TracerProviderto be overwritten.Problem
When running multiple servers with tracing enabled:
The trace agent would reinitialize for each server with different endpoints, overwriting the global
TracerProvider. Only the last configuration would take effect.Root Cause
The
StartAgentfunction only prevented re-initialization when the exact same endpoint was used:When different endpoints were configured (common in multi-server setups),
startAgent()would be called again, creating a newTracerProviderand overwriting the global one viaotel.SetTracerProvider().Solution
Adopted the
sync.Oncepattern used byprometheus.StartAgentandlogx.SetUpto ensure trace initialization happens exactly once:Changes
agentsmap andlockmutex withsync.OnceStartAgent()to wrap initialization inonce.Do()StopAgent()by removing unnecessary lockTestStartAgentto verify newsync.OncebehaviorBenefits
prometheus.StartAgentandlogx.SetUpusesync.OnceTesting
core/trace,core/service,rest,zrpc)Verification
Before fix - TracerProvider being overwritten:
After fix - TracerProvider remains consistent: