Skip to content
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

Examples: Fix ParentProvider not being set on MyFilteringProcessor #3370

Merged

Conversation

CodeBlanch
Copy link
Member

Fixes #3241

Changes

Uses CompositeProcessor<Activity> so that ParentProvider is correctly set on the inner processor for the filtering example.

Requires #3368 (comment) to fully work.

@CodeBlanch CodeBlanch requested a review from a team June 15, 2022 23:54
@codecov
Copy link

codecov bot commented Jun 16, 2022

Codecov Report

Merging #3370 (5954cfa) into main (a58c7a3) will increase coverage by 0.16%.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #3370      +/-   ##
==========================================
+ Coverage   85.87%   86.04%   +0.16%     
==========================================
  Files         268      268              
  Lines        9460     9460              
==========================================
+ Hits         8124     8140      +16     
+ Misses       1336     1320      -16     
Impacted Files Coverage Δ
...emetry.Api/Internal/OpenTelemetryApiEventSource.cs 73.52% <0.00%> (-5.89%) ⬇️
...Telemetry/Internal/SelfDiagnosticsEventListener.cs 96.87% <0.00%> (-0.79%) ⬇️
...ter.ZPages/Implementation/ZPagesActivityTracker.cs 100.00% <0.00%> (+2.85%) ⬆️
...metryProtocol/Implementation/ActivityExtensions.cs 95.60% <0.00%> (+4.39%) ⬆️
...tation/OpenTelemetryProtocolExporterEventSource.cs 85.00% <0.00%> (+10.00%) ⬆️
...xporter.OpenTelemetryProtocol/OtlpTraceExporter.cs 77.27% <0.00%> (+18.18%) ⬆️
...entation/ExportClient/OtlpGrpcTraceExportClient.cs 78.57% <0.00%> (+28.57%) ⬆️

@@ -18,15 +18,14 @@
using System.Diagnostics;
using OpenTelemetry;

internal class MyFilteringProcessor : BaseProcessor<Activity>
internal class MyFilteringProcessor : CompositeProcessor<Activity>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Purely from the reader's perspective - I guess folks would question "why would I need to derive from CompositeProcessor?".

Copy link
Member

@alanwest alanwest Jun 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 this is a good question, and I can't think of simple explanation to give users. The alternative to making SetParentProvider public is problematic for similar reasons. I'd struggle to come up with a concise way to explain to users under what circumstances they need to be sure to call SetParentProvider.

