Skip to content

Commit 3d9e22b

Browse files
authored
Merge branch 'main' into signing_with_cosign
2 parents 045e954 + 9f41ead commit 3d9e22b

File tree

146 files changed

+2269
-826
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+2269
-826
lines changed

.github/workflows/stale.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
close-pr-message: 'Closed as inactive. Feel free to reopen if this PR is still being worked on.'
1919
operations-per-run: 400
2020
days-before-pr-stale: 7
21-
days-before-issue-stale: 450
21+
days-before-issue-stale: 300
2222
days-before-pr-close: 7
2323
days-before-issue-close: 7
2424
exempt-all-issue-milestones: true

CONTRIBUTING.md

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,19 @@ Open a pull request against the main `opentelemetry-dotnet` repo.
203203
* If the PR is not ready for review, please mark it as
204204
[`draft`](https://github.blog/2019-02-14-introducing-draft-pull-requests/).
205205
* Make sure CLA is signed and all required CI checks are clear.
206-
* Submit small, focused PRs addressing a single
207-
concern/issue.
206+
* Submit small, focused PRs addressing a single concern/issue.
208207
* Make sure the PR title reflects the contribution.
209208
* Write a summary that helps understand the change.
210209
* Include usage examples in the summary, where applicable.
211210
* Include benchmarks (before/after) in the summary, for contributions that are
212211
performance enhancements.
212+
* We are open to bot generated PRs or AI/LLM assisted PRs. Actually, we are
213+
using
214+
[dependabot](https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/configuring-dependabot-security-updates)
215+
to automate the security updates. However, if you use bots to generate spam
216+
PRs (e.g. incorrect, noisy, non-improvements, unintelligible, trying to sell
217+
your product, etc.), we might close the PR right away with a warning, and if
218+
you keep doing so, we might block your user account.
213219

214220
### How to get pull requests merged
215221

@@ -302,23 +308,6 @@ analysis](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/overview
302308
[Common.props](https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/build/Common.props)
303309
new projects must NOT manually override these settings.
304310

305-
## New code
306-
307-
New code files MUST enable [nullable reference
308-
types](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/nullable-reference-types)
309-
manually in projects where it is not automatically enabled project-wide. This is
310-
done by specifying `#nullable enable` towards the top of the file (usually after
311-
the copyright header). We are currently working towards enabling nullable
312-
context in every project by updating code as it is worked on, this requirement
313-
is to make sure the surface area of code needing updates is shrinking and not
314-
expanding.
315-
316-
> [!NOTE]
317-
> The first time a project is updated to use nullable context in public APIs
318-
some housekeeping needs to be done in public API definitions (`.publicApi`
319-
folder). This can be done automatically via a code fix offered by the public API
320-
analyzer.
321-
322311
## License requirements
323312

324313
OpenTelemetry .NET is licensed under the [Apache License, Version

Directory.Packages.props

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
55
<OTelLatestStableVer>1.9.0</OTelLatestStableVer>
66

7+
<!--
8+
This is typically the latest annual release of .NET. Use this wherever
9+
possible and only deviate (use a specific version) when a package has a
10+
more specific patch which must be reference directly.
11+
-->
12+
<LatestRuntimeOutOfBandVer>9.0.0-rc.1.24431.7</LatestRuntimeOutOfBandVer>
13+
714
<!-- Mitigate https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-43485. -->
815
<SystemTextEncodingsWebOutOfBandMinimumCoreAppVer>8.0.0</SystemTextEncodingsWebOutOfBandMinimumCoreAppVer>
916
<SystemTextJsonOutOfBandMinimumCoreAppVer>8.0.5</SystemTextJsonOutOfBandMinimumCoreAppVer>
@@ -15,12 +22,6 @@
1522
vulnerability in the NuGet packages that are published from this repository.
1623
-->
1724
<ItemGroup>
18-
<PackageVersion Include="Google.Protobuf" Version="[3.22.5,4.0)" />
19-
<PackageVersion Include="Grpc" Version="[2.44.0,3.0)" />
20-
<PackageVersion Include="Grpc.Net.Client" Version="[2.52.0,3.0)" />
21-
<PackageVersion Include="Microsoft.AspNetCore.Http.Abstractions" Version="[2.1.1,6.0)" />
22-
<PackageVersion Include="Microsoft.AspNetCore.Http.Features" Version="[2.1.1,6.0)" />
23-
2425
<!--
2526
Typically, for the Microsoft.Extensions.* packages relating to DI Abstractions, Hosting Abstractions, and Logging,
2627
the latest stable version should be used because:
@@ -30,16 +31,18 @@
3031
3) Since version 3.1.0, the .NET runtime team is holding a high bar for backward compatibility on
3132
these packages even during major version bumps, so compatibility is not a concern here.
3233
-->
34+
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="$(LatestRuntimeOutOfBandVer)" />
35+
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="$(LatestRuntimeOutOfBandVer)" />
36+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(LatestRuntimeOutOfBandVer)" />
37+
<PackageVersion Include="Microsoft.Extensions.Diagnostics.Abstractions" Version="$(LatestRuntimeOutOfBandVer)" />
38+
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(LatestRuntimeOutOfBandVer)" />
39+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(LatestRuntimeOutOfBandVer)" />
40+
<PackageVersion Include="Microsoft.Extensions.Logging.Configuration" Version="$(LatestRuntimeOutOfBandVer)" />
41+
<PackageVersion Include="Microsoft.Extensions.Options" Version="$(LatestRuntimeOutOfBandVer)" />
3342

34-
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="9.0.0-rc.1.24431.7" />
35-
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.0-rc.1.24431.7" />
36-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0-rc.1.24431.7" />
37-
<PackageVersion Include="Microsoft.Extensions.Diagnostics.Abstractions" Version="9.0.0-rc.1.24431.7" />
38-
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.0-rc.1.24431.7" />
39-
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.0-rc.1.24431.7" />
40-
<PackageVersion Include="Microsoft.Extensions.Logging.Configuration" Version="9.0.0-rc.1.24431.7" />
41-
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.0-rc.1.24431.7" />
42-
43+
<!--
44+
OTel packages always point to latest stable release.
45+
-->
4346
<PackageVersion Include="OpenTelemetry" Version="[$(OTelLatestStableVer),2.0)" />
4447
<PackageVersion Include="OpenTelemetry.Api" Version="[$(OTelLatestStableVer),2.0)" />
4548
<PackageVersion Include="OpenTelemetry.Api.ProviderBuilderExtensions" Version="[$(OTelLatestStableVer),2.0)" />
@@ -50,14 +53,22 @@
5053

5154
<!--
5255
Typically, the latest stable version of System.Diagnostics.DiagnosticSource should be used here because:
53-
1) Each major version bump will have some new OpenTelemetry API capabilities (e.g. .NET 6 introduced Meter
54-
API, .NET 7 added UpDownCounter, .NET 8 is adding Meter/Instrument level attributes support, .NET 9 might
55-
add Advice/Hint API) that the OpenTelemetry components rely on.
56+
1) Each major version bump will likely have some new OpenTelemetry capabilities (e.g. .NET 6 introduced Meter
57+
API, .NET 7 added UpDownCounter, .NET 8 added Meter/Instrument level attributes support, .NET 9 added
58+
Advice/Hint API, etc.).
5659
2) Each minor version bump is normally security hotfixes or critical bug fixes.
5760
3) The .NET runtime team provides extra backward compatibility guarantee to System.Diagnostics.DiagnosticSource
5861
even during major version bumps, so compatibility is not a concern here.
5962
-->
60-
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="9.0.0-rc.1.24431.7" />
63+
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="$(LatestRuntimeOutOfBandVer)" />
64+
65+
<!--
66+
We use conservative versions of these packages where an upgrade might
67+
introduce breaking changes.
68+
-->
69+
<PackageVersion Include="Google.Protobuf" Version="[3.22.5,4.0)" />
70+
<PackageVersion Include="Grpc" Version="[2.44.0,3.0)" />
71+
<PackageVersion Include="Grpc.Net.Client" Version="[2.52.0,3.0)" />
6172
</ItemGroup>
6273

