-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Fix Client Diagnostics following upgrade to DiagnosticSource 5.0.0 #5326
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
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Relates: elastic/apm-agent-dotnet#1094 This commit fixes a rather pernicious bug with Diagnostics from the clients, following the upgrade to System.Diagnostics.DiagnosticSource 5.0.0. `Diagnostic` and `Diagnostic<TState, TStateEnd>` derived from System.Diagnostics.Activity, implementing IDisposable to make them nicer to work with. In System.Diagnostics.DiagnosticSource 5.0.0, Activity now implements IDisposable, so the impl was updated to override `Dispose(bool)`. A problem arises from now deriving from Activity in that for an activity that is not finished, `Dispose()` calls `Stop()` which in turn will notify the ActivitySource that it has stopped **and** sets `Activity.Current` to the parent Activity (null if there's no parent). Now, when calling into overridden `Dispose(bool)`, the DiagnosticSource is notified that the `Activity` has stopped, allowing for listeners to take action. If a listener is getting the Activity through `Activity.Current` as Elastic APM's integration does however, `Activity.Current` no longer represents the Activity that has stopped, but its parent, with no nice way to reference the stopped Activity. This commit removes deriving from `Activity` and introduces a private field in which to hold an Activity that is started, and ended on Dispose. Starting and stopping the activity sets the start and end times, respectively.
stevejgordon
requested changes
Feb 17, 2021
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.
Thanks, Russ! That's an annoying bug! This looks good, but I think the dispose pattern could be tweaked on this?
stevejgordon
approved these changes
Feb 17, 2021
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.
LGTM!
github-actions bot
pushed a commit
that referenced
this pull request
Feb 17, 2021
…5326) Relates: elastic/apm-agent-dotnet#1094 This commit fixes a rather pernicious bug with Diagnostics from the clients, following the upgrade to System.Diagnostics.DiagnosticSource 5.0.0. `Diagnostic` and `Diagnostic<TState, TStateEnd>` derived from System.Diagnostics.Activity, implementing IDisposable to make them nicer to work with. In System.Diagnostics.DiagnosticSource 5.0.0, Activity now implements IDisposable, so the impl was updated to override `Dispose(bool)`. A problem arises from now deriving from Activity in that for an activity that is not finished, `Dispose()` calls `Stop()` which in turn will notify the ActivitySource that it has stopped **and** sets `Activity.Current` to the parent Activity (null if there's no parent). Now, when calling into overridden `Dispose(bool)`, the DiagnosticSource is notified that the `Activity` has stopped, allowing for listeners to take action. If a listener is getting the Activity through `Activity.Current` as Elastic APM's integration does however, `Activity.Current` no longer represents the Activity that has stopped, but its parent, with no nice way to reference the stopped Activity. This commit removes deriving from `Activity` and introduces a private field in which to hold an Activity that is started, and ended on Dispose. Starting and stopping the activity sets the start and end times, respectively.
stevejgordon
pushed a commit
that referenced
this pull request
Feb 17, 2021
…5326) (#5327) Relates: elastic/apm-agent-dotnet#1094 This commit fixes a rather pernicious bug with Diagnostics from the clients, following the upgrade to System.Diagnostics.DiagnosticSource 5.0.0. `Diagnostic` and `Diagnostic<TState, TStateEnd>` derived from System.Diagnostics.Activity, implementing IDisposable to make them nicer to work with. In System.Diagnostics.DiagnosticSource 5.0.0, Activity now implements IDisposable, so the impl was updated to override `Dispose(bool)`. A problem arises from now deriving from Activity in that for an activity that is not finished, `Dispose()` calls `Stop()` which in turn will notify the ActivitySource that it has stopped **and** sets `Activity.Current` to the parent Activity (null if there's no parent). Now, when calling into overridden `Dispose(bool)`, the DiagnosticSource is notified that the `Activity` has stopped, allowing for listeners to take action. If a listener is getting the Activity through `Activity.Current` as Elastic APM's integration does however, `Activity.Current` no longer represents the Activity that has stopped, but its parent, with no nice way to reference the stopped Activity. This commit removes deriving from `Activity` and introduces a private field in which to hold an Activity that is started, and ended on Dispose. Starting and stopping the activity sets the start and end times, respectively. Co-authored-by: Russ Cam <russ.cam@elastic.co>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Relates: elastic/apm-agent-dotnet#1094
This commit fixes a rather pernicious bug with Diagnostics from the clients,
following the upgrade to System.Diagnostics.DiagnosticSource 5.0.0.
Diagnostic
andDiagnostic<TState, TStateEnd>
derived fromSystem.Diagnostics.Activity, implementing IDisposable to make them
nicer to work with. In System.Diagnostics.DiagnosticSource 5.0.0, Activity now
implements IDisposable, so the impl was updated to override
Dispose(bool)
.A problem arises from now deriving from Activity in that for an activity that is not finished,
Dispose()
callsStop()
which in turn will notify the ActivitySource that it has stoppedand sets
Activity.Current
to the parent Activity (null if there's no parent). Now,when calling into overridden
Dispose(bool)
, the DiagnosticSource is notified thatthe
Activity
has stopped, allowing for listeners to take action. If a listener is gettingthe Activity through
Activity.Current
as Elastic APM's integration does however,Activity.Current
no longer represents the Activity that has stopped, but its parent, withno nice way to reference the stopped Activity.
This commit removes deriving from
Activity
and introduces a private fieldin which to hold an Activity that is started, and ended on Dispose. Starting
and stopping the activity sets the start and end times, respectively.