From 14c474d63e47f2a922fcf471922559ece274108f Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 14:00:43 -0800 Subject: [PATCH 01/21] Release distro 1.8.1 and exporter beta.28. --- sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md | 2 +- sdk/monitor/monitor-opentelemetry-exporter/package.json | 2 +- .../src/generated/applicationInsightsClient.ts | 2 +- .../src/utils/constants/applicationinsights.ts | 2 +- sdk/monitor/monitor-opentelemetry/CHANGELOG.md | 8 +------- sdk/monitor/monitor-opentelemetry/package.json | 2 +- sdk/monitor/monitor-opentelemetry/src/types.ts | 2 +- sdk/monitor/perf-tests/monitor-opentelemetry/package.json | 2 +- 8 files changed, 8 insertions(+), 14 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md index 2e00c7a73b53..da7bf437ca20 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/monitor-opentelemetry-exporter/CHANGELOG.md @@ -1,6 +1,6 @@ # Release History -## 1.0.0-beta.28 () +## 1.0.0-beta.28 (2025-01-28) ### Features Added diff --git a/sdk/monitor/monitor-opentelemetry-exporter/package.json b/sdk/monitor/monitor-opentelemetry-exporter/package.json index 87b705b56096..b7f0f0160205 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/package.json +++ b/sdk/monitor/monitor-opentelemetry-exporter/package.json @@ -2,7 +2,7 @@ "name": "@azure/monitor-opentelemetry-exporter", "author": "Microsoft Corporation", "sdk-type": "client", - "version": "1.0.0-beta.27", + "version": "1.0.0-beta.28", "description": "Application Insights exporter for the OpenTelemetry JavaScript (Node.js) SDK", "main": "./dist/commonjs/index.js", "module": "./dist/esm/index.js", diff --git a/sdk/monitor/monitor-opentelemetry-exporter/src/generated/applicationInsightsClient.ts b/sdk/monitor/monitor-opentelemetry-exporter/src/generated/applicationInsightsClient.ts index 19c30ac26e69..7bc65cfc3697 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/src/generated/applicationInsightsClient.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/src/generated/applicationInsightsClient.ts @@ -32,7 +32,7 @@ export class ApplicationInsightsClient extends coreClient.ServiceClient { requestContentType: "application/json; charset=utf-8", }; - const packageDetails = `azsdk-js-monitor-opentelemetry-exporter/1.0.0-beta.27`; + const packageDetails = `azsdk-js-monitor-opentelemetry-exporter/1.0.0-beta.28`; const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` diff --git a/sdk/monitor/monitor-opentelemetry-exporter/src/utils/constants/applicationinsights.ts b/sdk/monitor/monitor-opentelemetry-exporter/src/utils/constants/applicationinsights.ts index 87efb8133fc3..3a07a2ff399b 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/src/utils/constants/applicationinsights.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/src/utils/constants/applicationinsights.ts @@ -20,7 +20,7 @@ export const TIME_SINCE_ENQUEUED = "timeSinceEnqueued"; * AzureMonitorTraceExporter version. * @internal */ -export const packageVersion = "1.0.0-beta.27"; +export const packageVersion = "1.0.0-beta.28"; export enum DependencyTypes { InProc = "InProc", diff --git a/sdk/monitor/monitor-opentelemetry/CHANGELOG.md b/sdk/monitor/monitor-opentelemetry/CHANGELOG.md index 9d32799675be..8101961ab4ed 100644 --- a/sdk/monitor/monitor-opentelemetry/CHANGELOG.md +++ b/sdk/monitor/monitor-opentelemetry/CHANGELOG.md @@ -1,10 +1,6 @@ # Release History -## 1.8.1 (Unreleased) - -### Features Added - -### Breaking Changes +## 1.8.1 (2025-01-28) ### Bugs Fixed @@ -12,8 +8,6 @@ - Fix incorrectly setting the cloud role name and role instance to undefined on standard metrics in AKS environments. - Handle exceptions thrown when no http url is present on request telemetry quickpulse documents. -### Other Changes - ## 1.8.0 (2024-10-23) ### Features Added diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index 4f2af28acfc7..11c55acc6d53 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -85,7 +85,7 @@ "@azure/core-client": "^1.0.0", "@azure/core-rest-pipeline": "^1.1.0", "@azure/logger": "^1.0.0", - "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.27", + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.28", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.7", "@microsoft/applicationinsights-web-snippet": "^1.2.1", "@opentelemetry/api": "^1.9.0", diff --git a/sdk/monitor/monitor-opentelemetry/src/types.ts b/sdk/monitor/monitor-opentelemetry/src/types.ts index 619fcaa8fe67..10454350514c 100644 --- a/sdk/monitor/monitor-opentelemetry/src/types.ts +++ b/sdk/monitor/monitor-opentelemetry/src/types.ts @@ -145,7 +145,7 @@ export interface BrowserSdkLoaderOptions { connectionString?: string; } -export const AZURE_MONITOR_OPENTELEMETRY_VERSION = "1.8.0"; +export const AZURE_MONITOR_OPENTELEMETRY_VERSION = "1.8.1"; export const AZURE_MONITOR_STATSBEAT_FEATURES = "AZURE_MONITOR_STATSBEAT_FEATURES"; export const AZURE_MONITOR_PREFIX = "AZURE_MONITOR_PREFIX"; export const AZURE_MONITOR_AUTO_ATTACH = "AZURE_MONITOR_AUTO_ATTACH"; diff --git a/sdk/monitor/perf-tests/monitor-opentelemetry/package.json b/sdk/monitor/perf-tests/monitor-opentelemetry/package.json index 3ffdc2bc4dd8..a47ea591d5fa 100644 --- a/sdk/monitor/perf-tests/monitor-opentelemetry/package.json +++ b/sdk/monitor/perf-tests/monitor-opentelemetry/package.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "@azure-tools/test-perf": "^1.0.0", - "@azure/monitor-opentelemetry": "^1.8.0", + "@azure/monitor-opentelemetry": "^1.8.1", "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.57.1", "@opentelemetry/sdk-logs": "^0.57.1", From 0a528d02b9d2e79eaebf70a3d488bf46eb6fe361 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 15:16:32 -0800 Subject: [PATCH 02/21] Update packages with dependency on exporter. --- common/config/rush/pnpm-lock.yaml | 94 ++++++++++++++----- sdk/ai/ai-inference-rest/package.json | 2 +- .../samples/v1-beta/javascript/package.json | 2 +- .../samples/v1-beta/typescript/package.json | 2 +- sdk/ai/ai-projects/package.json | 2 +- .../samples/v1-beta/javascript/package.json | 2 +- .../samples/v1-beta/typescript/package.json | 2 +- .../monitor-opentelemetry/package.json | 2 +- sdk/monitor/monitor-query/package.json | 2 +- 9 files changed, 81 insertions(+), 29 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index af60cb061435..4fcaf3c4a91a 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -270,7 +270,7 @@ importers: version: file:projects/arm-datadog.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) '@rush-temp/arm-datafactory': specifier: file:./projects/arm-datafactory.tgz - version: file:projects/arm-datafactory.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) + version: file:projects/arm-datafactory.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) '@rush-temp/arm-datalake-analytics': specifier: file:./projects/arm-datalake-analytics.tgz version: file:projects/arm-datalake-analytics.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) @@ -1381,6 +1381,10 @@ packages: resolution: {integrity: sha512-PB9GlnfojcQ4nf9WXdQvWeAk7gm8P74o+Z5IHz5YLK/W+3vrNrmVVVuFpGOvCPrLjag50UinaZsMBtPtxoiobg==} engines: {node: '>=14.0.0'} + '@azure/monitor-opentelemetry-exporter@1.0.0-beta.27': + resolution: {integrity: sha512-21iXu9ubtPB7iO3ghnzMMdB0KwHpz7Zl1a9xSBR3Gl8IDUlXOBjMn6OT9+ycj9VZrTyEKiV59T9VTf0IlokPYQ==} + engines: {node: '>=18.0.0'} + '@azure/msal-browser@4.0.2': resolution: {integrity: sha512-bq6PasUpJgBSOSMeSlh8gXh4LZGgAaPoJFNcu5u0zxwueh+I8NpMb9oxlCfS/8CJHyXUhTUAMLSnvThemNdyQw==} engines: {node: '>=0.8.0'} @@ -2186,6 +2190,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.26.0': + resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.30.1': resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} @@ -2364,12 +2374,24 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 + '@opentelemetry/resources@1.26.0': + resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/resources@1.30.1': resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-logs@0.53.0': + resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@opentelemetry/sdk-logs@0.57.1': resolution: {integrity: sha512-jGdObb/BGWu6Peo3cL3skx/Rl1Ak/wDDO3vpPrrThGbqE7isvkCsX6uE+OAt8Ayjm9YC8UGkohWbLR09JmM0FA==} engines: {node: '>=14'} @@ -2652,7 +2674,7 @@ packages: version: 0.0.0 '@rush-temp/ai-inference@file:projects/ai-inference.tgz': - resolution: {integrity: sha512-DLcvtjTNr2ho+YwJBGGWETWHNG0yBNiUU/BinmvA3d2jUnMYQyrEYJe1+8Sype0GXvR9Pv+XtlUJJsRVjyXj8g==, tarball: file:projects/ai-inference.tgz} + resolution: {integrity: sha512-pRLZ+VKFlpK0r48LLuyuySS3P5ag+KRbSJj1B38FYvqIztoqY9CrGyHB470JVvbciVypbw8MdMA35Z/upmrRdQ==, tarball: file:projects/ai-inference.tgz} version: 0.0.0 '@rush-temp/ai-language-conversations@file:projects/ai-language-conversations.tgz': @@ -2956,27 +2978,27 @@ packages: version: 0.0.0 '@rush-temp/arm-databricks@file:projects/arm-databricks.tgz': - resolution: {integrity: sha512-LPK6f/zzzWXFa4aGnazgTkydNr4Z42iTafRXFkYJFcVkLibTmQO6JOQ+W1V8o2DfKiejs8XpjcydhOhulYovRA==, tarball: file:projects/arm-databricks.tgz} + resolution: {integrity: sha512-OMcAEeindyff/GOy+0Q6J25kcrQpA+plMMmH+vy9g1qMaCZywRK8ptpW+NuPQv6bQd6pi8BBvAmEB78Sw/qBqw==, tarball: file:projects/arm-databricks.tgz} version: 0.0.0 '@rush-temp/arm-datacatalog@file:projects/arm-datacatalog.tgz': - resolution: {integrity: sha512-qeBZm+84NtQT6qoznDAv4HCDW5Q4qbtFgbkXw5IYSKjBvPmC+wR3d/ZZxRCvC/q3SzNqNRg52KBWaK1uxx7SMQ==, tarball: file:projects/arm-datacatalog.tgz} + resolution: {integrity: sha512-xFRskrr3fopT3Za7yU48UY5LvjX6aZRkaOS1MNQpskZneJ0Z1rguHgBDcDcG724cEh5uMmr3mK4Lf1YHE6IuNw==, tarball: file:projects/arm-datacatalog.tgz} version: 0.0.0 '@rush-temp/arm-datadog@file:projects/arm-datadog.tgz': - resolution: {integrity: sha512-vBrWWCH6p61/q1E6/qOtV8nwM3U0KuFGyQZaMksIJ8KeJDEwNSXbiFiV1iHTTLyASTARkq0s3OPnqgrLbBLMvQ==, tarball: file:projects/arm-datadog.tgz} + resolution: {integrity: sha512-ZlBxlaxdJ32SGa7hd0YNlrkW5oO7/tXX25sQOaSHGXOQIMo+SGCUfDP+7NpEka4xKXxoPEPm8LEl5Sn0RRF+Yg==, tarball: file:projects/arm-datadog.tgz} version: 0.0.0 '@rush-temp/arm-datafactory@file:projects/arm-datafactory.tgz': - resolution: {integrity: sha512-yKCDZJWfsdt2CAyDWYtOQ1p+LpbpsLdNvJunAeuTMn1yDg7sZ0tasVRaxGegryPnm+O7l4HS2nqGRCaQb7Vixg==, tarball: file:projects/arm-datafactory.tgz} + resolution: {integrity: sha512-0IvtVFcd8vTPoTodXqPJMNwh7r9QS55QS3UkFyaVgw6av4aMxNp4jqZtuF2cTkVhy4Qrkf1O527DBQa9ulhc3Q==, tarball: file:projects/arm-datafactory.tgz} version: 0.0.0 '@rush-temp/arm-datalake-analytics@file:projects/arm-datalake-analytics.tgz': - resolution: {integrity: sha512-0ECYmItkXiSvEb+fXGh5Dwx1ukk4eapr7Zn1/54oUTaRufxha69JJqjRRDlRJBrZM6tzeq9mU/KO/wX6gEVi0g==, tarball: file:projects/arm-datalake-analytics.tgz} + resolution: {integrity: sha512-wu6GpPZWx8XBbZ++cXyu56J8RK9XZVfy3Kf04dJ1iEDBV8BKZnl1Cxz2EUyA5znuwG6jghjuuwGlJDzJAetJ5Q==, tarball: file:projects/arm-datalake-analytics.tgz} version: 0.0.0 '@rush-temp/arm-datamigration@file:projects/arm-datamigration.tgz': - resolution: {integrity: sha512-SdXQX33RIxeNeiaDTgoBv7oZsJMZ8m9QYiGkcOS22Ok9Xvzo7dsGj77MgXCOmlLFk8J8riFQew3OnCGwRMaH3g==, tarball: file:projects/arm-datamigration.tgz} + resolution: {integrity: sha512-ioAhAORJLg4aff/8kp+Mq6cOzcoC7OGH2TimL/UDm0Qfm2r+X5ivlXO09XIJJqQdfHbJ0Htn1obCZxeED7Bppw==, tarball: file:projects/arm-datamigration.tgz} version: 0.0.0 '@rush-temp/arm-dataprotection@file:projects/arm-dataprotection.tgz': @@ -4004,11 +4026,11 @@ packages: version: 0.0.0 '@rush-temp/monitor-opentelemetry@file:projects/monitor-opentelemetry.tgz': - resolution: {integrity: sha512-yj3eLTGUSFU2lGpjjYQ0n2u4DLTjaJNEZgRZpp64Be6vr0oaoFdMmLVxpe9tHG+z5qhktqW4H17mD46QZmLHrw==, tarball: file:projects/monitor-opentelemetry.tgz} + resolution: {integrity: sha512-z5UtXbsaWkLnIHmEMZoEtUXx1JlX0h8qgs+NUDTrIhb4eeKvLQQq7MdBn5ebvQ5+IK9X7Eo48plVd7uc0klcuQ==, tarball: file:projects/monitor-opentelemetry.tgz} version: 0.0.0 '@rush-temp/monitor-query@file:projects/monitor-query.tgz': - resolution: {integrity: sha512-jeOWD62O9d4VqeqJi2tDLWdFYLr4WdyFZLptBvddKPcNM7ioc3J6cT9l+u8MyLw8mhR+jmUXnE5USLYKequWnA==, tarball: file:projects/monitor-query.tgz} + resolution: {integrity: sha512-cOOWwNg4PVHrU2kHAj7iQseDZfLpiQqxZjt1w1DrUsJscBRnIOi0+Gj0VJjdH8nKKLKd24Bq79teSp11dluVcg==, tarball: file:projects/monitor-query.tgz} version: 0.0.0 '@rush-temp/notification-hubs@file:projects/notification-hubs.tgz': @@ -4084,7 +4106,7 @@ packages: version: 0.0.0 '@rush-temp/perf-monitor-opentelemetry@file:projects/perf-monitor-opentelemetry.tgz': - resolution: {integrity: sha512-byBSym/OfxQ58bVHVolF00z4GRg96yCYO7SwgMGbODClLim6M9/GJ7K4VVe4bifJ8DxljLMjdZh+9dDHL8+Q1g==, tarball: file:projects/perf-monitor-opentelemetry.tgz} + resolution: {integrity: sha512-dwzpNIZPU6i3RcqjhLVipjyiz3ZZMtjs7dOuCSH4TtaOyj5vgqVvQC61FbEsnQrI5coVWW0NEOmbNYbzkih1Yw==, tarball: file:projects/perf-monitor-opentelemetry.tgz} version: 0.0.0 '@rush-temp/perf-monitor-query@file:projects/perf-monitor-query.tgz': @@ -4164,7 +4186,7 @@ packages: version: 0.0.0 '@rush-temp/service-bus@file:projects/service-bus.tgz': - resolution: {integrity: sha512-t9IaVEy/hf1+zANzqEE24d8ckaY+iFfhCSYsOWL53xBl4rINoYYeKVLjiGsi+dfCdgLUQF+lrDMc/FKk3xA3og==, tarball: file:projects/service-bus.tgz} + resolution: {integrity: sha512-3J1MkJ54xTVhUxp6bnqZanWXMwyovz1snfXuAJeO2ieTgnWew28Rbbb//DAYO8saOFyjs15l0ZgXdd5QaKLbbg==, tarball: file:projects/service-bus.tgz} version: 0.0.0 '@rush-temp/storage-blob-changefeed@file:projects/storage-blob-changefeed.tgz': @@ -8850,6 +8872,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@azure/monitor-opentelemetry-exporter@1.0.0-beta.27': + dependencies: + '@azure/core-auth': 1.9.0 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.18.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@azure/msal-browser@4.0.2': dependencies: '@azure/msal-common': 15.0.2 @@ -9591,6 +9630,11 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -9854,12 +9898,25 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs@0.57.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -10346,6 +10403,7 @@ snapshots: dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 + '@azure/monitor-opentelemetry-exporter': 1.0.0-beta.27 '@azure/opentelemetry-instrumentation-azure-sdk': 1.0.0-beta.7 '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0) @@ -12985,7 +13043,6 @@ snapshots: '@rush-temp/arm-databricks@file:projects/arm-databricks.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13021,7 +13078,6 @@ snapshots: '@rush-temp/arm-datacatalog@file:projects/arm-datacatalog.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13056,7 +13112,6 @@ snapshots: '@rush-temp/arm-datadog@file:projects/arm-datadog.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13090,7 +13145,7 @@ snapshots: - webdriverio - yaml - '@rush-temp/arm-datafactory@file:projects/arm-datafactory.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': + '@rush-temp/arm-datafactory@file:projects/arm-datafactory.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 @@ -13099,7 +13154,6 @@ snapshots: dotenv: 16.4.7 playwright: 1.50.0 tslib: 2.8.1 - tsx: 4.19.2 typescript: 5.7.3 vitest: 3.0.4(@types/debug@4.1.12)(@types/node@18.19.74)(@vitest/browser@3.0.4)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: @@ -13120,6 +13174,7 @@ snapshots: - sugarss - supports-color - terser + - tsx - utf-8-validate - vite - webdriverio @@ -13127,7 +13182,6 @@ snapshots: '@rush-temp/arm-datalake-analytics@file:projects/arm-datalake-analytics.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13162,7 +13216,6 @@ snapshots: '@rush-temp/arm-datamigration@file:projects/arm-datamigration.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -20338,6 +20391,7 @@ snapshots: '@rush-temp/monitor-query@file:projects/monitor-query.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: + '@azure/monitor-opentelemetry-exporter': 1.0.0-beta.27 '@opentelemetry/api': 1.9.0 '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) @@ -21198,7 +21252,6 @@ snapshots: '@types/debug': 4.1.12 '@types/is-buffer': 2.0.2 '@types/node': 18.19.74 - '@types/uuid': 8.3.4 '@types/ws': 7.4.7 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) @@ -21219,7 +21272,6 @@ snapshots: rhea-promise: 3.0.3 tslib: 2.8.1 typescript: 5.7.3 - uuid: 8.3.2 vitest: 3.0.4(@types/debug@4.1.12)(@types/node@18.19.74)(@vitest/browser@3.0.4)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.7.0) ws: 8.18.0 transitivePeerDependencies: diff --git a/sdk/ai/ai-inference-rest/package.json b/sdk/ai/ai-inference-rest/package.json index c99f4e6cb4e5..608350d23f98 100644 --- a/sdk/ai/ai-inference-rest/package.json +++ b/sdk/ai/ai-inference-rest/package.json @@ -95,7 +95,7 @@ "@azure/dev-tool": "^1.0.0", "@azure/eslint-plugin-azure-sdk": "^3.0.0", "@azure/identity": "^4.3.0", - "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.27", + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.28", "@azure/opentelemetry-instrumentation-azure-sdk": "1.0.0-beta.7", "@opentelemetry/api": "^1.9.0", "@opentelemetry/instrumentation": "^0.57.1", diff --git a/sdk/ai/ai-inference-rest/samples/v1-beta/javascript/package.json b/sdk/ai/ai-inference-rest/samples/v1-beta/javascript/package.json index 2a9eab1dd2b4..d4563620ec0c 100644 --- a/sdk/ai/ai-inference-rest/samples/v1-beta/javascript/package.json +++ b/sdk/ai/ai-inference-rest/samples/v1-beta/javascript/package.json @@ -35,6 +35,6 @@ "@opentelemetry/instrumentation": "^0.57.0", "@azure/opentelemetry-instrumentation-azure-sdk": "1.0.0-beta.7", "@opentelemetry/sdk-trace-node": "^1.30.0", - "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.27" + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.28" } } diff --git a/sdk/ai/ai-inference-rest/samples/v1-beta/typescript/package.json b/sdk/ai/ai-inference-rest/samples/v1-beta/typescript/package.json index 75ce03a64642..566f17b922c1 100644 --- a/sdk/ai/ai-inference-rest/samples/v1-beta/typescript/package.json +++ b/sdk/ai/ai-inference-rest/samples/v1-beta/typescript/package.json @@ -39,7 +39,7 @@ "@opentelemetry/instrumentation": "^0.57.0", "@azure/opentelemetry-instrumentation-azure-sdk": "1.0.0-beta.7", "@opentelemetry/sdk-trace-node": "^1.30.0", - "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.27" + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.28" }, "devDependencies": { "@types/node": "^18.0.0", diff --git a/sdk/ai/ai-projects/package.json b/sdk/ai/ai-projects/package.json index fd7dd89f2321..c8b12e938484 100644 --- a/sdk/ai/ai-projects/package.json +++ b/sdk/ai/ai-projects/package.json @@ -75,7 +75,7 @@ "@azure/eslint-plugin-azure-sdk": "^3.0.0", "@azure/identity": "^4.3.0", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.7", - "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.27", + "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.28", "@azure-tools/test-credential": "^2.0.0", "@azure-tools/test-recorder": "^4.1.0", "@azure-tools/test-utils-vitest": "^1.0.0", diff --git a/sdk/ai/ai-projects/samples/v1-beta/javascript/package.json b/sdk/ai/ai-projects/samples/v1-beta/javascript/package.json index f70e39db603e..91d7b63210a0 100644 --- a/sdk/ai/ai-projects/samples/v1-beta/javascript/package.json +++ b/sdk/ai/ai-projects/samples/v1-beta/javascript/package.json @@ -28,7 +28,7 @@ "dependencies": { "@azure/ai-projects": "next", "dotenv": "latest", - "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.27", + "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.28", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.7", "@opentelemetry/api": "^1.9.0", "@opentelemetry/instrumentation": "0.53.0", diff --git a/sdk/ai/ai-projects/samples/v1-beta/typescript/package.json b/sdk/ai/ai-projects/samples/v1-beta/typescript/package.json index 3b0a808b8cfb..580bbca38132 100644 --- a/sdk/ai/ai-projects/samples/v1-beta/typescript/package.json +++ b/sdk/ai/ai-projects/samples/v1-beta/typescript/package.json @@ -32,7 +32,7 @@ "dependencies": { "@azure/ai-projects": "next", "dotenv": "latest", - "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.27", + "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.28", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.7", "@opentelemetry/api": "^1.9.0", "@opentelemetry/instrumentation": "0.53.0", diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index 11c55acc6d53..ad6ec8d025c0 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -85,7 +85,7 @@ "@azure/core-client": "^1.0.0", "@azure/core-rest-pipeline": "^1.1.0", "@azure/logger": "^1.0.0", - "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.28", + "1.0.0-beta.28", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.7", "@microsoft/applicationinsights-web-snippet": "^1.2.1", "@opentelemetry/api": "^1.9.0", diff --git a/sdk/monitor/monitor-query/package.json b/sdk/monitor/monitor-query/package.json index dd5abfa3081a..6c9794999b5d 100644 --- a/sdk/monitor/monitor-query/package.json +++ b/sdk/monitor/monitor-query/package.json @@ -102,7 +102,7 @@ "@azure/dev-tool": "^1.0.0", "@azure/eslint-plugin-azure-sdk": "^3.0.0", "@azure/identity": "^4.0.1", - "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.27", + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.28", "@opentelemetry/api": "^1.9.0", "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/sdk-trace-node": "^1.30.1", From 91513bc63ff0cc043d91995afc74208930c11142 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 15:25:00 -0800 Subject: [PATCH 03/21] Fix package format. --- sdk/monitor/monitor-opentelemetry/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index ad6ec8d025c0..11c55acc6d53 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -85,7 +85,7 @@ "@azure/core-client": "^1.0.0", "@azure/core-rest-pipeline": "^1.1.0", "@azure/logger": "^1.0.0", - "1.0.0-beta.28", + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.28", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.7", "@microsoft/applicationinsights-web-snippet": "^1.2.1", "@opentelemetry/api": "^1.9.0", From 951f30722227f31a3d3bb7328547421cde27a038 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 16:18:05 -0800 Subject: [PATCH 04/21] Update pnpm-lock.yaml --- common/config/rush/pnpm-lock.yaml | 143 ++++++++++-------------------- 1 file changed, 49 insertions(+), 94 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 4fcaf3c4a91a..4cbc61b5e953 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -792,7 +792,7 @@ importers: version: file:projects/arm-timeseriesinsights.tgz '@rush-temp/arm-trafficmanager': specifier: file:./projects/arm-trafficmanager.tgz - version: file:projects/arm-trafficmanager.tgz + version: file:projects/arm-trafficmanager.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) '@rush-temp/arm-trustedsigning': specifier: file:./projects/arm-trustedsigning.tgz version: file:projects/arm-trustedsigning.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) @@ -1381,10 +1381,6 @@ packages: resolution: {integrity: sha512-PB9GlnfojcQ4nf9WXdQvWeAk7gm8P74o+Z5IHz5YLK/W+3vrNrmVVVuFpGOvCPrLjag50UinaZsMBtPtxoiobg==} engines: {node: '>=14.0.0'} - '@azure/monitor-opentelemetry-exporter@1.0.0-beta.27': - resolution: {integrity: sha512-21iXu9ubtPB7iO3ghnzMMdB0KwHpz7Zl1a9xSBR3Gl8IDUlXOBjMn6OT9+ycj9VZrTyEKiV59T9VTf0IlokPYQ==} - engines: {node: '>=18.0.0'} - '@azure/msal-browser@4.0.2': resolution: {integrity: sha512-bq6PasUpJgBSOSMeSlh8gXh4LZGgAaPoJFNcu5u0zxwueh+I8NpMb9oxlCfS/8CJHyXUhTUAMLSnvThemNdyQw==} engines: {node: '>=0.8.0'} @@ -2190,12 +2186,6 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@1.26.0': - resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@1.30.1': resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} @@ -2374,24 +2364,12 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resources@1.26.0': - resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.30.1': resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-logs@0.53.0': - resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-logs@0.57.1': resolution: {integrity: sha512-jGdObb/BGWu6Peo3cL3skx/Rl1Ak/wDDO3vpPrrThGbqE7isvkCsX6uE+OAt8Ayjm9YC8UGkohWbLR09JmM0FA==} engines: {node: '>=14'} @@ -2674,7 +2652,7 @@ packages: version: 0.0.0 '@rush-temp/ai-inference@file:projects/ai-inference.tgz': - resolution: {integrity: sha512-pRLZ+VKFlpK0r48LLuyuySS3P5ag+KRbSJj1B38FYvqIztoqY9CrGyHB470JVvbciVypbw8MdMA35Z/upmrRdQ==, tarball: file:projects/ai-inference.tgz} + resolution: {integrity: sha512-aYCTDI+1ku2ekPsq3SIi9EzHHJL7T6HmMse4xfBigI7/mYlpkytV5MM5CqPK/0ZAHjRc8yqxUBP6EMOh0my5dQ==, tarball: file:projects/ai-inference.tgz} version: 0.0.0 '@rush-temp/ai-language-conversations@file:projects/ai-language-conversations.tgz': @@ -2694,7 +2672,7 @@ packages: version: 0.0.0 '@rush-temp/ai-projects@file:projects/ai-projects.tgz': - resolution: {integrity: sha512-BXHStxw/ilX6aO+nU/v9ZTijLJGqGUNPTOgcKOMezRJ3oHy1W3YaPwnd2mgfb375r4oCzxI9tgqAGCudmDGR9Q==, tarball: file:projects/ai-projects.tgz} + resolution: {integrity: sha512-olWaOR+lScYd4KfOBFDagJ6zLA728vt+08hSgNDsM182EdAAAYN2c5dqJ7BsN/1rv7I6rb6lywdCSQ5gK9pABQ==, tarball: file:projects/ai-projects.tgz} version: 0.0.0 '@rush-temp/ai-text-analytics@file:projects/ai-text-analytics.tgz': @@ -2726,7 +2704,7 @@ packages: version: 0.0.0 '@rush-temp/app-configuration@file:projects/app-configuration.tgz': - resolution: {integrity: sha512-vjq2Gao56nWls4WanTBCTwwjx58Tjne7vWsJzG6pjaM3KnNVuC91v97x+MT2OKq4EmRYJ3yTNFs6T+Vg7rVJmQ==, tarball: file:projects/app-configuration.tgz} + resolution: {integrity: sha512-TVqurxZGAWBtJuzZTr+rUdJM9eHGgTu7h638ukTCZG/7CrBHM+MrpfE4mEkiArgpjGYfSS7p+abAvGZJ5PYFBg==, tarball: file:projects/app-configuration.tgz} version: 0.0.0 '@rush-temp/arm-advisor@file:projects/arm-advisor.tgz': @@ -3686,7 +3664,7 @@ packages: version: 0.0.0 '@rush-temp/arm-trafficmanager@file:projects/arm-trafficmanager.tgz': - resolution: {integrity: sha512-E/sq0Q6UOECHqvLvzEoW71y/JiYLGQbStpmLxYRUZZWvGiKtjaydeDZB9yLx6fg+UrtUw/hgqXpfXoSvUIXgEg==, tarball: file:projects/arm-trafficmanager.tgz} + resolution: {integrity: sha512-Vkh7H1+d90veBVsDJCGUX5XbJhLu/TLr6io/DstEacEsf19H5ff1nBbzOywCJoCZ73zPyelbFKs2zpGvelcrAg==, tarball: file:projects/arm-trafficmanager.tgz} version: 0.0.0 '@rush-temp/arm-trustedsigning@file:projects/arm-trustedsigning.tgz': @@ -3850,7 +3828,7 @@ packages: version: 0.0.0 '@rush-temp/cosmos@file:projects/cosmos.tgz': - resolution: {integrity: sha512-v9YVLjFKbVmx5EWiE7LsPWU04QvgDtvIkB2cGhQhm+sbNsCmXtdvkuRLCU7KqB/fWUMjAmnE14leCv/9cKYr8Q==, tarball: file:projects/cosmos.tgz} + resolution: {integrity: sha512-Oo1YC8Bl9JY/gJF6MTQWnAhSRPfZvqjaXfuU4SUsyRGmamwrkDfigyUJYEcqRwCF4JyZ+JjkgIdVER9nITATsA==, tarball: file:projects/cosmos.tgz} version: 0.0.0 '@rush-temp/create-microsoft-playwright-testing@file:projects/create-microsoft-playwright-testing.tgz': @@ -3898,11 +3876,11 @@ packages: version: 0.0.0 '@rush-temp/eventhubs-checkpointstore-blob@file:projects/eventhubs-checkpointstore-blob.tgz': - resolution: {integrity: sha512-DbmOo34cAhRN4xCxJ+CnKHJaHYjYAk6vZr0wRKsBxeTIbxJkL2ESFrEw3/yixU3svDT2Gr+xi/rYnl4aNdkhGQ==, tarball: file:projects/eventhubs-checkpointstore-blob.tgz} + resolution: {integrity: sha512-4bWI8Y2wx29aieLXJSW8yuVSlKIDqMCjQxjCtQbYmwOo/vQ0Ynp4r9Ub721S4I09VoLG0psx3GhYPlz67x6LGg==, tarball: file:projects/eventhubs-checkpointstore-blob.tgz} version: 0.0.0 '@rush-temp/eventhubs-checkpointstore-table@file:projects/eventhubs-checkpointstore-table.tgz': - resolution: {integrity: sha512-fM504j6XfwH9KokQ89iHSsW04WHa2z+0pVnDZ7XbqP5YWePdaTwtX3vaF4p2tVJuE3OLEO0soGrUCIStwg4Nig==, tarball: file:projects/eventhubs-checkpointstore-table.tgz} + resolution: {integrity: sha512-km+Bp77eWlqjmK39ngutzVuXBafw2kzvBQKkdMIwMhlN4Q7QkDHYScGW/bA//KtZjgaVbNPTG9jxHbMSYX49tw==, tarball: file:projects/eventhubs-checkpointstore-table.tgz} version: 0.0.0 '@rush-temp/functions-authentication-events@file:projects/functions-authentication-events.tgz': @@ -4022,15 +4000,15 @@ packages: version: 0.0.0 '@rush-temp/monitor-opentelemetry-exporter@file:projects/monitor-opentelemetry-exporter.tgz': - resolution: {integrity: sha512-hEnlLvehlh3ejDkAZMH2pTtAPU+i6O550upJ4DPMW89QmlerdmJT9CJt3u8yCb6af/ei6C871wpRH/JEXKk4ig==, tarball: file:projects/monitor-opentelemetry-exporter.tgz} + resolution: {integrity: sha512-zkjFwSF6XaWqqgTseIApfabjxBusvCV2GCPAH0784331hWHMlVMm2mnpVoLpR4EUD3/m2sK9/UTvRzAuToJhTQ==, tarball: file:projects/monitor-opentelemetry-exporter.tgz} version: 0.0.0 '@rush-temp/monitor-opentelemetry@file:projects/monitor-opentelemetry.tgz': - resolution: {integrity: sha512-z5UtXbsaWkLnIHmEMZoEtUXx1JlX0h8qgs+NUDTrIhb4eeKvLQQq7MdBn5ebvQ5+IK9X7Eo48plVd7uc0klcuQ==, tarball: file:projects/monitor-opentelemetry.tgz} + resolution: {integrity: sha512-XCp3e1E1Qj+LdCmuDtuI4lpUYOWxXSi605U4I+lcTCBV32Qdtz4bRMu0+TDWh2TemD63u/QacXshllWPVjPVyQ==, tarball: file:projects/monitor-opentelemetry.tgz} version: 0.0.0 '@rush-temp/monitor-query@file:projects/monitor-query.tgz': - resolution: {integrity: sha512-cOOWwNg4PVHrU2kHAj7iQseDZfLpiQqxZjt1w1DrUsJscBRnIOi0+Gj0VJjdH8nKKLKd24Bq79teSp11dluVcg==, tarball: file:projects/monitor-query.tgz} + resolution: {integrity: sha512-QySGA7L+mDLcyYqOmT0uB3vusB6f8FBSVbJPPkU0lpSji3nBLw590UHS8m8UOdKSdDKKZOGhgYyCbAFWML42sA==, tarball: file:projects/monitor-query.tgz} version: 0.0.0 '@rush-temp/notification-hubs@file:projects/notification-hubs.tgz': @@ -4078,7 +4056,7 @@ packages: version: 0.0.0 '@rush-temp/perf-event-hubs@file:projects/perf-event-hubs.tgz': - resolution: {integrity: sha512-XPsqbfMqeWuXqOoYOcqK/7YecXtpu4bkSlYYqa0JHsqNb7wfDe8bj5HDXguNqvabsHTcB6BxP5gVPLea/JWNsw==, tarball: file:projects/perf-event-hubs.tgz} + resolution: {integrity: sha512-H678jAymOp3nc6EG4H308t3D5K2Nl3LuKmO8+qJlaeMchj8Ehaop94CpOn9FVNjeRRT5zjSqtmeosolCucFBjg==, tarball: file:projects/perf-event-hubs.tgz} version: 0.0.0 '@rush-temp/perf-eventgrid@file:projects/perf-eventgrid.tgz': @@ -4170,11 +4148,11 @@ packages: version: 0.0.0 '@rush-temp/schema-registry-avro@file:projects/schema-registry-avro.tgz': - resolution: {integrity: sha512-f2KsjKlSwNStRGn2cgkcJ4UfudS+WLMw3a96BOAtFRJxrpHnOZsdzQZAGXxM4KXNfcvKHxiYDGnjU2yCqhvy4Q==, tarball: file:projects/schema-registry-avro.tgz} + resolution: {integrity: sha512-gDtFjHRTpg080DOLALhNomtt2FufRwILNg6aDM0EKL6I+cDizUpAnzZ1/H5y9mGD63hohGlDCjQezo6TIerKbw==, tarball: file:projects/schema-registry-avro.tgz} version: 0.0.0 '@rush-temp/schema-registry-json@file:projects/schema-registry-json.tgz': - resolution: {integrity: sha512-6ndRHittj388RlbMOqSf3/a/hw0LfmBHg2LgD1DQLtkV1oi4PZgC/zZFGTHN48XGjxmwVEnNwjMolIp9yESMGw==, tarball: file:projects/schema-registry-json.tgz} + resolution: {integrity: sha512-ZwFbFtIFKLrC3h+7A7Ct8dPokgFmUaCKXsxIIFETiJCMcoBGxAvvAmP59/E5S8l4AgeE7RcQuw4FdN/ySLbwBg==, tarball: file:projects/schema-registry-json.tgz} version: 0.0.0 '@rush-temp/schema-registry@file:projects/schema-registry.tgz': @@ -6935,9 +6913,9 @@ packages: nise@6.1.1: resolution: {integrity: sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==} - nock@13.5.6: - resolution: {integrity: sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==} - engines: {node: '>= 10.13'} + nock@14.0.0: + resolution: {integrity: sha512-3Z2ZoZoYTR/y2I+NI16+6IzfZFKBX7MrADtoBAm7v/QKqxQUhKw+Dh+847PPS1j/FDutjfIXfrh3CJF74yITWg==} + engines: {node: '>= 18'} node-abi@3.73.0: resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==} @@ -8872,23 +8850,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/monitor-opentelemetry-exporter@1.0.0-beta.27': - dependencies: - '@azure/core-auth': 1.9.0 - '@azure/core-client': 1.9.2 - '@azure/core-rest-pipeline': 1.18.2 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.53.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - '@azure/msal-browser@4.0.2': dependencies: '@azure/msal-common': 15.0.2 @@ -9630,11 +9591,6 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -9898,25 +9854,12 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 - '@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.53.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs@0.57.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -10403,7 +10346,6 @@ snapshots: dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 - '@azure/monitor-opentelemetry-exporter': 1.0.0-beta.27 '@azure/opentelemetry-instrumentation-azure-sdk': 1.0.0-beta.7 '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0) @@ -10899,7 +10841,7 @@ snapshots: '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) dotenv: 16.4.7 eslint: 9.19.0 - nock: 13.5.6 + nock: 14.0.0 playwright: 1.50.0 tslib: 2.8.1 typescript: 5.7.3 @@ -17291,23 +17233,39 @@ snapshots: - '@swc/wasm' - supports-color - '@rush-temp/arm-trafficmanager@file:projects/arm-trafficmanager.tgz': + '@rush-temp/arm-trafficmanager@file:projects/arm-trafficmanager.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure-tools/test-credential': 1.3.1 - '@azure-tools/test-recorder': 3.5.2 - '@types/chai': 4.3.20 - '@types/mocha': 10.0.10 '@types/node': 18.19.74 - chai: 4.5.0 + '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) + '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) dotenv: 16.4.7 - mocha: 11.1.0 - ts-node: 10.9.2(@types/node@18.19.74)(typescript@5.7.3) + playwright: 1.50.0 tslib: 2.8.1 typescript: 5.7.3 + vitest: 3.0.4(@types/debug@4.1.12)(@types/node@18.19.74)(@vitest/browser@3.0.4)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - '@edge-runtime/vm' + - '@types/debug' + - '@vitest/ui' + - bufferutil + - happy-dom + - jiti + - jsdom + - less + - lightningcss + - msw + - safaridriver + - sass + - sass-embedded + - stylus + - sugarss - supports-color + - terser + - tsx + - utf-8-validate + - vite + - webdriverio + - yaml '@rush-temp/arm-trustedsigning@file:projects/arm-trustedsigning.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: @@ -18705,7 +18663,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 jsbi: 4.3.0 mocha: 11.1.0 - nock: 13.5.6 + nock: 14.0.0 priorityqueuejs: 2.0.0 requirejs: 2.3.7 semaphore: 1.1.0 @@ -20318,7 +20276,7 @@ snapshots: '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) dotenv: 16.4.7 eslint: 9.19.0 - nock: 13.5.6 + nock: 14.0.0 playwright: 1.50.0 tslib: 2.8.1 typescript: 5.7.3 @@ -20379,7 +20337,7 @@ snapshots: dotenv: 16.4.7 eslint: 9.19.0 mocha: 11.1.0 - nock: 13.5.6 + nock: 14.0.0 nyc: 17.1.0 sinon: 17.0.1 tslib: 2.8.1 @@ -20391,7 +20349,6 @@ snapshots: '@rush-temp/monitor-query@file:projects/monitor-query.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/monitor-opentelemetry-exporter': 1.0.0-beta.27 '@opentelemetry/api': 1.9.0 '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) @@ -25319,13 +25276,11 @@ snapshots: just-extend: 6.2.0 path-to-regexp: 8.2.0 - nock@13.5.6: + nock@14.0.0: dependencies: - debug: 4.4.0(supports-color@8.1.1) + '@mswjs/interceptors': 0.37.5 json-stringify-safe: 5.0.1 propagate: 2.0.1 - transitivePeerDependencies: - - supports-color node-abi@3.73.0: dependencies: From 1a4a5db313040092a3f75ec633709a31724a115c Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 17:31:07 -0800 Subject: [PATCH 05/21] Update traceHandler.test.ts --- .../test/internal/unit/traces/traceHandler.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts index c441fb018ca7..f7735caab149 100644 --- a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts +++ b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts @@ -126,6 +126,7 @@ describe("Library/TraceHandler", () => { .then(() => { assert.ok(exportStub.calledOnce, "Export called"); const spans = exportStub.args[0][0]; + console.log(`BIG TEST FOR THIS TEST WOW TEST: ${JSON.stringify(spans[0].attributes)}`); assert.deepStrictEqual(spans.length, 2); // Incoming request assert.deepStrictEqual(spans[0].name, "GET"); @@ -174,7 +175,6 @@ describe("Library/TraceHandler", () => { `http://localhost:${mockHttpServerPort}/test`, ); assert.deepStrictEqual(spans[1].attributes["net.peer.name"], "localhost"); - assert.deepStrictEqual(spans[1].attributes["net.peer.port"], mockHttpServerPort); assert.deepStrictEqual( spans[0]["_spanContext"]["traceId"], From 75b323be25eb0f561a6a952934a98dfff0e5d4dc Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 17:47:21 -0800 Subject: [PATCH 06/21] Update timeout. --- sdk/monitor/monitor-opentelemetry/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index 2e0142a03672..36ff46048d95 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -31,7 +31,7 @@ "test:node": "npm run clean && npm run build:test && npm run unit-test:node", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "unit-test:browser": "echo skipped", - "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 1200000 \"test/internal/unit/**/*.test.ts\"", + "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 2000000 \"test/internal/unit/**/*.test.ts\"", "update-snippets": "echo skipped" }, "engines": { From e85ae0ae6629fdd65800f51c8d05100661fe7675 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 18:31:52 -0800 Subject: [PATCH 07/21] Update traceHandler.test.ts --- .../test/internal/unit/traces/traceHandler.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts index f7735caab149..eb78d5e6ada8 100644 --- a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts +++ b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts @@ -126,7 +126,6 @@ describe("Library/TraceHandler", () => { .then(() => { assert.ok(exportStub.calledOnce, "Export called"); const spans = exportStub.args[0][0]; - console.log(`BIG TEST FOR THIS TEST WOW TEST: ${JSON.stringify(spans[0].attributes)}`); assert.deepStrictEqual(spans.length, 2); // Incoming request assert.deepStrictEqual(spans[0].name, "GET"); From a4bac24e58f044d35bb282c47f35a1bca96e8cc3 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Tue, 28 Jan 2025 19:21:57 -0800 Subject: [PATCH 08/21] Test if it's a timeout issue. --- sdk/monitor/monitor-opentelemetry/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index 36ff46048d95..198dc51fc2e9 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -31,7 +31,7 @@ "test:node": "npm run clean && npm run build:test && npm run unit-test:node", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "unit-test:browser": "echo skipped", - "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 2000000 \"test/internal/unit/**/*.test.ts\"", + "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 20000000 \"test/internal/unit/**/*.test.ts\"", "update-snippets": "echo skipped" }, "engines": { From 2e85a70f40df9568ea11657bea8edeaeb80b6316 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Wed, 29 Jan 2025 13:30:37 -0800 Subject: [PATCH 09/21] Expand unit test time to test if we can fix timeout. --- sdk/monitor/monitor-opentelemetry/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index 198dc51fc2e9..1304b9d9396a 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -31,7 +31,7 @@ "test:node": "npm run clean && npm run build:test && npm run unit-test:node", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "unit-test:browser": "echo skipped", - "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 20000000 \"test/internal/unit/**/*.test.ts\"", + "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 200000000 \"test/internal/unit/**/*.test.ts\"", "update-snippets": "echo skipped" }, "engines": { From 5c78d79e76cfdf89ddf21ef6b1d914e4c5acd490 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Wed, 29 Jan 2025 15:25:48 -0800 Subject: [PATCH 10/21] Change timeout settings. --- .../monitor-opentelemetry-exporter/vitest.integration.config.ts | 2 +- sdk/monitor/monitor-opentelemetry/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts b/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts index 67bfebdc75a5..359d36571be9 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts @@ -9,7 +9,7 @@ export default mergeConfig( viteConfig, defineConfig({ test: { - testTimeout: 600000, + testTimeout: 900000, include: ["test/internal/functional/**/*.test.ts"], }, }), diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index 1304b9d9396a..2e0142a03672 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -31,7 +31,7 @@ "test:node": "npm run clean && npm run build:test && npm run unit-test:node", "unit-test": "npm run unit-test:node && npm run unit-test:browser", "unit-test:browser": "echo skipped", - "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 200000000 \"test/internal/unit/**/*.test.ts\"", + "unit-test:node": "dev-tool run test:node-tsx-ts --no-test-proxy -- --timeout 1200000 \"test/internal/unit/**/*.test.ts\"", "update-snippets": "echo skipped" }, "engines": { From 5f907d5e9e5536c72e4838628775a7b91d44bd58 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Wed, 29 Jan 2025 20:38:50 -0800 Subject: [PATCH 11/21] Isolate build issue. --- .../test/internal/statsbeat.spec.ts | 850 +++++++++--------- 1 file changed, 425 insertions(+), 425 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts index 5f20272f2f76..fefd62c9507e 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts @@ -1,425 +1,425 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { ExportResultCode } from "@opentelemetry/core"; -import { failedBreezeResponse, successfulBreezeResponse } from "../utils/breezeTestUtils.js"; -import { - DEFAULT_BREEZE_ENDPOINT, - ENV_DISABLE_STATSBEAT, - LEGACY_ENV_DISABLE_STATSBEAT, -} from "../../src/Declarations/Constants.js"; -import nock from "nock"; -import { NetworkStatsbeatMetrics } from "../../src/export/statsbeat/networkStatsbeatMetrics.js"; -import { StatsbeatCounter } from "../../src/export/statsbeat/types.js"; -import { getInstance } from "../../src/export/statsbeat/longIntervalStatsbeatMetrics.js"; -import { AzureMonitorTraceExporter } from "../../src/export/trace.js"; -import { diag } from "@opentelemetry/api"; -import { describe, it, assert, expect, vi, beforeAll, afterAll } from "vitest"; - -describe("#AzureMonitorStatsbeatExporter", () => { - process.env.LONG_INTERVAL_EXPORT_MILLIS = "100"; - process.env.AZURE_MONITOR_STATSBEAT_FEATURES = JSON.stringify({ - // Represents DISKRETRY and AADHANDLING features enabled - feature: 3, - // Represents REDIS and MONGODB instrumentations enabled - instrumentation: 10, - }); - - const options = { - instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", - endpointUrl: "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", - }; - - const exportOptions = { - connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, - }; - - const disableOfflineStorageOptions = { - connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, - disableOfflineStorage: true, - }; - - describe("Export/Statsbeat", () => { - let scope: nock.Interceptor; - const envelope = { - name: "Name", - time: new Date(), - }; - - beforeAll(() => { - scope = nock(DEFAULT_BREEZE_ENDPOINT).post("/v2.1/track"); - - it("should wait 15 seconds from startup to export long interval statsbeat", async () => { - const longIntervalStatsbeat = getInstance(options); - const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); - longIntervalStatsbeat["initialize"](); - expect(mockExport).not.toHaveBeenCalled(); - setTimeout(async () => { - expect(mockExport).toHaveBeenCalled(); - }, 15000); - }); - }); - - afterAll(() => { - vi.restoreAllMocks(); - nock.cleanAll(); - }); - - describe("Initialization, shutdown, and connection string functions", () => { - it("should pass the options to the exporter and create an HTTP sender", () => { - const exporter = new AzureMonitorTraceExporter(exportOptions); - assert.ok(exporter["sender"]); - assert.ok(exporter["options"]); - }); - it("should initialize statsbeat by default", async () => { - const exporter = new AzureMonitorTraceExporter(exportOptions); - const response = successfulBreezeResponse(1); - scope.reply(200, JSON.stringify(response)); - - const result = await exporter["sender"]["exportEnvelopes"]([envelope]); - assert.strictEqual(result.code, ExportResultCode.SUCCESS); - assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); - assert.strictEqual( - exporter?.["sender"]?.["networkStatsbeatMetrics"]?.["isInitialized"], - true, - ); - }); - - it("should use non EU connection string", () => { - const statsbeat = new NetworkStatsbeatMetrics({ - instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", - endpointUrl: "IngestionEndpoint=https://westus-0.in.applicationinsights.azure.com", - }); - assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westus-0"); - }); - - it("should use EU connection string", () => { - const statsbeat = new NetworkStatsbeatMetrics(options); - assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westeurope-5"); - }); - - it("getShortHost", () => { - const statsbeat = new NetworkStatsbeatMetrics(options); - assert.strictEqual( - statsbeat["getShortHost"]("http://westus02-1.in.applicationinsights.azure.com"), - "westus02", - ); - assert.strictEqual( - statsbeat["getShortHost"]("https://westus02-1.in.applicationinsights.azure.com"), - "westus02", - ); - assert.strictEqual(statsbeat["getShortHost"]("https://dc.services.visualstudio.com"), "dc"); - assert.strictEqual(statsbeat["getShortHost"]("https://www.test.com"), "test"); - }); - - it("should add correct network properties to the custom metric", () => { - const statsbeat = new NetworkStatsbeatMetrics(options); - // eslint-disable-next-line no-unused-expressions - statsbeat["statsCollectionShortInterval"]; - statsbeat.countSuccess(100); - const metric = statsbeat["networkStatsbeatCollection"][0]; - assert.strictEqual(metric.intervalRequestExecutionTime, 100); - - // Ensure network statsbeat attributes are populated - assert.strictEqual(statsbeat["attach"], "Manual"); - assert.strictEqual( - statsbeat["cikey"], - "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", - ); - assert.strictEqual(statsbeat["language"], "node"); - assert.strictEqual(statsbeat["resourceProvider"], "unknown"); - assert.strictEqual( - statsbeat["endpointUrl"], - "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", - ); - assert.ok(statsbeat["os"]); - assert.ok(statsbeat["runtimeVersion"]); - assert.ok(statsbeat["version"]); - }); - - it("should set common properties correctly", () => { - const originalEnv = process.env; - const newEnv = <{ [id: string]: string }>{}; - newEnv.WEBSITE_SITE_NAME = "test"; - process.env = newEnv; - const statsbeat = new NetworkStatsbeatMetrics(options); - assert.strictEqual(statsbeat["commonProperties"]["rp"], "appsvc"); - process.env = originalEnv; - }); - - it("should add correct long interval properties to the custom metric", () => { - const longIntervalStatsbeatMetrics = getInstance(options); - assert.ok(longIntervalStatsbeatMetrics); - // Represents the bitwise OR of NONE and AADHANDLING features - assert.strictEqual(longIntervalStatsbeatMetrics["feature"], 3); - // Represents the bitwise OR of MONGODB and REDIS instrumentations - assert.strictEqual(longIntervalStatsbeatMetrics["instrumentation"], 10); - assert.strictEqual(longIntervalStatsbeatMetrics["attachProperties"].rpId, ""); - }); - - it("should turn off statsbeat after max failures", async () => { - const exporter = new AzureMonitorTraceExporter(exportOptions); - const response = failedBreezeResponse(1, 200); - scope.reply(200, JSON.stringify(response)); - exporter["sender"]["statsbeatFailureCount"] = 4; - - const result = await exporter["sender"]["exportEnvelopes"]([envelope]); - assert.strictEqual(result.code, ExportResultCode.SUCCESS); - }); - - it("should not log error upon failed send if statsbeat is being sent", async () => { - const mockExport = vi.spyOn(diag, "error"); - const exporter = new AzureMonitorTraceExporter(exportOptions); - const response = failedBreezeResponse(1, 500); - scope.reply(500, JSON.stringify(response)); - exporter["sender"]["isStatsbeatSender"] = true; - await exporter["sender"]["exportEnvelopes"]([envelope]); - expect(mockExport).not.toHaveBeenCalled(); - }); - }); - - it("should mark statsbeat exporters as disableOfflineStorage when in the config", async () => { - const exporter = new AzureMonitorTraceExporter(disableOfflineStorageOptions); - const response = failedBreezeResponse(1, 502); - scope.reply(200, JSON.stringify(response)); - exporter["sender"]["disableOfflineStorage"] = true; - - const result = await exporter["sender"]["exportEnvelopes"]([envelope]); - assert.strictEqual(result.code, ExportResultCode.SUCCESS); - }); - - describe("Resource provider function", () => { - const statsbeat = new NetworkStatsbeatMetrics(options); - - it("it should determine if the rp is unknown", async () => { - await statsbeat["getResourceProvider"](); - assert.strictEqual(statsbeat["resourceProvider"], "unknown"); - }); - - it("it should determine if the rp is an app service", async () => { - const newEnv = <{ [id: string]: string }>{}; - newEnv["WEBSITE_SITE_NAME"] = "Test Website"; - newEnv["WEBSITE_HOME_STAMPNAME"] = "testhome"; - const originalEnv = process.env; - process.env = newEnv; - await statsbeat["getResourceProvider"](); - process.env = originalEnv; - assert.strictEqual(statsbeat["resourceProvider"], "appsvc"); - assert.strictEqual(statsbeat["resourceIdentifier"], "Test Website/testhome"); - }); - - it("should determine if the rp is an Azure Function", async () => { - const newEnv = <{ [id: string]: string }>{}; - newEnv["FUNCTIONS_WORKER_RUNTIME"] = "test"; - newEnv["WEBSITE_HOSTNAME"] = "testhost"; - const originalEnv = process.env; - process.env = newEnv; - await statsbeat["getResourceProvider"](); - process.env = originalEnv; - assert.strictEqual(statsbeat["resourceProvider"], "functions"); - assert.strictEqual(statsbeat["resourceIdentifier"], "testhost"); - }); - - it("should determine if the rp is an Azure VM", async () => { - const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); - getAzureComputeStub.mockResolvedValue(true); - - const newEnv = <{ [id: string]: string }>{}; - const originalEnv = process.env; - process.env = newEnv; - - await statsbeat["getResourceProvider"](); - process.env = originalEnv; - assert.strictEqual(statsbeat["resourceProvider"], "vm"); - assert.strictEqual(statsbeat["resourceIdentifier"], "undefined/undefined"); - }); - - it("should determine if the rp is AKS", async () => { - const newEnv = <{ [id: string]: string }>{}; - newEnv["AKS_ARM_NAMESPACE_ID"] = "testaks"; - const originalEnv = process.env; - process.env = newEnv; - - await statsbeat["getResourceProvider"](); - process.env = originalEnv; - assert.strictEqual(statsbeat["resourceProvider"], "aks"); - assert.strictEqual(statsbeat["resourceIdentifier"], "testaks"); - }); - - it("should override OS and VM info", async () => { - const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); - getAzureComputeStub.mockResolvedValue(true); - statsbeat["vmInfo"]["osType"] = "test"; - - const newEnv = <{ [id: string]: string }>{}; - const originalEnv = process.env; - process.env = newEnv; - - await statsbeat["getResourceProvider"](); - process.env = originalEnv; - assert.strictEqual(statsbeat["resourceProvider"], "vm"); - assert.strictEqual(statsbeat["os"], "test"); - }); - }); - - describe("Track data from statsbeats", () => { - let statsbeat: NetworkStatsbeatMetrics; - - beforeAll(() => { - process.env.WEBSITE_SITE_NAME = "test"; - statsbeat = new NetworkStatsbeatMetrics({ - ...options, - networkCollectionInterval: 100, - }); - }); - - afterAll(async () => { - await statsbeat.shutdown(); - process.env.WEBSITE_SITE_NAME = undefined; - }); - - it("should track duration", async () => { - const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); - statsbeat.countSuccess(100); - statsbeat.countRetry(206); - statsbeat.countFailure(200, 500); - statsbeat.countThrottle(402); - statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); - - await new Promise((resolve) => setTimeout(resolve, 120)); - expect(mockExport).toHaveBeenCalled(); - const resourceMetrics = mockExport.mock.calls[0][0]; - const scopeMetrics = resourceMetrics.scopeMetrics; - assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); - const metrics = scopeMetrics[0].metrics; - assert.strictEqual(metrics.length, 8, "Metrics count"); - assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.SUCCESS_COUNT); - assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.FAILURE_COUNT); - assert.strictEqual(metrics[2].descriptor.name, StatsbeatCounter.RETRY_COUNT); - assert.strictEqual(metrics[3].descriptor.name, StatsbeatCounter.THROTTLE_COUNT); - assert.strictEqual(metrics[4].descriptor.name, StatsbeatCounter.EXCEPTION_COUNT); - assert.strictEqual(metrics[5].descriptor.name, StatsbeatCounter.AVERAGE_DURATION); - - // Test that average duration is exported. - assert.strictEqual(metrics[5].dataPoints[0].value, 150); - }); - - it("should track statsbeat counts", async () => { - const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); - statsbeat.countSuccess(100); - statsbeat.countSuccess(100); - statsbeat.countSuccess(100); - statsbeat.countSuccess(100); - statsbeat.countFailure(200, 500); - statsbeat.countFailure(100, 500); - statsbeat.countFailure(200, 501); - statsbeat.countFailure(200, 502); - statsbeat.countRetry(206); - statsbeat.countRetry(206); - statsbeat.countRetry(204); - statsbeat.countThrottle(402); - statsbeat.countThrottle(439); - statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); - statsbeat.countException({ name: "Statsbeat2", message: "Second Statsbeat Exception" }); - statsbeat.countReadFailure(); - statsbeat.countWriteFailure(); - statsbeat.countWriteFailure(); - - await new Promise((resolve) => setTimeout(resolve, 500)); - expect(mockExport).toHaveBeenCalled(); - const resourceMetrics = mockExport.mock.calls[1][0]; - const scopeMetrics = resourceMetrics.scopeMetrics; - const metrics = scopeMetrics[0].metrics; - - assert.ok(metrics, "Statsbeat metrics not properly initialized"); - assert.strictEqual(metrics.length, 8); - // Represents the last observation called for each callback - // Successful - assert.strictEqual(metrics[0].dataPoints[0].value, 4); - - // Failed - assert.strictEqual(metrics[1].dataPoints[0].value, 2); - assert.strictEqual(metrics[1].dataPoints[0].attributes.statusCode, 500); - - assert.strictEqual(metrics[1].dataPoints[1].value, 1); - assert.strictEqual(metrics[1].dataPoints[1].attributes.statusCode, 501); - - assert.strictEqual(metrics[1].dataPoints[2].value, 1); - assert.strictEqual(metrics[1].dataPoints[2].attributes.statusCode, 502); - - // Retry - assert.strictEqual(metrics[2].dataPoints[0].value, 2); - assert.strictEqual(metrics[2].dataPoints[0].attributes.statusCode, 206); - - assert.strictEqual(metrics[2].dataPoints[1].value, 1); - assert.strictEqual(metrics[2].dataPoints[1].attributes.statusCode, 204); - - // Throttle - assert.strictEqual(metrics[3].dataPoints[0].value, 1); - assert.strictEqual(metrics[3].dataPoints[0].attributes.statusCode, 402); - - assert.strictEqual(metrics[3].dataPoints[1].value, 1); - assert.strictEqual(metrics[3].dataPoints[1].attributes.statusCode, 439); - - // Exception - assert.strictEqual(metrics[4].dataPoints[0].value, 1); - assert.strictEqual(metrics[4].dataPoints[0].attributes.exceptionType, "Statsbeat"); - - assert.strictEqual(metrics[4].dataPoints[1].value, 1); - assert.strictEqual(metrics[4].dataPoints[1].attributes.exceptionType, "Statsbeat2"); - - // Average Duration - assert.strictEqual(metrics[5].dataPoints[0].value, 137.5); - - // Disk Read Failure - assert.strictEqual(metrics[6].dataPoints[0].value, 1); - - // Disk Write Failure - assert.strictEqual(metrics[7].dataPoints[0].value, 2); - }); - - it("should track long interval statsbeats", async () => { - const longIntervalStatsbeat = getInstance(options); - const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); - - await new Promise((resolve) => setTimeout(resolve, 120)); - expect(mockExport).toHaveBeenCalled(); - const resourceMetrics = mockExport.mock.calls[0][0]; - const scopeMetrics = resourceMetrics.scopeMetrics; - assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); - const metrics = scopeMetrics[0].metrics; - assert.strictEqual(metrics.length, 2, "Metrics count"); - assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.FEATURE); - assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.ATTACH); - // Instrumentation statsbeat - assert.strictEqual(metrics[0].dataPoints[0].attributes.type, 1); - // Feature statsbeat - assert.strictEqual(metrics[0].dataPoints[1].attributes.type, 0); - - // Clean up env variables - delete process.env.STATSBEAT_INSTRUMENTATIONS; - delete process.env.STATSBEAT_FEATURES; - delete process.env.LONG_INTERVAL_EXPORT_MILLIS; - }); - }); - - describe("Disable Non-Essential Statsbeat", () => { - it("should disable statsbeat when the environement variable is set", () => { - process.env[ENV_DISABLE_STATSBEAT] = "true"; - const exporter = new AzureMonitorTraceExporter(exportOptions); - assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); - assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["readFailureGauge"]); - assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["writeFailureGauge"]); - delete process.env[ENV_DISABLE_STATSBEAT]; - }); - - it("should disable all statsbeat when the legacy environement variable is set", () => { - process.env[LEGACY_ENV_DISABLE_STATSBEAT] = "true"; - const exporter = new AzureMonitorTraceExporter(exportOptions); - assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]); - assert.ok(!exporter["sender"]["longIntervalStatsbeatMetrics"]); - delete process.env[LEGACY_ENV_DISABLE_STATSBEAT]; - }); - }); - }); -}); +// // Copyright (c) Microsoft Corporation. +// // Licensed under the MIT License. + +// import { ExportResultCode } from "@opentelemetry/core"; +// import { failedBreezeResponse, successfulBreezeResponse } from "../utils/breezeTestUtils.js"; +// import { +// DEFAULT_BREEZE_ENDPOINT, +// ENV_DISABLE_STATSBEAT, +// LEGACY_ENV_DISABLE_STATSBEAT, +// } from "../../src/Declarations/Constants.js"; +// import nock from "nock"; +// import { NetworkStatsbeatMetrics } from "../../src/export/statsbeat/networkStatsbeatMetrics.js"; +// import { StatsbeatCounter } from "../../src/export/statsbeat/types.js"; +// import { getInstance } from "../../src/export/statsbeat/longIntervalStatsbeatMetrics.js"; +// import { AzureMonitorTraceExporter } from "../../src/export/trace.js"; +// import { diag } from "@opentelemetry/api"; +// import { describe, it, assert, expect, vi, beforeAll, afterAll } from "vitest"; + +// describe("#AzureMonitorStatsbeatExporter", () => { +// process.env.LONG_INTERVAL_EXPORT_MILLIS = "100"; +// process.env.AZURE_MONITOR_STATSBEAT_FEATURES = JSON.stringify({ +// // Represents DISKRETRY and AADHANDLING features enabled +// feature: 3, +// // Represents REDIS and MONGODB instrumentations enabled +// instrumentation: 10, +// }); + +// const options = { +// instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", +// endpointUrl: "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", +// }; + +// const exportOptions = { +// connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, +// }; + +// const disableOfflineStorageOptions = { +// connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, +// disableOfflineStorage: true, +// }; + +// describe("Export/Statsbeat", () => { +// let scope: nock.Interceptor; +// const envelope = { +// name: "Name", +// time: new Date(), +// }; + +// beforeAll(() => { +// scope = nock(DEFAULT_BREEZE_ENDPOINT).post("/v2.1/track"); + +// it("should wait 15 seconds from startup to export long interval statsbeat", async () => { +// const longIntervalStatsbeat = getInstance(options); +// const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); +// longIntervalStatsbeat["initialize"](); +// expect(mockExport).not.toHaveBeenCalled(); +// setTimeout(async () => { +// expect(mockExport).toHaveBeenCalled(); +// }, 15000); +// }); +// }); + +// afterAll(() => { +// vi.restoreAllMocks(); +// nock.cleanAll(); +// }); + +// describe("Initialization, shutdown, and connection string functions", () => { +// it("should pass the options to the exporter and create an HTTP sender", () => { +// const exporter = new AzureMonitorTraceExporter(exportOptions); +// assert.ok(exporter["sender"]); +// assert.ok(exporter["options"]); +// }); +// it("should initialize statsbeat by default", async () => { +// const exporter = new AzureMonitorTraceExporter(exportOptions); +// const response = successfulBreezeResponse(1); +// scope.reply(200, JSON.stringify(response)); + +// const result = await exporter["sender"]["exportEnvelopes"]([envelope]); +// assert.strictEqual(result.code, ExportResultCode.SUCCESS); +// assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); +// assert.strictEqual( +// exporter?.["sender"]?.["networkStatsbeatMetrics"]?.["isInitialized"], +// true, +// ); +// }); + +// it("should use non EU connection string", () => { +// const statsbeat = new NetworkStatsbeatMetrics({ +// instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", +// endpointUrl: "IngestionEndpoint=https://westus-0.in.applicationinsights.azure.com", +// }); +// assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westus-0"); +// }); + +// it("should use EU connection string", () => { +// const statsbeat = new NetworkStatsbeatMetrics(options); +// assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westeurope-5"); +// }); + +// it("getShortHost", () => { +// const statsbeat = new NetworkStatsbeatMetrics(options); +// assert.strictEqual( +// statsbeat["getShortHost"]("http://westus02-1.in.applicationinsights.azure.com"), +// "westus02", +// ); +// assert.strictEqual( +// statsbeat["getShortHost"]("https://westus02-1.in.applicationinsights.azure.com"), +// "westus02", +// ); +// assert.strictEqual(statsbeat["getShortHost"]("https://dc.services.visualstudio.com"), "dc"); +// assert.strictEqual(statsbeat["getShortHost"]("https://www.test.com"), "test"); +// }); + +// it("should add correct network properties to the custom metric", () => { +// const statsbeat = new NetworkStatsbeatMetrics(options); +// // eslint-disable-next-line no-unused-expressions +// statsbeat["statsCollectionShortInterval"]; +// statsbeat.countSuccess(100); +// const metric = statsbeat["networkStatsbeatCollection"][0]; +// assert.strictEqual(metric.intervalRequestExecutionTime, 100); + +// // Ensure network statsbeat attributes are populated +// assert.strictEqual(statsbeat["attach"], "Manual"); +// assert.strictEqual( +// statsbeat["cikey"], +// "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", +// ); +// assert.strictEqual(statsbeat["language"], "node"); +// assert.strictEqual(statsbeat["resourceProvider"], "unknown"); +// assert.strictEqual( +// statsbeat["endpointUrl"], +// "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", +// ); +// assert.ok(statsbeat["os"]); +// assert.ok(statsbeat["runtimeVersion"]); +// assert.ok(statsbeat["version"]); +// }); + +// it("should set common properties correctly", () => { +// const originalEnv = process.env; +// const newEnv = <{ [id: string]: string }>{}; +// newEnv.WEBSITE_SITE_NAME = "test"; +// process.env = newEnv; +// const statsbeat = new NetworkStatsbeatMetrics(options); +// assert.strictEqual(statsbeat["commonProperties"]["rp"], "appsvc"); +// process.env = originalEnv; +// }); + +// it("should add correct long interval properties to the custom metric", () => { +// const longIntervalStatsbeatMetrics = getInstance(options); +// assert.ok(longIntervalStatsbeatMetrics); +// // Represents the bitwise OR of NONE and AADHANDLING features +// assert.strictEqual(longIntervalStatsbeatMetrics["feature"], 3); +// // Represents the bitwise OR of MONGODB and REDIS instrumentations +// assert.strictEqual(longIntervalStatsbeatMetrics["instrumentation"], 10); +// assert.strictEqual(longIntervalStatsbeatMetrics["attachProperties"].rpId, ""); +// }); + +// it("should turn off statsbeat after max failures", async () => { +// const exporter = new AzureMonitorTraceExporter(exportOptions); +// const response = failedBreezeResponse(1, 200); +// scope.reply(200, JSON.stringify(response)); +// exporter["sender"]["statsbeatFailureCount"] = 4; + +// const result = await exporter["sender"]["exportEnvelopes"]([envelope]); +// assert.strictEqual(result.code, ExportResultCode.SUCCESS); +// }); + +// it("should not log error upon failed send if statsbeat is being sent", async () => { +// const mockExport = vi.spyOn(diag, "error"); +// const exporter = new AzureMonitorTraceExporter(exportOptions); +// const response = failedBreezeResponse(1, 500); +// scope.reply(500, JSON.stringify(response)); +// exporter["sender"]["isStatsbeatSender"] = true; +// await exporter["sender"]["exportEnvelopes"]([envelope]); +// expect(mockExport).not.toHaveBeenCalled(); +// }); +// }); + +// it("should mark statsbeat exporters as disableOfflineStorage when in the config", async () => { +// const exporter = new AzureMonitorTraceExporter(disableOfflineStorageOptions); +// const response = failedBreezeResponse(1, 502); +// scope.reply(200, JSON.stringify(response)); +// exporter["sender"]["disableOfflineStorage"] = true; + +// const result = await exporter["sender"]["exportEnvelopes"]([envelope]); +// assert.strictEqual(result.code, ExportResultCode.SUCCESS); +// }); + +// describe("Resource provider function", () => { +// const statsbeat = new NetworkStatsbeatMetrics(options); + +// it("it should determine if the rp is unknown", async () => { +// await statsbeat["getResourceProvider"](); +// assert.strictEqual(statsbeat["resourceProvider"], "unknown"); +// }); + +// it("it should determine if the rp is an app service", async () => { +// const newEnv = <{ [id: string]: string }>{}; +// newEnv["WEBSITE_SITE_NAME"] = "Test Website"; +// newEnv["WEBSITE_HOME_STAMPNAME"] = "testhome"; +// const originalEnv = process.env; +// process.env = newEnv; +// await statsbeat["getResourceProvider"](); +// process.env = originalEnv; +// assert.strictEqual(statsbeat["resourceProvider"], "appsvc"); +// assert.strictEqual(statsbeat["resourceIdentifier"], "Test Website/testhome"); +// }); + +// it("should determine if the rp is an Azure Function", async () => { +// const newEnv = <{ [id: string]: string }>{}; +// newEnv["FUNCTIONS_WORKER_RUNTIME"] = "test"; +// newEnv["WEBSITE_HOSTNAME"] = "testhost"; +// const originalEnv = process.env; +// process.env = newEnv; +// await statsbeat["getResourceProvider"](); +// process.env = originalEnv; +// assert.strictEqual(statsbeat["resourceProvider"], "functions"); +// assert.strictEqual(statsbeat["resourceIdentifier"], "testhost"); +// }); + +// it("should determine if the rp is an Azure VM", async () => { +// const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); +// getAzureComputeStub.mockResolvedValue(true); + +// const newEnv = <{ [id: string]: string }>{}; +// const originalEnv = process.env; +// process.env = newEnv; + +// await statsbeat["getResourceProvider"](); +// process.env = originalEnv; +// assert.strictEqual(statsbeat["resourceProvider"], "vm"); +// assert.strictEqual(statsbeat["resourceIdentifier"], "undefined/undefined"); +// }); + +// it("should determine if the rp is AKS", async () => { +// const newEnv = <{ [id: string]: string }>{}; +// newEnv["AKS_ARM_NAMESPACE_ID"] = "testaks"; +// const originalEnv = process.env; +// process.env = newEnv; + +// await statsbeat["getResourceProvider"](); +// process.env = originalEnv; +// assert.strictEqual(statsbeat["resourceProvider"], "aks"); +// assert.strictEqual(statsbeat["resourceIdentifier"], "testaks"); +// }); + +// it("should override OS and VM info", async () => { +// const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); +// getAzureComputeStub.mockResolvedValue(true); +// statsbeat["vmInfo"]["osType"] = "test"; + +// const newEnv = <{ [id: string]: string }>{}; +// const originalEnv = process.env; +// process.env = newEnv; + +// await statsbeat["getResourceProvider"](); +// process.env = originalEnv; +// assert.strictEqual(statsbeat["resourceProvider"], "vm"); +// assert.strictEqual(statsbeat["os"], "test"); +// }); +// }); + +// describe("Track data from statsbeats", () => { +// let statsbeat: NetworkStatsbeatMetrics; + +// beforeAll(() => { +// process.env.WEBSITE_SITE_NAME = "test"; +// statsbeat = new NetworkStatsbeatMetrics({ +// ...options, +// networkCollectionInterval: 100, +// }); +// }); + +// afterAll(async () => { +// await statsbeat.shutdown(); +// process.env.WEBSITE_SITE_NAME = undefined; +// }); + +// it("should track duration", async () => { +// const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); +// statsbeat.countSuccess(100); +// statsbeat.countRetry(206); +// statsbeat.countFailure(200, 500); +// statsbeat.countThrottle(402); +// statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); + +// await new Promise((resolve) => setTimeout(resolve, 120)); +// expect(mockExport).toHaveBeenCalled(); +// const resourceMetrics = mockExport.mock.calls[0][0]; +// const scopeMetrics = resourceMetrics.scopeMetrics; +// assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); +// const metrics = scopeMetrics[0].metrics; +// assert.strictEqual(metrics.length, 8, "Metrics count"); +// assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.SUCCESS_COUNT); +// assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.FAILURE_COUNT); +// assert.strictEqual(metrics[2].descriptor.name, StatsbeatCounter.RETRY_COUNT); +// assert.strictEqual(metrics[3].descriptor.name, StatsbeatCounter.THROTTLE_COUNT); +// assert.strictEqual(metrics[4].descriptor.name, StatsbeatCounter.EXCEPTION_COUNT); +// assert.strictEqual(metrics[5].descriptor.name, StatsbeatCounter.AVERAGE_DURATION); + +// // Test that average duration is exported. +// assert.strictEqual(metrics[5].dataPoints[0].value, 150); +// }); + +// it("should track statsbeat counts", async () => { +// const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); +// statsbeat.countSuccess(100); +// statsbeat.countSuccess(100); +// statsbeat.countSuccess(100); +// statsbeat.countSuccess(100); +// statsbeat.countFailure(200, 500); +// statsbeat.countFailure(100, 500); +// statsbeat.countFailure(200, 501); +// statsbeat.countFailure(200, 502); +// statsbeat.countRetry(206); +// statsbeat.countRetry(206); +// statsbeat.countRetry(204); +// statsbeat.countThrottle(402); +// statsbeat.countThrottle(439); +// statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); +// statsbeat.countException({ name: "Statsbeat2", message: "Second Statsbeat Exception" }); +// statsbeat.countReadFailure(); +// statsbeat.countWriteFailure(); +// statsbeat.countWriteFailure(); + +// await new Promise((resolve) => setTimeout(resolve, 500)); +// expect(mockExport).toHaveBeenCalled(); +// const resourceMetrics = mockExport.mock.calls[1][0]; +// const scopeMetrics = resourceMetrics.scopeMetrics; +// const metrics = scopeMetrics[0].metrics; + +// assert.ok(metrics, "Statsbeat metrics not properly initialized"); +// assert.strictEqual(metrics.length, 8); +// // Represents the last observation called for each callback +// // Successful +// assert.strictEqual(metrics[0].dataPoints[0].value, 4); + +// // Failed +// assert.strictEqual(metrics[1].dataPoints[0].value, 2); +// assert.strictEqual(metrics[1].dataPoints[0].attributes.statusCode, 500); + +// assert.strictEqual(metrics[1].dataPoints[1].value, 1); +// assert.strictEqual(metrics[1].dataPoints[1].attributes.statusCode, 501); + +// assert.strictEqual(metrics[1].dataPoints[2].value, 1); +// assert.strictEqual(metrics[1].dataPoints[2].attributes.statusCode, 502); + +// // Retry +// assert.strictEqual(metrics[2].dataPoints[0].value, 2); +// assert.strictEqual(metrics[2].dataPoints[0].attributes.statusCode, 206); + +// assert.strictEqual(metrics[2].dataPoints[1].value, 1); +// assert.strictEqual(metrics[2].dataPoints[1].attributes.statusCode, 204); + +// // Throttle +// assert.strictEqual(metrics[3].dataPoints[0].value, 1); +// assert.strictEqual(metrics[3].dataPoints[0].attributes.statusCode, 402); + +// assert.strictEqual(metrics[3].dataPoints[1].value, 1); +// assert.strictEqual(metrics[3].dataPoints[1].attributes.statusCode, 439); + +// // Exception +// assert.strictEqual(metrics[4].dataPoints[0].value, 1); +// assert.strictEqual(metrics[4].dataPoints[0].attributes.exceptionType, "Statsbeat"); + +// assert.strictEqual(metrics[4].dataPoints[1].value, 1); +// assert.strictEqual(metrics[4].dataPoints[1].attributes.exceptionType, "Statsbeat2"); + +// // Average Duration +// assert.strictEqual(metrics[5].dataPoints[0].value, 137.5); + +// // Disk Read Failure +// assert.strictEqual(metrics[6].dataPoints[0].value, 1); + +// // Disk Write Failure +// assert.strictEqual(metrics[7].dataPoints[0].value, 2); +// }); + +// it("should track long interval statsbeats", async () => { +// const longIntervalStatsbeat = getInstance(options); +// const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); + +// await new Promise((resolve) => setTimeout(resolve, 120)); +// expect(mockExport).toHaveBeenCalled(); +// const resourceMetrics = mockExport.mock.calls[0][0]; +// const scopeMetrics = resourceMetrics.scopeMetrics; +// assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); +// const metrics = scopeMetrics[0].metrics; +// assert.strictEqual(metrics.length, 2, "Metrics count"); +// assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.FEATURE); +// assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.ATTACH); +// // Instrumentation statsbeat +// assert.strictEqual(metrics[0].dataPoints[0].attributes.type, 1); +// // Feature statsbeat +// assert.strictEqual(metrics[0].dataPoints[1].attributes.type, 0); + +// // Clean up env variables +// delete process.env.STATSBEAT_INSTRUMENTATIONS; +// delete process.env.STATSBEAT_FEATURES; +// delete process.env.LONG_INTERVAL_EXPORT_MILLIS; +// }); +// }); + +// describe("Disable Non-Essential Statsbeat", () => { +// it("should disable statsbeat when the environement variable is set", () => { +// process.env[ENV_DISABLE_STATSBEAT] = "true"; +// const exporter = new AzureMonitorTraceExporter(exportOptions); +// assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); +// assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["readFailureGauge"]); +// assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["writeFailureGauge"]); +// delete process.env[ENV_DISABLE_STATSBEAT]; +// }); + +// it("should disable all statsbeat when the legacy environement variable is set", () => { +// process.env[LEGACY_ENV_DISABLE_STATSBEAT] = "true"; +// const exporter = new AzureMonitorTraceExporter(exportOptions); +// assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]); +// assert.ok(!exporter["sender"]["longIntervalStatsbeatMetrics"]); +// delete process.env[LEGACY_ENV_DISABLE_STATSBEAT]; +// }); +// }); +// }); +// }); From 84afc349601eb6721da48b676ffe05ab3484575f Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 10:37:08 -0800 Subject: [PATCH 12/21] Delete statsbeat.spec.ts --- .../test/internal/statsbeat.spec.ts | 425 ------------------ 1 file changed, 425 deletions(-) delete mode 100644 sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts deleted file mode 100644 index fefd62c9507e..000000000000 --- a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts +++ /dev/null @@ -1,425 +0,0 @@ -// // Copyright (c) Microsoft Corporation. -// // Licensed under the MIT License. - -// import { ExportResultCode } from "@opentelemetry/core"; -// import { failedBreezeResponse, successfulBreezeResponse } from "../utils/breezeTestUtils.js"; -// import { -// DEFAULT_BREEZE_ENDPOINT, -// ENV_DISABLE_STATSBEAT, -// LEGACY_ENV_DISABLE_STATSBEAT, -// } from "../../src/Declarations/Constants.js"; -// import nock from "nock"; -// import { NetworkStatsbeatMetrics } from "../../src/export/statsbeat/networkStatsbeatMetrics.js"; -// import { StatsbeatCounter } from "../../src/export/statsbeat/types.js"; -// import { getInstance } from "../../src/export/statsbeat/longIntervalStatsbeatMetrics.js"; -// import { AzureMonitorTraceExporter } from "../../src/export/trace.js"; -// import { diag } from "@opentelemetry/api"; -// import { describe, it, assert, expect, vi, beforeAll, afterAll } from "vitest"; - -// describe("#AzureMonitorStatsbeatExporter", () => { -// process.env.LONG_INTERVAL_EXPORT_MILLIS = "100"; -// process.env.AZURE_MONITOR_STATSBEAT_FEATURES = JSON.stringify({ -// // Represents DISKRETRY and AADHANDLING features enabled -// feature: 3, -// // Represents REDIS and MONGODB instrumentations enabled -// instrumentation: 10, -// }); - -// const options = { -// instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", -// endpointUrl: "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", -// }; - -// const exportOptions = { -// connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, -// }; - -// const disableOfflineStorageOptions = { -// connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, -// disableOfflineStorage: true, -// }; - -// describe("Export/Statsbeat", () => { -// let scope: nock.Interceptor; -// const envelope = { -// name: "Name", -// time: new Date(), -// }; - -// beforeAll(() => { -// scope = nock(DEFAULT_BREEZE_ENDPOINT).post("/v2.1/track"); - -// it("should wait 15 seconds from startup to export long interval statsbeat", async () => { -// const longIntervalStatsbeat = getInstance(options); -// const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); -// longIntervalStatsbeat["initialize"](); -// expect(mockExport).not.toHaveBeenCalled(); -// setTimeout(async () => { -// expect(mockExport).toHaveBeenCalled(); -// }, 15000); -// }); -// }); - -// afterAll(() => { -// vi.restoreAllMocks(); -// nock.cleanAll(); -// }); - -// describe("Initialization, shutdown, and connection string functions", () => { -// it("should pass the options to the exporter and create an HTTP sender", () => { -// const exporter = new AzureMonitorTraceExporter(exportOptions); -// assert.ok(exporter["sender"]); -// assert.ok(exporter["options"]); -// }); -// it("should initialize statsbeat by default", async () => { -// const exporter = new AzureMonitorTraceExporter(exportOptions); -// const response = successfulBreezeResponse(1); -// scope.reply(200, JSON.stringify(response)); - -// const result = await exporter["sender"]["exportEnvelopes"]([envelope]); -// assert.strictEqual(result.code, ExportResultCode.SUCCESS); -// assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); -// assert.strictEqual( -// exporter?.["sender"]?.["networkStatsbeatMetrics"]?.["isInitialized"], -// true, -// ); -// }); - -// it("should use non EU connection string", () => { -// const statsbeat = new NetworkStatsbeatMetrics({ -// instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", -// endpointUrl: "IngestionEndpoint=https://westus-0.in.applicationinsights.azure.com", -// }); -// assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westus-0"); -// }); - -// it("should use EU connection string", () => { -// const statsbeat = new NetworkStatsbeatMetrics(options); -// assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westeurope-5"); -// }); - -// it("getShortHost", () => { -// const statsbeat = new NetworkStatsbeatMetrics(options); -// assert.strictEqual( -// statsbeat["getShortHost"]("http://westus02-1.in.applicationinsights.azure.com"), -// "westus02", -// ); -// assert.strictEqual( -// statsbeat["getShortHost"]("https://westus02-1.in.applicationinsights.azure.com"), -// "westus02", -// ); -// assert.strictEqual(statsbeat["getShortHost"]("https://dc.services.visualstudio.com"), "dc"); -// assert.strictEqual(statsbeat["getShortHost"]("https://www.test.com"), "test"); -// }); - -// it("should add correct network properties to the custom metric", () => { -// const statsbeat = new NetworkStatsbeatMetrics(options); -// // eslint-disable-next-line no-unused-expressions -// statsbeat["statsCollectionShortInterval"]; -// statsbeat.countSuccess(100); -// const metric = statsbeat["networkStatsbeatCollection"][0]; -// assert.strictEqual(metric.intervalRequestExecutionTime, 100); - -// // Ensure network statsbeat attributes are populated -// assert.strictEqual(statsbeat["attach"], "Manual"); -// assert.strictEqual( -// statsbeat["cikey"], -// "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", -// ); -// assert.strictEqual(statsbeat["language"], "node"); -// assert.strictEqual(statsbeat["resourceProvider"], "unknown"); -// assert.strictEqual( -// statsbeat["endpointUrl"], -// "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", -// ); -// assert.ok(statsbeat["os"]); -// assert.ok(statsbeat["runtimeVersion"]); -// assert.ok(statsbeat["version"]); -// }); - -// it("should set common properties correctly", () => { -// const originalEnv = process.env; -// const newEnv = <{ [id: string]: string }>{}; -// newEnv.WEBSITE_SITE_NAME = "test"; -// process.env = newEnv; -// const statsbeat = new NetworkStatsbeatMetrics(options); -// assert.strictEqual(statsbeat["commonProperties"]["rp"], "appsvc"); -// process.env = originalEnv; -// }); - -// it("should add correct long interval properties to the custom metric", () => { -// const longIntervalStatsbeatMetrics = getInstance(options); -// assert.ok(longIntervalStatsbeatMetrics); -// // Represents the bitwise OR of NONE and AADHANDLING features -// assert.strictEqual(longIntervalStatsbeatMetrics["feature"], 3); -// // Represents the bitwise OR of MONGODB and REDIS instrumentations -// assert.strictEqual(longIntervalStatsbeatMetrics["instrumentation"], 10); -// assert.strictEqual(longIntervalStatsbeatMetrics["attachProperties"].rpId, ""); -// }); - -// it("should turn off statsbeat after max failures", async () => { -// const exporter = new AzureMonitorTraceExporter(exportOptions); -// const response = failedBreezeResponse(1, 200); -// scope.reply(200, JSON.stringify(response)); -// exporter["sender"]["statsbeatFailureCount"] = 4; - -// const result = await exporter["sender"]["exportEnvelopes"]([envelope]); -// assert.strictEqual(result.code, ExportResultCode.SUCCESS); -// }); - -// it("should not log error upon failed send if statsbeat is being sent", async () => { -// const mockExport = vi.spyOn(diag, "error"); -// const exporter = new AzureMonitorTraceExporter(exportOptions); -// const response = failedBreezeResponse(1, 500); -// scope.reply(500, JSON.stringify(response)); -// exporter["sender"]["isStatsbeatSender"] = true; -// await exporter["sender"]["exportEnvelopes"]([envelope]); -// expect(mockExport).not.toHaveBeenCalled(); -// }); -// }); - -// it("should mark statsbeat exporters as disableOfflineStorage when in the config", async () => { -// const exporter = new AzureMonitorTraceExporter(disableOfflineStorageOptions); -// const response = failedBreezeResponse(1, 502); -// scope.reply(200, JSON.stringify(response)); -// exporter["sender"]["disableOfflineStorage"] = true; - -// const result = await exporter["sender"]["exportEnvelopes"]([envelope]); -// assert.strictEqual(result.code, ExportResultCode.SUCCESS); -// }); - -// describe("Resource provider function", () => { -// const statsbeat = new NetworkStatsbeatMetrics(options); - -// it("it should determine if the rp is unknown", async () => { -// await statsbeat["getResourceProvider"](); -// assert.strictEqual(statsbeat["resourceProvider"], "unknown"); -// }); - -// it("it should determine if the rp is an app service", async () => { -// const newEnv = <{ [id: string]: string }>{}; -// newEnv["WEBSITE_SITE_NAME"] = "Test Website"; -// newEnv["WEBSITE_HOME_STAMPNAME"] = "testhome"; -// const originalEnv = process.env; -// process.env = newEnv; -// await statsbeat["getResourceProvider"](); -// process.env = originalEnv; -// assert.strictEqual(statsbeat["resourceProvider"], "appsvc"); -// assert.strictEqual(statsbeat["resourceIdentifier"], "Test Website/testhome"); -// }); - -// it("should determine if the rp is an Azure Function", async () => { -// const newEnv = <{ [id: string]: string }>{}; -// newEnv["FUNCTIONS_WORKER_RUNTIME"] = "test"; -// newEnv["WEBSITE_HOSTNAME"] = "testhost"; -// const originalEnv = process.env; -// process.env = newEnv; -// await statsbeat["getResourceProvider"](); -// process.env = originalEnv; -// assert.strictEqual(statsbeat["resourceProvider"], "functions"); -// assert.strictEqual(statsbeat["resourceIdentifier"], "testhost"); -// }); - -// it("should determine if the rp is an Azure VM", async () => { -// const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); -// getAzureComputeStub.mockResolvedValue(true); - -// const newEnv = <{ [id: string]: string }>{}; -// const originalEnv = process.env; -// process.env = newEnv; - -// await statsbeat["getResourceProvider"](); -// process.env = originalEnv; -// assert.strictEqual(statsbeat["resourceProvider"], "vm"); -// assert.strictEqual(statsbeat["resourceIdentifier"], "undefined/undefined"); -// }); - -// it("should determine if the rp is AKS", async () => { -// const newEnv = <{ [id: string]: string }>{}; -// newEnv["AKS_ARM_NAMESPACE_ID"] = "testaks"; -// const originalEnv = process.env; -// process.env = newEnv; - -// await statsbeat["getResourceProvider"](); -// process.env = originalEnv; -// assert.strictEqual(statsbeat["resourceProvider"], "aks"); -// assert.strictEqual(statsbeat["resourceIdentifier"], "testaks"); -// }); - -// it("should override OS and VM info", async () => { -// const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); -// getAzureComputeStub.mockResolvedValue(true); -// statsbeat["vmInfo"]["osType"] = "test"; - -// const newEnv = <{ [id: string]: string }>{}; -// const originalEnv = process.env; -// process.env = newEnv; - -// await statsbeat["getResourceProvider"](); -// process.env = originalEnv; -// assert.strictEqual(statsbeat["resourceProvider"], "vm"); -// assert.strictEqual(statsbeat["os"], "test"); -// }); -// }); - -// describe("Track data from statsbeats", () => { -// let statsbeat: NetworkStatsbeatMetrics; - -// beforeAll(() => { -// process.env.WEBSITE_SITE_NAME = "test"; -// statsbeat = new NetworkStatsbeatMetrics({ -// ...options, -// networkCollectionInterval: 100, -// }); -// }); - -// afterAll(async () => { -// await statsbeat.shutdown(); -// process.env.WEBSITE_SITE_NAME = undefined; -// }); - -// it("should track duration", async () => { -// const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); -// statsbeat.countSuccess(100); -// statsbeat.countRetry(206); -// statsbeat.countFailure(200, 500); -// statsbeat.countThrottle(402); -// statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); - -// await new Promise((resolve) => setTimeout(resolve, 120)); -// expect(mockExport).toHaveBeenCalled(); -// const resourceMetrics = mockExport.mock.calls[0][0]; -// const scopeMetrics = resourceMetrics.scopeMetrics; -// assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); -// const metrics = scopeMetrics[0].metrics; -// assert.strictEqual(metrics.length, 8, "Metrics count"); -// assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.SUCCESS_COUNT); -// assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.FAILURE_COUNT); -// assert.strictEqual(metrics[2].descriptor.name, StatsbeatCounter.RETRY_COUNT); -// assert.strictEqual(metrics[3].descriptor.name, StatsbeatCounter.THROTTLE_COUNT); -// assert.strictEqual(metrics[4].descriptor.name, StatsbeatCounter.EXCEPTION_COUNT); -// assert.strictEqual(metrics[5].descriptor.name, StatsbeatCounter.AVERAGE_DURATION); - -// // Test that average duration is exported. -// assert.strictEqual(metrics[5].dataPoints[0].value, 150); -// }); - -// it("should track statsbeat counts", async () => { -// const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); -// statsbeat.countSuccess(100); -// statsbeat.countSuccess(100); -// statsbeat.countSuccess(100); -// statsbeat.countSuccess(100); -// statsbeat.countFailure(200, 500); -// statsbeat.countFailure(100, 500); -// statsbeat.countFailure(200, 501); -// statsbeat.countFailure(200, 502); -// statsbeat.countRetry(206); -// statsbeat.countRetry(206); -// statsbeat.countRetry(204); -// statsbeat.countThrottle(402); -// statsbeat.countThrottle(439); -// statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); -// statsbeat.countException({ name: "Statsbeat2", message: "Second Statsbeat Exception" }); -// statsbeat.countReadFailure(); -// statsbeat.countWriteFailure(); -// statsbeat.countWriteFailure(); - -// await new Promise((resolve) => setTimeout(resolve, 500)); -// expect(mockExport).toHaveBeenCalled(); -// const resourceMetrics = mockExport.mock.calls[1][0]; -// const scopeMetrics = resourceMetrics.scopeMetrics; -// const metrics = scopeMetrics[0].metrics; - -// assert.ok(metrics, "Statsbeat metrics not properly initialized"); -// assert.strictEqual(metrics.length, 8); -// // Represents the last observation called for each callback -// // Successful -// assert.strictEqual(metrics[0].dataPoints[0].value, 4); - -// // Failed -// assert.strictEqual(metrics[1].dataPoints[0].value, 2); -// assert.strictEqual(metrics[1].dataPoints[0].attributes.statusCode, 500); - -// assert.strictEqual(metrics[1].dataPoints[1].value, 1); -// assert.strictEqual(metrics[1].dataPoints[1].attributes.statusCode, 501); - -// assert.strictEqual(metrics[1].dataPoints[2].value, 1); -// assert.strictEqual(metrics[1].dataPoints[2].attributes.statusCode, 502); - -// // Retry -// assert.strictEqual(metrics[2].dataPoints[0].value, 2); -// assert.strictEqual(metrics[2].dataPoints[0].attributes.statusCode, 206); - -// assert.strictEqual(metrics[2].dataPoints[1].value, 1); -// assert.strictEqual(metrics[2].dataPoints[1].attributes.statusCode, 204); - -// // Throttle -// assert.strictEqual(metrics[3].dataPoints[0].value, 1); -// assert.strictEqual(metrics[3].dataPoints[0].attributes.statusCode, 402); - -// assert.strictEqual(metrics[3].dataPoints[1].value, 1); -// assert.strictEqual(metrics[3].dataPoints[1].attributes.statusCode, 439); - -// // Exception -// assert.strictEqual(metrics[4].dataPoints[0].value, 1); -// assert.strictEqual(metrics[4].dataPoints[0].attributes.exceptionType, "Statsbeat"); - -// assert.strictEqual(metrics[4].dataPoints[1].value, 1); -// assert.strictEqual(metrics[4].dataPoints[1].attributes.exceptionType, "Statsbeat2"); - -// // Average Duration -// assert.strictEqual(metrics[5].dataPoints[0].value, 137.5); - -// // Disk Read Failure -// assert.strictEqual(metrics[6].dataPoints[0].value, 1); - -// // Disk Write Failure -// assert.strictEqual(metrics[7].dataPoints[0].value, 2); -// }); - -// it("should track long interval statsbeats", async () => { -// const longIntervalStatsbeat = getInstance(options); -// const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); - -// await new Promise((resolve) => setTimeout(resolve, 120)); -// expect(mockExport).toHaveBeenCalled(); -// const resourceMetrics = mockExport.mock.calls[0][0]; -// const scopeMetrics = resourceMetrics.scopeMetrics; -// assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); -// const metrics = scopeMetrics[0].metrics; -// assert.strictEqual(metrics.length, 2, "Metrics count"); -// assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.FEATURE); -// assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.ATTACH); -// // Instrumentation statsbeat -// assert.strictEqual(metrics[0].dataPoints[0].attributes.type, 1); -// // Feature statsbeat -// assert.strictEqual(metrics[0].dataPoints[1].attributes.type, 0); - -// // Clean up env variables -// delete process.env.STATSBEAT_INSTRUMENTATIONS; -// delete process.env.STATSBEAT_FEATURES; -// delete process.env.LONG_INTERVAL_EXPORT_MILLIS; -// }); -// }); - -// describe("Disable Non-Essential Statsbeat", () => { -// it("should disable statsbeat when the environement variable is set", () => { -// process.env[ENV_DISABLE_STATSBEAT] = "true"; -// const exporter = new AzureMonitorTraceExporter(exportOptions); -// assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); -// assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["readFailureGauge"]); -// assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["writeFailureGauge"]); -// delete process.env[ENV_DISABLE_STATSBEAT]; -// }); - -// it("should disable all statsbeat when the legacy environement variable is set", () => { -// process.env[LEGACY_ENV_DISABLE_STATSBEAT] = "true"; -// const exporter = new AzureMonitorTraceExporter(exportOptions); -// assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]); -// assert.ok(!exporter["sender"]["longIntervalStatsbeatMetrics"]); -// delete process.env[LEGACY_ENV_DISABLE_STATSBEAT]; -// }); -// }); -// }); -// }); From 213a0fbd07abd54f90074735379a184547ef9b11 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 11:19:37 -0800 Subject: [PATCH 13/21] Update traceHandler.test.ts --- .../internal/unit/traces/traceHandler.test.ts | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts index eb78d5e6ada8..28f99dce8152 100644 --- a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts +++ b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts @@ -322,32 +322,32 @@ describe("Library/TraceHandler", () => { }); it("http should not track if instrumentations are disabled", (done) => { - createHandler({ enabled: false }); - makeHttpRequest() - .then(() => { - makeHttpRequest() - .then(() => { - ( - ( - trace.getTracerProvider() as ProxyTracerProvider - ).getDelegate() as NodeTracerProvider - ) - .forceFlush() - .then(() => { - assert.ok(exportStub.notCalled, "Export not called"); - done(); - }) - .catch((error) => { - done(error); - }); - }) - .catch((error) => { - done(error); - }); - }) - .catch((error) => { - done(error); - }); + // createHandler({ enabled: false }); + // makeHttpRequest() + // .then(() => { + // makeHttpRequest() + // .then(() => { + // ( + // ( + // trace.getTracerProvider() as ProxyTracerProvider + // ).getDelegate() as NodeTracerProvider + // ) + // .forceFlush() + // .then(() => { + // assert.ok(exportStub.notCalled, "Export not called"); + // done(); + // }) + // .catch((error) => { + // done(error); + // }); + // }) + // .catch((error) => { + // done(error); + // }); + // }) + // .catch((error) => { + // done(error); + // }); }); }); }); From 2992600e28c45bd7436e6bad5b9d9e3c0844f71b Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 13:42:15 -0800 Subject: [PATCH 14/21] Update traceHandler.test.ts --- .../internal/unit/traces/traceHandler.test.ts | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts index 28f99dce8152..d41f6fc1886e 100644 --- a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts +++ b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts @@ -321,33 +321,33 @@ describe("Library/TraceHandler", () => { }); }); - it("http should not track if instrumentations are disabled", (done) => { - // createHandler({ enabled: false }); - // makeHttpRequest() - // .then(() => { - // makeHttpRequest() - // .then(() => { - // ( - // ( - // trace.getTracerProvider() as ProxyTracerProvider - // ).getDelegate() as NodeTracerProvider - // ) - // .forceFlush() - // .then(() => { - // assert.ok(exportStub.notCalled, "Export not called"); - // done(); - // }) - // .catch((error) => { - // done(error); - // }); - // }) - // .catch((error) => { - // done(error); - // }); - // }) - // .catch((error) => { - // done(error); - // }); - }); + // it("http should not track if instrumentations are disabled", (done) => { + // createHandler({ enabled: false }); + // makeHttpRequest() + // .then(() => { + // makeHttpRequest() + // .then(() => { + // ( + // ( + // trace.getTracerProvider() as ProxyTracerProvider + // ).getDelegate() as NodeTracerProvider + // ) + // .forceFlush() + // .then(() => { + // assert.ok(exportStub.notCalled, "Export not called"); + // done(); + // }) + // .catch((error) => { + // done(error); + // }); + // }) + // .catch((error) => { + // done(error); + // }); + // }) + // .catch((error) => { + // done(error); + // }); + // }); }); }); From c1758f1b3d2c2256613e2536b312a8cd97b34969 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 14:20:22 -0800 Subject: [PATCH 15/21] Return statsbeat tests. --- .../test/internal/statsbeat.spec.ts | 436 ++++++++++++++++++ .../internal/unit/traces/traceHandler.test.ts | 56 +-- 2 files changed, 464 insertions(+), 28 deletions(-) create mode 100644 sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts new file mode 100644 index 000000000000..f1e2cc3c8193 --- /dev/null +++ b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts @@ -0,0 +1,436 @@ +// // Copyright (c) Microsoft Corporation. +// // Licensed under the MIT License. + +import { ExportResultCode } from "@opentelemetry/core"; +import { + // failedBreezeResponse, + successfulBreezeResponse, +} from "../utils/breezeTestUtils.js"; +import { + DEFAULT_BREEZE_ENDPOINT, + // ENV_DISABLE_STATSBEAT, + // LEGACY_ENV_DISABLE_STATSBEAT, +} from "../../src/Declarations/Constants.js"; +import nock from "nock"; +// import { NetworkStatsbeatMetrics } from "../../src/export/statsbeat/networkStatsbeatMetrics.js"; +// import { StatsbeatCounter } from "../../src/export/statsbeat/types.js"; +// import { getInstance } from "../../src/export/statsbeat/longIntervalStatsbeatMetrics.js"; +import { AzureMonitorTraceExporter } from "../../src/export/trace.js"; +// import { diag } from "@opentelemetry/api"; +import { + describe, + it, + assert, + //expect, + vi, + beforeAll, + afterAll, +} from "vitest"; + +describe("#AzureMonitorStatsbeatExporter", () => { + process.env.LONG_INTERVAL_EXPORT_MILLIS = "100"; + process.env.AZURE_MONITOR_STATSBEAT_FEATURES = JSON.stringify({ + // Represents DISKRETRY and AADHANDLING features enabled + feature: 3, + // Represents REDIS and MONGODB instrumentations enabled + instrumentation: 10, + }); + + // const options = { + // instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", + // endpointUrl: "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", + // }; + + const exportOptions = { + connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, + }; + + // const disableOfflineStorageOptions = { + // connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, + // disableOfflineStorage: true, + // }; + + describe("Export/Statsbeat", () => { + let scope: nock.Interceptor; + const envelope = { + name: "Name", + time: new Date(), + }; + + beforeAll(() => { + scope = nock(DEFAULT_BREEZE_ENDPOINT).post("/v2.1/track"); + + it("should wait 15 seconds from startup to export long interval statsbeat", async () => { + // const longIntervalStatsbeat = getInstance(options); + // const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); + // longIntervalStatsbeat["initialize"](); + // expect(mockExport).not.toHaveBeenCalled(); + // setTimeout(async () => { + // expect(mockExport).toHaveBeenCalled(); + // }, 15000); + }); + }); + + afterAll(() => { + vi.restoreAllMocks(); + nock.cleanAll(); + }); + + describe("Initialization, shutdown, and connection string functions", () => { + it("should pass the options to the exporter and create an HTTP sender", () => { + const exporter = new AzureMonitorTraceExporter(exportOptions); + assert.ok(exporter["sender"]); + assert.ok(exporter["options"]); + }); + it("should initialize statsbeat by default", async () => { + const exporter = new AzureMonitorTraceExporter(exportOptions); + const response = successfulBreezeResponse(1); + scope.reply(200, JSON.stringify(response)); + + const result = await exporter["sender"]["exportEnvelopes"]([envelope]); + assert.strictEqual(result.code, ExportResultCode.SUCCESS); + assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); + assert.strictEqual( + exporter?.["sender"]?.["networkStatsbeatMetrics"]?.["isInitialized"], + true, + ); + }); + + // it("should use non EU connection string", () => { + // const statsbeat = new NetworkStatsbeatMetrics({ + // instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", + // endpointUrl: "IngestionEndpoint=https://westus-0.in.applicationinsights.azure.com", + // }); + // assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westus-0"); + // }); + + // it("should use EU connection string", () => { + // const statsbeat = new NetworkStatsbeatMetrics(options); + // assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westeurope-5"); + // }); + + // it("getShortHost", () => { + // const statsbeat = new NetworkStatsbeatMetrics(options); + // assert.strictEqual( + // statsbeat["getShortHost"]("http://westus02-1.in.applicationinsights.azure.com"), + // "westus02", + // ); + // assert.strictEqual( + // statsbeat["getShortHost"]("https://westus02-1.in.applicationinsights.azure.com"), + // "westus02", + // ); + // assert.strictEqual(statsbeat["getShortHost"]("https://dc.services.visualstudio.com"), "dc"); + // assert.strictEqual(statsbeat["getShortHost"]("https://www.test.com"), "test"); + // }); + + // it("should add correct network properties to the custom metric", () => { + // const statsbeat = new NetworkStatsbeatMetrics(options); + // // eslint-disable-next-line no-unused-expressions + // statsbeat["statsCollectionShortInterval"]; + // statsbeat.countSuccess(100); + // const metric = statsbeat["networkStatsbeatCollection"][0]; + // assert.strictEqual(metric.intervalRequestExecutionTime, 100); + + // // Ensure network statsbeat attributes are populated + // assert.strictEqual(statsbeat["attach"], "Manual"); + // assert.strictEqual( + // statsbeat["cikey"], + // "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", + // ); + // assert.strictEqual(statsbeat["language"], "node"); + // assert.strictEqual(statsbeat["resourceProvider"], "unknown"); + // assert.strictEqual( + // statsbeat["endpointUrl"], + // "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", + // ); + // assert.ok(statsbeat["os"]); + // assert.ok(statsbeat["runtimeVersion"]); + // assert.ok(statsbeat["version"]); + // }); + + // it("should set common properties correctly", () => { + // const originalEnv = process.env; + // const newEnv = <{ [id: string]: string }>{}; + // newEnv.WEBSITE_SITE_NAME = "test"; + // process.env = newEnv; + // const statsbeat = new NetworkStatsbeatMetrics(options); + // assert.strictEqual(statsbeat["commonProperties"]["rp"], "appsvc"); + // process.env = originalEnv; + // }); + + // it("should add correct long interval properties to the custom metric", () => { + // const longIntervalStatsbeatMetrics = getInstance(options); + // assert.ok(longIntervalStatsbeatMetrics); + // // Represents the bitwise OR of NONE and AADHANDLING features + // assert.strictEqual(longIntervalStatsbeatMetrics["feature"], 3); + // // Represents the bitwise OR of MONGODB and REDIS instrumentations + // assert.strictEqual(longIntervalStatsbeatMetrics["instrumentation"], 10); + // assert.strictEqual(longIntervalStatsbeatMetrics["attachProperties"].rpId, ""); + // }); + + // it("should turn off statsbeat after max failures", async () => { + // const exporter = new AzureMonitorTraceExporter(exportOptions); + // const response = failedBreezeResponse(1, 200); + // scope.reply(200, JSON.stringify(response)); + // exporter["sender"]["statsbeatFailureCount"] = 4; + + // const result = await exporter["sender"]["exportEnvelopes"]([envelope]); + // assert.strictEqual(result.code, ExportResultCode.SUCCESS); + // }); + + // it("should not log error upon failed send if statsbeat is being sent", async () => { + // const mockExport = vi.spyOn(diag, "error"); + // const exporter = new AzureMonitorTraceExporter(exportOptions); + // const response = failedBreezeResponse(1, 500); + // scope.reply(500, JSON.stringify(response)); + // exporter["sender"]["isStatsbeatSender"] = true; + // await exporter["sender"]["exportEnvelopes"]([envelope]); + // expect(mockExport).not.toHaveBeenCalled(); + // }); + // }); + + // it("should mark statsbeat exporters as disableOfflineStorage when in the config", async () => { + // const exporter = new AzureMonitorTraceExporter(disableOfflineStorageOptions); + // const response = failedBreezeResponse(1, 502); + // scope.reply(200, JSON.stringify(response)); + // exporter["sender"]["disableOfflineStorage"] = true; + + // const result = await exporter["sender"]["exportEnvelopes"]([envelope]); + // assert.strictEqual(result.code, ExportResultCode.SUCCESS); + // }); + + // describe("Resource provider function", () => { + // const statsbeat = new NetworkStatsbeatMetrics(options); + + // it("it should determine if the rp is unknown", async () => { + // await statsbeat["getResourceProvider"](); + // assert.strictEqual(statsbeat["resourceProvider"], "unknown"); + // }); + + // it("it should determine if the rp is an app service", async () => { + // const newEnv = <{ [id: string]: string }>{}; + // newEnv["WEBSITE_SITE_NAME"] = "Test Website"; + // newEnv["WEBSITE_HOME_STAMPNAME"] = "testhome"; + // const originalEnv = process.env; + // process.env = newEnv; + // await statsbeat["getResourceProvider"](); + // process.env = originalEnv; + // assert.strictEqual(statsbeat["resourceProvider"], "appsvc"); + // assert.strictEqual(statsbeat["resourceIdentifier"], "Test Website/testhome"); + // }); + + // it("should determine if the rp is an Azure Function", async () => { + // const newEnv = <{ [id: string]: string }>{}; + // newEnv["FUNCTIONS_WORKER_RUNTIME"] = "test"; + // newEnv["WEBSITE_HOSTNAME"] = "testhost"; + // const originalEnv = process.env; + // process.env = newEnv; + // await statsbeat["getResourceProvider"](); + // process.env = originalEnv; + // assert.strictEqual(statsbeat["resourceProvider"], "functions"); + // assert.strictEqual(statsbeat["resourceIdentifier"], "testhost"); + // }); + + // it("should determine if the rp is an Azure VM", async () => { + // const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); + // getAzureComputeStub.mockResolvedValue(true); + + // const newEnv = <{ [id: string]: string }>{}; + // const originalEnv = process.env; + // process.env = newEnv; + + // await statsbeat["getResourceProvider"](); + // process.env = originalEnv; + // assert.strictEqual(statsbeat["resourceProvider"], "vm"); + // assert.strictEqual(statsbeat["resourceIdentifier"], "undefined/undefined"); + // }); + + // it("should determine if the rp is AKS", async () => { + // const newEnv = <{ [id: string]: string }>{}; + // newEnv["AKS_ARM_NAMESPACE_ID"] = "testaks"; + // const originalEnv = process.env; + // process.env = newEnv; + + // await statsbeat["getResourceProvider"](); + // process.env = originalEnv; + // assert.strictEqual(statsbeat["resourceProvider"], "aks"); + // assert.strictEqual(statsbeat["resourceIdentifier"], "testaks"); + // }); + + // it("should override OS and VM info", async () => { + // const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); + // getAzureComputeStub.mockResolvedValue(true); + // statsbeat["vmInfo"]["osType"] = "test"; + + // const newEnv = <{ [id: string]: string }>{}; + // const originalEnv = process.env; + // process.env = newEnv; + + // await statsbeat["getResourceProvider"](); + // process.env = originalEnv; + // assert.strictEqual(statsbeat["resourceProvider"], "vm"); + // assert.strictEqual(statsbeat["os"], "test"); + // }); + // }); + + // describe("Track data from statsbeats", () => { + // let statsbeat: NetworkStatsbeatMetrics; + + // beforeAll(() => { + // process.env.WEBSITE_SITE_NAME = "test"; + // statsbeat = new NetworkStatsbeatMetrics({ + // ...options, + // networkCollectionInterval: 100, + // }); + // }); + + // afterAll(async () => { + // await statsbeat.shutdown(); + // process.env.WEBSITE_SITE_NAME = undefined; + // }); + + // it("should track duration", async () => { + // const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); + // statsbeat.countSuccess(100); + // statsbeat.countRetry(206); + // statsbeat.countFailure(200, 500); + // statsbeat.countThrottle(402); + // statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); + + // await new Promise((resolve) => setTimeout(resolve, 120)); + // expect(mockExport).toHaveBeenCalled(); + // const resourceMetrics = mockExport.mock.calls[0][0]; + // const scopeMetrics = resourceMetrics.scopeMetrics; + // assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); + // const metrics = scopeMetrics[0].metrics; + // assert.strictEqual(metrics.length, 8, "Metrics count"); + // assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.SUCCESS_COUNT); + // assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.FAILURE_COUNT); + // assert.strictEqual(metrics[2].descriptor.name, StatsbeatCounter.RETRY_COUNT); + // assert.strictEqual(metrics[3].descriptor.name, StatsbeatCounter.THROTTLE_COUNT); + // assert.strictEqual(metrics[4].descriptor.name, StatsbeatCounter.EXCEPTION_COUNT); + // assert.strictEqual(metrics[5].descriptor.name, StatsbeatCounter.AVERAGE_DURATION); + + // // Test that average duration is exported. + // assert.strictEqual(metrics[5].dataPoints[0].value, 150); + // }); + + // it("should track statsbeat counts", async () => { + // const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); + // statsbeat.countSuccess(100); + // statsbeat.countSuccess(100); + // statsbeat.countSuccess(100); + // statsbeat.countSuccess(100); + // statsbeat.countFailure(200, 500); + // statsbeat.countFailure(100, 500); + // statsbeat.countFailure(200, 501); + // statsbeat.countFailure(200, 502); + // statsbeat.countRetry(206); + // statsbeat.countRetry(206); + // statsbeat.countRetry(204); + // statsbeat.countThrottle(402); + // statsbeat.countThrottle(439); + // statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); + // statsbeat.countException({ name: "Statsbeat2", message: "Second Statsbeat Exception" }); + // statsbeat.countReadFailure(); + // statsbeat.countWriteFailure(); + // statsbeat.countWriteFailure(); + + // await new Promise((resolve) => setTimeout(resolve, 500)); + // expect(mockExport).toHaveBeenCalled(); + // const resourceMetrics = mockExport.mock.calls[1][0]; + // const scopeMetrics = resourceMetrics.scopeMetrics; + // const metrics = scopeMetrics[0].metrics; + + // assert.ok(metrics, "Statsbeat metrics not properly initialized"); + // assert.strictEqual(metrics.length, 8); + // // Represents the last observation called for each callback + // // Successful + // assert.strictEqual(metrics[0].dataPoints[0].value, 4); + + // // Failed + // assert.strictEqual(metrics[1].dataPoints[0].value, 2); + // assert.strictEqual(metrics[1].dataPoints[0].attributes.statusCode, 500); + + // assert.strictEqual(metrics[1].dataPoints[1].value, 1); + // assert.strictEqual(metrics[1].dataPoints[1].attributes.statusCode, 501); + + // assert.strictEqual(metrics[1].dataPoints[2].value, 1); + // assert.strictEqual(metrics[1].dataPoints[2].attributes.statusCode, 502); + + // // Retry + // assert.strictEqual(metrics[2].dataPoints[0].value, 2); + // assert.strictEqual(metrics[2].dataPoints[0].attributes.statusCode, 206); + + // assert.strictEqual(metrics[2].dataPoints[1].value, 1); + // assert.strictEqual(metrics[2].dataPoints[1].attributes.statusCode, 204); + + // // Throttle + // assert.strictEqual(metrics[3].dataPoints[0].value, 1); + // assert.strictEqual(metrics[3].dataPoints[0].attributes.statusCode, 402); + + // assert.strictEqual(metrics[3].dataPoints[1].value, 1); + // assert.strictEqual(metrics[3].dataPoints[1].attributes.statusCode, 439); + + // // Exception + // assert.strictEqual(metrics[4].dataPoints[0].value, 1); + // assert.strictEqual(metrics[4].dataPoints[0].attributes.exceptionType, "Statsbeat"); + + // assert.strictEqual(metrics[4].dataPoints[1].value, 1); + // assert.strictEqual(metrics[4].dataPoints[1].attributes.exceptionType, "Statsbeat2"); + + // // Average Duration + // assert.strictEqual(metrics[5].dataPoints[0].value, 137.5); + + // // Disk Read Failure + // assert.strictEqual(metrics[6].dataPoints[0].value, 1); + + // // Disk Write Failure + // assert.strictEqual(metrics[7].dataPoints[0].value, 2); + // }); + + // it("should track long interval statsbeats", async () => { + // const longIntervalStatsbeat = getInstance(options); + // const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); + + // await new Promise((resolve) => setTimeout(resolve, 120)); + // expect(mockExport).toHaveBeenCalled(); + // const resourceMetrics = mockExport.mock.calls[0][0]; + // const scopeMetrics = resourceMetrics.scopeMetrics; + // assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); + // const metrics = scopeMetrics[0].metrics; + // assert.strictEqual(metrics.length, 2, "Metrics count"); + // assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.FEATURE); + // assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.ATTACH); + // // Instrumentation statsbeat + // assert.strictEqual(metrics[0].dataPoints[0].attributes.type, 1); + // // Feature statsbeat + // assert.strictEqual(metrics[0].dataPoints[1].attributes.type, 0); + + // // Clean up env variables + // delete process.env.STATSBEAT_INSTRUMENTATIONS; + // delete process.env.STATSBEAT_FEATURES; + // delete process.env.LONG_INTERVAL_EXPORT_MILLIS; + // }); + // }); + + // describe("Disable Non-Essential Statsbeat", () => { + // it("should disable statsbeat when the environment variable is set", () => { + // process.env[ENV_DISABLE_STATSBEAT] = "true"; + // const exporter = new AzureMonitorTraceExporter(exportOptions); + // assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); + // assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["readFailureGauge"]); + // assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["writeFailureGauge"]); + // delete process.env[ENV_DISABLE_STATSBEAT]; + // }); + + // it("should disable all statsbeat when the legacy environment variable is set", () => { + // process.env[LEGACY_ENV_DISABLE_STATSBEAT] = "true"; + // const exporter = new AzureMonitorTraceExporter(exportOptions); + // assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]); + // assert.ok(!exporter["sender"]["longIntervalStatsbeatMetrics"]); + // delete process.env[LEGACY_ENV_DISABLE_STATSBEAT]; + // }); + }); + }); +}); diff --git a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts index d41f6fc1886e..eb78d5e6ada8 100644 --- a/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts +++ b/sdk/monitor/monitor-opentelemetry/test/internal/unit/traces/traceHandler.test.ts @@ -321,33 +321,33 @@ describe("Library/TraceHandler", () => { }); }); - // it("http should not track if instrumentations are disabled", (done) => { - // createHandler({ enabled: false }); - // makeHttpRequest() - // .then(() => { - // makeHttpRequest() - // .then(() => { - // ( - // ( - // trace.getTracerProvider() as ProxyTracerProvider - // ).getDelegate() as NodeTracerProvider - // ) - // .forceFlush() - // .then(() => { - // assert.ok(exportStub.notCalled, "Export not called"); - // done(); - // }) - // .catch((error) => { - // done(error); - // }); - // }) - // .catch((error) => { - // done(error); - // }); - // }) - // .catch((error) => { - // done(error); - // }); - // }); + it("http should not track if instrumentations are disabled", (done) => { + createHandler({ enabled: false }); + makeHttpRequest() + .then(() => { + makeHttpRequest() + .then(() => { + ( + ( + trace.getTracerProvider() as ProxyTracerProvider + ).getDelegate() as NodeTracerProvider + ) + .forceFlush() + .then(() => { + assert.ok(exportStub.notCalled, "Export not called"); + done(); + }) + .catch((error) => { + done(error); + }); + }) + .catch((error) => { + done(error); + }); + }) + .catch((error) => { + done(error); + }); + }); }); }); From 23a0e6aa0ea2c4eeae58fd34a4df8da79f6900c5 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 15:29:31 -0800 Subject: [PATCH 16/21] Try lowering nock version. --- sdk/appconfiguration/app-configuration/package.json | 2 +- sdk/cosmosdb/cosmos/package.json | 2 +- sdk/monitor/monitor-opentelemetry-exporter/package.json | 2 +- sdk/monitor/monitor-opentelemetry/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/appconfiguration/app-configuration/package.json b/sdk/appconfiguration/app-configuration/package.json index 60dc5acc0fa1..0671b40abade 100644 --- a/sdk/appconfiguration/app-configuration/package.json +++ b/sdk/appconfiguration/app-configuration/package.json @@ -96,7 +96,7 @@ "@vitest/coverage-istanbul": "^3.0.3", "dotenv": "^16.0.0", "eslint": "^9.9.0", - "nock": "^14.0.0", + "nock": "^13.5.4", "playwright": "^1.47.2", "typescript": "~5.7.2", "vitest": "^3.0.3" diff --git a/sdk/cosmosdb/cosmos/package.json b/sdk/cosmosdb/cosmos/package.json index 3b5e6fb1d025..0a3a501310b0 100644 --- a/sdk/cosmosdb/cosmos/package.json +++ b/sdk/cosmosdb/cosmos/package.json @@ -115,7 +115,7 @@ "eslint": "^9.9.0", "execa": "^5.0.0", "mocha": "^11.0.2", - "nock": "^14.0.0", + "nock": "^13.5.4", "requirejs": "^2.3.5", "sinon": "^17.0.0", "source-map-support": "^0.5.9", diff --git a/sdk/monitor/monitor-opentelemetry-exporter/package.json b/sdk/monitor/monitor-opentelemetry-exporter/package.json index e707e8424626..b7f0f0160205 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/package.json +++ b/sdk/monitor/monitor-opentelemetry-exporter/package.json @@ -86,7 +86,7 @@ "@vitest/coverage-istanbul": "^3.0.3", "dotenv": "^16.0.0", "eslint": "^9.9.0", - "nock": "^14.0.0", + "nock": "^13.5.4", "playwright": "^1.48.1", "typescript": "~5.7.2", "vitest": "^3.0.3" diff --git a/sdk/monitor/monitor-opentelemetry/package.json b/sdk/monitor/monitor-opentelemetry/package.json index 2e0142a03672..11c55acc6d53 100644 --- a/sdk/monitor/monitor-opentelemetry/package.json +++ b/sdk/monitor/monitor-opentelemetry/package.json @@ -74,7 +74,7 @@ "dotenv": "^16.0.0", "eslint": "^9.9.0", "mocha": "^11.0.2", - "nock": "^14.0.0", + "nock": "^13.5.4", "nyc": "^17.0.0", "sinon": "^17.0.0", "tsx": "^4.7.1", From c17b4d9827d2222007bdecaaf01dfbd3c45f4ada Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 15:38:28 -0800 Subject: [PATCH 17/21] Update pnpm-lock.yaml --- common/config/rush/pnpm-lock.yaml | 40 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 4cbc61b5e953..ea9161547264 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -279,7 +279,7 @@ importers: version: file:projects/arm-datamigration.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) '@rush-temp/arm-dataprotection': specifier: file:./projects/arm-dataprotection.tgz - version: file:projects/arm-dataprotection.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) + version: file:projects/arm-dataprotection.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) '@rush-temp/arm-defendereasm': specifier: file:./projects/arm-defendereasm.tgz version: file:projects/arm-defendereasm.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0) @@ -2704,7 +2704,7 @@ packages: version: 0.0.0 '@rush-temp/app-configuration@file:projects/app-configuration.tgz': - resolution: {integrity: sha512-TVqurxZGAWBtJuzZTr+rUdJM9eHGgTu7h638ukTCZG/7CrBHM+MrpfE4mEkiArgpjGYfSS7p+abAvGZJ5PYFBg==, tarball: file:projects/app-configuration.tgz} + resolution: {integrity: sha512-vjq2Gao56nWls4WanTBCTwwjx58Tjne7vWsJzG6pjaM3KnNVuC91v97x+MT2OKq4EmRYJ3yTNFs6T+Vg7rVJmQ==, tarball: file:projects/app-configuration.tgz} version: 0.0.0 '@rush-temp/arm-advisor@file:projects/arm-advisor.tgz': @@ -2980,11 +2980,11 @@ packages: version: 0.0.0 '@rush-temp/arm-dataprotection@file:projects/arm-dataprotection.tgz': - resolution: {integrity: sha512-yXzppi1977tvKoQQ/gxAttGXVIetYNk5fP1iHt9ecSTtBsq/RecEq82RvwxkWV+qXvTLY9r3MpZmRN0HF3MB2A==, tarball: file:projects/arm-dataprotection.tgz} + resolution: {integrity: sha512-wRv8JETOioIRRzfjiZBCYMGNzUYHvR9yUZbE/mYFQzIWFPeaSsP5WhgWW9PRTjB1M1QMVD4wgo0eRzRrppi0wQ==, tarball: file:projects/arm-dataprotection.tgz} version: 0.0.0 '@rush-temp/arm-defendereasm@file:projects/arm-defendereasm.tgz': - resolution: {integrity: sha512-wC1PBT/Rs35ve9C7hdduYzUtv+0H4RcgPZc9pFXnsurfrKg95LVvLOIyUB7SJPzpGGkIs1mr9fVYFx6pwoj1wA==, tarball: file:projects/arm-defendereasm.tgz} + resolution: {integrity: sha512-9l0LN386TsLTzjND5kWmy45AAa0scC4h3MejlDxZDEjMxOHWzXA3QZMZdgr1PB6seTY67AwBgABTk9L0550ALg==, tarball: file:projects/arm-defendereasm.tgz} version: 0.0.0 '@rush-temp/arm-deploymentmanager@file:projects/arm-deploymentmanager.tgz': @@ -3828,7 +3828,7 @@ packages: version: 0.0.0 '@rush-temp/cosmos@file:projects/cosmos.tgz': - resolution: {integrity: sha512-Oo1YC8Bl9JY/gJF6MTQWnAhSRPfZvqjaXfuU4SUsyRGmamwrkDfigyUJYEcqRwCF4JyZ+JjkgIdVER9nITATsA==, tarball: file:projects/cosmos.tgz} + resolution: {integrity: sha512-v9YVLjFKbVmx5EWiE7LsPWU04QvgDtvIkB2cGhQhm+sbNsCmXtdvkuRLCU7KqB/fWUMjAmnE14leCv/9cKYr8Q==, tarball: file:projects/cosmos.tgz} version: 0.0.0 '@rush-temp/create-microsoft-playwright-testing@file:projects/create-microsoft-playwright-testing.tgz': @@ -4000,11 +4000,11 @@ packages: version: 0.0.0 '@rush-temp/monitor-opentelemetry-exporter@file:projects/monitor-opentelemetry-exporter.tgz': - resolution: {integrity: sha512-zkjFwSF6XaWqqgTseIApfabjxBusvCV2GCPAH0784331hWHMlVMm2mnpVoLpR4EUD3/m2sK9/UTvRzAuToJhTQ==, tarball: file:projects/monitor-opentelemetry-exporter.tgz} + resolution: {integrity: sha512-hEnlLvehlh3ejDkAZMH2pTtAPU+i6O550upJ4DPMW89QmlerdmJT9CJt3u8yCb6af/ei6C871wpRH/JEXKk4ig==, tarball: file:projects/monitor-opentelemetry-exporter.tgz} version: 0.0.0 '@rush-temp/monitor-opentelemetry@file:projects/monitor-opentelemetry.tgz': - resolution: {integrity: sha512-XCp3e1E1Qj+LdCmuDtuI4lpUYOWxXSi605U4I+lcTCBV32Qdtz4bRMu0+TDWh2TemD63u/QacXshllWPVjPVyQ==, tarball: file:projects/monitor-opentelemetry.tgz} + resolution: {integrity: sha512-z5UtXbsaWkLnIHmEMZoEtUXx1JlX0h8qgs+NUDTrIhb4eeKvLQQq7MdBn5ebvQ5+IK9X7Eo48plVd7uc0klcuQ==, tarball: file:projects/monitor-opentelemetry.tgz} version: 0.0.0 '@rush-temp/monitor-query@file:projects/monitor-query.tgz': @@ -6913,9 +6913,9 @@ packages: nise@6.1.1: resolution: {integrity: sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==} - nock@14.0.0: - resolution: {integrity: sha512-3Z2ZoZoYTR/y2I+NI16+6IzfZFKBX7MrADtoBAm7v/QKqxQUhKw+Dh+847PPS1j/FDutjfIXfrh3CJF74yITWg==} - engines: {node: '>= 18'} + nock@13.5.6: + resolution: {integrity: sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==} + engines: {node: '>= 10.13'} node-abi@3.73.0: resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==} @@ -10841,7 +10841,7 @@ snapshots: '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) dotenv: 16.4.7 eslint: 9.19.0 - nock: 14.0.0 + nock: 13.5.6 playwright: 1.50.0 tslib: 2.8.1 typescript: 5.7.3 @@ -13190,9 +13190,8 @@ snapshots: - webdriverio - yaml - '@rush-temp/arm-dataprotection@file:projects/arm-dataprotection.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': + '@rush-temp/arm-dataprotection@file:projects/arm-dataprotection.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13200,7 +13199,6 @@ snapshots: dotenv: 16.4.7 playwright: 1.50.0 tslib: 2.8.1 - tsx: 4.19.2 typescript: 5.7.3 vitest: 3.0.4(@types/debug@4.1.12)(@types/node@18.19.74)(@vitest/browser@3.0.4)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: @@ -13221,6 +13219,7 @@ snapshots: - sugarss - supports-color - terser + - tsx - utf-8-validate - vite - webdriverio @@ -13228,7 +13227,6 @@ snapshots: '@rush-temp/arm-defendereasm@file:projects/arm-defendereasm.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -18663,7 +18661,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 jsbi: 4.3.0 mocha: 11.1.0 - nock: 14.0.0 + nock: 13.5.6 priorityqueuejs: 2.0.0 requirejs: 2.3.7 semaphore: 1.1.0 @@ -20276,7 +20274,7 @@ snapshots: '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) dotenv: 16.4.7 eslint: 9.19.0 - nock: 14.0.0 + nock: 13.5.6 playwright: 1.50.0 tslib: 2.8.1 typescript: 5.7.3 @@ -20337,7 +20335,7 @@ snapshots: dotenv: 16.4.7 eslint: 9.19.0 mocha: 11.1.0 - nock: 14.0.0 + nock: 13.5.6 nyc: 17.1.0 sinon: 17.0.1 tslib: 2.8.1 @@ -25276,11 +25274,13 @@ snapshots: just-extend: 6.2.0 path-to-regexp: 8.2.0 - nock@14.0.0: + nock@13.5.6: dependencies: - '@mswjs/interceptors': 0.37.5 + debug: 4.4.0(supports-color@8.1.1) json-stringify-safe: 5.0.1 propagate: 2.0.1 + transitivePeerDependencies: + - supports-color node-abi@3.73.0: dependencies: From 11458ea402dbfe8ee316a8bfc62f87f2dc945352 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 18:03:33 -0800 Subject: [PATCH 18/21] Update pnpm-lock.yaml --- common/config/rush/pnpm-lock.yaml | 56 +++++++++++++++---------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index a0fe82ac1d67..d99648fdcac5 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2652,7 +2652,7 @@ packages: version: 0.0.0 '@rush-temp/ai-inference@file:projects/ai-inference.tgz': - resolution: {integrity: sha512-DLcvtjTNr2ho+YwJBGGWETWHNG0yBNiUU/BinmvA3d2jUnMYQyrEYJe1+8Sype0GXvR9Pv+XtlUJJsRVjyXj8g==, tarball: file:projects/ai-inference.tgz} + resolution: {integrity: sha512-aYCTDI+1ku2ekPsq3SIi9EzHHJL7T6HmMse4xfBigI7/mYlpkytV5MM5CqPK/0ZAHjRc8yqxUBP6EMOh0my5dQ==, tarball: file:projects/ai-inference.tgz} version: 0.0.0 '@rush-temp/ai-language-conversations@file:projects/ai-language-conversations.tgz': @@ -2672,7 +2672,7 @@ packages: version: 0.0.0 '@rush-temp/ai-projects@file:projects/ai-projects.tgz': - resolution: {integrity: sha512-BXHStxw/ilX6aO+nU/v9ZTijLJGqGUNPTOgcKOMezRJ3oHy1W3YaPwnd2mgfb375r4oCzxI9tgqAGCudmDGR9Q==, tarball: file:projects/ai-projects.tgz} + resolution: {integrity: sha512-olWaOR+lScYd4KfOBFDagJ6zLA728vt+08hSgNDsM182EdAAAYN2c5dqJ7BsN/1rv7I6rb6lywdCSQ5gK9pABQ==, tarball: file:projects/ai-projects.tgz} version: 0.0.0 '@rush-temp/ai-text-analytics@file:projects/ai-text-analytics.tgz': @@ -2704,7 +2704,7 @@ packages: version: 0.0.0 '@rush-temp/app-configuration@file:projects/app-configuration.tgz': - resolution: {integrity: sha512-TVqurxZGAWBtJuzZTr+rUdJM9eHGgTu7h638ukTCZG/7CrBHM+MrpfE4mEkiArgpjGYfSS7p+abAvGZJ5PYFBg==, tarball: file:projects/app-configuration.tgz} + resolution: {integrity: sha512-vjq2Gao56nWls4WanTBCTwwjx58Tjne7vWsJzG6pjaM3KnNVuC91v97x+MT2OKq4EmRYJ3yTNFs6T+Vg7rVJmQ==, tarball: file:projects/app-configuration.tgz} version: 0.0.0 '@rush-temp/arm-advisor@file:projects/arm-advisor.tgz': @@ -3008,27 +3008,27 @@ packages: version: 0.0.0 '@rush-temp/arm-deviceregistry@file:projects/arm-deviceregistry.tgz': - resolution: {integrity: sha512-qUOI02wFlgcRFu0/2QJXJ68w8p+st700Vjk5Xv/ywOcd3AShAQtGHduNSlByg2M2/BZZrCX4iezy+8vthJS3VA==, tarball: file:projects/arm-deviceregistry.tgz} + resolution: {integrity: sha512-6MciE8WhOTd75MHBzJJ+eSumcMuecnGFco8XkvsDZwOHQNHuR1luCf/y1ZEuDPSdKHkEs2nGh1gp0EcI1QRPpw==, tarball: file:projects/arm-deviceregistry.tgz} version: 0.0.0 '@rush-temp/arm-deviceupdate@file:projects/arm-deviceupdate.tgz': - resolution: {integrity: sha512-fcIPtB8SRvn94bktwFQ68TjpanmbrSGl21les6Ku9vjuPD9wCtEEqmmbX40bxF0yKbJpxsfz6AmuH2fzpdqTbg==, tarball: file:projects/arm-deviceupdate.tgz} + resolution: {integrity: sha512-v5/ThyhcfIKZ/wcvz24IP33PcIHKedIndbC/Ma93TBAMacoSSug2hhDd40ifvBmOomCGg8M12cPaD3StuQ1JcA==, tarball: file:projects/arm-deviceupdate.tgz} version: 0.0.0 '@rush-temp/arm-devopsinfrastructure@file:projects/arm-devopsinfrastructure.tgz': - resolution: {integrity: sha512-qThLI1jWnRhRS5M9YC9pSCyfS2IUCr+C55ZLZdZ/ewWknYeKlik7d34C3ixzY5fWJqlgj2m8FIxDG4dNv22GHw==, tarball: file:projects/arm-devopsinfrastructure.tgz} + resolution: {integrity: sha512-J9bklMCmzlQNf6YrAq6YltaIvj2pE20kKVzjobP+jXApozhfxzSgiS+kgv3yunIzJPopuCSCzqalQ9DqJftVig==, tarball: file:projects/arm-devopsinfrastructure.tgz} version: 0.0.0 '@rush-temp/arm-devspaces@file:projects/arm-devspaces.tgz': - resolution: {integrity: sha512-MlWmvDRdzCnx5V+k/XswOhPfGn3bZsTqB9U6rLU7uhcCpQtnC0URq2h6mAL2TohrdxkZAMrkn+MQHZkP7ZWNZQ==, tarball: file:projects/arm-devspaces.tgz} + resolution: {integrity: sha512-i/6AV99dDnXeO+NzwT8AaOjVwX1FFEVQudH7KPxAAfQdUqXlxIS0O4f26MXLsqAiuOcg6i4JEQYTNTdAEbtmCQ==, tarball: file:projects/arm-devspaces.tgz} version: 0.0.0 '@rush-temp/arm-devtestlabs@file:projects/arm-devtestlabs.tgz': - resolution: {integrity: sha512-Z/UZJKTEtsgEs/m9FM+8F2bTbbOLAL0cvdd3pmKDfimhxf98tO84fk0etI6PE1S/ClYJWt6WZRvHf3V4t6b7OQ==, tarball: file:projects/arm-devtestlabs.tgz} + resolution: {integrity: sha512-rlS/q9Etn8UN6TlwTXJeY2wou7J/f6LfewbPM02J1nLzk5DgnJ+Z49cZ/k4FdGlUw68hevGU1FIY6hQ7jocNzw==, tarball: file:projects/arm-devtestlabs.tgz} version: 0.0.0 '@rush-temp/arm-digitaltwins@file:projects/arm-digitaltwins.tgz': - resolution: {integrity: sha512-RHVauug3UIfbpdZ7obViFVVMLWP5IjqjI78IdjV0zxX5gI4Z6Uanw/kllBu10kxAw5F/4hh0bieUDJNeY1r6SA==, tarball: file:projects/arm-digitaltwins.tgz} + resolution: {integrity: sha512-Vgmp1Bv/MZGldkRVcgc5cTmhNfukT9o6Qq2Q1IXb+tCbsQWe2CDKQZbKBqkf8Xj8d1mE8t3UCzVwi9jiTbytdw==, tarball: file:projects/arm-digitaltwins.tgz} version: 0.0.0 '@rush-temp/arm-dns-profile-2020-09-01-hybrid@file:projects/arm-dns-profile-2020-09-01-hybrid.tgz': @@ -3828,7 +3828,7 @@ packages: version: 0.0.0 '@rush-temp/cosmos@file:projects/cosmos.tgz': - resolution: {integrity: sha512-Oo1YC8Bl9JY/gJF6MTQWnAhSRPfZvqjaXfuU4SUsyRGmamwrkDfigyUJYEcqRwCF4JyZ+JjkgIdVER9nITATsA==, tarball: file:projects/cosmos.tgz} + resolution: {integrity: sha512-v9YVLjFKbVmx5EWiE7LsPWU04QvgDtvIkB2cGhQhm+sbNsCmXtdvkuRLCU7KqB/fWUMjAmnE14leCv/9cKYr8Q==, tarball: file:projects/cosmos.tgz} version: 0.0.0 '@rush-temp/create-microsoft-playwright-testing@file:projects/create-microsoft-playwright-testing.tgz': @@ -3852,7 +3852,7 @@ packages: version: 0.0.0 '@rush-temp/digital-twins-core@file:projects/digital-twins-core.tgz': - resolution: {integrity: sha512-HyLhG4SuWFEMQ3KUJtApNev3ntmWO0p9hynqujg2fdHGlSPedlHdTpgtJxJ24sml1/zprYaE6Bj7IvHcb8x4Xg==, tarball: file:projects/digital-twins-core.tgz} + resolution: {integrity: sha512-3U1LBke38h90I7bcDdvEPrSiN1eYPRhbAglwRw+pVoqT48YySHQmNueFk1Kgs5ew6wF1x9H8oBtnkdXp1wluAA==, tarball: file:projects/digital-twins-core.tgz} version: 0.0.0 '@rush-temp/eslint-plugin-azure-sdk@file:projects/eslint-plugin-azure-sdk.tgz': @@ -3920,7 +3920,7 @@ packages: version: 0.0.0 '@rush-temp/iot-device-update@file:projects/iot-device-update.tgz': - resolution: {integrity: sha512-YxiAuEHQrn5tMzXrU+xAqAOpz3BEPRZReT3VT7N3pPM5iT+d73NwbRFanU+cU0mJE4231iW8686RxCevp0YjHw==, tarball: file:projects/iot-device-update.tgz} + resolution: {integrity: sha512-l0iPIJEaLQIYyBR/1Q1uhsN4jZgJ7S+sEw4ZkV4VaPdYMEfmc5yqoBFGTb8xLcTS3YOrkID5QKKmPMSb/Qym4w==, tarball: file:projects/iot-device-update.tgz} version: 0.0.0 '@rush-temp/iot-modelsrepository@file:projects/iot-modelsrepository.tgz': @@ -4000,15 +4000,15 @@ packages: version: 0.0.0 '@rush-temp/monitor-opentelemetry-exporter@file:projects/monitor-opentelemetry-exporter.tgz': - resolution: {integrity: sha512-zkjFwSF6XaWqqgTseIApfabjxBusvCV2GCPAH0784331hWHMlVMm2mnpVoLpR4EUD3/m2sK9/UTvRzAuToJhTQ==, tarball: file:projects/monitor-opentelemetry-exporter.tgz} + resolution: {integrity: sha512-hEnlLvehlh3ejDkAZMH2pTtAPU+i6O550upJ4DPMW89QmlerdmJT9CJt3u8yCb6af/ei6C871wpRH/JEXKk4ig==, tarball: file:projects/monitor-opentelemetry-exporter.tgz} version: 0.0.0 '@rush-temp/monitor-opentelemetry@file:projects/monitor-opentelemetry.tgz': - resolution: {integrity: sha512-5+1YPPlqtKMgVsteZDwGzHenNo7xTz7Kfnf5T6hCPQBYoc3h+8UDXPLX5eY4H94BpK6DPqIRRzo5/ssTOlIZvw==, tarball: file:projects/monitor-opentelemetry.tgz} + resolution: {integrity: sha512-z5UtXbsaWkLnIHmEMZoEtUXx1JlX0h8qgs+NUDTrIhb4eeKvLQQq7MdBn5ebvQ5+IK9X7Eo48plVd7uc0klcuQ==, tarball: file:projects/monitor-opentelemetry.tgz} version: 0.0.0 '@rush-temp/monitor-query@file:projects/monitor-query.tgz': - resolution: {integrity: sha512-jeOWD62O9d4VqeqJi2tDLWdFYLr4WdyFZLptBvddKPcNM7ioc3J6cT9l+u8MyLw8mhR+jmUXnE5USLYKequWnA==, tarball: file:projects/monitor-query.tgz} + resolution: {integrity: sha512-QySGA7L+mDLcyYqOmT0uB3vusB6f8FBSVbJPPkU0lpSji3nBLw590UHS8m8UOdKSdDKKZOGhgYyCbAFWML42sA==, tarball: file:projects/monitor-query.tgz} version: 0.0.0 '@rush-temp/notification-hubs@file:projects/notification-hubs.tgz': @@ -4084,7 +4084,7 @@ packages: version: 0.0.0 '@rush-temp/perf-monitor-opentelemetry@file:projects/perf-monitor-opentelemetry.tgz': - resolution: {integrity: sha512-byBSym/OfxQ58bVHVolF00z4GRg96yCYO7SwgMGbODClLim6M9/GJ7K4VVe4bifJ8DxljLMjdZh+9dDHL8+Q1g==, tarball: file:projects/perf-monitor-opentelemetry.tgz} + resolution: {integrity: sha512-dwzpNIZPU6i3RcqjhLVipjyiz3ZZMtjs7dOuCSH4TtaOyj5vgqVvQC61FbEsnQrI5coVWW0NEOmbNYbzkih1Yw==, tarball: file:projects/perf-monitor-opentelemetry.tgz} version: 0.0.0 '@rush-temp/perf-monitor-query@file:projects/perf-monitor-query.tgz': @@ -6913,9 +6913,9 @@ packages: nise@6.1.1: resolution: {integrity: sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==} - nock@14.0.0: - resolution: {integrity: sha512-3Z2ZoZoYTR/y2I+NI16+6IzfZFKBX7MrADtoBAm7v/QKqxQUhKw+Dh+847PPS1j/FDutjfIXfrh3CJF74yITWg==} - engines: {node: '>= 18'} + nock@13.5.6: + resolution: {integrity: sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==} + engines: {node: '>= 10.13'} node-abi@3.73.0: resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==} @@ -10841,7 +10841,7 @@ snapshots: '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) dotenv: 16.4.7 eslint: 9.19.0 - nock: 14.0.0 + nock: 13.5.6 playwright: 1.50.0 tslib: 2.8.1 typescript: 5.7.3 @@ -13469,7 +13469,6 @@ snapshots: '@rush-temp/arm-deviceupdate@file:projects/arm-deviceupdate.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13541,7 +13540,6 @@ snapshots: '@rush-temp/arm-devspaces@file:projects/arm-devspaces.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13576,7 +13574,6 @@ snapshots: '@rush-temp/arm-devtestlabs@file:projects/arm-devtestlabs.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -13611,7 +13608,6 @@ snapshots: '@rush-temp/arm-digitaltwins@file:projects/arm-digitaltwins.tgz(@types/debug@4.1.12)(msw@2.7.0(@types/node@22.7.9)(typescript@5.7.3))(tsx@4.19.2)(vite@5.4.14(@types/node@22.7.9))(yaml@2.7.0)': dependencies: - '@azure/abort-controller': 1.1.0 '@azure/core-lro': 2.7.2 '@types/node': 18.19.74 '@vitest/browser': 3.0.4(@types/node@18.19.74)(playwright@1.50.0)(typescript@5.7.3)(vite@5.4.14(@types/node@22.7.9))(vitest@3.0.4) @@ -18664,7 +18660,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 jsbi: 4.3.0 mocha: 11.1.0 - nock: 14.0.0 + nock: 13.5.6 priorityqueuejs: 2.0.0 requirejs: 2.3.7 semaphore: 1.1.0 @@ -20276,7 +20272,7 @@ snapshots: '@vitest/coverage-istanbul': 3.0.4(vitest@3.0.4) dotenv: 16.4.7 eslint: 9.19.0 - nock: 14.0.0 + nock: 13.5.6 playwright: 1.50.0 tslib: 2.8.1 typescript: 5.7.3 @@ -20337,7 +20333,7 @@ snapshots: dotenv: 16.4.7 eslint: 9.19.0 mocha: 11.1.0 - nock: 14.0.0 + nock: 13.5.6 nyc: 17.1.0 sinon: 17.0.1 tslib: 2.8.1 @@ -25276,11 +25272,13 @@ snapshots: just-extend: 6.2.0 path-to-regexp: 8.2.0 - nock@14.0.0: + nock@13.5.6: dependencies: - '@mswjs/interceptors': 0.37.5 + debug: 4.4.0(supports-color@8.1.1) json-stringify-safe: 5.0.1 propagate: 2.0.1 + transitivePeerDependencies: + - supports-color node-abi@3.73.0: dependencies: From f61615336e994740f705aad2e4ed72687aa55e4c Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Thu, 30 Jan 2025 21:13:03 -0800 Subject: [PATCH 19/21] Fix lint. --- .../test/internal/statsbeat.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts index f1e2cc3c8193..a8191ed9086d 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts @@ -1,5 +1,5 @@ -// // Copyright (c) Microsoft Corporation. -// // Licensed under the MIT License. +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. import { ExportResultCode } from "@opentelemetry/core"; import { @@ -21,7 +21,7 @@ import { describe, it, assert, - //expect, + // expect, vi, beforeAll, afterAll, From a330d6481bc15368c5049af1d5dbf48acc6abf7b Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Fri, 31 Jan 2025 12:11:39 -0800 Subject: [PATCH 20/21] Uncomment statsbeat tests and revert timeout. --- .../test/internal/statsbeat.spec.ts | 724 +++++++++--------- .../vitest.integration.config.ts | 2 +- 2 files changed, 359 insertions(+), 367 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts index a8191ed9086d..ec2b101b0f60 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts @@ -3,29 +3,21 @@ import { ExportResultCode } from "@opentelemetry/core"; import { - // failedBreezeResponse, + failedBreezeResponse, successfulBreezeResponse, } from "../utils/breezeTestUtils.js"; import { DEFAULT_BREEZE_ENDPOINT, - // ENV_DISABLE_STATSBEAT, - // LEGACY_ENV_DISABLE_STATSBEAT, + ENV_DISABLE_STATSBEAT, + LEGACY_ENV_DISABLE_STATSBEAT, } from "../../src/Declarations/Constants.js"; import nock from "nock"; -// import { NetworkStatsbeatMetrics } from "../../src/export/statsbeat/networkStatsbeatMetrics.js"; -// import { StatsbeatCounter } from "../../src/export/statsbeat/types.js"; -// import { getInstance } from "../../src/export/statsbeat/longIntervalStatsbeatMetrics.js"; +import { NetworkStatsbeatMetrics } from "../../src/export/statsbeat/networkStatsbeatMetrics.js"; +import { StatsbeatCounter } from "../../src/export/statsbeat/types.js"; +import { getInstance } from "../../src/export/statsbeat/longIntervalStatsbeatMetrics.js"; import { AzureMonitorTraceExporter } from "../../src/export/trace.js"; -// import { diag } from "@opentelemetry/api"; -import { - describe, - it, - assert, - // expect, - vi, - beforeAll, - afterAll, -} from "vitest"; +import { diag } from "@opentelemetry/api"; +import { describe, it, assert, expect, vi, beforeAll, afterAll } from "vitest"; describe("#AzureMonitorStatsbeatExporter", () => { process.env.LONG_INTERVAL_EXPORT_MILLIS = "100"; @@ -36,19 +28,19 @@ describe("#AzureMonitorStatsbeatExporter", () => { instrumentation: 10, }); - // const options = { - // instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", - // endpointUrl: "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", - // }; + const options = { + instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", + endpointUrl: "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", + }; const exportOptions = { connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, }; - // const disableOfflineStorageOptions = { - // connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, - // disableOfflineStorage: true, - // }; + const disableOfflineStorageOptions = { + connectionString: `InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333`, + disableOfflineStorage: true, + }; describe("Export/Statsbeat", () => { let scope: nock.Interceptor; @@ -61,13 +53,13 @@ describe("#AzureMonitorStatsbeatExporter", () => { scope = nock(DEFAULT_BREEZE_ENDPOINT).post("/v2.1/track"); it("should wait 15 seconds from startup to export long interval statsbeat", async () => { - // const longIntervalStatsbeat = getInstance(options); - // const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); - // longIntervalStatsbeat["initialize"](); - // expect(mockExport).not.toHaveBeenCalled(); - // setTimeout(async () => { - // expect(mockExport).toHaveBeenCalled(); - // }, 15000); + const longIntervalStatsbeat = getInstance(options); + const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); + longIntervalStatsbeat["initialize"](); + expect(mockExport).not.toHaveBeenCalled(); + setTimeout(async () => { + expect(mockExport).toHaveBeenCalled(); + }, 15000); }); }); @@ -96,341 +88,341 @@ describe("#AzureMonitorStatsbeatExporter", () => { ); }); - // it("should use non EU connection string", () => { - // const statsbeat = new NetworkStatsbeatMetrics({ - // instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", - // endpointUrl: "IngestionEndpoint=https://westus-0.in.applicationinsights.azure.com", - // }); - // assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westus-0"); - // }); - - // it("should use EU connection string", () => { - // const statsbeat = new NetworkStatsbeatMetrics(options); - // assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westeurope-5"); - // }); - - // it("getShortHost", () => { - // const statsbeat = new NetworkStatsbeatMetrics(options); - // assert.strictEqual( - // statsbeat["getShortHost"]("http://westus02-1.in.applicationinsights.azure.com"), - // "westus02", - // ); - // assert.strictEqual( - // statsbeat["getShortHost"]("https://westus02-1.in.applicationinsights.azure.com"), - // "westus02", - // ); - // assert.strictEqual(statsbeat["getShortHost"]("https://dc.services.visualstudio.com"), "dc"); - // assert.strictEqual(statsbeat["getShortHost"]("https://www.test.com"), "test"); - // }); - - // it("should add correct network properties to the custom metric", () => { - // const statsbeat = new NetworkStatsbeatMetrics(options); - // // eslint-disable-next-line no-unused-expressions - // statsbeat["statsCollectionShortInterval"]; - // statsbeat.countSuccess(100); - // const metric = statsbeat["networkStatsbeatCollection"][0]; - // assert.strictEqual(metric.intervalRequestExecutionTime, 100); - - // // Ensure network statsbeat attributes are populated - // assert.strictEqual(statsbeat["attach"], "Manual"); - // assert.strictEqual( - // statsbeat["cikey"], - // "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", - // ); - // assert.strictEqual(statsbeat["language"], "node"); - // assert.strictEqual(statsbeat["resourceProvider"], "unknown"); - // assert.strictEqual( - // statsbeat["endpointUrl"], - // "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", - // ); - // assert.ok(statsbeat["os"]); - // assert.ok(statsbeat["runtimeVersion"]); - // assert.ok(statsbeat["version"]); - // }); - - // it("should set common properties correctly", () => { - // const originalEnv = process.env; - // const newEnv = <{ [id: string]: string }>{}; - // newEnv.WEBSITE_SITE_NAME = "test"; - // process.env = newEnv; - // const statsbeat = new NetworkStatsbeatMetrics(options); - // assert.strictEqual(statsbeat["commonProperties"]["rp"], "appsvc"); - // process.env = originalEnv; - // }); - - // it("should add correct long interval properties to the custom metric", () => { - // const longIntervalStatsbeatMetrics = getInstance(options); - // assert.ok(longIntervalStatsbeatMetrics); - // // Represents the bitwise OR of NONE and AADHANDLING features - // assert.strictEqual(longIntervalStatsbeatMetrics["feature"], 3); - // // Represents the bitwise OR of MONGODB and REDIS instrumentations - // assert.strictEqual(longIntervalStatsbeatMetrics["instrumentation"], 10); - // assert.strictEqual(longIntervalStatsbeatMetrics["attachProperties"].rpId, ""); - // }); - - // it("should turn off statsbeat after max failures", async () => { - // const exporter = new AzureMonitorTraceExporter(exportOptions); - // const response = failedBreezeResponse(1, 200); - // scope.reply(200, JSON.stringify(response)); - // exporter["sender"]["statsbeatFailureCount"] = 4; - - // const result = await exporter["sender"]["exportEnvelopes"]([envelope]); - // assert.strictEqual(result.code, ExportResultCode.SUCCESS); - // }); - - // it("should not log error upon failed send if statsbeat is being sent", async () => { - // const mockExport = vi.spyOn(diag, "error"); - // const exporter = new AzureMonitorTraceExporter(exportOptions); - // const response = failedBreezeResponse(1, 500); - // scope.reply(500, JSON.stringify(response)); - // exporter["sender"]["isStatsbeatSender"] = true; - // await exporter["sender"]["exportEnvelopes"]([envelope]); - // expect(mockExport).not.toHaveBeenCalled(); - // }); - // }); - - // it("should mark statsbeat exporters as disableOfflineStorage when in the config", async () => { - // const exporter = new AzureMonitorTraceExporter(disableOfflineStorageOptions); - // const response = failedBreezeResponse(1, 502); - // scope.reply(200, JSON.stringify(response)); - // exporter["sender"]["disableOfflineStorage"] = true; - - // const result = await exporter["sender"]["exportEnvelopes"]([envelope]); - // assert.strictEqual(result.code, ExportResultCode.SUCCESS); - // }); - - // describe("Resource provider function", () => { - // const statsbeat = new NetworkStatsbeatMetrics(options); - - // it("it should determine if the rp is unknown", async () => { - // await statsbeat["getResourceProvider"](); - // assert.strictEqual(statsbeat["resourceProvider"], "unknown"); - // }); - - // it("it should determine if the rp is an app service", async () => { - // const newEnv = <{ [id: string]: string }>{}; - // newEnv["WEBSITE_SITE_NAME"] = "Test Website"; - // newEnv["WEBSITE_HOME_STAMPNAME"] = "testhome"; - // const originalEnv = process.env; - // process.env = newEnv; - // await statsbeat["getResourceProvider"](); - // process.env = originalEnv; - // assert.strictEqual(statsbeat["resourceProvider"], "appsvc"); - // assert.strictEqual(statsbeat["resourceIdentifier"], "Test Website/testhome"); - // }); - - // it("should determine if the rp is an Azure Function", async () => { - // const newEnv = <{ [id: string]: string }>{}; - // newEnv["FUNCTIONS_WORKER_RUNTIME"] = "test"; - // newEnv["WEBSITE_HOSTNAME"] = "testhost"; - // const originalEnv = process.env; - // process.env = newEnv; - // await statsbeat["getResourceProvider"](); - // process.env = originalEnv; - // assert.strictEqual(statsbeat["resourceProvider"], "functions"); - // assert.strictEqual(statsbeat["resourceIdentifier"], "testhost"); - // }); - - // it("should determine if the rp is an Azure VM", async () => { - // const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); - // getAzureComputeStub.mockResolvedValue(true); - - // const newEnv = <{ [id: string]: string }>{}; - // const originalEnv = process.env; - // process.env = newEnv; - - // await statsbeat["getResourceProvider"](); - // process.env = originalEnv; - // assert.strictEqual(statsbeat["resourceProvider"], "vm"); - // assert.strictEqual(statsbeat["resourceIdentifier"], "undefined/undefined"); - // }); - - // it("should determine if the rp is AKS", async () => { - // const newEnv = <{ [id: string]: string }>{}; - // newEnv["AKS_ARM_NAMESPACE_ID"] = "testaks"; - // const originalEnv = process.env; - // process.env = newEnv; - - // await statsbeat["getResourceProvider"](); - // process.env = originalEnv; - // assert.strictEqual(statsbeat["resourceProvider"], "aks"); - // assert.strictEqual(statsbeat["resourceIdentifier"], "testaks"); - // }); - - // it("should override OS and VM info", async () => { - // const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); - // getAzureComputeStub.mockResolvedValue(true); - // statsbeat["vmInfo"]["osType"] = "test"; - - // const newEnv = <{ [id: string]: string }>{}; - // const originalEnv = process.env; - // process.env = newEnv; - - // await statsbeat["getResourceProvider"](); - // process.env = originalEnv; - // assert.strictEqual(statsbeat["resourceProvider"], "vm"); - // assert.strictEqual(statsbeat["os"], "test"); - // }); - // }); - - // describe("Track data from statsbeats", () => { - // let statsbeat: NetworkStatsbeatMetrics; - - // beforeAll(() => { - // process.env.WEBSITE_SITE_NAME = "test"; - // statsbeat = new NetworkStatsbeatMetrics({ - // ...options, - // networkCollectionInterval: 100, - // }); - // }); - - // afterAll(async () => { - // await statsbeat.shutdown(); - // process.env.WEBSITE_SITE_NAME = undefined; - // }); - - // it("should track duration", async () => { - // const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); - // statsbeat.countSuccess(100); - // statsbeat.countRetry(206); - // statsbeat.countFailure(200, 500); - // statsbeat.countThrottle(402); - // statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); - - // await new Promise((resolve) => setTimeout(resolve, 120)); - // expect(mockExport).toHaveBeenCalled(); - // const resourceMetrics = mockExport.mock.calls[0][0]; - // const scopeMetrics = resourceMetrics.scopeMetrics; - // assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); - // const metrics = scopeMetrics[0].metrics; - // assert.strictEqual(metrics.length, 8, "Metrics count"); - // assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.SUCCESS_COUNT); - // assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.FAILURE_COUNT); - // assert.strictEqual(metrics[2].descriptor.name, StatsbeatCounter.RETRY_COUNT); - // assert.strictEqual(metrics[3].descriptor.name, StatsbeatCounter.THROTTLE_COUNT); - // assert.strictEqual(metrics[4].descriptor.name, StatsbeatCounter.EXCEPTION_COUNT); - // assert.strictEqual(metrics[5].descriptor.name, StatsbeatCounter.AVERAGE_DURATION); - - // // Test that average duration is exported. - // assert.strictEqual(metrics[5].dataPoints[0].value, 150); - // }); - - // it("should track statsbeat counts", async () => { - // const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); - // statsbeat.countSuccess(100); - // statsbeat.countSuccess(100); - // statsbeat.countSuccess(100); - // statsbeat.countSuccess(100); - // statsbeat.countFailure(200, 500); - // statsbeat.countFailure(100, 500); - // statsbeat.countFailure(200, 501); - // statsbeat.countFailure(200, 502); - // statsbeat.countRetry(206); - // statsbeat.countRetry(206); - // statsbeat.countRetry(204); - // statsbeat.countThrottle(402); - // statsbeat.countThrottle(439); - // statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); - // statsbeat.countException({ name: "Statsbeat2", message: "Second Statsbeat Exception" }); - // statsbeat.countReadFailure(); - // statsbeat.countWriteFailure(); - // statsbeat.countWriteFailure(); - - // await new Promise((resolve) => setTimeout(resolve, 500)); - // expect(mockExport).toHaveBeenCalled(); - // const resourceMetrics = mockExport.mock.calls[1][0]; - // const scopeMetrics = resourceMetrics.scopeMetrics; - // const metrics = scopeMetrics[0].metrics; - - // assert.ok(metrics, "Statsbeat metrics not properly initialized"); - // assert.strictEqual(metrics.length, 8); - // // Represents the last observation called for each callback - // // Successful - // assert.strictEqual(metrics[0].dataPoints[0].value, 4); - - // // Failed - // assert.strictEqual(metrics[1].dataPoints[0].value, 2); - // assert.strictEqual(metrics[1].dataPoints[0].attributes.statusCode, 500); - - // assert.strictEqual(metrics[1].dataPoints[1].value, 1); - // assert.strictEqual(metrics[1].dataPoints[1].attributes.statusCode, 501); - - // assert.strictEqual(metrics[1].dataPoints[2].value, 1); - // assert.strictEqual(metrics[1].dataPoints[2].attributes.statusCode, 502); - - // // Retry - // assert.strictEqual(metrics[2].dataPoints[0].value, 2); - // assert.strictEqual(metrics[2].dataPoints[0].attributes.statusCode, 206); - - // assert.strictEqual(metrics[2].dataPoints[1].value, 1); - // assert.strictEqual(metrics[2].dataPoints[1].attributes.statusCode, 204); - - // // Throttle - // assert.strictEqual(metrics[3].dataPoints[0].value, 1); - // assert.strictEqual(metrics[3].dataPoints[0].attributes.statusCode, 402); - - // assert.strictEqual(metrics[3].dataPoints[1].value, 1); - // assert.strictEqual(metrics[3].dataPoints[1].attributes.statusCode, 439); - - // // Exception - // assert.strictEqual(metrics[4].dataPoints[0].value, 1); - // assert.strictEqual(metrics[4].dataPoints[0].attributes.exceptionType, "Statsbeat"); - - // assert.strictEqual(metrics[4].dataPoints[1].value, 1); - // assert.strictEqual(metrics[4].dataPoints[1].attributes.exceptionType, "Statsbeat2"); - - // // Average Duration - // assert.strictEqual(metrics[5].dataPoints[0].value, 137.5); - - // // Disk Read Failure - // assert.strictEqual(metrics[6].dataPoints[0].value, 1); - - // // Disk Write Failure - // assert.strictEqual(metrics[7].dataPoints[0].value, 2); - // }); - - // it("should track long interval statsbeats", async () => { - // const longIntervalStatsbeat = getInstance(options); - // const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); - - // await new Promise((resolve) => setTimeout(resolve, 120)); - // expect(mockExport).toHaveBeenCalled(); - // const resourceMetrics = mockExport.mock.calls[0][0]; - // const scopeMetrics = resourceMetrics.scopeMetrics; - // assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); - // const metrics = scopeMetrics[0].metrics; - // assert.strictEqual(metrics.length, 2, "Metrics count"); - // assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.FEATURE); - // assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.ATTACH); - // // Instrumentation statsbeat - // assert.strictEqual(metrics[0].dataPoints[0].attributes.type, 1); - // // Feature statsbeat - // assert.strictEqual(metrics[0].dataPoints[1].attributes.type, 0); - - // // Clean up env variables - // delete process.env.STATSBEAT_INSTRUMENTATIONS; - // delete process.env.STATSBEAT_FEATURES; - // delete process.env.LONG_INTERVAL_EXPORT_MILLIS; - // }); - // }); - - // describe("Disable Non-Essential Statsbeat", () => { - // it("should disable statsbeat when the environment variable is set", () => { - // process.env[ENV_DISABLE_STATSBEAT] = "true"; - // const exporter = new AzureMonitorTraceExporter(exportOptions); - // assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); - // assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["readFailureGauge"]); - // assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["writeFailureGauge"]); - // delete process.env[ENV_DISABLE_STATSBEAT]; - // }); - - // it("should disable all statsbeat when the legacy environment variable is set", () => { - // process.env[LEGACY_ENV_DISABLE_STATSBEAT] = "true"; - // const exporter = new AzureMonitorTraceExporter(exportOptions); - // assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]); - // assert.ok(!exporter["sender"]["longIntervalStatsbeatMetrics"]); - // delete process.env[LEGACY_ENV_DISABLE_STATSBEAT]; - // }); + it("should use non EU connection string", () => { + const statsbeat = new NetworkStatsbeatMetrics({ + instrumentationKey: "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", + endpointUrl: "IngestionEndpoint=https://westus-0.in.applicationinsights.azure.com", + }); + assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westus-0"); + }); + + it("should use EU connection string", () => { + const statsbeat = new NetworkStatsbeatMetrics(options); + assert.strictEqual(statsbeat["host"], "IngestionEndpoint=https://westeurope-5"); + }); + + it("getShortHost", () => { + const statsbeat = new NetworkStatsbeatMetrics(options); + assert.strictEqual( + statsbeat["getShortHost"]("http://westus02-1.in.applicationinsights.azure.com"), + "westus02", + ); + assert.strictEqual( + statsbeat["getShortHost"]("https://westus02-1.in.applicationinsights.azure.com"), + "westus02", + ); + assert.strictEqual(statsbeat["getShortHost"]("https://dc.services.visualstudio.com"), "dc"); + assert.strictEqual(statsbeat["getShortHost"]("https://www.test.com"), "test"); + }); + + it("should add correct network properties to the custom metric", () => { + const statsbeat = new NetworkStatsbeatMetrics(options); + // eslint-disable-next-line no-unused-expressions + statsbeat["statsCollectionShortInterval"]; + statsbeat.countSuccess(100); + const metric = statsbeat["networkStatsbeatCollection"][0]; + assert.strictEqual(metric.intervalRequestExecutionTime, 100); + + // Ensure network statsbeat attributes are populated + assert.strictEqual(statsbeat["attach"], "Manual"); + assert.strictEqual( + statsbeat["cikey"], + "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;", + ); + assert.strictEqual(statsbeat["language"], "node"); + assert.strictEqual(statsbeat["resourceProvider"], "unknown"); + assert.strictEqual( + statsbeat["endpointUrl"], + "IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com", + ); + assert.ok(statsbeat["os"]); + assert.ok(statsbeat["runtimeVersion"]); + assert.ok(statsbeat["version"]); + }); + + it("should set common properties correctly", () => { + const originalEnv = process.env; + const newEnv = <{ [id: string]: string }>{}; + newEnv.WEBSITE_SITE_NAME = "test"; + process.env = newEnv; + const statsbeat = new NetworkStatsbeatMetrics(options); + assert.strictEqual(statsbeat["commonProperties"]["rp"], "appsvc"); + process.env = originalEnv; + }); + + it("should add correct long interval properties to the custom metric", () => { + const longIntervalStatsbeatMetrics = getInstance(options); + assert.ok(longIntervalStatsbeatMetrics); + // Represents the bitwise OR of NONE and AADHANDLING features + assert.strictEqual(longIntervalStatsbeatMetrics["feature"], 3); + // Represents the bitwise OR of MONGODB and REDIS instrumentations + assert.strictEqual(longIntervalStatsbeatMetrics["instrumentation"], 10); + assert.strictEqual(longIntervalStatsbeatMetrics["attachProperties"].rpId, ""); + }); + + it("should turn off statsbeat after max failures", async () => { + const exporter = new AzureMonitorTraceExporter(exportOptions); + const response = failedBreezeResponse(1, 200); + scope.reply(200, JSON.stringify(response)); + exporter["sender"]["statsbeatFailureCount"] = 4; + + const result = await exporter["sender"]["exportEnvelopes"]([envelope]); + assert.strictEqual(result.code, ExportResultCode.SUCCESS); + }); + + it("should not log error upon failed send if statsbeat is being sent", async () => { + const mockExport = vi.spyOn(diag, "error"); + const exporter = new AzureMonitorTraceExporter(exportOptions); + const response = failedBreezeResponse(1, 500); + scope.reply(500, JSON.stringify(response)); + exporter["sender"]["isStatsbeatSender"] = true; + await exporter["sender"]["exportEnvelopes"]([envelope]); + expect(mockExport).not.toHaveBeenCalled(); + }); + }); + + it("should mark statsbeat exporters as disableOfflineStorage when in the config", async () => { + const exporter = new AzureMonitorTraceExporter(disableOfflineStorageOptions); + const response = failedBreezeResponse(1, 502); + scope.reply(200, JSON.stringify(response)); + exporter["sender"]["disableOfflineStorage"] = true; + + const result = await exporter["sender"]["exportEnvelopes"]([envelope]); + assert.strictEqual(result.code, ExportResultCode.SUCCESS); + }); + + describe("Resource provider function", () => { + const statsbeat = new NetworkStatsbeatMetrics(options); + + it("it should determine if the rp is unknown", async () => { + await statsbeat["getResourceProvider"](); + assert.strictEqual(statsbeat["resourceProvider"], "unknown"); + }); + + it("it should determine if the rp is an app service", async () => { + const newEnv = <{ [id: string]: string }>{}; + newEnv["WEBSITE_SITE_NAME"] = "Test Website"; + newEnv["WEBSITE_HOME_STAMPNAME"] = "testhome"; + const originalEnv = process.env; + process.env = newEnv; + await statsbeat["getResourceProvider"](); + process.env = originalEnv; + assert.strictEqual(statsbeat["resourceProvider"], "appsvc"); + assert.strictEqual(statsbeat["resourceIdentifier"], "Test Website/testhome"); + }); + + it("should determine if the rp is an Azure Function", async () => { + const newEnv = <{ [id: string]: string }>{}; + newEnv["FUNCTIONS_WORKER_RUNTIME"] = "test"; + newEnv["WEBSITE_HOSTNAME"] = "testhost"; + const originalEnv = process.env; + process.env = newEnv; + await statsbeat["getResourceProvider"](); + process.env = originalEnv; + assert.strictEqual(statsbeat["resourceProvider"], "functions"); + assert.strictEqual(statsbeat["resourceIdentifier"], "testhost"); + }); + + it("should determine if the rp is an Azure VM", async () => { + const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); + getAzureComputeStub.mockResolvedValue(true); + + const newEnv = <{ [id: string]: string }>{}; + const originalEnv = process.env; + process.env = newEnv; + + await statsbeat["getResourceProvider"](); + process.env = originalEnv; + assert.strictEqual(statsbeat["resourceProvider"], "vm"); + assert.strictEqual(statsbeat["resourceIdentifier"], "undefined/undefined"); + }); + + it("should determine if the rp is AKS", async () => { + const newEnv = <{ [id: string]: string }>{}; + newEnv["AKS_ARM_NAMESPACE_ID"] = "testaks"; + const originalEnv = process.env; + process.env = newEnv; + + await statsbeat["getResourceProvider"](); + process.env = originalEnv; + assert.strictEqual(statsbeat["resourceProvider"], "aks"); + assert.strictEqual(statsbeat["resourceIdentifier"], "testaks"); + }); + + it("should override OS and VM info", async () => { + const getAzureComputeStub = vi.spyOn(statsbeat, "getAzureComputeMetadata"); + getAzureComputeStub.mockResolvedValue(true); + statsbeat["vmInfo"]["osType"] = "test"; + + const newEnv = <{ [id: string]: string }>{}; + const originalEnv = process.env; + process.env = newEnv; + + await statsbeat["getResourceProvider"](); + process.env = originalEnv; + assert.strictEqual(statsbeat["resourceProvider"], "vm"); + assert.strictEqual(statsbeat["os"], "test"); + }); + }); + + describe("Track data from statsbeats", () => { + let statsbeat: NetworkStatsbeatMetrics; + + beforeAll(() => { + process.env.WEBSITE_SITE_NAME = "test"; + statsbeat = new NetworkStatsbeatMetrics({ + ...options, + networkCollectionInterval: 100, + }); + }); + + afterAll(async () => { + await statsbeat.shutdown(); + process.env.WEBSITE_SITE_NAME = undefined; + }); + + it("should track duration", async () => { + const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); + statsbeat.countSuccess(100); + statsbeat.countRetry(206); + statsbeat.countFailure(200, 500); + statsbeat.countThrottle(402); + statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); + + await new Promise((resolve) => setTimeout(resolve, 120)); + expect(mockExport).toHaveBeenCalled(); + const resourceMetrics = mockExport.mock.calls[0][0]; + const scopeMetrics = resourceMetrics.scopeMetrics; + assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); + const metrics = scopeMetrics[0].metrics; + assert.strictEqual(metrics.length, 8, "Metrics count"); + assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.SUCCESS_COUNT); + assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.FAILURE_COUNT); + assert.strictEqual(metrics[2].descriptor.name, StatsbeatCounter.RETRY_COUNT); + assert.strictEqual(metrics[3].descriptor.name, StatsbeatCounter.THROTTLE_COUNT); + assert.strictEqual(metrics[4].descriptor.name, StatsbeatCounter.EXCEPTION_COUNT); + assert.strictEqual(metrics[5].descriptor.name, StatsbeatCounter.AVERAGE_DURATION); + + // Test that average duration is exported. + assert.strictEqual(metrics[5].dataPoints[0].value, 150); + }); + + it("should track statsbeat counts", async () => { + const mockExport = vi.spyOn(statsbeat["networkAzureExporter"], "export"); + statsbeat.countSuccess(100); + statsbeat.countSuccess(100); + statsbeat.countSuccess(100); + statsbeat.countSuccess(100); + statsbeat.countFailure(200, 500); + statsbeat.countFailure(100, 500); + statsbeat.countFailure(200, 501); + statsbeat.countFailure(200, 502); + statsbeat.countRetry(206); + statsbeat.countRetry(206); + statsbeat.countRetry(204); + statsbeat.countThrottle(402); + statsbeat.countThrottle(439); + statsbeat.countException({ name: "Statsbeat", message: "Statsbeat Exception" }); + statsbeat.countException({ name: "Statsbeat2", message: "Second Statsbeat Exception" }); + statsbeat.countReadFailure(); + statsbeat.countWriteFailure(); + statsbeat.countWriteFailure(); + + await new Promise((resolve) => setTimeout(resolve, 500)); + expect(mockExport).toHaveBeenCalled(); + const resourceMetrics = mockExport.mock.calls[1][0]; + const scopeMetrics = resourceMetrics.scopeMetrics; + const metrics = scopeMetrics[0].metrics; + + assert.ok(metrics, "Statsbeat metrics not properly initialized"); + assert.strictEqual(metrics.length, 8); + // Represents the last observation called for each callback + // Successful + assert.strictEqual(metrics[0].dataPoints[0].value, 4); + + // Failed + assert.strictEqual(metrics[1].dataPoints[0].value, 2); + assert.strictEqual(metrics[1].dataPoints[0].attributes.statusCode, 500); + + assert.strictEqual(metrics[1].dataPoints[1].value, 1); + assert.strictEqual(metrics[1].dataPoints[1].attributes.statusCode, 501); + + assert.strictEqual(metrics[1].dataPoints[2].value, 1); + assert.strictEqual(metrics[1].dataPoints[2].attributes.statusCode, 502); + + // Retry + assert.strictEqual(metrics[2].dataPoints[0].value, 2); + assert.strictEqual(metrics[2].dataPoints[0].attributes.statusCode, 206); + + assert.strictEqual(metrics[2].dataPoints[1].value, 1); + assert.strictEqual(metrics[2].dataPoints[1].attributes.statusCode, 204); + + // Throttle + assert.strictEqual(metrics[3].dataPoints[0].value, 1); + assert.strictEqual(metrics[3].dataPoints[0].attributes.statusCode, 402); + + assert.strictEqual(metrics[3].dataPoints[1].value, 1); + assert.strictEqual(metrics[3].dataPoints[1].attributes.statusCode, 439); + + // Exception + assert.strictEqual(metrics[4].dataPoints[0].value, 1); + assert.strictEqual(metrics[4].dataPoints[0].attributes.exceptionType, "Statsbeat"); + + assert.strictEqual(metrics[4].dataPoints[1].value, 1); + assert.strictEqual(metrics[4].dataPoints[1].attributes.exceptionType, "Statsbeat2"); + + // Average Duration + assert.strictEqual(metrics[5].dataPoints[0].value, 137.5); + + // Disk Read Failure + assert.strictEqual(metrics[6].dataPoints[0].value, 1); + + // Disk Write Failure + assert.strictEqual(metrics[7].dataPoints[0].value, 2); + }); + + it("should track long interval statsbeats", async () => { + const longIntervalStatsbeat = getInstance(options); + const mockExport = vi.spyOn(longIntervalStatsbeat["longIntervalAzureExporter"], "export"); + + await new Promise((resolve) => setTimeout(resolve, 120)); + expect(mockExport).toHaveBeenCalled(); + const resourceMetrics = mockExport.mock.calls[0][0]; + const scopeMetrics = resourceMetrics.scopeMetrics; + assert.strictEqual(scopeMetrics.length, 1, "Scope Metrics count"); + const metrics = scopeMetrics[0].metrics; + assert.strictEqual(metrics.length, 2, "Metrics count"); + assert.strictEqual(metrics[0].descriptor.name, StatsbeatCounter.FEATURE); + assert.strictEqual(metrics[1].descriptor.name, StatsbeatCounter.ATTACH); + // Instrumentation statsbeat + assert.strictEqual(metrics[0].dataPoints[0].attributes.type, 1); + // Feature statsbeat + assert.strictEqual(metrics[0].dataPoints[1].attributes.type, 0); + + // Clean up env variables + delete process.env.STATSBEAT_INSTRUMENTATIONS; + delete process.env.STATSBEAT_FEATURES; + delete process.env.LONG_INTERVAL_EXPORT_MILLIS; + }); + }); + + describe("Disable Non-Essential Statsbeat", () => { + it("should disable statsbeat when the environment variable is set", () => { + process.env[ENV_DISABLE_STATSBEAT] = "true"; + const exporter = new AzureMonitorTraceExporter(exportOptions); + assert.ok(exporter["sender"]["networkStatsbeatMetrics"]); + assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["readFailureGauge"]); + assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]?.["writeFailureGauge"]); + delete process.env[ENV_DISABLE_STATSBEAT]; + }); + + it("should disable all statsbeat when the legacy environment variable is set", () => { + process.env[LEGACY_ENV_DISABLE_STATSBEAT] = "true"; + const exporter = new AzureMonitorTraceExporter(exportOptions); + assert.ok(!exporter["sender"]["networkStatsbeatMetrics"]); + assert.ok(!exporter["sender"]["longIntervalStatsbeatMetrics"]); + delete process.env[LEGACY_ENV_DISABLE_STATSBEAT]; + }); }); }); }); diff --git a/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts b/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts index 359d36571be9..67bfebdc75a5 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/vitest.integration.config.ts @@ -9,7 +9,7 @@ export default mergeConfig( viteConfig, defineConfig({ test: { - testTimeout: 900000, + testTimeout: 600000, include: ["test/internal/functional/**/*.test.ts"], }, }), From 4621d5920c880b631809c79cae0ea367b7786741 Mon Sep 17 00:00:00 2001 From: Jackson Weber Date: Fri, 31 Jan 2025 12:40:46 -0800 Subject: [PATCH 21/21] Fix format. --- .../test/internal/statsbeat.spec.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts index ec2b101b0f60..bbf81da856f0 100644 --- a/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts +++ b/sdk/monitor/monitor-opentelemetry-exporter/test/internal/statsbeat.spec.ts @@ -2,10 +2,7 @@ // Licensed under the MIT License. import { ExportResultCode } from "@opentelemetry/core"; -import { - failedBreezeResponse, - successfulBreezeResponse, -} from "../utils/breezeTestUtils.js"; +import { failedBreezeResponse, successfulBreezeResponse } from "../utils/breezeTestUtils.js"; import { DEFAULT_BREEZE_ENDPOINT, ENV_DISABLE_STATSBEAT,