6374
<ItemGroup>
@@ -92,10 +103,10 @@
92103
<PackageVersion Include="Microsoft.CSharp" Version="[4.7.0]" />
93104
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="[3.11.0-beta1.23525.2]" />
94105
<PackageVersion Include="Microsoft.Coyote" Version="1.7.11" />
95-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="[9.0.0-rc.1.24431.7,)" />
96-
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="[9.0.0-rc.1.24431.7,)" />
97-
<PackageVersion Include="Microsoft.Extensions.Http" Version="[9.0.0-rc.1.24431.7,)" />
98-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="[9.0.0-rc.1.24431.7,)" />
106+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(LatestRuntimeOutOfBandVer)" />
107+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(LatestRuntimeOutOfBandVer)" />
108+
<PackageVersion Include="Microsoft.Extensions.Http" Version="$(LatestRuntimeOutOfBandVer)" />
109+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(LatestRuntimeOutOfBandVer)" />
99110
<PackageVersion Include="Microsoft.Extensions.Telemetry.Abstractions" Version="[9.0.0-preview.8.24460.1,)" />
100111
<PackageVersion Include="Microsoft.NETFramework.ReferenceAssemblies" Version="[1.0.3,2.0)" />
101112
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="[17.11.0,18.0.0)" />

build/Common.prod.props

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
2626
<PackagePrimaryLicenseFile>$(RepoRoot)\LICENSE.TXT</PackagePrimaryLicenseFile>
2727
<PackageThirdPartyNoticesFile>$(RepoRoot)\THIRD-PARTY-NOTICES.TXT</PackageThirdPartyNoticesFile>
28+
<PackageReadmeFile>README.md</PackageReadmeFile>
29+
<PackageChangelogFile>CHANGELOG.md</PackageChangelogFile>
30+
<PackageReleaseNotesFile>$(RepoRoot)\RELEASENOTES.md</PackageReleaseNotesFile>
2831
</PropertyGroup>
2932

