From c5d25a297933c3b5fe511d8dd8dc7b1355dd81b3 Mon Sep 17 00:00:00 2001 From: Jackson Weber <47067795+JacksonWeber@users.noreply.github.com> Date: Wed, 1 May 2024 10:53:36 -0700 Subject: [PATCH] [Azure Monitor OpenTelemetry Exporter] Capture Measurements when Creating Logs (#29511) ### Packages impacted by this PR @azure/monitor-opentelemetry-exporter ### Issues associated with this PR https://github.com/microsoft/ApplicationInsights-node.js/issues/1318 ### Describe the problem that is addressed by this PR Previously measurements passed from the Application Insights 3.X SDK were not being populated on logs in the exporter. These should be populated from the log body and exported to breeze. ### Are there test cases added in this PR? _(If not, why?)_ Yes, added a test case to ensure that when measurements exist in the log body field, they're populated on the final envelope. ### Checklists - [x] Added impacted package name to the issue description - [ ] Does this PR needs any fixes in the SDK Generator?** _(If so, create an Issue in the [Autorest/typescript](https://github.com/Azure/autorest.typescript) repository and link it here)_ - [x] Added a changelog (if necessary) --- .../monitor-opentelemetry-exporter/CHANGELOG.md | 6 ++++++ .../src/utils/logUtils.ts | 11 ++++++++++- .../test/internal/logUtils.test.ts | 10 +++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md index f34efbb1f4af..0df5bee831fa 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md @@ -1,5 +1,11 @@ # Release History +## Unreleased () + +### Features Added + +- Capture and export measurements when creating log records from the Application Insights 3.X SDK. + ## 1.0.0-beta.22 (2024-04-16) ### Features Added diff --git a/sdk/monitor/monitor-opentelemetry-exporter/src/utils/logUtils.ts b/sdk/monitor/monitor-opentelemetry-exporter/src/utils/logUtils.ts index 9274c3cbfba3..0fb5429082df 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/src/utils/logUtils.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/src/utils/logUtils.ts @@ -45,7 +45,7 @@ export function logToEnvelope(log: ReadableLogRecord, ikey: string): Envelope | const sampleRate = 100; const instrumentationKey = ikey; const tags = createTagsFromLog(log); - const [properties, measurements] = createPropertiesFromLog(log); + let [properties, measurements] = createPropertiesFromLog(log); let name: string; let baseType: string; let baseData: MonitorDomain; @@ -85,6 +85,7 @@ export function logToEnvelope(log: ReadableLogRecord, ikey: string): Envelope | baseType = String(log.attributes[ApplicationInsightsBaseType]); name = getLegacyApplicationInsightsName(log); baseData = getLegacyApplicationInsightsBaseData(log); + measurements = getLegacyApplicationInsightsMeasurements(log); if (!baseData) { // Failed to parse log return; @@ -180,6 +181,14 @@ function getLegacyApplicationInsightsName(log: ReadableLogRecord): string { return name; } +function getLegacyApplicationInsightsMeasurements(log: ReadableLogRecord): Measurements { + let measurements: Measurements = {}; + if ((log.body as MonitorDomain)?.measurements) { + measurements = { ...(log.body as MonitorDomain).measurements }; + } + return measurements; +} + function getLegacyApplicationInsightsBaseData(log: ReadableLogRecord): MonitorDomain { let baseData: MonitorDomain = { version: 2, diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/logUtils.test.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/logUtils.test.ts index fc69bf05c4a2..cf42f15b6f0c 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/logUtils.test.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/logUtils.test.ts @@ -114,7 +114,7 @@ describe("logUtils.ts", () => { severityLevel: `Information`, version: 2, properties: expectedProperties, - measurements: {}, + measurements: emptyMeasurements, }; const envelope = logToEnvelope(testLogRecord as ReadableLogRecord, "ikey"); @@ -178,6 +178,7 @@ describe("logUtils.ts", () => { const data: MessageData = { message: "testMessage", severityLevel: "Verbose", + measurements: { testMeasurement: 1 }, version: 2, }; testLogRecord.attributes = { @@ -192,12 +193,15 @@ describe("logUtils.ts", () => { "extra.attribute": "foo", [SemanticAttributes.MESSAGE_TYPE]: "test message type", }; + const expectedMeasurements: Measurements = { + testMeasurement: 1, + }; const expectedBaseData: Partial = { message: `testMessage`, severityLevel: `Verbose`, version: 2, properties: expectedProperties, - measurements: {}, + measurements: expectedMeasurements, }; const envelope = logToEnvelope(testLogRecord as ReadableLogRecord, "ikey"); @@ -207,7 +211,7 @@ describe("logUtils.ts", () => { 100, "MessageData", expectedProperties, - emptyMeasurements, + expectedMeasurements, expectedBaseData, expectedTime, );