In either case the explanation is basically: if you're newing up a processor and you're not directly passing it to providerBuilder.AddProcessor() (i.e., it's nested in another processor or something) then you gotta make sure that the parent provider gets set - which in turn ensures the processor has access to the configured resource... which may or may not be important depending on the processor

which then raises questions of why the parent provider needs to be set, why does it need access to a resource, and when is all of this important

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't have a good solution for this! Agree with @alanwest exposing SetParentProvider feels wrong. I just added some XML comments explaining (or hinting at) what is going on in the example. That might help?

We could introduce a class to make it more self-explanatory like...

public class DelegatingProcessor<T> : CompositeProcessor<T>
{
   public DelegatingProcessor(BaseProcessor<T> innerProcessor)
      : base(new[] { innerProcessor ?? throw new ArgumentNullException(nameof(innerProcessor) })
   {
   }
}

...or...

    public class DelegatingProcessor<T> : BaseProcessor<T>
    {
        public DelegatingProcessor(BaseProcessor<T> innerProcessor)
        {
            Guard.ThrowIfNull(innerProcessor);

            this.InnerProcessor = innerProcessor;
        }

        protected BaseProcessor<T> InnerProcessor { get; }

        public override void OnStart(T data)
        {
            this.InnerProcessor.OnStart(data);
        }

        public override void OnEnd(T data)
        {
            this.InnerProcessor.OnEnd(data);
        }

        internal override void SetParentProvider(BaseProvider parentProvider)
        {
            this.InnerProcessor.SetParentProvider(parentProvider);
        }

        protected override bool OnForceFlush(int timeoutMilliseconds)
        {
            return this.InnerProcessor.ForceFlush(timeoutMilliseconds);
        }

        protected override bool OnShutdown(int timeoutMilliseconds)
        {
            return this.InnerProcessor.Shutdown(timeoutMilliseconds);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                this.InnerProcessor.Dispose();
            }

            base.Dispose(disposing);
        }
    }

I doubt anyone will like that either, but it's an option 🤣

Copy link
Member

@reyang reyang Jun 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Giving this is an example, I guess I can just close my eyes on it and click the approve button. 🤣

I guess there might be a solution to retrieve the "parent" processor's ParentProvider - based on callstack or context (should be reasonably performant since we only have to fetch it once when the ParentProvider is not yet set), but maybe it's just an overkill 🤷‍♂️

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt anyone will like that either, but it's an option 🤣

Yea not yet excited about this idea. I do agree the naming offers a slight improvement, but I think it's worth sitting on a bit. Definitely think it's worth continuing this discussion in hopes of finding a better solution.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something about this problem kinda feels similar to middleware branching. Like the filter processor effectively introduces a branch in the pipeline. Something like

if (filterFunc(span)) {
    // invoke the next process in the chain
} else {
    // terminate the pipeline - maybe call a noop processor or something
}

Copy link
Member

@reyang reyang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks okay to me.

Copy link
Member

@alanwest alanwest left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 looks good. At least the example works as intended now! Can't argue with progress.

@CodeBlanch CodeBlanch merged commit 870eb92 into open-telemetry:main Jun 16, 2022
@CodeBlanch CodeBlanch deleted the example-filtering-processor-fix branch June 16, 2022 22:32
alanwest added a commit that referenced this pull request Jun 27, 2022
* Added Jaeger Propagator to Opentelemetry.Extensions.Propagators (#3309)

* Remove unnecessary bullet in CHANGELOG.md (#3352)

Co-authored-by: Cijo Thomas <cithomas@microsoft.com>

* Fix OTLP test (#3357)

* Show that test is not doing what you might think it does

* More asserts the merrier

* Show this little test that it has potential

* improve test coverage: InMemoryExporter & IDeferredMeterProviderBuilder (#3345)

* [SDK] Circular buffer tweaks + cpu pressure test (#3349)

* CircularBuffer tweaks and cpu pressure test.

* Switch to Volatile.Read.

* Perf tweaks.

* Remove race check in debug after doing more testing.

Co-authored-by: Cijo Thomas <cithomas@microsoft.com>

* Fix event name logic + support null categoryname. (#3359)

* In-memory Exporter: Buffer log scopes (#3360)

* Buffer log scopes when using in-memory exporter.

* CHANGELOG update.

* Code review.

* Tests.

* CHANGELOG tweak.

* SDK: Forward SetParentProvider to children of CompositeProcessor (#3368)

* Examples: Fix ParentProvider not being set on MyFilteringProcessor (#3370)

* Fix ParentProvider not being set on MyFilteringProcessor example.

* Added XML comments.

* Tweak.

* Typo.

* Logs: Add helper ctors & forceflush on OpenTelemetryLoggerProvider (#3364)

* Add helper ctors & forceflush on OpenTelemetryLoggerProvider.

* CHANGELOG update.

* Unit tests.

* Code review.

* Code review.

* Tweak.

* SDK: Nullable annotations for base classes & batch + shims to enable compiler features (#3374)

* Nullable annotations and shims for SDK base classes & batch.

* Target updates.

* Remove System.Collections.Immutable ref.

* ApiCompat attribute exclusions.

* ASPNETCore instrumentation to populate httpflavor tag (#3372)

* improve test coverage: InMemoryExporter SnapshotMetric (#3344)

* Fix AspNetCore metrics to use correct value for http.flavor (#3379)

* Fix AspNetCore metrics to use correct value for http.flavor

* word better

* Logs: Add LogRecordData (#3378)

* Add LogRecordData and hook up to LogRecord.

* CHANGELOG update.

* Code review.

* Remove SetHttpFlavor from Http instrumentations (#3381)

* Asp.Net Core trace instrumentation to populate http schema tag (#3392)

* Try asp.net core tests with inproc server (#3394)

* Dedupe IsPackable (#3398)

* Remove AspNet and AspNet.TelemetryHttpModule instrumentation projects (#3397)

* Handle possible exception when initializing the default service name (#3405)

* HttpClient: Invoke Enrich when SocketException = HostNotFound (#3407)

* Add & use ConfigureResource API. (#3307)

Co-authored-by: tyler jago <ty_bone11@hotmail.com>
Co-authored-by: Robert Pająk <rpajak@splunk.com>
Co-authored-by: Cijo Thomas <cithomas@microsoft.com>
Co-authored-by: Timothy Mothra <tilee@microsoft.com>
Co-authored-by: Mikel Blanchard <mblanchard@macrosssoftware.com>
Co-authored-by: Reiley Yang <reyang@microsoft.com>
Co-authored-by: Utkarsh Umesan Pillai <utpilla@microsoft.com>
Co-authored-by: Christian Neumüller <christian.neumueller@dynatrace.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Filtering Processor example is problematic
3 participants