-
-
Notifications
You must be signed in to change notification settings - Fork 226
QOL: Allow finishing spans and transactions with using
#4627
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
base: version6
Are you sure you want to change the base?
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## version6 #4627 +/- ##
===========================================
Coverage ? 73.20%
===========================================
Files ? 480
Lines ? 17403
Branches ? 3430
===========================================
Hits ? 12739
Misses ? 3811
Partials ? 853 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
@Flash0ver I'm trying to force an analyzer warning for the <WarningsAsErrors>CA2000</WarningsAsErrors> However I can't seem to get it to work: The warning does appear for the undisposed use of Any ideas/thoughts? |
Oh ... perhaps I totally misunderstood CA2000 😟 DisposeObjectsBeforeLosingScope.cs Hmmm ... it seems that the CA2000-DiagnosticAnalyzer does some Control-Flow-Analysis, that either tries to "see through" the implementation and does not report when it can't statically figure it out, or just does not report for some usage patterns. var instance1 = new MyDisposable(); //CA2000
var instance2 = new MyFactory().CreateInstance(); //CA2000
var instance3 = MyFactory.CreateStatic(); //CA2000
var instance4 = MyFactory.Instance.CreateInstance(); // does not report CA2000
public sealed class MyDisposable : IDisposable
{
public void Dispose()
{
}
}
public interface IMyFactory
{
IDisposable CreateInstance();
}
public sealed class MyFactory : IMyFactory
{
public static IMyFactory Instance { get; } = new MyFactory();
public static IDisposable CreateStatic() => new MyDisposable();
public IDisposable CreateInstance() => new MyDisposable();
} Not sure if that analysis behavior is intended or not. Now, as a follow-up, I'm wondering: var transaction = new TransactionTracer(null!, null!); //CA2000
var span = new SpanTracer(null!, transaction, default, default, null!); //CA2000
span.Finish();
transaction.Finish(); Are there valid/intended usage scenarios to instantiate these types directly from user code, which would report |
I can't think of any scenario in which people would want to construct those manually... so I suspect not.
That's possibly the case yes... and without being able to reproduce the warning that it's supposed to suppress, it's relatively difficult to test. I think this PR might be ready for review then... |
{ | ||
if (_hasFinished.Exchange(true)) | ||
{ | ||
return; |
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.
question: Timer
Should we, in the case of a Timer still being active, disable/dispose the timer too when the transactions is transitioning from unfinished to finished?
Wait ... I read this wrong ... this is actually what is happening:
- the first
Finish
will Stop/Dispose the Timer, if active - subsequent
Finish
es will early-out, but the Timer, if active, has been stopped/disposed previously
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.
The timer is only relevant if idle timeouts are enabled. That was added by Sean here:
I think there were plans to maybe use transactions that timed out automatically to instrument MAUI, but this hasn't yet been done. So, in practice, that code path is never executed.
I'm not sure I understand though - do you think there's a potential problem here? In what scenario?
Resolves #4321