Skip to content

Commit b60724e

Browse files
[Instrumentation.Process] Add schema URL (#4088)
1 parent fe86eb1 commit b60724e

6 files changed

Lines changed: 34 additions & 48 deletions

File tree

src/OpenTelemetry.Instrumentation.Process/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
## Unreleased
44

5+
* Add instrumentation scope version and schema URL to metrics.
6+
([#4088](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4088))
7+
8+
* Removed the `process.cpu.count` metric as it is not part of
9+
the semantic conventions. Use the
10+
[`dotnet.process.cpu.count`](https://github.com/open-telemetry/semantic-conventions/blob/v1.41.0/docs/runtime/dotnet-metrics.md#metric-dotnetprocesscpucount)
11+
metric as an alternative.
12+
([#4088](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/4088))
13+
514
## 1.15.1-beta.1
615

716
Released 2026-Apr-21

src/OpenTelemetry.Instrumentation.Process/MeterProviderBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static MeterProviderBuilder AddProcessInstrumentation(
2121
{
2222
Guard.ThrowIfNull(builder);
2323

24-
builder.AddMeter(ProcessMetrics.MeterName);
24+
builder.AddMeter(ProcessMetrics.MeterInstance.Name);
2525
return builder.AddInstrumentation(() => new ProcessMetrics());
2626
}
2727
}

src/OpenTelemetry.Instrumentation.Process/OpenTelemetry.Instrumentation.Process.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<ItemGroup>
2626
<Compile Include="$(RepoRoot)\src\Shared\AssemblyVersionExtensions.cs" Link="Includes\AssemblyVersionExtensions.cs" />
2727
<Compile Include="$(RepoRoot)\src\Shared\Guard.cs" Link="Includes\Guard.cs" />
28+
<Compile Include="$(RepoRoot)\src\Shared\MeterFactory.cs" Link="Includes\MeterFactory.cs" />
2829
</ItemGroup>
2930

3031
</Project>

src/OpenTelemetry.Instrumentation.Process/ProcessMetrics.cs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,14 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System.Diagnostics.Metrics;
5-
using System.Reflection;
6-
using OpenTelemetry.Internal;
75
using Diagnostics = System.Diagnostics;
86

97
namespace OpenTelemetry.Instrumentation.Process;
108

119
internal sealed class ProcessMetrics
1210
{
13-
internal static readonly Assembly Assembly = typeof(ProcessMetrics).Assembly;
14-
internal static readonly AssemblyName AssemblyName = Assembly.GetName();
15-
#pragma warning disable IDE0370 // Suppression is unnecessary
16-
internal static readonly string MeterName = AssemblyName.Name!;
17-
#pragma warning restore IDE0370 // Suppression is unnecessary
18-
19-
private static readonly Meter MeterInstance = new(MeterName, Assembly.GetPackageVersion());
11+
internal static readonly Version SemanticConventionsVersion = new(1, 25, 0);
12+
internal static readonly Meter MeterInstance = Metrics.MeterFactory.Create<ProcessMetrics>(SemanticConventionsVersion);
2013

2114
static ProcessMetrics()
2215
{
@@ -54,15 +47,6 @@ static ProcessMetrics()
5447
unit: "s",
5548
description: "Total CPU seconds broken down by different states.");
5649

57-
MeterInstance.CreateObservableUpDownCounter(
58-
"process.cpu.count",
59-
() =>
60-
{
61-
return Environment.ProcessorCount;
62-
},
63-
unit: "{processors}",
64-
description: "The number of processors (CPU cores) available to the current process.");
65-
6650
MeterInstance.CreateObservableUpDownCounter(
6751
"process.thread.count",
6852
() =>

src/OpenTelemetry.Instrumentation.Process/README.md

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -118,24 +118,6 @@ Gets the user processor time for this process.
118118
* [Process.PrivilegedProcessorTime](https://learn.microsoft.com/dotnet/api/system.diagnostics.process.privilegedprocessortime):
119119
Gets the privileged processor time for this process.
120120

121-
### process.cpu.count
122-
123-
The number of processors (CPU cores) available to the current process.
124-
125-
| Units | Instrument Type | Value Type |
126-
| ------------- | ----------------------- | ---------- |
127-
| `{processors}`| ObservableUpDownCounter | `Int32` |
128-
129-
The API used to retrieve the value is
130-
[System.Environment.ProcessorCount](https://learn.microsoft.com/dotnet/api/system.environment.processorcount).
131-
132-
> [!NOTE]
133-
> This metric is under
134-
> [discussion](https://github.com/open-telemetry/opentelemetry-specification/issues/3200)
135-
and not part of the [Process Metrics
136-
Spec](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/system/process-metrics.md)
137-
at this time.
138-
139121
### process.thread.count
140122

141123
Process threads count.

test/OpenTelemetry.Instrumentation.Process.Tests/ProcessMetricsTests.cs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@ public void ProcessMetricsAreCaptured()
2121

2222
meterProviderA.ForceFlush(MaxTimeToAllowForFlush);
2323

24-
Assert.Equal(5, exportedItemsA.Count);
2524
var physicalMemoryMetric = exportedItemsA.FirstOrDefault(i => i.Name == "process.memory.usage");
2625
Assert.NotNull(physicalMemoryMetric);
2726
var virtualMemoryMetric = exportedItemsA.FirstOrDefault(i => i.Name == "process.memory.virtual");
2827
Assert.NotNull(virtualMemoryMetric);
2928
var cpuTimeMetric = exportedItemsA.FirstOrDefault(i => i.Name == "process.cpu.time");
3029
Assert.NotNull(cpuTimeMetric);
31-
var processorCountMetric = exportedItemsA.FirstOrDefault(i => i.Name == "process.cpu.count");
32-
Assert.NotNull(processorCountMetric);
3330
var threadMetric = exportedItemsA.FirstOrDefault(i => i.Name == "process.thread.count");
3431
Assert.NotNull(threadMetric);
32+
Assert.Equal(4, exportedItemsA.Count);
3533

3634
exportedItemsA.Clear();
3735

@@ -51,8 +49,11 @@ public void ProcessMetricsAreCaptured()
5149

5250
meterProviderB.ForceFlush(MaxTimeToAllowForFlush);
5351

54-
Assert.Equal(5, exportedItemsA.Count);
55-
Assert.Equal(5, exportedItemsB.Count);
52+
Assert.Equal(4, exportedItemsA.Count);
53+
Assert.Equal(4, exportedItemsB.Count);
54+
55+
AssertMetrics(exportedItemsA);
56+
AssertMetrics(exportedItemsB);
5657
}
5758

5859
[Fact]
@@ -129,29 +130,28 @@ public async Task ProcessMetricsAreCapturedWhenTasksOverlap()
129130

130131
await Task.WhenAll(tasks);
131132

132-
Assert.Equal(5, exportedItemsA.Count);
133133
var physicalMemoryMetricA = exportedItemsA.FirstOrDefault(i => i.Name == "process.memory.usage");
134134
Assert.NotNull(physicalMemoryMetricA);
135135
var virtualMemoryMetricA = exportedItemsA.FirstOrDefault(i => i.Name == "process.memory.virtual");
136136
Assert.NotNull(virtualMemoryMetricA);
137137
var cpuTimeMetricA = exportedItemsA.FirstOrDefault(i => i.Name == "process.cpu.time");
138138
Assert.NotNull(cpuTimeMetricA);
139-
var processorCountMetricA = exportedItemsA.FirstOrDefault(i => i.Name == "process.cpu.count");
140-
Assert.NotNull(processorCountMetricA);
141139
var threadMetricA = exportedItemsA.FirstOrDefault(i => i.Name == "process.thread.count");
142140
Assert.NotNull(threadMetricA);
141+
Assert.Equal(4, exportedItemsA.Count);
143142

144-
Assert.Equal(5, exportedItemsB.Count);
145143
var physicalMemoryMetricB = exportedItemsB.FirstOrDefault(i => i.Name == "process.memory.usage");
146144
Assert.NotNull(physicalMemoryMetricB);
147145
var virtualMemoryMetricB = exportedItemsB.FirstOrDefault(i => i.Name == "process.memory.virtual");
148146
Assert.NotNull(virtualMemoryMetricB);
149147
var cpuTimeMetricB = exportedItemsB.FirstOrDefault(i => i.Name == "process.cpu.time");
150148
Assert.NotNull(cpuTimeMetricB);
151-
var processorCountMetricB = exportedItemsB.FirstOrDefault(i => i.Name == "process.cpu.count");
152-
Assert.NotNull(processorCountMetricB);
153149
var threadMetricB = exportedItemsB.FirstOrDefault(i => i.Name == "process.thread.count");
154150
Assert.NotNull(threadMetricB);
151+
Assert.Equal(4, exportedItemsB.Count);
152+
153+
AssertMetrics(exportedItemsA);
154+
AssertMetrics(exportedItemsB);
155155
}
156156

157157
[Fact]
@@ -221,4 +221,14 @@ private static double GetValue(Metric metric)
221221

222222
return sum;
223223
}
224+
225+
private static void AssertMetrics(IEnumerable<Metric> metrics)
226+
{
227+
foreach (var metric in metrics)
228+
{
229+
Assert.NotNull(metric.MeterVersion);
230+
Assert.NotEmpty(metric.MeterVersion);
231+
Assert.StartsWith("https://opentelemetry.io/schemas/", metric.MeterSchemaUrl);
232+
}
233+
}
224234
}

0 commit comments

Comments
 (0)