From 9ca0a396ca3a5b51f6bf0af76c6e4cbe4be4bd2b Mon Sep 17 00:00:00 2001 From: Reiley Yang Date: Wed, 22 Sep 2021 19:26:30 -0700 Subject: [PATCH 1/5] Implement the metrics dispose/shutdown logic --- OpenTelemetry.sln | 2 +- README.md | 2 +- docs/metrics/README.md | 6 --- docs/metrics/extending-the-sdk/MyReader.cs | 3 +- .../Program.cs | 10 +++-- .../README.md | 40 ++++++------------- .../getting-started.csproj} | 0 .../Metrics/BaseExportingMetricReader.cs | 19 ++++++++- src/OpenTelemetry/Metrics/MetricReader.cs | 2 +- 9 files changed, 41 insertions(+), 43 deletions(-) delete mode 100644 docs/metrics/README.md rename docs/metrics/{getting-started-counter => getting-started}/Program.cs (73%) rename docs/metrics/{getting-started-counter => getting-started}/README.md (55%) rename docs/metrics/{getting-started-counter/getting-started-counter.csproj => getting-started/getting-started.csproj} (100%) diff --git a/OpenTelemetry.sln b/OpenTelemetry.sln index 3e98154fc26..8cec81b40bc 100644 --- a/OpenTelemetry.sln +++ b/OpenTelemetry.sln @@ -218,7 +218,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started-observable- EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started-observable-counter", "docs\metrics\getting-started-observable-counter\getting-started-observable-counter.csproj", "{43005998-0247-4620-AF88-27DACD48712E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started-counter", "docs\metrics\getting-started-counter\getting-started-counter.csproj", "{EA60B549-F712-4ABE-8E44-FCA83B78C06E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started", "docs\metrics\getting-started\getting-started.csproj", "{EA60B549-F712-4ABE-8E44-FCA83B78C06E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "extending-the-sdk", "docs\metrics\extending-the-sdk\extending-the-sdk.csproj", "{1F9D7748-D099-4E25-97F5-9C969D6FF969}" EndProject diff --git a/README.md b/README.md index bee231f7a05..57de8832bcd 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Any exceptions to this are noted in the individual `README.md` files. If you are new here, please read the getting started docs: * [logs](./docs/logs/getting-started/README.md) -* [metrics](./docs/metrics/README.md) (experimental) +* [metrics](./docs/metrics/getting-started/README.md) (experimental) * [trace](./docs/trace/getting-started/README.md) This repository includes multiple installable components, available on diff --git a/docs/metrics/README.md b/docs/metrics/README.md deleted file mode 100644 index f7177c5af94..00000000000 --- a/docs/metrics/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Getting Started with OpenTelemetry .NET Metrics in 5 Minutes - -* [Getting started with Counter](./getting-started-counter/README.md) -* [Getting started with Observable Counter](./getting-started-observable-counter/README.md) -* [Getting started with Observable Gauge](./getting-started-gauge/README.md) -* [Getting started with Histogram](./getting-started-histogram/README.md) diff --git a/docs/metrics/extending-the-sdk/MyReader.cs b/docs/metrics/extending-the-sdk/MyReader.cs index 84cb64eabb0..f42ddb53e27 100644 --- a/docs/metrics/extending-the-sdk/MyReader.cs +++ b/docs/metrics/extending-the-sdk/MyReader.cs @@ -36,11 +36,12 @@ protected override bool ProcessMetrics(Batch metrics, int timeoutMillise protected override bool OnShutdown(int timeoutMilliseconds) { Console.WriteLine($"{this.name}.OnShutdown(timeoutMilliseconds={timeoutMilliseconds})"); - return true; + return base.OnShutdown(timeoutMilliseconds); } protected override void Dispose(bool disposing) { Console.WriteLine($"{this.name}.Dispose({disposing})"); + base.Dispose(disposing); } } diff --git a/docs/metrics/getting-started-counter/Program.cs b/docs/metrics/getting-started/Program.cs similarity index 73% rename from docs/metrics/getting-started-counter/Program.cs rename to docs/metrics/getting-started/Program.cs index d560d11eca6..60897de4cad 100644 --- a/docs/metrics/getting-started-counter/Program.cs +++ b/docs/metrics/getting-started/Program.cs @@ -31,9 +31,11 @@ public static void Main(string[] args) var counter = MyMeter.CreateCounter("MyCounter"); - for (int i = 0; i < 20000000; i++) - { - counter.Add(1, new("tag1", "value1"), new("tag2", "value2")); - } + counter.Add(1, new("name", "orange"), new("color", "orange")); + counter.Add(2, new("name", "lemon"), new("color", "yellow")); + counter.Add(3, new("name", "lime"), new("color", "green")); + counter.Add(2, new("name", "orange"), new("color", "green")); + counter.Add(5, new("name", "orange"), new("color", "orange")); + counter.Add(8, new("name", "lime"), new("color", "green")); } } diff --git a/docs/metrics/getting-started-counter/README.md b/docs/metrics/getting-started/README.md similarity index 55% rename from docs/metrics/getting-started-counter/README.md rename to docs/metrics/getting-started/README.md index 290a59b3282..3b547de45ca 100644 --- a/docs/metrics/getting-started-counter/README.md +++ b/docs/metrics/getting-started/README.md @@ -6,8 +6,8 @@ SDK](https://dotnet.microsoft.com/download) on your computer. Create a new console application and run it: ```sh -dotnet new console --output getting-started-counter -cd getting-started-counter +dotnet new console --output getting-started +cd getting-started dotnet run ``` @@ -33,28 +33,14 @@ output from the console, similar to shown below: ```text Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 -(2021-09-03T04:29:37.1096398Z, 2021-09-03T04:29:38.0649233Z] tag1:value1tag2:value2 LongSum -Value: 460 - -Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 -(2021-09-03T04:29:38.0649233Z, 2021-09-03T04:29:39.1483639Z] tag1:value1tag2:value2 LongSum -Value: 640 - -Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 -(2021-09-03T04:29:39.1483639Z, 2021-09-03T04:29:40.1679696Z] tag1:value1tag2:value2 LongSum -Value: 420 - -Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 -(2021-09-03T04:29:40.1679696Z, 2021-09-03T04:29:41.1774527Z] tag1:value1tag2:value2 LongSum -Value: 560 - -Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 -(2021-09-03T04:29:41.1774527Z, 2021-09-03T04:29:42.1791523Z] tag1:value1tag2:value2 LongSum -Value: 650 - -Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 -(2021-09-03T04:29:42.1791523Z, 2021-09-03T04:29:43.1875033Z] tag1:value1tag2:value2 LongSum -Value: 620 +2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:orangename:orange LongSum +Value: 6 +2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:yellowname:lemon LongSum +Value: 2 +2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:greenname:lime LongSum +Value: 11 +2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:greenname:orange LongSum +Value: 2 ``` @@ -66,12 +52,10 @@ The program creates a [Meter](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#meter) instance named "MyCompany.MyProduct.MyLibrary" and then creates a [Counter](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#counter) -instrument from it. This counter is used to repeatedly report metric -measurements until it reaches a certain number of loops. +instrument from it. This counter is used to report several metric measurements. An OpenTelemetry [MeterProvider](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#meterprovider) is configured to subscribe to instruments from the Meter `MyCompany.MyProduct.MyLibrary`, and aggregate the measurements in-memory. The -pre-aggregated metrics are exported every 1 second to a `ConsoleExporter`. -`ConsoleExporter` simply displays it on the console. +pre-aggregated metrics are exported to a `ConsoleExporter`. diff --git a/docs/metrics/getting-started-counter/getting-started-counter.csproj b/docs/metrics/getting-started/getting-started.csproj similarity index 100% rename from docs/metrics/getting-started-counter/getting-started-counter.csproj rename to docs/metrics/getting-started/getting-started.csproj diff --git a/src/OpenTelemetry/Metrics/BaseExportingMetricReader.cs b/src/OpenTelemetry/Metrics/BaseExportingMetricReader.cs index 06409b924a5..058d590be77 100644 --- a/src/OpenTelemetry/Metrics/BaseExportingMetricReader.cs +++ b/src/OpenTelemetry/Metrics/BaseExportingMetricReader.cs @@ -15,6 +15,8 @@ // using System; +using System.Diagnostics; +using System.Threading; namespace OpenTelemetry.Metrics { @@ -97,7 +99,22 @@ protected override bool OnCollect(int timeoutMilliseconds) /// protected override bool OnShutdown(int timeoutMilliseconds) { - return this.exporter.Shutdown(timeoutMilliseconds); + var result = true; + + if (timeoutMilliseconds == Timeout.Infinite) + { + result = this.Collect(Timeout.Infinite) && result; + result = this.exporter.Shutdown(Timeout.Infinite) && result; + } + else + { + var sw = Stopwatch.StartNew(); + result = this.Collect(timeoutMilliseconds) && result; + var timeout = timeoutMilliseconds - sw.ElapsedMilliseconds; + result = this.exporter.Shutdown((int)Math.Max(timeout, 0)) && result; + } + + return result; } /// diff --git a/src/OpenTelemetry/Metrics/MetricReader.cs b/src/OpenTelemetry/Metrics/MetricReader.cs index fe300d75527..65a8a47d2fe 100644 --- a/src/OpenTelemetry/Metrics/MetricReader.cs +++ b/src/OpenTelemetry/Metrics/MetricReader.cs @@ -211,7 +211,7 @@ protected virtual bool OnCollect(int timeoutMilliseconds) /// protected virtual bool OnShutdown(int timeoutMilliseconds) { - return true; + return this.Collect(timeoutMilliseconds); } /// From 9cb186a46ff9dadf5644d7db1cd44feab2fb02cd Mon Sep 17 00:00:00 2001 From: Reiley Yang Date: Wed, 22 Sep 2021 20:18:02 -0700 Subject: [PATCH 2/5] improve indentation --- docs/metrics/getting-started/Program.cs | 12 ++++++------ docs/metrics/getting-started/README.md | 10 ++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/docs/metrics/getting-started/Program.cs b/docs/metrics/getting-started/Program.cs index 60897de4cad..fec6a1bf62a 100644 --- a/docs/metrics/getting-started/Program.cs +++ b/docs/metrics/getting-started/Program.cs @@ -31,11 +31,11 @@ public static void Main(string[] args) var counter = MyMeter.CreateCounter("MyCounter"); - counter.Add(1, new("name", "orange"), new("color", "orange")); - counter.Add(2, new("name", "lemon"), new("color", "yellow")); - counter.Add(3, new("name", "lime"), new("color", "green")); - counter.Add(2, new("name", "orange"), new("color", "green")); - counter.Add(5, new("name", "orange"), new("color", "orange")); - counter.Add(8, new("name", "lime"), new("color", "green")); + counter.Add(1, new("name", "apple"), new("color", "red")); + counter.Add(2, new("name", "lemon"), new("color", "yellow")); + counter.Add(1, new("name", "lemon"), new("color", "yellow")); + counter.Add(2, new("name", "apple"), new("color", "green")); + counter.Add(5, new("name", "apple"), new("color", "red")); + counter.Add(4, new("name", "lemon"), new("color", "yellow")); } } diff --git a/docs/metrics/getting-started/README.md b/docs/metrics/getting-started/README.md index 3b547de45ca..60281e6e4e1 100644 --- a/docs/metrics/getting-started/README.md +++ b/docs/metrics/getting-started/README.md @@ -33,13 +33,11 @@ output from the console, similar to shown below: ```text Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 -2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:orangename:orange LongSum +2021-09-23T03:17:30.6198292Z, 2021-09-23T03:17:30.6356517Z] color:redname:apple LongSum Value: 6 -2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:yellowname:lemon LongSum -Value: 2 -2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:greenname:lime LongSum -Value: 11 -2021-09-23T02:20:58.8168802Z, 2021-09-23T02:20:58.8359677Z] color:greenname:orange LongSum +2021-09-23T03:17:30.6198292Z, 2021-09-23T03:17:30.6356517Z] color:yellowname:lemon LongSum +Value: 7 +2021-09-23T03:17:30.6198292Z, 2021-09-23T03:17:30.6356517Z] color:greenname:apple LongSum Value: 2 ``` From f572c50e58446eecd8ecf3d318e39ab18913acd1 Mon Sep 17 00:00:00 2001 From: Reiley Yang Date: Wed, 22 Sep 2021 21:07:53 -0700 Subject: [PATCH 3/5] update test cases --- .../MetricTests.cs | 3 --- .../HttpClientTests.netcore31.cs | 3 --- 2 files changed, 6 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs index 85461b349d9..b71a74b3f78 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/MetricTests.cs @@ -84,9 +84,6 @@ void ProcessExport(Batch batch) // giving some breezing room for the End callback to complete await Task.Delay(TimeSpan.FromSeconds(1)); - // Invokes the TestExporter which will invoke ProcessExport - metricReader.Collect(); - this.meterProvider.Dispose(); var requestMetrics = metricItems diff --git a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.netcore31.cs b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.netcore31.cs index 1227347b9f9..c2fbccac6a3 100644 --- a/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.netcore31.cs +++ b/test/OpenTelemetry.Instrumentation.Http.Tests/HttpClientTests.netcore31.cs @@ -112,9 +112,6 @@ void ProcessExport(Batch batch) } } - // Invokes the TestExporter which will invoke ProcessExport - metricReader.Collect(); - meterProvider.Dispose(); var requestMetrics = metricItems From e6f98b6673e8b8d7aa18160606173b9cb7bfdabe Mon Sep 17 00:00:00 2001 From: Reiley Yang Date: Thu, 23 Sep 2021 07:46:18 -0700 Subject: [PATCH 4/5] Update docs/metrics/getting-started/Program.cs Co-authored-by: Cijo Thomas --- docs/metrics/getting-started/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/metrics/getting-started/Program.cs b/docs/metrics/getting-started/Program.cs index fec6a1bf62a..b4ef547bc75 100644 --- a/docs/metrics/getting-started/Program.cs +++ b/docs/metrics/getting-started/Program.cs @@ -29,7 +29,7 @@ public static void Main(string[] args) .AddConsoleExporter() .Build(); - var counter = MyMeter.CreateCounter("MyCounter"); + var counter = MyMeter.CreateCounter("MyFruitCounter"); counter.Add(1, new("name", "apple"), new("color", "red")); counter.Add(2, new("name", "lemon"), new("color", "yellow")); From 8be85bd897b1fb2573bf8dc842673470a06d7c18 Mon Sep 17 00:00:00 2001 From: Reiley Yang Date: Thu, 23 Sep 2021 07:47:10 -0700 Subject: [PATCH 5/5] nits --- docs/metrics/getting-started/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/metrics/getting-started/README.md b/docs/metrics/getting-started/README.md index 60281e6e4e1..59d89c9dbb4 100644 --- a/docs/metrics/getting-started/README.md +++ b/docs/metrics/getting-started/README.md @@ -32,7 +32,7 @@ output from the console, similar to shown below: ```text -Export MyCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 +Export MyFruitCounter, Meter: MyCompany.MyProduct.MyLibrary/1.0 2021-09-23T03:17:30.6198292Z, 2021-09-23T03:17:30.6356517Z] color:redname:apple LongSum Value: 6 2021-09-23T03:17:30.6198292Z, 2021-09-23T03:17:30.6356517Z] color:yellowname:lemon LongSum