From 8ac847aaaabd01ec6c60e5eaa9f135f32b685f74 Mon Sep 17 00:00:00 2001 From: heyams Date: Mon, 29 Apr 2024 17:08:43 -0700 Subject: [PATCH 1/8] Update otel metrics logic --- .../implementation/MetricDataMapper.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index 42bcfafe9f1a..b715fbe59be2 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -45,18 +45,20 @@ public class MetricDataMapper { private static final ClientLogger logger = new ClientLogger(MetricDataMapper.class); + private static final Set OTEL_STABLE_METRICS_TO_BREEZE = new HashSet<>(); + private static final String OTEL_INSTRUMENTATION_NAME_PREFIX = "io.opentelemetry"; private static final Set OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES = new HashSet<>(4); - private static final List EXCLUDED_METRIC_NAMES = new ArrayList<>(); public static final AttributeKey APPLICATIONINSIGHTS_INTERNAL_METRIC_NAME = AttributeKey.stringKey("applicationinsights.internal.metric_name"); private final BiConsumer telemetryInitializer; private final boolean captureHttpServer4xxAsError; static { - EXCLUDED_METRIC_NAMES.add("http.server.active_requests"); // Servlet - EXCLUDED_METRIC_NAMES.add("http.server.response.size"); - EXCLUDED_METRIC_NAMES.add("http.client.response.size"); + // HTTP stable metrics + OTEL_STABLE_METRICS_TO_BREEZE.add("http.server.request.duration"); + OTEL_STABLE_METRICS_TO_BREEZE.add("http.client.request.duration"); + // Application Insights pre-aggregated standard metrics OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.server.request.duration"); OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.client.request.duration"); OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.server.duration"); // pre-stable HTTP semconv @@ -73,8 +75,11 @@ public MetricDataMapper( } public void map(MetricData metricData, Consumer consumer) { - if (EXCLUDED_METRIC_NAMES.contains(metricData.getName())) { - return; + // only emit stable metrics from the OpenTelemetry instrumentation libraries + // custom metrics are always emitted + if (!OTEL_STABLE_METRICS_TO_BREEZE.contains(metricData.getName()) + && metricData.getInstrumentationScopeInfo().getName().startsWith(OTEL_INSTRUMENTATION_NAME_PREFIX)) { + return; } MetricDataType type = metricData.getType(); From 985639766aceba435ae967af83f0f2e21ba56ea3 Mon Sep 17 00:00:00 2001 From: "Harsimar Kaur (from Dev Box)" Date: Thu, 2 May 2024 11:19:06 -0700 Subject: [PATCH 2/8] add runtime metrics --- .../exporter/implementation/MetricDataMapper.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index b715fbe59be2..afd0ad1a6dc2 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -58,6 +58,18 @@ public class MetricDataMapper { OTEL_STABLE_METRICS_TO_BREEZE.add("http.server.request.duration"); OTEL_STABLE_METRICS_TO_BREEZE.add("http.client.request.duration"); + // otel runtime stable metrics + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.limit"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.used_after_last_gc"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.gc.duration"); // same as GC Total Time + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.thread.count"); // same as Current Thread Count + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.loaded"); // same as Loaded Class Count + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.unloaded"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.count"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.cpu.time"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.cpu.count"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.cpu.recent_utilization"); + // Application Insights pre-aggregated standard metrics OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.server.request.duration"); OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.client.request.duration"); From 645d83f742bf5965cc4ea37d24818290bc3bb78c Mon Sep 17 00:00:00 2001 From: "Harsimar Kaur (from Dev Box)" Date: Thu, 2 May 2024 11:34:06 -0700 Subject: [PATCH 3/8] adding a few metrics I forgot --- .../exporter/implementation/MetricDataMapper.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index afd0ad1a6dc2..638560130adb 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -58,12 +58,17 @@ public class MetricDataMapper { OTEL_STABLE_METRICS_TO_BREEZE.add("http.server.request.duration"); OTEL_STABLE_METRICS_TO_BREEZE.add("http.client.request.duration"); - // otel runtime stable metrics + // adding stable metrics from otel.instrumentation.runtime-telemetry + // link: + // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/runtime/jvm-metrics.md + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.used"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.committed"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.limit"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.limit"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.used_after_last_gc"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.gc.duration"); // same as GC Total Time - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.thread.count"); // same as Current Thread Count - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.loaded"); // same as Loaded Class Count + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.gc.duration"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.thread.count"); + OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.loaded"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.unloaded"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.count"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.cpu.time"); From 7351134a74eb3b2be244f3380e2c985bb5760cca Mon Sep 17 00:00:00 2001 From: "Harsimar Kaur (from Dev Box)" Date: Thu, 2 May 2024 11:35:42 -0700 Subject: [PATCH 4/8] small correction --- .../opentelemetry/exporter/implementation/MetricDataMapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index 638560130adb..8c20d97fadf0 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -64,7 +64,6 @@ public class MetricDataMapper { OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.used"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.committed"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.limit"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.limit"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.used_after_last_gc"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.gc.duration"); OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.thread.count"); From bc849521f769218809904b554d16aaa3ad50d01b Mon Sep 17 00:00:00 2001 From: heyams Date: Mon, 6 May 2024 11:54:20 -0700 Subject: [PATCH 5/8] Update --- .../implementation/MetricDataMapper.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index b715fbe59be2..253b4a29a55c 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -75,13 +75,6 @@ public MetricDataMapper( } public void map(MetricData metricData, Consumer consumer) { - // only emit stable metrics from the OpenTelemetry instrumentation libraries - // custom metrics are always emitted - if (!OTEL_STABLE_METRICS_TO_BREEZE.contains(metricData.getName()) - && metricData.getInstrumentationScopeInfo().getName().startsWith(OTEL_INSTRUMENTATION_NAME_PREFIX)) { - return; - } - MetricDataType type = metricData.getType(); if (type == DOUBLE_SUM || type == DOUBLE_GAUGE @@ -90,10 +83,17 @@ public void map(MetricData metricData, Consumer consumer) { || type == HISTOGRAM) { boolean isPreAggregatedStandardMetric = OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.contains(metricData.getName()); - List telemetryItemList = - convertOtelMetricToAzureMonitorMetric(metricData, isPreAggregatedStandardMetric); - for (TelemetryItem telemetryItem : telemetryItemList) { - consumer.accept(telemetryItem); + if (isPreAggregatedStandardMetric) { + List preAggregatedStandardMetrics = + convertOtelMetricToAzureMonitorMetric(metricData, true); + preAggregatedStandardMetrics.forEach(consumer::accept); + } + + // emit stable metrics from the OpenTelemetry instrumentation libraries + // custom metrics are always emitted + if (OTEL_STABLE_METRICS_TO_BREEZE.contains(metricData.getName())) { + List stableOtelMetrics = convertOtelMetricToAzureMonitorMetric(metricData, false); + stableOtelMetrics.forEach(consumer::accept); } } else { logger.warning("metric data type {} is not supported yet.", metricData.getType()); From 7b99c6e10a718ce3d65f2c108f52076bea705c9d Mon Sep 17 00:00:00 2001 From: heyams Date: Mon, 6 May 2024 12:17:14 -0700 Subject: [PATCH 6/8] Fix --- .../exporter/implementation/MetricDataMapper.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index 23e080037cbe..0143ec258595 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -107,10 +107,12 @@ public void map(MetricData metricData, Consumer consumer) { // emit stable metrics from the OpenTelemetry instrumentation libraries // custom metrics are always emitted - if (OTEL_STABLE_METRICS_TO_BREEZE.contains(metricData.getName())) { - List stableOtelMetrics = convertOtelMetricToAzureMonitorMetric(metricData, false); - stableOtelMetrics.forEach(consumer::accept); + if (!OTEL_STABLE_METRICS_TO_BREEZE.contains(metricData.getName()) + && metricData.getInstrumentationScopeInfo().getName().startsWith(OTEL_INSTRUMENTATION_NAME_PREFIX)) { + return; } + List stableOtelMetrics = convertOtelMetricToAzureMonitorMetric(metricData, false); + stableOtelMetrics.forEach(consumer::accept); } else { logger.warning("metric data type {} is not supported yet.", metricData.getType()); } From e39e7f203647a2db28cc9bf6653515871c74c754 Mon Sep 17 00:00:00 2001 From: heyams Date: Tue, 7 May 2024 11:13:55 -0700 Subject: [PATCH 7/8] Update --- .../implementation/MetricDataMapper.java | 28 ++++--------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index 0143ec258595..190a32c6c71a 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -45,7 +45,7 @@ public class MetricDataMapper { private static final ClientLogger logger = new ClientLogger(MetricDataMapper.class); - private static final Set OTEL_STABLE_METRICS_TO_BREEZE = new HashSet<>(); + private static final Set OTEL_UNSTABLE_METRICS_TO_EXCLUDE = new HashSet<>(); private static final String OTEL_INSTRUMENTATION_NAME_PREFIX = "io.opentelemetry"; private static final Set OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES = new HashSet<>(4); public static final AttributeKey APPLICATIONINSIGHTS_INTERNAL_METRIC_NAME = AttributeKey.stringKey("applicationinsights.internal.metric_name"); @@ -54,25 +54,9 @@ public class MetricDataMapper { private final boolean captureHttpServer4xxAsError; static { - // HTTP stable metrics - OTEL_STABLE_METRICS_TO_BREEZE.add("http.server.request.duration"); - OTEL_STABLE_METRICS_TO_BREEZE.add("http.client.request.duration"); - - // adding stable metrics from otel.instrumentation.runtime-telemetry - // link: - // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/runtime/jvm-metrics.md - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.used"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.committed"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.limit"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.memory.used_after_last_gc"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.gc.duration"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.thread.count"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.loaded"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.unloaded"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.class.count"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.cpu.time"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.cpu.count"); - OTEL_STABLE_METRICS_TO_BREEZE.add("jvm.cpu.recent_utilization"); + // HTTP unstable metrics to be excluded via Otel auto instrumentation + OTEL_UNSTABLE_METRICS_TO_EXCLUDE.add("rpc.client.duration"); + OTEL_UNSTABLE_METRICS_TO_EXCLUDE.add("rpc.server.duration"); // Application Insights pre-aggregated standard metrics OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.server.request.duration"); @@ -105,9 +89,9 @@ public void map(MetricData metricData, Consumer consumer) { preAggregatedStandardMetrics.forEach(consumer::accept); } - // emit stable metrics from the OpenTelemetry instrumentation libraries + // DO NOT emit unstable metrics from the OpenTelemetry auto instrumentation libraries // custom metrics are always emitted - if (!OTEL_STABLE_METRICS_TO_BREEZE.contains(metricData.getName()) + if (OTEL_UNSTABLE_METRICS_TO_EXCLUDE.contains(metricData.getName()) && metricData.getInstrumentationScopeInfo().getName().startsWith(OTEL_INSTRUMENTATION_NAME_PREFIX)) { return; } From 5d8b50810c7177f0c7c6d48847df9cdc954dea66 Mon Sep 17 00:00:00 2001 From: heyams Date: Wed, 8 May 2024 15:24:26 -0700 Subject: [PATCH 8/8] Delete pre-stable metrics --- .../opentelemetry/exporter/implementation/MetricDataMapper.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java index 190a32c6c71a..b69e5f9dd886 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/MetricDataMapper.java @@ -61,8 +61,6 @@ public class MetricDataMapper { // Application Insights pre-aggregated standard metrics OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.server.request.duration"); OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.client.request.duration"); - OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.server.duration"); // pre-stable HTTP semconv - OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("http.client.duration"); // pre-stable HTTP semconv OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("rpc.client.duration"); OTEL_PRE_AGGREGATED_STANDARD_METRIC_NAMES.add("rpc.server.duration"); }