Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
add some more implementation, not tested yet
  • Loading branch information
harsimar committed Sep 17, 2025
commit 04db1aa7bd3f4b52790cb7e2ca0174cd6bf85b28
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,18 @@ namespace Azure.Monitor.OpenTelemetry.Exporter.Internals
internal static class PerfCounterConstants
{
internal const string PerfCounterMeterName = "PerfCounterMeter";
internal const string ExceptionRateGauge = "ExceptionRateGauge";
internal const string RequestRateGauge = "RequestRateGauge";
internal const string ProcessCpuGauge = "ProcessCpuGauge";
internal const string ProcessCpuNormalizedGauge = "ProcessCpuNormalizedGauge";
internal const string ProcessPrivateBytesGauge = "ProcessPrivateBytesGauge";
internal const string ExceptionRateInstrumentName = "ExceptionRate";
internal const string RequestRateInstrumentName = "RequestRate";
internal const string ProcessCpuInstrumentName = "ProcessCpu";
internal const string ProcessCpuNormalizedInstrumentName = "ProcessCpuNormalized";
internal const string ProcessPrivateBytesInstrumentName = "ProcessPrivateBytes";

// breeze perf counter names
internal const string ExceptionRateMetricIdValue = "\.NET CLR Exceptions(??APP_CLR_PROC??)\# of Exceps Thrown / sec";
internal const string RequestRateMetricIdValue = "\ASP.NET Applications(??APP_W3SVC_PROC??)\Requests/Sec";
internal const string ProcessCpuMetricIdValue = "\Process(??APP_WIN32_PROC??)\% Processor Time";
internal const string ProcessCpuNormalizedMetricIdValue = "\Process(??APP_WIN32_PROC??)\% Processor Time Normalized";
internal const string ProcessPrivateBytesMetricIdValue = "\Process(??APP_WIN32_PROC??)\Private Bytes";

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,27 +39,27 @@ public PerformanceCounter(MeterProvider meterProvider, PerfCounterItemCounts ite

// Create observable gauges for perf counter
_exceptionRateGauge = _perfCounterMeter.CreateObservableGauge(
PerfCounterConstants.ExceptionRateGauge,
PerfCounterConstants.ExceptionRateInstrumentName,
() => GetExceptionRate(),
description: "Exception rate gauge (ex/sec)");

_requestRateGauge = _perfCounterMeter.CreateObservableGauge(
PerfCounterConstants.RequestRateGauge,
PerfCounterConstants.RequestRateInstrumentName,
() => GetRequestRate(),
description: "Request rate gauge (req/sec)");

_processCpuGauge = _perfCounterMeter.CreateObservableGauge(
PerfCounterConstants.ProcessCpuGauge,
PerfCounterConstants.ProcessCpuInstrumentName,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

() => GetProcessCpu(),
description: "Process CPU gauge (percent)");

_processCpuNormalizedGauge = _perfCounterMeter.CreateObservableGauge(
PerfCounterConstants.ProcessCpuNormalizedGauge,
PerfCounterConstants.ProcessCpuNormalizedInstrumentName,
() => GetProcessCpuNormalized(),
description: "Process CPU normalized gauge (percent)");

_processPrivateBytesGauge = _perfCounterMeter.CreateObservableGauge(
PerfCounterConstants.ProcessPrivateBytesGauge,
PerfCounterConstants.ProcessPrivateBytesInstrumentName,
() => GetProcessPrivateBytes(),
description: "Process private bytes gauge");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ internal sealed class StandardMetricsExtractionProcessor : BaseProcessor<Activit
{
[StandardMetricConstants.RequestDurationInstrumentName] = StandardMetricConstants.RequestDurationMetricIdValue,
[StandardMetricConstants.DependencyDurationInstrumentName] = StandardMetricConstants.DependencyDurationMetricIdValue,
[PerfCounterConstants.ExceptionRateInstrumentName] = PerfCounterConstants.ExceptionRateMetricIdValue,
[PerfCounterConstants.RequestRateInstrumentName] = PerfCounterConstants.RequestRateMetricIdValue,
[PerfCounterConstants.ProcessCpuInstrumentName] = PerfCounterConstants.ProcessCpuMetricIdValue,
[PerfCounterConstants.ProcessCpuNormalizedInstrumentName] = PerfCounterConstants.ProcessCpuNormalizedMetricIdValue,
[PerfCounterConstants.ProcessPrivateBytesInstrumentName] = PerfCounterConstants.ProcessPrivateBytesMetricIdValue,
};

internal AzureMonitorResource? StandardMetricResource => _resource ??= ParentProvider?.GetResource().CreateAzureMonitorResource();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public void ValidateRequestDurationMetric()
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
Expand Down Expand Up @@ -75,7 +75,7 @@ public void ValidateRequestDurationMetricNew()
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
Expand Down Expand Up @@ -124,7 +124,7 @@ public void ValidateRequestDurationMetricConsumerKind()
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
Expand Down Expand Up @@ -178,7 +178,7 @@ public void ValidateDependencyDurationMetric(bool isAzureSDK)
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
Expand Down Expand Up @@ -247,7 +247,7 @@ public void ValidateDependencyDurationMetricForProducerKind(bool isAzureSDKSpan)
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
Expand Down Expand Up @@ -315,7 +315,7 @@ public void ValidateDependencyDurationMetricNew(bool isAzureSDK)
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

var traceServiceName = new KeyValuePair<string, object>("service.name", "trace.service");
var resourceAttributes = new KeyValuePair<string, object>[] { traceServiceName };
Expand Down Expand Up @@ -384,7 +384,7 @@ public void ValidateNullStatusCode(ActivityKind kind)
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetSampler(new AlwaysOnSampler())
Expand Down Expand Up @@ -432,7 +432,7 @@ public void ValidateNullStatusCodeNew(ActivityKind kind)
var traceTelemetryItems = new List<TelemetryItem>();
var metricTelemetryItems = new List<TelemetryItem>();

var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)));
var standardMetricCustomProcessor = new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(new MockTransmitter(metricTelemetryItems)), new PerfCounterItemCounts());

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetSampler(new AlwaysOnSampler())
Expand Down
Loading