From 3b0943f6bbb30de2d015340fdb27d98e81685d2c Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai Date: Mon, 26 Jul 2021 14:48:55 -0700 Subject: [PATCH 1/3] Add InMemoryExporter for Metrics --- examples/Console/Program.cs | 2 +- examples/Console/TestMetrics.cs | 22 ++++++++ .../InMemoryExporterMetricHelperExtensions.cs | 50 +++++++++++++++++++ .../InMemoryExporterOptions.cs | 32 ++++++++++++ 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricHelperExtensions.cs create mode 100644 src/OpenTelemetry.Exporter.InMemory/InMemoryExporterOptions.cs diff --git a/examples/Console/Program.cs b/examples/Console/Program.cs index fd78e75b864..db4edede609 100644 --- a/examples/Console/Program.cs +++ b/examples/Console/Program.cs @@ -34,7 +34,7 @@ public class Program /// dotnet run -p Examples.Console.csproj prometheus -i 15 -p 9184 -d 2 /// dotnet run -p Examples.Console.csproj otlp -e "http://localhost:4317" /// dotnet run -p Examples.Console.csproj zpages - /// dotnet run -p Examples.Console.csproj metrics --help + /// dotnet run -p Examples.Console.csproj metrics --useExporter InMemory /// /// The above must be run from the project root folder /// (eg: C:\repos\opentelemetry-dotnet\examples\Console\). diff --git a/examples/Console/TestMetrics.cs b/examples/Console/TestMetrics.cs index e4ece9e12ed..eb1dd72d6f4 100644 --- a/examples/Console/TestMetrics.cs +++ b/examples/Console/TestMetrics.cs @@ -30,6 +30,7 @@ internal class TestMetrics { internal static object Run(MetricsOptions options) { + ICollection exportedItems = null; var providerBuilder = Sdk.CreateMeterProviderBuilder() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("myservice")) .AddSource("TestMeter"); // All instruments from this meter are enabled. @@ -70,6 +71,16 @@ internal static object Run(MetricsOptions options) o.IsDelta = options.IsDelta; }); } + else if (options.UseExporter.ToLower() == "inmemory") + { + exportedItems = new List(); + providerBuilder + .AddInMemoryExporter(exportedItems, o => + { + o.MetricExportInterval = options.DefaultCollectionPeriodMilliseconds; + o.IsDelta = options.IsDelta; + }); + } else { providerBuilder @@ -197,6 +208,17 @@ internal static object Run(MetricsOptions options) Task.WaitAll(tasks.ToArray()); + if (options.UseExporter.ToLower() == "inmemory") + { + foreach (var metricItem in exportedItems) + { + foreach (var metric in metricItem.Metrics) + { + System.Console.WriteLine($"MeterSource: {metric.Meter.Name} emitted metric: {metric.Name} with the description: {metric.Description}"); + } + } + } + return null; } } diff --git a/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricHelperExtensions.cs b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricHelperExtensions.cs new file mode 100644 index 00000000000..9fbcda9eba4 --- /dev/null +++ b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricHelperExtensions.cs @@ -0,0 +1,50 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using System.Collections.Generic; +using OpenTelemetry.Exporter; + +namespace OpenTelemetry.Metrics +{ + public static class InMemoryExporterMetricHelperExtensions + { + /// + /// Adds InMemory exporter to the TracerProvider. + /// + /// builder to use. + /// Collection which will be populated with the exported MetricItem. + /// Exporter configuration options. + /// The instance of to chain the calls. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope", Justification = "The objects should not be disposed.")] + public static MeterProviderBuilder AddInMemoryExporter(this MeterProviderBuilder builder, ICollection exportedItems, Action configure = null) + { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + + if (exportedItems == null) + { + throw new ArgumentNullException(nameof(exportedItems)); + } + + var options = new InMemoryExporterOptions(); + configure?.Invoke(options); + return builder.AddMetricProcessor(new PushMetricProcessor(new InMemoryExporter(exportedItems), options.MetricExportInterval, options.IsDelta)); + } + } +} diff --git a/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterOptions.cs b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterOptions.cs new file mode 100644 index 00000000000..17df3ec92ee --- /dev/null +++ b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterOptions.cs @@ -0,0 +1,32 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +namespace OpenTelemetry.Exporter +{ + public class InMemoryExporterOptions + { + /// + /// Gets or sets the metric export interval. + /// + public int MetricExportInterval { get; set; } = 1000; + + /// + /// Gets or sets a value indicating whether to export Delta + /// values or not (Cumulative). + /// + public bool IsDelta { get; set; } = true; + } +} From c26dc84a7603dbf6e30026cdf70ff31d92d34f18 Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai Date: Mon, 26 Jul 2021 14:52:25 -0700 Subject: [PATCH 2/3] Add CHANGELOG.md --- src/OpenTelemetry.Exporter.InMemory/CHANGELOG.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/OpenTelemetry.Exporter.InMemory/CHANGELOG.md b/src/OpenTelemetry.Exporter.InMemory/CHANGELOG.md index 7f8b02afcfa..e9367ea4bd7 100644 --- a/src/OpenTelemetry.Exporter.InMemory/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.InMemory/CHANGELOG.md @@ -2,18 +2,23 @@ ## Unreleased +* Add Metrics + support.([#2192](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2192)) + ## 1.2.0-alpha1 Released 2021-Jul-23 -* Removes support for .NET Framework 4.5.2 and 4.6. The minimum .NET Framework version - supported is .NET 4.6.1. ([#2138](https://github.com/open-telemetry/opentelemetry-dotnet/issues/2138)) +* Removes support for .NET Framework 4.5.2 and 4.6. The minimum .NET Framework + version supported is .NET 4.6.1. + ([#2138](https://github.com/open-telemetry/opentelemetry-dotnet/issues/2138)) ## 1.1.0 Released 2021-Jul-12 -* Supports OpenTelemetry.Extensions.Hosting based configuration for `InMemoryExporter` +* Supports OpenTelemetry.Extensions.Hosting based configuration for + `InMemoryExporter` ([#2129](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2129)) ## 1.1.0-rc1 @@ -52,8 +57,8 @@ Released 2021-Feb-04 Released 2021-Jan-29 -* `AddInMemoryExporter` extension method for traces moved from - `OpenTelemetry` namespace to `OpenTelemetry.Trace` namespace. +* `AddInMemoryExporter` extension method for traces moved from `OpenTelemetry` + namespace to `OpenTelemetry.Trace` namespace. ([#1576](https://github.com/open-telemetry/opentelemetry-dotnet/pull/1576)) * `AddInMemoryExporter` extension method for logs moved from `Microsoft.Extensions.Logging` namespace to `OpenTelemetry.Logs` namespace. From f79f8227fd3b82d48b4e3ff15a794387903e284d Mon Sep 17 00:00:00 2001 From: Utkarsh Umesan Pillai Date: Mon, 26 Jul 2021 15:26:15 -0700 Subject: [PATCH 3/3] Revert changes to example code --- examples/Console/Program.cs | 2 +- examples/Console/TestMetrics.cs | 22 ---------------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/examples/Console/Program.cs b/examples/Console/Program.cs index db4edede609..fd78e75b864 100644 --- a/examples/Console/Program.cs +++ b/examples/Console/Program.cs @@ -34,7 +34,7 @@ public class Program /// dotnet run -p Examples.Console.csproj prometheus -i 15 -p 9184 -d 2 /// dotnet run -p Examples.Console.csproj otlp -e "http://localhost:4317" /// dotnet run -p Examples.Console.csproj zpages - /// dotnet run -p Examples.Console.csproj metrics --useExporter InMemory + /// dotnet run -p Examples.Console.csproj metrics --help /// /// The above must be run from the project root folder /// (eg: C:\repos\opentelemetry-dotnet\examples\Console\). diff --git a/examples/Console/TestMetrics.cs b/examples/Console/TestMetrics.cs index eb1dd72d6f4..e4ece9e12ed 100644 --- a/examples/Console/TestMetrics.cs +++ b/examples/Console/TestMetrics.cs @@ -30,7 +30,6 @@ internal class TestMetrics { internal static object Run(MetricsOptions options) { - ICollection exportedItems = null; var providerBuilder = Sdk.CreateMeterProviderBuilder() .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("myservice")) .AddSource("TestMeter"); // All instruments from this meter are enabled. @@ -71,16 +70,6 @@ internal static object Run(MetricsOptions options) o.IsDelta = options.IsDelta; }); } - else if (options.UseExporter.ToLower() == "inmemory") - { - exportedItems = new List(); - providerBuilder - .AddInMemoryExporter(exportedItems, o => - { - o.MetricExportInterval = options.DefaultCollectionPeriodMilliseconds; - o.IsDelta = options.IsDelta; - }); - } else { providerBuilder @@ -208,17 +197,6 @@ internal static object Run(MetricsOptions options) Task.WaitAll(tasks.ToArray()); - if (options.UseExporter.ToLower() == "inmemory") - { - foreach (var metricItem in exportedItems) - { - foreach (var metric in metricItem.Metrics) - { - System.Console.WriteLine($"MeterSource: {metric.Meter.Name} emitted metric: {metric.Name} with the description: {metric.Description}"); - } - } - } - return null; } }