3033
<PropertyGroup Label="SourceLinkProperties">
@@ -70,7 +73,7 @@
7073
<Message Importance="high" Text="**IncludeCertificatesInPackagesDebug** SignatureFiles: @(CertificateFiles)" />
7174
</Target>
7275

73-
<Target Name="AssemblyVersionTarget" AfterTargets="MinVer" Condition="'$(MinVerVersion)'!='' AND '$(BuildNumber)' != ''">
76+
<Target Name="AssemblyVersionTarget" AfterTargets="MinVer" Condition="'$(MinVerVersion)' != '' AND '$(BuildNumber)' != ''">
7477
<!-- Note: $(BuildNumber) is typically only set for builds initiated by the
7578
publish workflow. The goal here is to set the assembly FileVersion and
7679
resolve ExposeExperimentalFeatures based on the version MinVer resolved from
@@ -100,6 +103,66 @@
100103
<Error Text="Cannot perform package validation without a baseline package version." />
101104
</Target>
102105

106+
<Target Name="IncludeReadmeAndReleaseNotesInPackages" BeforeTargets="_GetTargetFrameworksOutput">
107+
<!-- Note: This target runs during pack to convert relative links in
108+
markdowns into github permalinks which will work when rendered on Nuget. -->
109+
110+
<Exec
111+
Command="git rev-parse HEAD"
112+
ConsoleToMsBuild="True"
113+
IgnoreExitCode="True"
114+
StandardOutputImportance="low">
115+
<Output PropertyName="GitCommitConsoleOutput" TaskParameter="ConsoleOutput"/>
116+
<Output PropertyName="GitCommitExitCode" TaskParameter="ExitCode"/>
117+
</Exec>
118+
119+
<Exec
120+
Command="git remote get-url origin"
121+
ConsoleToMsBuild="True"
122+
IgnoreExitCode="True"
123+
StandardOutputImportance="low">
124+
<Output PropertyName="GitOriginConsoleOutput" TaskParameter="ConsoleOutput"/>
125+
<Output PropertyName="GitOriginExitCode" TaskParameter="ExitCode"/>
126+
</Exec>
127+
128+
<PropertyGroup>
129+
<MarkdownCommentRegex>\[([^]]+?)\]\(\.(.+?)\)</MarkdownCommentRegex>
130+
<GitHubRepoUrl>$(GitOriginConsoleOutput.Replace('.git',''))</GitHubRepoUrl>
131+
<GitHubPermalinkUrl Condition="'$(PackTag)' != ''">$(GitHubRepoUrl)/blob/$(PackTag)</GitHubPermalinkUrl>
132+
<GitHubPermalinkUrl Condition="'$(PackTag)' == ''">$(GitHubRepoUrl)/blob/$(GitCommitConsoleOutput)</GitHubPermalinkUrl>
133+
</PropertyGroup>
134+
135+
<Message Importance="high" Text="**GitInformationDebug** GitCommitConsoleOutput: $(GitCommitConsoleOutput), GitCommitExitCode: $(GitCommitExitCode), GitOriginConsoleOutput: $(GitOriginConsoleOutput), GitOriginExitCode: $(GitOriginExitCode), GitHubPermalinkUrl: $(GitHubPermalinkUrl)" />
136+
137+
<ItemGroup>
138+
<PackageMarkdownFiles Include="README.md" />
139+
</ItemGroup>
140+
141+
<ItemGroup>
142+
<PackageMarkdownFiles Update="@(PackageMarkdownFiles)" Path="$([MSBuild]::ValueOrDefault('%(FullPath)','').Replace('$(RepoRoot)', '').Replace('%(FileName)%(Extension)', ''))" />
143+
</ItemGroup>
144+
145+
<WriteLinesToFile
146+
File="$(IntermediateOutputPath)%(PackageMarkdownFiles.Filename)%(PackageMarkdownFiles.Extension)"
147+
Lines="$([System.Text.RegularExpressions.Regex]::Replace($([System.IO.File]::ReadAllText(%(PackageMarkdownFiles.FullPath))), '$(MarkdownCommentRegex)', '[$1]($(GitHubPermalinkUrl)%(PackageMarkdownFiles.Path).$2)').Replace('\', '/'))"
148+
Overwrite="true"
149+
Encoding="UTF-8"/>
150+
151+
<PropertyGroup>
152+
<_PackageReleaseNotesFilePath>$([System.IO.Path]::GetFullPath('$(PackageReleaseNotesFile)').Replace('$(RepoRoot)', '').Replace('\', '/'))</_PackageReleaseNotesFilePath>
153+
<_PackageChangelogFilePath>$([System.IO.Path]::GetFullPath('$(PackageChangelogFile)').Replace('$(RepoRoot)', '').Replace('\', '/'))</_PackageChangelogFilePath>
154+
<PackageReleaseNotes>
155+
For highlights and announcements see: $(GitHubPermalinkUrl)$(_PackageReleaseNotesFilePath).
156+
157+
For detailed changes see: $(GitHubPermalinkUrl)$(_PackageChangelogFilePath).
158+
</PackageReleaseNotes>
159+
</PropertyGroup>
160+
161+
<ItemGroup>
162+
<Content Include="$(IntermediateOutputPath)*.md" PackagePath="/" />
163+
</ItemGroup>
164+
</Target>
165+
103166
<Target Name="ResolveExposeExperimentalFeatures" BeforeTargets="CoreCompile" DependsOnTargets="AssemblyVersionTarget">
104167
<!-- Note: This runs for all builds. The goal here is to set the
105168
EXPOSE_EXPERIMENTAL_FEATURES compiler constant if

docs/logs/redaction/MyRedactionProcessor.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,33 @@ public override void OnEnd(LogRecord logRecord)
1515
}
1616
}
1717

18-
internal sealed class MyClassWithRedactionEnumerator : IReadOnlyList<KeyValuePair<string, object>>
18+
internal sealed class MyClassWithRedactionEnumerator : IReadOnlyList<KeyValuePair<string, object?>>
1919
{
20-
private readonly IReadOnlyList<KeyValuePair<string, object>> state;
20+
private readonly IReadOnlyList<KeyValuePair<string, object?>> state;
2121

22-
public MyClassWithRedactionEnumerator(IReadOnlyList<KeyValuePair<string, object>> state)
22+
public MyClassWithRedactionEnumerator(IReadOnlyList<KeyValuePair<string, object?>> state)
2323
{
2424
this.state = state;
2525
}
2626

2727
public int Count => this.state.Count;
2828

29-
public KeyValuePair<string, object> this[int index]
29+
public KeyValuePair<string, object?> this[int index]
3030
{
3131
get
3232
{
3333
var item = this.state[index];
3434
var entryVal = item.Value?.ToString();
3535
if (entryVal != null && entryVal.Contains("<secret>"))
3636
{
37-
return new KeyValuePair<string, object>(item.Key, "newRedactedValueHere");
37+
return new KeyValuePair<string, object?>(item.Key, "newRedactedValueHere");
3838
}
3939

4040
return item;
4141
}
4242
}
4343

44-
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
44+
public IEnumerator<KeyValuePair<string, object?>> GetEnumerator()
4545
{
4646
for (var i = 0; i < this.Count; i++)
4747
{

docs/logs/redaction/redaction.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
<Project Sdk="Microsoft.NET.Sdk">
2-
<PropertyGroup>
3-
<!-- this is temporary. will remove in future PR. -->
4-
<Nullable>disable</Nullable>
5-
</PropertyGroup>
62
<ItemGroup>
73
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Console\OpenTelemetry.Exporter.Console.csproj" />
84
</ItemGroup>

docs/metrics/README.md

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
* [Instruments](#instruments)
1111
* [MeterProvider Management](#meterprovider-management)
1212
* [Memory Management](#memory-management)
13+
* [Example](#example)
1314
* [Pre-Aggregation](#pre-aggregation)
1415
* [Cardinality Limits](#cardinality-limits)
1516
* [Memory Preallocation](#memory-preallocation)
1617
* [Metrics Correlation](#metrics-correlation)
1718
* [Metrics Enrichment](#metrics-enrichment)
19+
* [Common issues that lead to missing metrics](#common-issues-that-lead-to-missing-metrics)
1820

1921
</details>
2022

@@ -386,22 +388,13 @@ and the `MetricStreamConfiguration.CardinalityLimit` setting. Refer to this
386388
[doc](../../docs/metrics/customizing-the-sdk/README.md#changing-the-cardinality-limit-for-a-metric)
387389
for more information.
388390

389-
Given a metric, once the cardinality limit is reached, any new measurement which
390-
cannot be independently aggregated because of the limit will be dropped or
391-
aggregated using the [overflow
392-
attribute](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#overflow-attribute)
393-
(if enabled). When NOT using the overflow attribute feature a warning is written
394-
to the [self-diagnostic log](../../src/OpenTelemetry/README.md#self-diagnostics)
395-
the first time an overflow is detected for a given metric.
396-
397-
> [!NOTE]
398-
> Overflow attribute was introduced in OpenTelemetry .NET
399-
[1.6.0-rc.1](../../src/OpenTelemetry/CHANGELOG.md#160-rc1). It is currently an
400-
experimental feature which can be turned on by setting the environment
401-
variable `OTEL_DOTNET_EXPERIMENTAL_METRICS_EMIT_OVERFLOW_ATTRIBUTE=true`. Once
402-
the [OpenTelemetry
403-
Specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#overflow-attribute)
404-
become stable, this feature will be turned on by default.
391+
Given a metric, once the cardinality limit is reached, any new measurement
392+
that could not be independently aggregated will be aggregated using the
393+
[overflow attribute](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#overflow-attribute).
394+
In versions prior to 1.10.0, the default behavior when cardinality limit was
395+
reached was to drop the measurement. Users had the ability to opt-in to use
396+
overflow attribute instead, but this behavior is the default and the only
397+
allowed behavior starting with version 1.10.0.
405398

406399
When [Delta Aggregation
407400
Temporality](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/data-model.md#temporality)

docs/metrics/customizing-the-sdk/Program.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ public static void Main()
4040
// Drop the instrument "MyCounterDrop".
4141
.AddView(instrumentName: "MyCounterDrop", MetricStreamConfiguration.Drop)
4242

43+
// Configure the Explicit Bucket Histogram aggregation with custom boundaries and new name.
44+
.AddView(instrumentName: "histogramWithMultipleAggregations", new ExplicitBucketHistogramConfiguration() { Boundaries = new double[] { 10, 20 }, Name = "MyHistogramWithExplicitHistogram" })
45+
46+
// Use Base2 Exponential Bucket Histogram aggregation and new name.
47+
.AddView(instrumentName: "histogramWithMultipleAggregations", new Base2ExponentialBucketHistogramConfiguration() { Name = "MyHistogramWithBase2ExponentialBucketHistogram" })
48+
4349
// An instrument which does not match any views
4450
// gets processed with default behavior. (SDK default)
4551
// Uncommenting the following line will
@@ -70,6 +76,12 @@ public static void Main()
7076
exponentialBucketHistogram.Record(random.Next(1, 1000), new("tag1", "value1"), new("tag2", "value2"));
7177
}
7278

79+
var histogramWithMultipleAggregations = Meter1.CreateHistogram<long>("histogramWithMultipleAggregations");
80+
for (int i = 0; i < 20000; i++)
81+
{
82+
histogramWithMultipleAggregations.Record(random.Next(1, 1000), new("tag1", "value1"), new("tag2", "value2"));
83+
}
84+
7385
var counterCustomTags = Meter1.CreateCounter<long>("MyCounterCustomTags");
7486
for (int i = 0; i < 20000; i++)
7587
{

0 commit comments

Comments
 (0)