Skip to content

Commit 8af9b32

Browse files
cijothomasreyang
andauthored
Continue Refactoring TracerProvider. (#1035)
* optimize the flow * fix instrumenataion * move mroe things to provider ctor * move logic arounds Co-authored-by: Reiley Yang <[email protected]>
1 parent 6e53eb2 commit 8af9b32

File tree

6 files changed

+236
-222
lines changed

6 files changed

+236
-222
lines changed

docs/trace/building-your-own-exporter/Program.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ public class Program
2525
public static void Main()
2626
{
2727
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
28-
.AddActivitySources(
29-
new string[]
30-
{
31-
"MyCompany.MyProduct.MyLibrary",
32-
})
28+
.AddActivitySource("MyCompany.MyProduct.MyLibrary")
3329
.AddMyExporter()
3430
.Build();
3531

docs/trace/building-your-own-processor/Program.cs

+1-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ public class Program
2626
public static void Main()
2727
{
2828
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
29-
.AddActivitySources(new string[]
30-
{
31-
"MyCompany.MyProduct.MyLibrary",
32-
})
29+
.AddActivitySource("MyCompany.MyProduct.MyLibrary")
3330
.AddProcessor(new MyActivityProcessor("A"))
3431
.AddProcessor(new MyActivityProcessor("B"))
3532
.Build();

docs/trace/building-your-own-sampler/Program.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ public class Program
2727
public static void Main()
2828
{
2929
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
30-
.AddActivitySources(
31-
new string[]
32-
{
33-
"MyCompany.MyProduct.MyLibrary",
34-
})
30+
.AddActivitySource("MyCompany.MyProduct.MyLibrary")
3531
.SetSampler(new MySampler())
3632
.AddProcessor(new SimpleActivityProcessor(new ConsoleExporter(new ConsoleExporterOptions())))
3733
.Build();

docs/trace/getting-started/Program.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ public class Program
2727
public static void Main()
2828
{
2929
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
30-
.AddActivitySources(
31-
new string[]
32-
{
33-
"MyCompany.MyProduct.MyLibrary",
34-
})
30+
.AddActivitySource("MyCompany.MyProduct.MyLibrary")
3531
.AddProcessor(new SimpleActivityProcessor(new ConsoleExporter(new ConsoleExporterOptions())))
3632
.Build();
3733

src/OpenTelemetry/Trace/TracerProviderBuilder.cs

+33-142
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
// </copyright>
1616
using System;
1717
using System.Collections.Generic;
18-
using System.Diagnostics;
1918
using OpenTelemetry.Resources;
2019
using OpenTelemetry.Trace.Samplers;
2120

@@ -26,17 +25,17 @@ namespace OpenTelemetry.Trace
2625
/// </summary>
2726
public class TracerProviderBuilder
2827
{
29-
internal TracerProviderBuilder()
30-
{
31-
}
28+
private readonly List<ActivityProcessor> processors = new List<ActivityProcessor>();
3229

33-
internal Sampler Sampler { get; private set; }
30+
private readonly List<string> sources = new List<string>();
3431

35-
internal Resource Resource { get; private set; } = Resource.Empty;
32+
private Sampler sampler = new ParentOrElseSampler(new AlwaysOnSampler());
3633

37-
internal ActivityProcessor ActivityProcessor { get; private set; }
34+
private Resource resource = Resource.Empty;
3835

39-
internal Dictionary<string, bool> ActivitySourceNames { get; private set; }
36+
internal TracerProviderBuilder()
37+
{
38+
}
4039

4140
internal List<InstrumentationFactory> InstrumentationFactories { get; private set; }
4241

@@ -47,7 +46,7 @@ internal TracerProviderBuilder()
4746
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
4847
public TracerProviderBuilder SetSampler(Sampler sampler)
4948
{
50-
this.Sampler = sampler ?? throw new ArgumentNullException(nameof(sampler));
49+
this.sampler = sampler;
5150
return this;
5251
}
5352

@@ -58,45 +57,44 @@ public TracerProviderBuilder SetSampler(Sampler sampler)
5857
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
5958
public TracerProviderBuilder SetResource(Resource resource)
6059
{
61-
this.Resource = resource ?? Resource.Empty;
60+
this.resource = resource ?? Resource.Empty;
6261
return this;
6362
}
6463

6564
/// <summary>
6665
/// Adds given activitysource name to the list of subscribed sources.
6766
/// </summary>
68-
/// <param name="activitySourceName">Activity source name.</param>
67+
/// <param name="name">Activity source name.</param>
6968
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
70-
public TracerProviderBuilder AddActivitySource(string activitySourceName)
71-
{
69+
public TracerProviderBuilder AddActivitySource(string name)
70+
{
71+
if (string.IsNullOrWhiteSpace(name))
72+
{
73+
throw new ArgumentException($"{nameof(name)} is null or whitespace.");
74+
}
75+
7276
// TODO: We need to fix the listening model.
7377
// Today it ignores version.
74-
if (this.ActivitySourceNames == null)
75-
{
76-
this.ActivitySourceNames = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
77-
}
78+
this.sources.Add(name);
7879

79-
this.ActivitySourceNames[activitySourceName] = true;
8080
return this;
8181
}
8282

8383
/// <summary>
8484
/// Adds given activitysource names to the list of subscribed sources.
8585
/// </summary>
86-
/// <param name="activitySourceNames">Activity source names.</param>
86+
/// <param name="names">Activity source names.</param>
8787
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
88-
public TracerProviderBuilder AddActivitySources(IEnumerable<string> activitySourceNames)
89-
{
90-
// TODO: We need to fix the listening model.
91-
// Today it ignores version.
92-
if (this.ActivitySourceNames == null)
93-
{
94-
this.ActivitySourceNames = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
88+
public TracerProviderBuilder AddActivitySource(IEnumerable<string> names)
89+
{
90+
if (names == null)
91+
{
92+
throw new ArgumentNullException(nameof(names));
9593
}
9694

97-
foreach (var activitySourceName in activitySourceNames)
95+
foreach (var name in names)
9896
{
99-
this.ActivitySourceNames[activitySourceName] = true;
97+
this.AddActivitySource(name);
10098
}
10199

102100
return this;
@@ -108,24 +106,14 @@ public TracerProviderBuilder AddActivitySources(IEnumerable<string> activitySour
108106
/// <param name="activityProcessor">Activity processor to add.</param>
109107
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
110108
public TracerProviderBuilder AddProcessor(ActivityProcessor activityProcessor)
111-
{
112-
if (this.ActivityProcessor == null)
113-
{
114-
this.ActivityProcessor = activityProcessor;
115-
}
116-
else if (this.ActivityProcessor is CompositeActivityProcessor compositeProcessor)
117-
{
118-
compositeProcessor.AddProcessor(activityProcessor);
119-
}
120-
else
121-
{
122-
this.ActivityProcessor = new CompositeActivityProcessor(new[]
123-
{
124-
this.ActivityProcessor,
125-
activityProcessor,
126-
});
109+
{
110+
if (activityProcessor == null)
111+
{
112+
throw new ArgumentNullException(nameof(activityProcessor));
127113
}
128114

115+
this.processors.Add(activityProcessor);
116+
129117
return this;
130118
}
131119

@@ -160,104 +148,7 @@ public TracerProviderBuilder AddInstrumentation<TInstrumentation>(
160148

161149
public TracerProvider Build()
162150
{
163-
this.Sampler = this.Sampler ?? new ParentOrElseSampler(new AlwaysOnSampler());
164-
165-
var provider = new TracerProviderSdk
166-
{
167-
Resource = this.Resource,
168-
Sampler = this.Sampler,
169-
ActivityProcessor = this.ActivityProcessor,
170-
};
171-
172-
var activitySource = new ActivitySourceAdapter(provider.Sampler, provider.ActivityProcessor, provider.Resource);
173-
174-
if (this.InstrumentationFactories != null)
175-
{
176-
foreach (var instrumentation in this.InstrumentationFactories)
177-
{
178-
provider.Instrumentations.Add(instrumentation.Factory(activitySource));
179-
}
180-
}
181-
182-
provider.ActivityListener = new ActivityListener
183-
{
184-
// Callback when Activity is started.
185-
ActivityStarted = (activity) =>
186-
{
187-
if (activity.IsAllDataRequested)
188-
{
189-
activity.SetResource(this.Resource);
190-
}
191-
192-
provider.ActivityProcessor?.OnStart(activity);
193-
},
194-
195-
// Callback when Activity is stopped.
196-
ActivityStopped = (activity) =>
197-
{
198-
provider.ActivityProcessor?.OnEnd(activity);
199-
},
200-
201-
// Function which takes ActivitySource and returns true/false to indicate if it should be subscribed to
202-
// or not.
203-
ShouldListenTo = (activitySource) =>
204-
{
205-
if (this.ActivitySourceNames == null)
206-
{
207-
return false;
208-
}
209-
210-
return this.ActivitySourceNames.ContainsKey(activitySource.Name);
211-
},
212-
213-
// Setting this to true means TraceId will be always
214-
// available in sampling callbacks and will be the actual
215-
// traceid used, if activity ends up getting created.
216-
AutoGenerateRootContextTraceId = true,
217-
218-
// This delegate informs ActivitySource about sampling decision when the parent context is an ActivityContext.
219-
GetRequestedDataUsingContext = (ref ActivityCreationOptions<ActivityContext> options) => ComputeActivityDataRequest(options, this.Sampler),
220-
};
221-
222-
ActivitySource.AddActivityListener(provider.ActivityListener);
223-
224-
return provider;
225-
}
226-
227-
internal static ActivityDataRequest ComputeActivityDataRequest(
228-
in ActivityCreationOptions<ActivityContext> options,
229-
Sampler sampler)
230-
{
231-
var isRootSpan = /*TODO: Put back once AutoGenerateRootContextTraceId is removed.
232-
options.Parent.TraceId == default ||*/ options.Parent.SpanId == default;
233-
234-
if (sampler != null)
235-
{
236-
// As we set ActivityListener.AutoGenerateRootContextTraceId = true,
237-
// Parent.TraceId will always be the TraceId of the to-be-created Activity,
238-
// if it get created.
239-
ActivityTraceId traceId = options.Parent.TraceId;
240-
241-
var samplingParameters = new SamplingParameters(
242-
options.Parent,
243-
traceId,
244-
options.Name,
245-
options.Kind,
246-
options.Tags,
247-
options.Links);
248-
249-
var shouldSample = sampler.ShouldSample(samplingParameters);
250-
if (shouldSample.IsSampled)
251-
{
252-
return ActivityDataRequest.AllDataAndRecorded;
253-
}
254-
}
255-
256-
// If it is the root span select PropagationData so the trace ID is preserved
257-
// even if no activity of the trace is recorded (sampled per OpenTelemetry parlance).
258-
return isRootSpan
259-
? ActivityDataRequest.PropagationData
260-
: ActivityDataRequest.None;
151+
return new TracerProviderSdk(this.sources, this.processors, this.InstrumentationFactories, this.sampler, this.resource);
261152
}
262153

263154
internal readonly struct InstrumentationFactory

0 commit comments

Comments
 (0)