Skip to content

Commit a4d8b35

Browse files
authored
Add Resource support for MetricProvider (#2150)
1 parent 5d6d400 commit a4d8b35

File tree

9 files changed

+75
-7
lines changed

9 files changed

+75
-7
lines changed

examples/Console/TestMetrics.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
using System.Threading;
2222
using System.Threading.Tasks;
2323
using OpenTelemetry;
24-
using OpenTelemetry.Exporter;
2524
using OpenTelemetry.Metrics;
25+
using OpenTelemetry.Resources;
2626

2727
namespace Examples.Console
2828
{
@@ -31,6 +31,7 @@ internal class TestMetrics
3131
internal static object Run(MetricsOptions options)
3232
{
3333
var providerBuilder = Sdk.CreateMeterProviderBuilder()
34+
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("myservice"))
3435
.AddSource("TestMeter"); // All instruments from this meter are enabled.
3536

3637
if (options.UseExporter.ToLower() == "otlp")

src/OpenTelemetry.Exporter.Console/ConsoleMetricExporter.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,36 @@
1919
using System.Linq;
2020
using System.Text;
2121
using OpenTelemetry.Metrics;
22+
using OpenTelemetry.Resources;
2223

2324
namespace OpenTelemetry.Exporter
2425
{
2526
public class ConsoleMetricExporter : ConsoleExporter<MetricItem>
2627
{
28+
private Resource resource;
29+
2730
public ConsoleMetricExporter(ConsoleExporterOptions options)
2831
: base(options)
2932
{
3033
}
3134

3235
public override ExportResult Export(in Batch<MetricItem> batch)
3336
{
37+
if (this.resource == null)
38+
{
39+
this.resource = this.ParentProvider.GetResource();
40+
if (this.resource != Resource.Empty)
41+
{
42+
foreach (var resourceAttribute in this.resource.Attributes)
43+
{
44+
if (resourceAttribute.Key.Equals("service.name"))
45+
{
46+
Console.WriteLine("Service.Name" + resourceAttribute.Value);
47+
}
48+
}
49+
}
50+
}
51+
3452
foreach (var metricItem in batch)
3553
{
3654
foreach (var metric in metricItem.Metrics)

src/OpenTelemetry/Metrics/MeterProviderBuilderExtensions.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
// limitations under the License.
1515
// </copyright>
1616

17+
using OpenTelemetry.Resources;
18+
1719
namespace OpenTelemetry.Metrics
1820
{
1921
/// <summary>
@@ -53,6 +55,23 @@ public static MeterProviderBuilder AddMetricProcessor(this MeterProviderBuilder
5355
return meterProviderBuilder;
5456
}
5557

58+
/// <summary>
59+
/// Sets the <see cref="ResourceBuilder"/> from which the Resource associated with
60+
/// this provider is built from. Overwrites currently set ResourceBuilder.
61+
/// </summary>
62+
/// <param name="meterProviderBuilder">MeterProviderBuilder instance.</param>
63+
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/> from which Resource will be built.</param>
64+
/// <returns>Returns <see cref="MeterProviderBuilder"/> for chaining.</returns>
65+
public static MeterProviderBuilder SetResourceBuilder(this MeterProviderBuilder meterProviderBuilder, ResourceBuilder resourceBuilder)
66+
{
67+
if (meterProviderBuilder is MeterProviderBuilderSdk meterProviderBuilderSdk)
68+
{
69+
meterProviderBuilderSdk.SetResourceBuilder(resourceBuilder);
70+
}
71+
72+
return meterProviderBuilder;
73+
}
74+
5675
/// <summary>
5776
/// Run the given actions to initialize the <see cref="MeterProvider"/>.
5877
/// </summary>

src/OpenTelemetry/Metrics/MeterProviderBuilderSdk.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616

1717
using System;
1818
using System.Collections.Generic;
19+
using OpenTelemetry.Resources;
1920

2021
namespace OpenTelemetry.Metrics
2122
{
2223
internal class MeterProviderBuilderSdk : MeterProviderBuilder
2324
{
2425
private readonly List<string> meterSources = new List<string>();
26+
private ResourceBuilder resourceBuilder = ResourceBuilder.CreateDefault();
2527

2628
internal MeterProviderBuilderSdk()
2729
{
@@ -63,9 +65,16 @@ internal MeterProviderBuilderSdk AddMetricProcessor(MetricProcessor processor)
6365
return this;
6466
}
6567

68+
internal MeterProviderBuilderSdk SetResourceBuilder(ResourceBuilder resourceBuilder)
69+
{
70+
this.resourceBuilder = resourceBuilder ?? throw new ArgumentNullException(nameof(resourceBuilder));
71+
return this;
72+
}
73+
6674
internal MeterProvider Build()
6775
{
6876
return new MeterProviderSdk(
77+
this.resourceBuilder.Build(),
6978
this.meterSources,
7079
this.MeasurementProcessors.ToArray(),
7180
this.MetricProcessors.ToArray());

src/OpenTelemetry/Metrics/MeterProviderSdk.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818
using System.Collections.Concurrent;
1919
using System.Collections.Generic;
2020
using System.Diagnostics.Metrics;
21-
using System.Linq;
22-
using System.Runtime.CompilerServices;
2321
using System.Threading;
2422
using System.Threading.Tasks;
23+
using OpenTelemetry.Resources;
2524

2625
namespace OpenTelemetry.Metrics
2726
{
@@ -38,16 +37,19 @@ public class MeterProviderSdk
3837
private readonly List<MetricProcessor> metricProcessors = new List<MetricProcessor>();
3938

4039
internal MeterProviderSdk(
40+
Resource resource,
4141
IEnumerable<string> meterSources,
4242
MeasurementProcessor[] measurementProcessors,
4343
MetricProcessor[] metricProcessors)
4444
{
45+
this.Resource = resource;
4546
this.measurementProcessors.AddRange(measurementProcessors);
4647
this.metricProcessors.AddRange(metricProcessors);
4748

4849
foreach (var processor in this.metricProcessors)
4950
{
5051
processor.SetGetMetricFunction(this.Collect);
52+
processor.SetParentProvider(this);
5153
}
5254

5355
// Setup Listener
@@ -83,6 +85,8 @@ internal MeterProviderSdk(
8385
this.listener.Start();
8486
}
8587

88+
internal Resource Resource { get; }
89+
8690
internal void MeasurementsCompleted(Instrument instrument, object state)
8791
{
8892
Console.WriteLine($"Instrument {instrument.Meter.Name}:{instrument.Name} completed.");

src/OpenTelemetry/Metrics/Processors/MetricProcessor.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,22 @@ namespace OpenTelemetry.Metrics
2020
{
2121
public abstract class MetricProcessor : BaseProcessor<MetricItem>
2222
{
23+
protected readonly BaseExporter<MetricItem> exporter;
24+
25+
protected MetricProcessor(BaseExporter<MetricItem> exporter)
26+
{
27+
this.exporter = exporter ?? throw new ArgumentNullException(nameof(exporter));
28+
}
29+
2330
// GetMetric or GetMemoryState or GetAggregatedMetrics..
2431
// ...or some other names
2532
public abstract void SetGetMetricFunction(Func<bool, MetricItem> getMetrics);
33+
34+
internal override void SetParentProvider(BaseProvider parentProvider)
35+
{
36+
base.SetParentProvider(parentProvider);
37+
38+
this.exporter.ParentProvider = parentProvider;
39+
}
2640
}
2741
}

src/OpenTelemetry/Metrics/Processors/PullMetricProcessor.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@ namespace OpenTelemetry.Metrics
2323
public class PullMetricProcessor : MetricProcessor, IDisposable
2424
{
2525
private Func<bool, MetricItem> getMetrics;
26-
private BaseExporter<MetricItem> exporter;
2726
private bool disposed;
2827
private bool isDelta;
2928

3029
public PullMetricProcessor(BaseExporter<MetricItem> exporter, bool isDelta)
30+
: base(exporter)
3131
{
32-
this.exporter = exporter;
3332
this.isDelta = isDelta;
3433
}
3534

src/OpenTelemetry/Metrics/Processors/PushMetricProcessor.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@ public class PushMetricProcessor : MetricProcessor, IDisposable
2626
private CancellationTokenSource token;
2727
private int exportIntervalMs;
2828
private Func<bool, MetricItem> getMetrics;
29-
private BaseExporter<MetricItem> exporter;
3029
private bool disposed;
3130

3231
public PushMetricProcessor(BaseExporter<MetricItem> exporter, int exportIntervalMs, bool isDelta)
32+
: base(exporter)
3333
{
3434
this.exportIntervalMs = exportIntervalMs;
35-
this.exporter = exporter;
3635
this.token = new CancellationTokenSource();
3736
this.exportTask = new Task(() =>
3837
{

src/OpenTelemetry/ProviderExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#if NET461 || NETSTANDARD2_0
1818
using OpenTelemetry.Logs;
1919
#endif
20+
using OpenTelemetry.Metrics;
2021
using OpenTelemetry.Resources;
2122
using OpenTelemetry.Trace;
2223

@@ -44,6 +45,10 @@ public static Resource GetResource(this BaseProvider baseProvider)
4445
return otelLoggerProvider.Resource;
4546
}
4647
#endif
48+
else if (baseProvider is MeterProviderSdk meterProviderSdk)
49+
{
50+
return meterProviderSdk.Resource;
51+
}
4752

4853
return Resource.Empty;
4954
}

0 commit comments

Comments
 (0)