@azure/monitor-opentelemetry 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -97,7 +97,7 @@ useAzureMonitor(options);
97
97
  | browserSdkLoaderOptions| Allow configuration of Web Instrumentations. | { enabled: false, connectionString: "" } |
98
98
  | resource | Opentelemetry Resource. [More info here](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-resources) ||
99
99
  | samplingRatio | Sampling ratio must take a value in the range [0,1], 1 meaning all data will sampled and 0 all Tracing data will be sampled out. |1|
100
- | enableLiveMetrics | Enable/Disable Live Metrics. |false|
100
+ | enableLiveMetrics | Enable/Disable Live Metrics. |true|
101
101
  | enableStandardMetrics | Enable/Disable Standard Metrics. |true|
102
102
  | logRecordProcessors | Array of log record processors to register to the global logger provider. ||
103
103
  | spanProcessors | Array of span processors to register to the global tracer provider. ||
@@ -377,7 +377,7 @@ and thus draw attention to them in relevant experiences including the failures b
377
377
 
378
378
  ```typescript
379
379
  import { useAzureMonitor } from "@azure/monitor-opentelemetry";
380
- import { trace } from "@opentelemetry/api";
380
+ import { trace, Exception } from "@opentelemetry/api";
381
381
 
382
382
  useAzureMonitor();
383
383
  const tracer = trace.getTracer("testMeter");
@@ -387,7 +387,7 @@ try{
387
387
  throw new Error("Test Error");
388
388
  }
389
389
  catch(error){
390
- span.recordException(error);
390
+ span.recordException(error as Exception);
391
391
  }
392
392
  ```
393
393
 
package/dist/index.js CHANGED
@@ -168,6 +168,46 @@ const getResourceProvider = () => {
168
168
  }
169
169
  return "u";
170
170
  };
171
+ // This function is a slight modification of an upstream otel util function -
172
+ // mainly for prioritizing the resource detectors customer may specify over
173
+ // env var & not enabling process detector by default.
174
+ function parseResourceDetectorsFromEnvVar() {
175
+ var _a, _b;
176
+ const resourceDetectors = new Map([
177
+ ["env", resources.envDetectorSync],
178
+ ["host", resources.hostDetectorSync],
179
+ ["os", resources.osDetectorSync],
180
+ ["process", resources.processDetectorSync],
181
+ ["serviceinstance", resources.serviceInstanceIdDetectorSync],
182
+ ]);
183
+ if (process.env.OTEL_NODE_RESOURCE_DETECTORS != null) {
184
+ const resourceDetectorsFromEnv = (_b = (_a = process.env.OTEL_NODE_RESOURCE_DETECTORS) === null || _a === void 0 ? void 0 : _a.split(",")) !== null && _b !== void 0 ? _b : [
185
+ "env",
186
+ "host",
187
+ "os",
188
+ ];
189
+ if (resourceDetectorsFromEnv.includes("all")) {
190
+ return [...resourceDetectors.values()];
191
+ }
192
+ if (resourceDetectorsFromEnv.includes("none")) {
193
+ return [];
194
+ }
195
+ return resourceDetectorsFromEnv.flatMap((detector) => {
196
+ const resourceDetector = resourceDetectors.get(detector);
197
+ if (!resourceDetector) {
198
+ api.diag.error(`Invalid resource detector "${detector}" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`);
199
+ return [];
200
+ }
201
+ return [resourceDetector];
202
+ });
203
+ }
204
+ else {
205
+ // leaving out the process detector as that can add many resource attributes
206
+ // with large values. Also not enabling service instance attributes by default
207
+ // as this is still experimental.
208
+ return [resources.envDetectorSync, resources.hostDetectorSync, resources.osDetectorSync];
209
+ }
210
+ }
171
211
 
172
212
  // Copyright (c) Microsoft Corporation.
173
213
  // Licensed under the MIT license.
@@ -529,7 +569,7 @@ class InternalConfig {
529
569
  // Default values
530
570
  this.azureMonitorExporterOptions = {};
531
571
  this.samplingRatio = 1;
532
- this.enableLiveMetrics = false;
572
+ this.enableLiveMetrics = true;
533
573
  this.enableStandardMetrics = true;
534
574
  this.enableTraceBasedSamplingForLogs = true;
535
575
  this.instrumentationOptions = {
@@ -551,7 +591,8 @@ class InternalConfig {
551
591
  this.azureMonitorExporterOptions = Object.assign(this.azureMonitorExporterOptions, options.azureMonitorExporterOptions);
552
592
  this.instrumentationOptions = Object.assign(this.instrumentationOptions, options.instrumentationOptions);
553
593
  this.resource = Object.assign(this.resource, options.resource);
554
- this.samplingRatio = options.samplingRatio || this.samplingRatio;
594
+ this.samplingRatio =
595
+ options.samplingRatio !== undefined ? options.samplingRatio : this.samplingRatio;
555
596
  this.browserSdkLoaderOptions = Object.assign(this.browserSdkLoaderOptions, options.browserSdkLoaderOptions);
556
597
  this.enableLiveMetrics =
557
598
  options.enableLiveMetrics != undefined ? options.enableLiveMetrics : this.enableLiveMetrics;
@@ -659,9 +700,11 @@ var StandardMetricIds;
659
700
  function getRequestDimensions(span) {
660
701
  const dimensions = getBaseDimensions(span.resource);
661
702
  dimensions.metricId = StandardMetricIds.REQUEST_DURATION;
662
- const statusCode = String(span.attributes["http.status_code"]);
703
+ const statusCode = String(span.attributes[semanticConventions.SEMATTRS_HTTP_STATUS_CODE]);
663
704
  dimensions.requestResultCode = statusCode;
664
- dimensions.requestSuccess = statusCode === "200" ? "True" : "False";
705
+ // OTel treats 4xx request responses as UNSET SpanStatusCode, but we should count them as failed
706
+ dimensions.requestSuccess =
707
+ span.status.code !== api.SpanStatusCode.ERROR && (Number(statusCode) || 0) < 400 ? "True" : "False";
665
708
  if (isSyntheticLoad(span)) {
666
709
  dimensions.operationSynthetic = "True";
667
710
  }
@@ -670,11 +713,11 @@ function getRequestDimensions(span) {
670
713
  function getDependencyDimensions(span) {
671
714
  const dimensions = getBaseDimensions(span.resource);
672
715
  dimensions.metricId = StandardMetricIds.DEPENDENCIES_DURATION;
673
- const statusCode = String(span.attributes["http.status_code"]);
716
+ const statusCode = String(span.attributes[semanticConventions.SEMATTRS_HTTP_STATUS_CODE]);
674
717
  dimensions.dependencyTarget = getDependencyTarget(span.attributes);
675
718
  dimensions.dependencyResultCode = statusCode;
676
719
  dimensions.dependencyType = "http";
677
- dimensions.dependencySuccess = statusCode === "200" ? "True" : "False";
720
+ dimensions.dependencySuccess = span.status.code !== api.SpanStatusCode.ERROR ? "True" : "False";
678
721
  if (isSyntheticLoad(span)) {
679
722
  dimensions.operationSynthetic = "True";
680
723
  }
@@ -695,8 +738,8 @@ function getBaseDimensions(resource) {
695
738
  dimensions.IsAutocollected = "True";
696
739
  if (resource) {
697
740
  const spanResourceAttributes = resource.attributes;
698
- const serviceName = spanResourceAttributes[semanticConventions.SemanticResourceAttributes.SERVICE_NAME];
699
- const serviceNamespace = spanResourceAttributes[semanticConventions.SemanticResourceAttributes.SERVICE_NAMESPACE];
741
+ const serviceName = spanResourceAttributes[semanticConventions.SEMRESATTRS_SERVICE_NAME];
742
+ const serviceNamespace = spanResourceAttributes[semanticConventions.SEMRESATTRS_SERVICE_NAMESPACE];
700
743
  if (serviceName) {
701
744
  if (serviceNamespace) {
702
745
  dimensions.cloudRoleName = `${serviceNamespace}.${serviceName}`;
@@ -705,7 +748,7 @@ function getBaseDimensions(resource) {
705
748
  dimensions.cloudRoleName = String(serviceName);
706
749
  }
707
750
  }
708
- const serviceInstanceId = spanResourceAttributes[semanticConventions.SemanticResourceAttributes.SERVICE_INSTANCE_ID];
751
+ const serviceInstanceId = spanResourceAttributes[semanticConventions.SEMRESATTRS_SERVICE_INSTANCE_ID];
709
752
  dimensions.cloudRoleInstance = String(serviceInstanceId);
710
753
  }
711
754
  return dimensions;
@@ -714,11 +757,11 @@ function getDependencyTarget(attributes) {
714
757
  if (!attributes) {
715
758
  return "";
716
759
  }
717
- const peerService = attributes[semanticConventions.SemanticAttributes.PEER_SERVICE];
718
- const httpHost = attributes[semanticConventions.SemanticAttributes.HTTP_HOST];
719
- const httpUrl = attributes[semanticConventions.SemanticAttributes.HTTP_URL];
720
- const netPeerName = attributes[semanticConventions.SemanticAttributes.NET_PEER_NAME];
721
- const netPeerIp = attributes[semanticConventions.SemanticAttributes.NET_PEER_IP];
760
+ const peerService = attributes[semanticConventions.SEMATTRS_PEER_SERVICE];
761
+ const httpHost = attributes[semanticConventions.SEMATTRS_HTTP_HOST];
762
+ const httpUrl = attributes[semanticConventions.SEMATTRS_HTTP_URL];
763
+ const netPeerName = attributes[semanticConventions.SEMATTRS_NET_PEER_NAME];
764
+ const netPeerIp = attributes[semanticConventions.SEMATTRS_NET_PEER_IP];
722
765
  if (peerService) {
723
766
  return String(peerService);
724
767
  }
@@ -742,8 +785,8 @@ function isExceptionTelemetry(logRecord) {
742
785
  if (baseType && baseType === "ExceptionData") {
743
786
  return true;
744
787
  }
745
- else if (logRecord.attributes[semanticConventions.SemanticAttributes.EXCEPTION_MESSAGE] ||
746
- logRecord.attributes[semanticConventions.SemanticAttributes.EXCEPTION_TYPE]) {
788
+ else if (logRecord.attributes[semanticConventions.SEMATTRS_EXCEPTION_MESSAGE] ||
789
+ logRecord.attributes[semanticConventions.SEMATTRS_EXCEPTION_TYPE]) {
747
790
  return true;
748
791
  }
749
792
  return false;
@@ -754,14 +797,14 @@ function isTraceTelemetry(logRecord) {
754
797
  if (baseType && baseType === "MessageData") {
755
798
  return true;
756
799
  }
757
- else if (!logRecord.attributes[semanticConventions.SemanticAttributes.EXCEPTION_MESSAGE] &&
758
- !logRecord.attributes[semanticConventions.SemanticAttributes.EXCEPTION_TYPE]) {
800
+ else if (!logRecord.attributes[semanticConventions.SEMATTRS_EXCEPTION_MESSAGE] &&
801
+ !logRecord.attributes[semanticConventions.SEMATTRS_EXCEPTION_TYPE]) {
759
802
  return true;
760
803
  }
761
804
  return false;
762
805
  }
763
806
  function isSyntheticLoad(record) {
764
- const userAgent = String(record.attributes[semanticConventions.SemanticAttributes.HTTP_USER_AGENT]);
807
+ const userAgent = String(record.attributes[semanticConventions.SEMATTRS_HTTP_USER_AGENT]);
765
808
  return userAgent !== null && userAgent.includes("AlwaysOn") ? true : false;
766
809
  }
767
810
  function convertDimensions(dimensions) {
@@ -2070,7 +2113,7 @@ const publishOperationSpec = {
2070
2113
  // Licensed under the MIT license.
2071
2114
  // Copyright (c) Microsoft Corporation.
2072
2115
  // Licensed under the MIT license.
2073
- const AZURE_MONITOR_OPENTELEMETRY_VERSION = "1.5.0";
2116
+ const AZURE_MONITOR_OPENTELEMETRY_VERSION = "1.6.0";
2074
2117
  const AZURE_MONITOR_STATSBEAT_FEATURES = "AZURE_MONITOR_STATSBEAT_FEATURES";
2075
2118
  const AZURE_MONITOR_PREFIX = "AZURE_MONITOR_PREFIX";
2076
2119
  const AZURE_MONITOR_AUTO_ATTACH = "AZURE_MONITOR_AUTO_ATTACH";
@@ -2102,6 +2145,7 @@ var StatsbeatFeature;
2102
2145
  StatsbeatFeature[StatsbeatFeature["BROWSER_SDK_LOADER"] = 4] = "BROWSER_SDK_LOADER";
2103
2146
  StatsbeatFeature[StatsbeatFeature["DISTRO"] = 8] = "DISTRO";
2104
2147
  StatsbeatFeature[StatsbeatFeature["LIVE_METRICS"] = 16] = "LIVE_METRICS";
2148
+ StatsbeatFeature[StatsbeatFeature["SHIM"] = 32] = "SHIM";
2105
2149
  })(StatsbeatFeature || (StatsbeatFeature = {}));
2106
2150
  var StatsbeatInstrumentation;
2107
2151
  (function (StatsbeatInstrumentation) {
@@ -2662,6 +2706,7 @@ class StatsbeatConfiguration {
2662
2706
  constructor() {
2663
2707
  // Initial Statsbeat options
2664
2708
  this.currentStatsbeatOptions = {};
2709
+ this.initializedByShim = false;
2665
2710
  this.setStatsbeatFeatures = (statsbeatOptions) => {
2666
2711
  // Merge old statsbeat options with new statsbeat options overriding any common properties
2667
2712
  this.currentStatsbeatOptions = Object.assign(Object.assign({}, this.currentStatsbeatOptions), statsbeatOptions);
@@ -2696,6 +2741,9 @@ class StatsbeatConfiguration {
2696
2741
  if (statsbeatOptions.liveMetrics === true) {
2697
2742
  featureBitMap |= StatsbeatFeature.LIVE_METRICS;
2698
2743
  }
2744
+ if (this.initializedByShim) {
2745
+ featureBitMap |= StatsbeatFeature.SHIM;
2746
+ }
2699
2747
  try {
2700
2748
  const currentFeaturesBitMap = Number(process.env[AZURE_MONITOR_STATSBEAT_FEATURES]);
2701
2749
  if (!isNaN(currentFeaturesBitMap)) {
@@ -2710,6 +2758,16 @@ class StatsbeatConfiguration {
2710
2758
  Logger.getInstance().error("Failed call to JSON.stringify.", error);
2711
2759
  }
2712
2760
  };
2761
+ // Check for shim initialization upon construction
2762
+ try {
2763
+ if (JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || "{}").feature &
2764
+ StatsbeatFeature.SHIM) {
2765
+ this.initializedByShim = true;
2766
+ }
2767
+ }
2768
+ catch (error) {
2769
+ Logger.getInstance().error("Failed to parse statsbeat config environment variable.", error);
2770
+ }
2713
2771
  }
2714
2772
  }
2715
2773
  /**
@@ -3331,6 +3389,8 @@ class AzureFunctionsHook {
3331
3389
  }
3332
3390
  }
3333
3391
 
3392
+ // Copyright (c) Microsoft Corporation.
3393
+ // Licensed under the MIT license.
3334
3394
  /**
3335
3395
  * ApplicationInsightsSampler is responsible for the following:
3336
3396
  * Implements same trace id hashing algorithm so that traces are sampled the same across multiple nodes
@@ -3344,8 +3404,10 @@ class ApplicationInsightsSampler {
3344
3404
  */
3345
3405
  constructor(samplingRatio = 1) {
3346
3406
  this._samplingRatio = samplingRatio;
3347
- if (this._samplingRatio > 1) {
3348
- throw new Error("Invalid sampling rate, sampling rate must be a value in the range [0,1].");
3407
+ if (this._samplingRatio > 1 ||
3408
+ this._samplingRatio < 0 ||
3409
+ !Number.isFinite(this._samplingRatio)) {
3410
+ api.diag.warn("Invalid sampling rate, sampling rate must be a value in the range [0,1].");
3349
3411
  }
3350
3412
  this._sampleRate = Math.round(this._samplingRatio * 100);
3351
3413
  }
@@ -3731,7 +3793,7 @@ class BrowserSdkLoader {
3731
3793
  this._isIkeyValid = true;
3732
3794
  this._isInitialized = false;
3733
3795
  if (!!BrowserSdkLoader._instance) {
3734
- throw new Error("Browser SDK Loader should be configured from the applicationInsights object");
3796
+ api.diag.warn("Browser SDK Loader should be configured from the applicationInsights object");
3735
3797
  }
3736
3798
  BrowserSdkLoader._instance = this;
3737
3799
  // AI URL used to validate if sdk loader already included
@@ -4070,6 +4132,7 @@ function useAzureMonitor(options) {
4070
4132
  const instrumentations = traceHandler
4071
4133
  .getInstrumentations()
4072
4134
  .concat(logHandler.getInstrumentations());
4135
+ const resourceDetectorsList = parseResourceDetectorsFromEnvVar();
4073
4136
  // Initialize OpenTelemetry SDK
4074
4137
  const sdkConfig = {
4075
4138
  autoDetectResources: true,
@@ -4080,6 +4143,7 @@ function useAzureMonitor(options) {
4080
4143
  resource: config.resource,
4081
4144
  sampler: traceHandler.getSampler(),
4082
4145
  spanProcessors: [traceHandler.getAzureMonitorSpanProcessor()],
4146
+ resourceDetectors: resourceDetectorsList,
4083
4147
  };
4084
4148
  sdk = new sdkNode.NodeSDK(sdkConfig);
4085
4149
  setSdkPrefix();
@@ -7,13 +7,14 @@ import * as zlib from "zlib";
7
7
  import { ConnectionStringParser } from "../utils/connectionStringParser";
8
8
  import { Logger } from "../shared/logging/logger";
9
9
  import { BROWSER_SDK_LOADER_DEFAULT_SOURCE } from "../types";
10
+ import { diag } from "@opentelemetry/api";
10
11
  export class BrowserSdkLoader {
11
12
  constructor(config) {
12
13
  var _a, _b;
13
14
  this._isIkeyValid = true;
14
15
  this._isInitialized = false;
15
16
  if (!!BrowserSdkLoader._instance) {
16
- throw new Error("Browser SDK Loader should be configured from the applicationInsights object");
17
+ diag.warn("Browser SDK Loader should be configured from the applicationInsights object");
17
18
  }
18
19
  BrowserSdkLoader._instance = this;
19
20
  // AI URL used to validate if sdk loader already included
@@ -1 +1 @@
1
- {"version":3,"file":"browserSdkLoader.js","sourceRoot":"","sources":["../../../src/browserSdkLoader/browserSdkLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import http from \"http\";\nimport https from \"https\";\nimport { webSnippet as sdkLoader } from \"@microsoft/applicationinsights-web-snippet\";\nimport * as browserSdkLoaderHelper from \"./browserSdkLoaderHelper\";\nimport * as prefixHelper from \"../utils/common\";\nimport * as zlib from \"zlib\";\nimport { InternalConfig } from \"../shared\";\nimport { ConnectionStringParser } from \"../utils/connectionStringParser\";\nimport { IncomingMessage, ServerResponse } from \"http\";\nimport { Logger } from \"../shared/logging/logger\";\nimport { BROWSER_SDK_LOADER_DEFAULT_SOURCE } from \"../types\";\n\nexport class BrowserSdkLoader {\n private static _instance: BrowserSdkLoader | null;\n\n private static _sdkLoader: string;\n private static _aiUrl: string;\n private _isIkeyValid: boolean = true;\n private _isInitialized: boolean = false;\n private _browserSdkLoaderIkey?: string;\n\n constructor(config: InternalConfig) {\n if (!!BrowserSdkLoader._instance) {\n throw new Error(\n \"Browser SDK Loader should be configured from the applicationInsights object\",\n );\n }\n\n BrowserSdkLoader._instance = this;\n // AI URL used to validate if sdk loader already included\n BrowserSdkLoader._aiUrl = BROWSER_SDK_LOADER_DEFAULT_SOURCE;\n let clientWebIkey;\n if (config.browserSdkLoaderOptions?.connectionString) {\n clientWebIkey = this._getBrowserSdkLoaderIkey(\n config?.browserSdkLoaderOptions?.connectionString,\n );\n }\n this._browserSdkLoaderIkey =\n clientWebIkey ||\n ConnectionStringParser.parse(config.azureMonitorExporterOptions.connectionString)\n .instrumentationkey;\n\n if (this._isIkeyValid) {\n this._initialize();\n }\n }\n\n public isInitialized() {\n return this._isInitialized;\n }\n\n public static getInstance(): BrowserSdkLoader {\n return BrowserSdkLoader._instance!;\n }\n\n private _getBrowserSdkLoaderIkey(connectionString: string) {\n let iKey = null;\n try {\n const csCode = ConnectionStringParser.parse(connectionString);\n const iKeyCode = csCode.instrumentationkey || \"\";\n if (!ConnectionStringParser.validateInstrumentationKey(iKeyCode)) {\n this._isIkeyValid = false;\n Logger.getInstance().info(\n \"Invalid browser SDK loader connection string, browser SDK loader is not enabled.\",\n );\n } else {\n this._isIkeyValid = true;\n iKey = iKeyCode;\n }\n } catch (err) {\n Logger.getInstance().info(\"get browser SDK loader ikey error: \" + err);\n }\n return iKey;\n }\n\n /**\n * Gets string to inject into the web page\n * @returns The string to inject into the web page\n */\n private _getBrowserSdkLoaderReplacedStr() {\n let osStr = prefixHelper.getOsPrefix();\n let rpStr = prefixHelper.getResourceProvider();\n let sdkLoaderReplacedStr = `${this._browserSdkLoaderIkey}\\\",\\r\\n disableIkeyDeprecationMessage: true,\\r\\n sdkExtension: \\\"${rpStr}${osStr}d_n_`;\n let replacedSdkLoader = sdkLoader.replace(\"INSTRUMENTATION_KEY\", sdkLoaderReplacedStr);\n return replacedSdkLoader;\n }\n\n private _initialize() {\n this._isInitialized = true;\n BrowserSdkLoader._sdkLoader = this._getBrowserSdkLoaderReplacedStr();\n const originalHttpServer = http.createServer;\n const originalHttpsServer = https.createServer;\n\n (http.createServer as any) = (\n requestListener?: (request: IncomingMessage, response: ServerResponse) => void,\n ) => {\n const originalRequestListener = requestListener;\n if (originalRequestListener) {\n requestListener = (request: IncomingMessage, response: ServerResponse) => {\n // Patch response write method\n let originalResponseWrite = response.write;\n let isGetRequest = request.method == \"GET\";\n response.write = function wrap(a: Buffer | string, b?: Function | string) {\n //only patch GET request\n try {\n if (isGetRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(response);\n let writeBufferType = undefined;\n if (typeof b === \"string\") {\n writeBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(response, a)) {\n arguments[0] = BrowserSdkLoader._instance.InjectSdkLoader(\n response,\n a,\n undefined,\n writeBufferType,\n );\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(\n response,\n a,\n encodeType,\n );\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject browser sdk loader error: \" + err);\n }\n return originalResponseWrite.apply(response, arguments as any);\n };\n\n // Patch response end method for cases when HTML is added there\n let originalResponseEnd = response.end;\n\n (response.end as any) = function wrap(a?: Buffer | string | any, b?: Function) {\n if (isGetRequest) {\n try {\n if (isGetRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(response);\n let endBufferType = undefined;\n if (typeof b === \"string\") {\n endBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(response, a)) {\n arguments[0] = BrowserSdkLoader._instance.InjectSdkLoader(\n response,\n a,\n undefined,\n endBufferType,\n );\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(\n response,\n a,\n encodeType,\n );\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject browser sdk loader error: \" + err);\n }\n }\n return originalResponseEnd.apply(response, arguments as any);\n };\n\n return originalRequestListener(request, response);\n };\n }\n return originalHttpServer(requestListener);\n };\n\n (https.createServer as any) = function (options: any, httpsRequestListener: any): any {\n const originalHttpsRequestListener = httpsRequestListener;\n if (originalHttpsRequestListener) {\n httpsRequestListener = function (req: any, res: any) {\n let isGetHttpsRequest = req.method == \"GET\";\n let originalHttpsResponseWrite = res.write;\n let originalHttpsResponseEnd = res.end;\n res.write = function wrap(a: Buffer | string | any, b?: Function | string) {\n try {\n if (isGetHttpsRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(res);\n let writeBufferType = undefined;\n if (typeof b === \"string\") {\n writeBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(res, a)) {\n arguments[0] = this.InjectSdkLoader(res, a, undefined, writeBufferType);\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(res, a, encodeType);\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject SDK loader error: \" + err);\n }\n return originalHttpsResponseWrite.apply(res, arguments);\n };\n\n res.end = function wrap(a: Buffer | string | any, b?: Function | string) {\n try {\n if (isGetHttpsRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(res);\n let endBufferType = undefined;\n if (typeof b === \"string\") {\n endBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(res, a)) {\n arguments[0] = BrowserSdkLoader._instance.InjectSdkLoader(\n res,\n a,\n undefined,\n endBufferType,\n );\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(res, a, encodeType);\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject SDK loader error: \" + err);\n }\n return originalHttpsResponseEnd.apply(res, arguments);\n };\n return originalHttpsRequestListener(req, res);\n };\n return originalHttpsServer(options, httpsRequestListener);\n }\n };\n }\n\n /**\n * Validate response and try to inject Browser SDK Loader\n */\n public ValidateInjection(response: any, input: string | Buffer): boolean {\n try {\n if (!response || !input || response.statusCode != 200) return false;\n let isContentHtml = browserSdkLoaderHelper.isContentTypeHeaderHtml(response);\n if (!isContentHtml) return false;\n let inputStr = input.slice().toString();\n if (inputStr.indexOf(\"<head>\") >= 0 && inputStr.indexOf(\"</head>\") >= 0) {\n // Check if sdk loader not already present looking for AI Web SDK URL\n if (inputStr.indexOf(BrowserSdkLoader._aiUrl) < 0) {\n return true;\n }\n }\n } catch (err) {\n Logger.getInstance().info(\"validate injections error: \" + err);\n }\n return false;\n }\n\n /**\n * Inject Browser SDK Loader\n */\n public InjectSdkLoader(\n response: any,\n input: string | Buffer,\n encodeType?: browserSdkLoaderHelper.contentEncodingMethod,\n bufferEncodeType?: string,\n ): string | Buffer {\n try {\n let isCompressedBuffer = !!encodeType;\n if (!isCompressedBuffer) {\n let html = input.toString();\n let index = html.indexOf(\"</head>\");\n if (index < 0) return input;\n\n let newHtml = browserSdkLoaderHelper.insertBrowserSdkLoaderByIndex(\n index,\n html,\n BrowserSdkLoader._sdkLoader,\n );\n if (typeof input === \"string\") {\n response.removeHeader(\"Content-Length\");\n if (newHtml) {\n input = newHtml;\n }\n response.setHeader(\"Content-Length\", Buffer.byteLength(input));\n } else if (Buffer.isBuffer(input)) {\n let bufferType = bufferEncodeType ? bufferEncodeType : \"utf8\";\n let isValidBufferType = browserSdkLoaderHelper.isBufferType(input, bufferType);\n if (isValidBufferType && newHtml) {\n response.removeHeader(\"Content-Length\");\n let encodedString = Buffer.from(newHtml).toString(bufferType as BufferEncoding);\n input = Buffer.from(encodedString, bufferType as BufferEncoding);\n response.setHeader(\"Content-Length\", input.length);\n }\n }\n } else {\n response.removeHeader(\"Content-Length\");\n input = this._getInjectedCompressBuffer(\n response,\n input as Buffer,\n encodeType as browserSdkLoaderHelper.contentEncodingMethod,\n );\n response.setHeader(\"Content-Length\", input.length);\n }\n } catch (ex) {\n Logger.getInstance().warn(\n \"Failed to inject browser sdk loader and change content-length headers. Exception:\" + ex,\n );\n }\n return input;\n }\n\n //***********************\n // should NOT use sync functions here. But currently cannot get async functions to work\n // because reponse.write return boolean\n // and also this function do not support partial compression as well\n // need more investigation\n private _getInjectedCompressBuffer(\n response: any,\n input: Buffer,\n encodeType: browserSdkLoaderHelper.contentEncodingMethod,\n ): Buffer {\n try {\n switch (encodeType) {\n case browserSdkLoaderHelper.contentEncodingMethod.GZIP:\n let gunzipBuffer = zlib.gunzipSync(input);\n if (this.ValidateInjection(response, gunzipBuffer)) {\n let injectedGunzipBuffer = this.InjectSdkLoader(response, gunzipBuffer);\n input = zlib.gzipSync(injectedGunzipBuffer);\n }\n break;\n case browserSdkLoaderHelper.contentEncodingMethod.DEFLATE:\n let inflateBuffer = zlib.inflateSync(input);\n if (this.ValidateInjection(response, inflateBuffer)) {\n let injectedInflateBuffer = this.InjectSdkLoader(response, inflateBuffer);\n input = zlib.deflateSync(injectedInflateBuffer);\n }\n break;\n case browserSdkLoaderHelper.contentEncodingMethod.BR:\n let BrotliDecompressSync = browserSdkLoaderHelper.getBrotliDecompressSync(zlib);\n let BrotliCompressSync = browserSdkLoaderHelper.getBrotliCompressSync(zlib);\n if (BrotliDecompressSync && BrotliCompressSync) {\n let decompressBuffer = BrotliDecompressSync(input);\n if (this.ValidateInjection(response, decompressBuffer)) {\n let injectedDecompressBuffer = this.InjectSdkLoader(response, decompressBuffer);\n input = BrotliCompressSync(injectedDecompressBuffer);\n }\n break;\n }\n }\n } catch (err) {\n Logger.getInstance().info(\"get browser SDK loader compress buffer error: \" + err);\n }\n\n return input;\n }\n\n public dispose() {\n BrowserSdkLoader._instance = null;\n this._isInitialized = false;\n }\n}\n"]}
1
+ {"version":3,"file":"browserSdkLoader.js","sourceRoot":"","sources":["../../../src/browserSdkLoader/browserSdkLoader.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,KAAK,sBAAsB,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,OAAO,gBAAgB;IAS3B,YAAY,MAAsB;;QAJ1B,iBAAY,GAAY,IAAI,CAAC;QAC7B,mBAAc,GAAY,KAAK,CAAC;QAItC,IAAI,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC3F,CAAC;QAED,gBAAgB,CAAC,SAAS,GAAG,IAAI,CAAC;QAClC,yDAAyD;QACzD,gBAAgB,CAAC,MAAM,GAAG,iCAAiC,CAAC;QAC5D,IAAI,aAAa,CAAC;QAClB,IAAI,MAAA,MAAM,CAAC,uBAAuB,0CAAE,gBAAgB,EAAE,CAAC;YACrD,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAC3C,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,uBAAuB,0CAAE,gBAAgB,CAClD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,qBAAqB;YACxB,aAAa;gBACb,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,gBAAgB,CAAC;qBAC9E,kBAAkB,CAAC;QAExB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,OAAO,gBAAgB,CAAC,SAAU,CAAC;IACrC,CAAC;IAEO,wBAAwB,CAAC,gBAAwB;QACvD,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC;YACjD,IAAI,CAAC,sBAAsB,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CACvB,kFAAkF,CACnF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,GAAG,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,qCAAqC,GAAG,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,+BAA+B;QACrC,IAAI,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,KAAK,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC;QAC/C,IAAI,oBAAoB,GAAG,GAAG,IAAI,CAAC,qBAAqB,oEAAoE,KAAK,GAAG,KAAK,MAAM,CAAC;QAChJ,IAAI,iBAAiB,GAAG,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;QACvF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACrE,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7C,MAAM,mBAAmB,GAAG,KAAK,CAAC,YAAY,CAAC;QAE9C,IAAI,CAAC,YAAoB,GAAG,CAC3B,eAA8E,EAC9E,EAAE;YACF,MAAM,uBAAuB,GAAG,eAAe,CAAC;YAChD,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,eAAe,GAAG,CAAC,OAAwB,EAAE,QAAwB,EAAE,EAAE;oBACvE,8BAA8B;oBAC9B,IAAI,qBAAqB,GAAG,QAAQ,CAAC,KAAK,CAAC;oBAC3C,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;oBAC3C,QAAQ,CAAC,KAAK,GAAG,SAAS,IAAI,CAAC,CAAkB,EAAE,CAAqB;;wBACtE,wBAAwB;wBACxB,IAAI,CAAC;4BACH,IAAI,YAAY,EAAE,CAAC;gCACjB,IAAI,OAAO,GAAG,sBAAsB,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;gCAC7E,IAAI,eAAe,GAAG,SAAS,CAAC;gCAChC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oCAC1B,eAAe,GAAG,CAAC,CAAC;gCACtB,CAAC;gCACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oCAC9C,IAAI,MAAA,gBAAgB,CAAC,SAAS,0CAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;wCAC/D,SAAS,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,SAAS,CAAC,eAAe,CACvD,QAAQ,EACR,CAAC,EACD,SAAS,EACT,eAAe,CAChB,CAAC;oCACJ,CAAC;gCACH,CAAC;qCAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oCAC1B,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oCAC5B,SAAS,CAAC,CAAC,CAAC,GAAG,MAAA,gBAAgB,CAAC,SAAS,0CAAE,eAAe,CACxD,QAAQ,EACR,CAAC,EACD,UAAU,CACX,CAAC;gCACJ,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,mCAAmC,GAAG,GAAG,CAAC,CAAC;wBACvE,CAAC;wBACD,OAAO,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAgB,CAAC,CAAC;oBACjE,CAAC,CAAC;oBAEF,+DAA+D;oBAC/D,IAAI,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC;oBAEtC,QAAQ,CAAC,GAAW,GAAG,SAAS,IAAI,CAAC,CAAyB,EAAE,CAAY;;wBAC3E,IAAI,YAAY,EAAE,CAAC;4BACjB,IAAI,CAAC;gCACH,IAAI,YAAY,EAAE,CAAC;oCACjB,IAAI,OAAO,GAAG,sBAAsB,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;oCAC7E,IAAI,aAAa,GAAG,SAAS,CAAC;oCAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;wCAC1B,aAAa,GAAG,CAAC,CAAC;oCACpB,CAAC;oCACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wCAC9C,IAAI,MAAA,gBAAgB,CAAC,SAAS,0CAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;4CAC/D,SAAS,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,SAAS,CAAC,eAAe,CACvD,QAAQ,EACR,CAAC,EACD,SAAS,EACT,aAAa,CACd,CAAC;wCACJ,CAAC;oCACH,CAAC;yCAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wCAC1B,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;wCAC5B,SAAS,CAAC,CAAC,CAAC,GAAG,MAAA,gBAAgB,CAAC,SAAS,0CAAE,eAAe,CACxD,QAAQ,EACR,CAAC,EACD,UAAU,CACX,CAAC;oCACJ,CAAC;gCACH,CAAC;4BACH,CAAC;4BAAC,OAAO,GAAG,EAAE,CAAC;gCACb,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,mCAAmC,GAAG,GAAG,CAAC,CAAC;4BACvE,CAAC;wBACH,CAAC;wBACD,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAgB,CAAC,CAAC;oBAC/D,CAAC,CAAC;oBAEF,OAAO,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACpD,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC,CAAC;QAED,KAAK,CAAC,YAAoB,GAAG,UAAU,OAAY,EAAE,oBAAyB;YAC7E,MAAM,4BAA4B,GAAG,oBAAoB,CAAC;YAC1D,IAAI,4BAA4B,EAAE,CAAC;gBACjC,oBAAoB,GAAG,UAAU,GAAQ,EAAE,GAAQ;oBACjD,IAAI,iBAAiB,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;oBAC5C,IAAI,0BAA0B,GAAG,GAAG,CAAC,KAAK,CAAC;oBAC3C,IAAI,wBAAwB,GAAG,GAAG,CAAC,GAAG,CAAC;oBACvC,GAAG,CAAC,KAAK,GAAG,SAAS,IAAI,CAAC,CAAwB,EAAE,CAAqB;;wBACvE,IAAI,CAAC;4BACH,IAAI,iBAAiB,EAAE,CAAC;gCACtB,IAAI,OAAO,GAAG,sBAAsB,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;gCACxE,IAAI,eAAe,GAAG,SAAS,CAAC;gCAChC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oCAC1B,eAAe,GAAG,CAAC,CAAC;gCACtB,CAAC;gCACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oCAC9C,IAAI,MAAA,gBAAgB,CAAC,SAAS,0CAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;wCAC1D,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;oCAC1E,CAAC;gCACH,CAAC;qCAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oCAC1B,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oCAC5B,SAAS,CAAC,CAAC,CAAC,GAAG,MAAA,gBAAgB,CAAC,SAAS,0CAAE,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;gCACjF,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;wBAC/D,CAAC;wBACD,OAAO,0BAA0B,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAC1D,CAAC,CAAC;oBAEF,GAAG,CAAC,GAAG,GAAG,SAAS,IAAI,CAAC,CAAwB,EAAE,CAAqB;;wBACrE,IAAI,CAAC;4BACH,IAAI,iBAAiB,EAAE,CAAC;gCACtB,IAAI,OAAO,GAAG,sBAAsB,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;gCACxE,IAAI,aAAa,GAAG,SAAS,CAAC;gCAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oCAC1B,aAAa,GAAG,CAAC,CAAC;gCACpB,CAAC;gCACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oCAC9C,IAAI,MAAA,gBAAgB,CAAC,SAAS,0CAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;wCAC1D,SAAS,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,SAAS,CAAC,eAAe,CACvD,GAAG,EACH,CAAC,EACD,SAAS,EACT,aAAa,CACd,CAAC;oCACJ,CAAC;gCACH,CAAC;qCAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oCAC1B,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oCAC5B,SAAS,CAAC,CAAC,CAAC,GAAG,MAAA,gBAAgB,CAAC,SAAS,0CAAE,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;gCACjF,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;wBAC/D,CAAC;wBACD,OAAO,wBAAwB,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBACxD,CAAC,CAAC;oBACF,OAAO,4BAA4B,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAChD,CAAC,CAAC;gBACF,OAAO,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,QAAa,EAAE,KAAsB;QAC5D,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG;gBAAE,OAAO,KAAK,CAAC;YACpE,IAAI,aAAa,GAAG,sBAAsB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YAC7E,IAAI,CAAC,aAAa;gBAAE,OAAO,KAAK,CAAC;YACjC,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxE,qEAAqE;gBACrE,IAAI,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClD,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACI,eAAe,CACpB,QAAa,EACb,KAAsB,EACtB,UAAyD,EACzD,gBAAyB;QAEzB,IAAI,CAAC;YACH,IAAI,kBAAkB,GAAG,CAAC,CAAC,UAAU,CAAC;YACtC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,IAAI,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC5B,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACpC,IAAI,KAAK,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAE5B,IAAI,OAAO,GAAG,sBAAsB,CAAC,6BAA6B,CAChE,KAAK,EACL,IAAI,EACJ,gBAAgB,CAAC,UAAU,CAC5B,CAAC;gBACF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;oBACxC,IAAI,OAAO,EAAE,CAAC;wBACZ,KAAK,GAAG,OAAO,CAAC;oBAClB,CAAC;oBACD,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjE,CAAC;qBAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClC,IAAI,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC9D,IAAI,iBAAiB,GAAG,sBAAsB,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;oBAC/E,IAAI,iBAAiB,IAAI,OAAO,EAAE,CAAC;wBACjC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;wBACxC,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,UAA4B,CAAC,CAAC;wBAChF,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,UAA4B,CAAC,CAAC;wBACjE,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;gBACxC,KAAK,GAAG,IAAI,CAAC,0BAA0B,CACrC,QAAQ,EACR,KAAe,EACf,UAA0D,CAC3D,CAAC;gBACF,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CACvB,mFAAmF,GAAG,EAAE,CACzF,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yBAAyB;IACzB,uFAAuF;IACvF,uCAAuC;IACvC,oEAAoE;IACpE,0BAA0B;IAClB,0BAA0B,CAChC,QAAa,EACb,KAAa,EACb,UAAwD;QAExD,IAAI,CAAC;YACH,QAAQ,UAAU,EAAE,CAAC;gBACnB,KAAK,sBAAsB,CAAC,qBAAqB,CAAC,IAAI;oBACpD,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAC1C,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;wBACnD,IAAI,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;wBACxE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;oBAC9C,CAAC;oBACD,MAAM;gBACR,KAAK,sBAAsB,CAAC,qBAAqB,CAAC,OAAO;oBACvD,IAAI,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBAC5C,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC;wBACpD,IAAI,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;wBAC1E,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;oBAClD,CAAC;oBACD,MAAM;gBACR,KAAK,sBAAsB,CAAC,qBAAqB,CAAC,EAAE;oBAClD,IAAI,oBAAoB,GAAG,sBAAsB,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;oBAChF,IAAI,kBAAkB,GAAG,sBAAsB,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;oBAC5E,IAAI,oBAAoB,IAAI,kBAAkB,EAAE,CAAC;wBAC/C,IAAI,gBAAgB,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;wBACnD,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,CAAC;4BACvD,IAAI,wBAAwB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;4BAChF,KAAK,GAAG,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;wBACvD,CAAC;wBACD,MAAM;oBACR,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,gDAAgD,GAAG,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,OAAO;QACZ,gBAAgB,CAAC,SAAS,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;CACF","sourcesContent":["import http from \"http\";\nimport https from \"https\";\nimport { webSnippet as sdkLoader } from \"@microsoft/applicationinsights-web-snippet\";\nimport * as browserSdkLoaderHelper from \"./browserSdkLoaderHelper\";\nimport * as prefixHelper from \"../utils/common\";\nimport * as zlib from \"zlib\";\nimport { InternalConfig } from \"../shared\";\nimport { ConnectionStringParser } from \"../utils/connectionStringParser\";\nimport { IncomingMessage, ServerResponse } from \"http\";\nimport { Logger } from \"../shared/logging/logger\";\nimport { BROWSER_SDK_LOADER_DEFAULT_SOURCE } from \"../types\";\nimport { diag } from \"@opentelemetry/api\";\n\nexport class BrowserSdkLoader {\n private static _instance: BrowserSdkLoader | null;\n\n private static _sdkLoader: string;\n private static _aiUrl: string;\n private _isIkeyValid: boolean = true;\n private _isInitialized: boolean = false;\n private _browserSdkLoaderIkey?: string;\n\n constructor(config: InternalConfig) {\n if (!!BrowserSdkLoader._instance) {\n diag.warn(\"Browser SDK Loader should be configured from the applicationInsights object\");\n }\n\n BrowserSdkLoader._instance = this;\n // AI URL used to validate if sdk loader already included\n BrowserSdkLoader._aiUrl = BROWSER_SDK_LOADER_DEFAULT_SOURCE;\n let clientWebIkey;\n if (config.browserSdkLoaderOptions?.connectionString) {\n clientWebIkey = this._getBrowserSdkLoaderIkey(\n config?.browserSdkLoaderOptions?.connectionString,\n );\n }\n this._browserSdkLoaderIkey =\n clientWebIkey ||\n ConnectionStringParser.parse(config.azureMonitorExporterOptions.connectionString)\n .instrumentationkey;\n\n if (this._isIkeyValid) {\n this._initialize();\n }\n }\n\n public isInitialized() {\n return this._isInitialized;\n }\n\n public static getInstance(): BrowserSdkLoader {\n return BrowserSdkLoader._instance!;\n }\n\n private _getBrowserSdkLoaderIkey(connectionString: string) {\n let iKey = null;\n try {\n const csCode = ConnectionStringParser.parse(connectionString);\n const iKeyCode = csCode.instrumentationkey || \"\";\n if (!ConnectionStringParser.validateInstrumentationKey(iKeyCode)) {\n this._isIkeyValid = false;\n Logger.getInstance().info(\n \"Invalid browser SDK loader connection string, browser SDK loader is not enabled.\",\n );\n } else {\n this._isIkeyValid = true;\n iKey = iKeyCode;\n }\n } catch (err) {\n Logger.getInstance().info(\"get browser SDK loader ikey error: \" + err);\n }\n return iKey;\n }\n\n /**\n * Gets string to inject into the web page\n * @returns The string to inject into the web page\n */\n private _getBrowserSdkLoaderReplacedStr() {\n let osStr = prefixHelper.getOsPrefix();\n let rpStr = prefixHelper.getResourceProvider();\n let sdkLoaderReplacedStr = `${this._browserSdkLoaderIkey}\\\",\\r\\n disableIkeyDeprecationMessage: true,\\r\\n sdkExtension: \\\"${rpStr}${osStr}d_n_`;\n let replacedSdkLoader = sdkLoader.replace(\"INSTRUMENTATION_KEY\", sdkLoaderReplacedStr);\n return replacedSdkLoader;\n }\n\n private _initialize() {\n this._isInitialized = true;\n BrowserSdkLoader._sdkLoader = this._getBrowserSdkLoaderReplacedStr();\n const originalHttpServer = http.createServer;\n const originalHttpsServer = https.createServer;\n\n (http.createServer as any) = (\n requestListener?: (request: IncomingMessage, response: ServerResponse) => void,\n ) => {\n const originalRequestListener = requestListener;\n if (originalRequestListener) {\n requestListener = (request: IncomingMessage, response: ServerResponse) => {\n // Patch response write method\n let originalResponseWrite = response.write;\n let isGetRequest = request.method == \"GET\";\n response.write = function wrap(a: Buffer | string, b?: Function | string) {\n //only patch GET request\n try {\n if (isGetRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(response);\n let writeBufferType = undefined;\n if (typeof b === \"string\") {\n writeBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(response, a)) {\n arguments[0] = BrowserSdkLoader._instance.InjectSdkLoader(\n response,\n a,\n undefined,\n writeBufferType,\n );\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(\n response,\n a,\n encodeType,\n );\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject browser sdk loader error: \" + err);\n }\n return originalResponseWrite.apply(response, arguments as any);\n };\n\n // Patch response end method for cases when HTML is added there\n let originalResponseEnd = response.end;\n\n (response.end as any) = function wrap(a?: Buffer | string | any, b?: Function) {\n if (isGetRequest) {\n try {\n if (isGetRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(response);\n let endBufferType = undefined;\n if (typeof b === \"string\") {\n endBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(response, a)) {\n arguments[0] = BrowserSdkLoader._instance.InjectSdkLoader(\n response,\n a,\n undefined,\n endBufferType,\n );\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(\n response,\n a,\n encodeType,\n );\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject browser sdk loader error: \" + err);\n }\n }\n return originalResponseEnd.apply(response, arguments as any);\n };\n\n return originalRequestListener(request, response);\n };\n }\n return originalHttpServer(requestListener);\n };\n\n (https.createServer as any) = function (options: any, httpsRequestListener: any): any {\n const originalHttpsRequestListener = httpsRequestListener;\n if (originalHttpsRequestListener) {\n httpsRequestListener = function (req: any, res: any) {\n let isGetHttpsRequest = req.method == \"GET\";\n let originalHttpsResponseWrite = res.write;\n let originalHttpsResponseEnd = res.end;\n res.write = function wrap(a: Buffer | string | any, b?: Function | string) {\n try {\n if (isGetHttpsRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(res);\n let writeBufferType = undefined;\n if (typeof b === \"string\") {\n writeBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(res, a)) {\n arguments[0] = this.InjectSdkLoader(res, a, undefined, writeBufferType);\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(res, a, encodeType);\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject SDK loader error: \" + err);\n }\n return originalHttpsResponseWrite.apply(res, arguments);\n };\n\n res.end = function wrap(a: Buffer | string | any, b?: Function | string) {\n try {\n if (isGetHttpsRequest) {\n let headers = browserSdkLoaderHelper.getContentEncodingFromHeaders(res);\n let endBufferType = undefined;\n if (typeof b === \"string\") {\n endBufferType = b;\n }\n if (headers === null || headers === undefined) {\n if (BrowserSdkLoader._instance?.ValidateInjection(res, a)) {\n arguments[0] = BrowserSdkLoader._instance.InjectSdkLoader(\n res,\n a,\n undefined,\n endBufferType,\n );\n }\n } else if (headers.length) {\n let encodeType = headers[0];\n arguments[0] = BrowserSdkLoader._instance?.InjectSdkLoader(res, a, encodeType);\n }\n }\n } catch (err) {\n Logger.getInstance().warn(\"Inject SDK loader error: \" + err);\n }\n return originalHttpsResponseEnd.apply(res, arguments);\n };\n return originalHttpsRequestListener(req, res);\n };\n return originalHttpsServer(options, httpsRequestListener);\n }\n };\n }\n\n /**\n * Validate response and try to inject Browser SDK Loader\n */\n public ValidateInjection(response: any, input: string | Buffer): boolean {\n try {\n if (!response || !input || response.statusCode != 200) return false;\n let isContentHtml = browserSdkLoaderHelper.isContentTypeHeaderHtml(response);\n if (!isContentHtml) return false;\n let inputStr = input.slice().toString();\n if (inputStr.indexOf(\"<head>\") >= 0 && inputStr.indexOf(\"</head>\") >= 0) {\n // Check if sdk loader not already present looking for AI Web SDK URL\n if (inputStr.indexOf(BrowserSdkLoader._aiUrl) < 0) {\n return true;\n }\n }\n } catch (err) {\n Logger.getInstance().info(\"validate injections error: \" + err);\n }\n return false;\n }\n\n /**\n * Inject Browser SDK Loader\n */\n public InjectSdkLoader(\n response: any,\n input: string | Buffer,\n encodeType?: browserSdkLoaderHelper.contentEncodingMethod,\n bufferEncodeType?: string,\n ): string | Buffer {\n try {\n let isCompressedBuffer = !!encodeType;\n if (!isCompressedBuffer) {\n let html = input.toString();\n let index = html.indexOf(\"</head>\");\n if (index < 0) return input;\n\n let newHtml = browserSdkLoaderHelper.insertBrowserSdkLoaderByIndex(\n index,\n html,\n BrowserSdkLoader._sdkLoader,\n );\n if (typeof input === \"string\") {\n response.removeHeader(\"Content-Length\");\n if (newHtml) {\n input = newHtml;\n }\n response.setHeader(\"Content-Length\", Buffer.byteLength(input));\n } else if (Buffer.isBuffer(input)) {\n let bufferType = bufferEncodeType ? bufferEncodeType : \"utf8\";\n let isValidBufferType = browserSdkLoaderHelper.isBufferType(input, bufferType);\n if (isValidBufferType && newHtml) {\n response.removeHeader(\"Content-Length\");\n let encodedString = Buffer.from(newHtml).toString(bufferType as BufferEncoding);\n input = Buffer.from(encodedString, bufferType as BufferEncoding);\n response.setHeader(\"Content-Length\", input.length);\n }\n }\n } else {\n response.removeHeader(\"Content-Length\");\n input = this._getInjectedCompressBuffer(\n response,\n input as Buffer,\n encodeType as browserSdkLoaderHelper.contentEncodingMethod,\n );\n response.setHeader(\"Content-Length\", input.length);\n }\n } catch (ex) {\n Logger.getInstance().warn(\n \"Failed to inject browser sdk loader and change content-length headers. Exception:\" + ex,\n );\n }\n return input;\n }\n\n //***********************\n // should NOT use sync functions here. But currently cannot get async functions to work\n // because reponse.write return boolean\n // and also this function do not support partial compression as well\n // need more investigation\n private _getInjectedCompressBuffer(\n response: any,\n input: Buffer,\n encodeType: browserSdkLoaderHelper.contentEncodingMethod,\n ): Buffer {\n try {\n switch (encodeType) {\n case browserSdkLoaderHelper.contentEncodingMethod.GZIP:\n let gunzipBuffer = zlib.gunzipSync(input);\n if (this.ValidateInjection(response, gunzipBuffer)) {\n let injectedGunzipBuffer = this.InjectSdkLoader(response, gunzipBuffer);\n input = zlib.gzipSync(injectedGunzipBuffer);\n }\n break;\n case browserSdkLoaderHelper.contentEncodingMethod.DEFLATE:\n let inflateBuffer = zlib.inflateSync(input);\n if (this.ValidateInjection(response, inflateBuffer)) {\n let injectedInflateBuffer = this.InjectSdkLoader(response, inflateBuffer);\n input = zlib.deflateSync(injectedInflateBuffer);\n }\n break;\n case browserSdkLoaderHelper.contentEncodingMethod.BR:\n let BrotliDecompressSync = browserSdkLoaderHelper.getBrotliDecompressSync(zlib);\n let BrotliCompressSync = browserSdkLoaderHelper.getBrotliCompressSync(zlib);\n if (BrotliDecompressSync && BrotliCompressSync) {\n let decompressBuffer = BrotliDecompressSync(input);\n if (this.ValidateInjection(response, decompressBuffer)) {\n let injectedDecompressBuffer = this.InjectSdkLoader(response, decompressBuffer);\n input = BrotliCompressSync(injectedDecompressBuffer);\n }\n break;\n }\n }\n } catch (err) {\n Logger.getInstance().info(\"get browser SDK loader compress buffer error: \" + err);\n }\n\n return input;\n }\n\n public dispose() {\n BrowserSdkLoader._instance = null;\n this._isInitialized = false;\n }\n}\n"]}
@@ -12,6 +12,7 @@ import { AZURE_MONITOR_OPENTELEMETRY_VERSION, } from "./types";
12
12
  import { BrowserSdkLoader } from "./browserSdkLoader/browserSdkLoader";
13
13
  import { setSdkPrefix } from "./metrics/quickpulse/utils";
14
14
  import { getInstance } from "./utils/statsbeat";
15
+ import { parseResourceDetectorsFromEnvVar } from "./utils/common";
15
16
  process.env["AZURE_MONITOR_DISTRO_VERSION"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;
16
17
  let sdk;
17
18
  let browserSdkLoader;
@@ -51,6 +52,7 @@ export function useAzureMonitor(options) {
51
52
  const instrumentations = traceHandler
52
53
  .getInstrumentations()
53
54
  .concat(logHandler.getInstrumentations());
55
+ const resourceDetectorsList = parseResourceDetectorsFromEnvVar();
54
56
  // Initialize OpenTelemetry SDK
55
57
  const sdkConfig = {
56
58
  autoDetectResources: true,
@@ -61,6 +63,7 @@ export function useAzureMonitor(options) {
61
63
  resource: config.resource,
62
64
  sampler: traceHandler.getSampler(),
63
65
  spanProcessors: [traceHandler.getAzureMonitorSpanProcessor()],
66
+ resourceDetectors: resourceDetectorsList,
64
67
  };
65
68
  sdk = new NodeSDK(sdkConfig);
66
69
  setSdkPrefix();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ProxyTracerProvider, metrics, trace } from \"@opentelemetry/api\";\nimport { logs } from \"@opentelemetry/api-logs\";\nimport { NodeSDK, NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { InternalConfig } from \"./shared/config\";\nimport { MetricHandler } from \"./metrics\";\nimport { TraceHandler } from \"./traces/handler\";\nimport { Logger as InternalLogger } from \"./shared/logging\";\nimport { LogHandler } from \"./logs\";\nimport {\n AZURE_MONITOR_OPENTELEMETRY_VERSION,\n AzureMonitorOpenTelemetryOptions,\n InstrumentationOptions,\n BrowserSdkLoaderOptions,\n StatsbeatOptions,\n} from \"./types\";\nimport { BrowserSdkLoader } from \"./browserSdkLoader/browserSdkLoader\";\nimport { setSdkPrefix } from \"./metrics/quickpulse/utils\";\nimport { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { LogRecordProcessor, LoggerProvider } from \"@opentelemetry/sdk-logs\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { getInstance } from \"./utils/statsbeat\";\n\nexport { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, BrowserSdkLoaderOptions };\n\nprocess.env[\"AZURE_MONITOR_DISTRO_VERSION\"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;\n\nlet sdk: NodeSDK;\nlet browserSdkLoader: BrowserSdkLoader | undefined;\n\n/**\n * Initialize Azure Monitor Distro\n * @param options Azure Monitor OpenTelemetry Options\n */\nexport function useAzureMonitor(options?: AzureMonitorOpenTelemetryOptions) {\n const config = new InternalConfig(options);\n const statsbeatOptions: StatsbeatOptions = {\n // Instrumentations\n azureSdk: config.instrumentationOptions?.azureSdk?.enabled,\n mongoDb: config.instrumentationOptions?.mongoDb?.enabled,\n mySql: config.instrumentationOptions?.mySql?.enabled,\n postgreSql: config.instrumentationOptions?.postgreSql?.enabled,\n redis: config.instrumentationOptions?.redis?.enabled,\n bunyan: config.instrumentationOptions?.bunyan?.enabled,\n winston: config.instrumentationOptions?.winston?.enabled,\n // Features\n browserSdkLoader: config.browserSdkLoaderOptions.enabled,\n aadHandling: !!config.azureMonitorExporterOptions?.credential,\n diskRetry: !config.azureMonitorExporterOptions?.disableOfflineStorage,\n };\n getInstance().setStatsbeatFeatures(statsbeatOptions);\n\n if (config.browserSdkLoaderOptions.enabled) {\n browserSdkLoader = new BrowserSdkLoader(config);\n }\n // Remove global providers in OpenTelemetry, these would be overriden if present\n metrics.disable();\n trace.disable();\n logs.disable();\n\n // Create internal handlers\n const metricHandler = new MetricHandler(config);\n const traceHandler = new TraceHandler(config, metricHandler);\n const logHandler = new LogHandler(config, metricHandler);\n\n const instrumentations = traceHandler\n .getInstrumentations()\n .concat(logHandler.getInstrumentations());\n\n // Initialize OpenTelemetry SDK\n const sdkConfig: Partial<NodeSDKConfiguration> = {\n autoDetectResources: true,\n metricReader: metricHandler.getMetricReader(),\n views: metricHandler.getViews(),\n instrumentations: instrumentations,\n logRecordProcessor: logHandler.getAzureLogRecordProcessor(),\n resource: config.resource,\n sampler: traceHandler.getSampler(),\n spanProcessors: [traceHandler.getAzureMonitorSpanProcessor()],\n };\n sdk = new NodeSDK(sdkConfig);\n setSdkPrefix();\n sdk.start();\n\n // TODO: Send processors as NodeSDK config once arrays are supported\n // https://github.com/open-telemetry/opentelemetry-js/issues/4451\n\n // Add extra SpanProcessors, MetricReaders and LogRecordProcessors\n let spanProcessors: SpanProcessor[] = options?.spanProcessors || [];\n // Add batch processor as the last one\n spanProcessors.push(traceHandler.getBatchSpanProcessor());\n\n // Add extra SpanProcessors, MetricReaders and LogRecordProcessors\n let logRecordProcessors: LogRecordProcessor[] = options?.logRecordProcessors || [];\n // Add batch processor as the last one\n logRecordProcessors.push(logHandler.getBatchLogRecordProcessor());\n\n try {\n const tracerProvider = (\n trace.getTracerProvider() as ProxyTracerProvider\n ).getDelegate() as NodeTracerProvider;\n spanProcessors.forEach((spanProcessor) => {\n tracerProvider.addSpanProcessor(spanProcessor);\n });\n } catch (error) {\n InternalLogger.getInstance().error(\"Failed to add SpanProcessors to TracerProvider.\", error);\n }\n try {\n const logProvider = logs.getLoggerProvider() as LoggerProvider;\n logRecordProcessors.forEach((logRecordProcessor) => {\n logProvider.addLogRecordProcessor(logRecordProcessor);\n });\n } catch (error) {\n InternalLogger.getInstance().error(\n \"Failed to add LogRecordProcessors to LoggerProvider.\",\n error,\n );\n }\n}\n\n/**\n * Shutdown Azure Monitor Open Telemetry Distro\n * @see https://github.com/open-telemetry/opentelemetry-js/blob/0229434cb5a3179f63c021105f36270ae7897929/experimental/packages/opentelemetry-sdk-node/src/sdk.ts#L398\n */\nexport function shutdownAzureMonitor(): Promise<void> {\n browserSdkLoader?.dispose();\n return sdk?.shutdown();\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ProxyTracerProvider, metrics, trace } from \"@opentelemetry/api\";\nimport { logs } from \"@opentelemetry/api-logs\";\nimport { NodeSDK, NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { InternalConfig } from \"./shared/config\";\nimport { MetricHandler } from \"./metrics\";\nimport { TraceHandler } from \"./traces/handler\";\nimport { Logger as InternalLogger } from \"./shared/logging\";\nimport { LogHandler } from \"./logs\";\nimport {\n AZURE_MONITOR_OPENTELEMETRY_VERSION,\n AzureMonitorOpenTelemetryOptions,\n InstrumentationOptions,\n BrowserSdkLoaderOptions,\n StatsbeatOptions,\n} from \"./types\";\nimport { BrowserSdkLoader } from \"./browserSdkLoader/browserSdkLoader\";\nimport { setSdkPrefix } from \"./metrics/quickpulse/utils\";\nimport { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { LogRecordProcessor, LoggerProvider } from \"@opentelemetry/sdk-logs\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { getInstance } from \"./utils/statsbeat\";\nimport { parseResourceDetectorsFromEnvVar } from \"./utils/common\";\n\nexport { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, BrowserSdkLoaderOptions };\n\nprocess.env[\"AZURE_MONITOR_DISTRO_VERSION\"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;\n\nlet sdk: NodeSDK;\nlet browserSdkLoader: BrowserSdkLoader | undefined;\n\n/**\n * Initialize Azure Monitor Distro\n * @param options Azure Monitor OpenTelemetry Options\n */\nexport function useAzureMonitor(options?: AzureMonitorOpenTelemetryOptions) {\n const config = new InternalConfig(options);\n const statsbeatOptions: StatsbeatOptions = {\n // Instrumentations\n azureSdk: config.instrumentationOptions?.azureSdk?.enabled,\n mongoDb: config.instrumentationOptions?.mongoDb?.enabled,\n mySql: config.instrumentationOptions?.mySql?.enabled,\n postgreSql: config.instrumentationOptions?.postgreSql?.enabled,\n redis: config.instrumentationOptions?.redis?.enabled,\n bunyan: config.instrumentationOptions?.bunyan?.enabled,\n winston: config.instrumentationOptions?.winston?.enabled,\n // Features\n browserSdkLoader: config.browserSdkLoaderOptions.enabled,\n aadHandling: !!config.azureMonitorExporterOptions?.credential,\n diskRetry: !config.azureMonitorExporterOptions?.disableOfflineStorage,\n };\n getInstance().setStatsbeatFeatures(statsbeatOptions);\n\n if (config.browserSdkLoaderOptions.enabled) {\n browserSdkLoader = new BrowserSdkLoader(config);\n }\n // Remove global providers in OpenTelemetry, these would be overriden if present\n metrics.disable();\n trace.disable();\n logs.disable();\n\n // Create internal handlers\n const metricHandler = new MetricHandler(config);\n const traceHandler = new TraceHandler(config, metricHandler);\n const logHandler = new LogHandler(config, metricHandler);\n\n const instrumentations = traceHandler\n .getInstrumentations()\n .concat(logHandler.getInstrumentations());\n\n const resourceDetectorsList = parseResourceDetectorsFromEnvVar();\n\n // Initialize OpenTelemetry SDK\n const sdkConfig: Partial<NodeSDKConfiguration> = {\n autoDetectResources: true,\n metricReader: metricHandler.getMetricReader(),\n views: metricHandler.getViews(),\n instrumentations: instrumentations,\n logRecordProcessor: logHandler.getAzureLogRecordProcessor(),\n resource: config.resource,\n sampler: traceHandler.getSampler(),\n spanProcessors: [traceHandler.getAzureMonitorSpanProcessor()],\n resourceDetectors: resourceDetectorsList,\n };\n sdk = new NodeSDK(sdkConfig);\n setSdkPrefix();\n sdk.start();\n\n // TODO: Send processors as NodeSDK config once arrays are supported\n // https://github.com/open-telemetry/opentelemetry-js/issues/4451\n\n // Add extra SpanProcessors, MetricReaders and LogRecordProcessors\n let spanProcessors: SpanProcessor[] = options?.spanProcessors || [];\n // Add batch processor as the last one\n spanProcessors.push(traceHandler.getBatchSpanProcessor());\n\n // Add extra SpanProcessors, MetricReaders and LogRecordProcessors\n let logRecordProcessors: LogRecordProcessor[] = options?.logRecordProcessors || [];\n // Add batch processor as the last one\n logRecordProcessors.push(logHandler.getBatchLogRecordProcessor());\n\n try {\n const tracerProvider = (\n trace.getTracerProvider() as ProxyTracerProvider\n ).getDelegate() as NodeTracerProvider;\n spanProcessors.forEach((spanProcessor) => {\n tracerProvider.addSpanProcessor(spanProcessor);\n });\n } catch (error) {\n InternalLogger.getInstance().error(\"Failed to add SpanProcessors to TracerProvider.\", error);\n }\n try {\n const logProvider = logs.getLoggerProvider() as LoggerProvider;\n logRecordProcessors.forEach((logRecordProcessor) => {\n logProvider.addLogRecordProcessor(logRecordProcessor);\n });\n } catch (error) {\n InternalLogger.getInstance().error(\n \"Failed to add LogRecordProcessors to LoggerProvider.\",\n error,\n );\n }\n}\n\n/**\n * Shutdown Azure Monitor Open Telemetry Distro\n * @see https://github.com/open-telemetry/opentelemetry-js/blob/0229434cb5a3179f63c021105f36270ae7897929/experimental/packages/opentelemetry-sdk-node/src/sdk.ts#L398\n */\nexport function shutdownAzureMonitor(): Promise<void> {\n browserSdkLoader?.dispose();\n return sdk?.shutdown();\n}\n"]}
@@ -1,13 +1,16 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT license.
3
- import { SemanticAttributes, SemanticResourceAttributes, } from "@opentelemetry/semantic-conventions";
3
+ import { SpanStatusCode } from "@opentelemetry/api";
4
+ import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_NAMESPACE, SEMRESATTRS_SERVICE_INSTANCE_ID, SEMATTRS_PEER_SERVICE, SEMATTRS_HTTP_HOST, SEMATTRS_HTTP_URL, SEMATTRS_NET_PEER_NAME, SEMATTRS_NET_PEER_IP, SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_EXCEPTION_TYPE, SEMATTRS_HTTP_USER_AGENT, SEMATTRS_HTTP_STATUS_CODE, } from "@opentelemetry/semantic-conventions";
4
5
  import { StandardMetricIds, StandardMetricPropertyNames, } from "./types";
5
6
  export function getRequestDimensions(span) {
6
7
  const dimensions = getBaseDimensions(span.resource);
7
8
  dimensions.metricId = StandardMetricIds.REQUEST_DURATION;
8
- const statusCode = String(span.attributes["http.status_code"]);
9
+ const statusCode = String(span.attributes[SEMATTRS_HTTP_STATUS_CODE]);
9
10
  dimensions.requestResultCode = statusCode;
10
- dimensions.requestSuccess = statusCode === "200" ? "True" : "False";
11
+ // OTel treats 4xx request responses as UNSET SpanStatusCode, but we should count them as failed
12
+ dimensions.requestSuccess =
13
+ span.status.code !== SpanStatusCode.ERROR && (Number(statusCode) || 0) < 400 ? "True" : "False";
11
14
  if (isSyntheticLoad(span)) {
12
15
  dimensions.operationSynthetic = "True";
13
16
  }
@@ -16,11 +19,11 @@ export function getRequestDimensions(span) {
16
19
  export function getDependencyDimensions(span) {
17
20
  const dimensions = getBaseDimensions(span.resource);
18
21
  dimensions.metricId = StandardMetricIds.DEPENDENCIES_DURATION;
19
- const statusCode = String(span.attributes["http.status_code"]);
22
+ const statusCode = String(span.attributes[SEMATTRS_HTTP_STATUS_CODE]);
20
23
  dimensions.dependencyTarget = getDependencyTarget(span.attributes);
21
24
  dimensions.dependencyResultCode = statusCode;
22
25
  dimensions.dependencyType = "http";
23
- dimensions.dependencySuccess = statusCode === "200" ? "True" : "False";
26
+ dimensions.dependencySuccess = span.status.code !== SpanStatusCode.ERROR ? "True" : "False";
24
27
  if (isSyntheticLoad(span)) {
25
28
  dimensions.operationSynthetic = "True";
26
29
  }
@@ -41,8 +44,8 @@ export function getBaseDimensions(resource) {
41
44
  dimensions.IsAutocollected = "True";
42
45
  if (resource) {
43
46
  const spanResourceAttributes = resource.attributes;
44
- const serviceName = spanResourceAttributes[SemanticResourceAttributes.SERVICE_NAME];
45
- const serviceNamespace = spanResourceAttributes[SemanticResourceAttributes.SERVICE_NAMESPACE];
47
+ const serviceName = spanResourceAttributes[SEMRESATTRS_SERVICE_NAME];
48
+ const serviceNamespace = spanResourceAttributes[SEMRESATTRS_SERVICE_NAMESPACE];
46
49
  if (serviceName) {
47
50
  if (serviceNamespace) {
48
51
  dimensions.cloudRoleName = `${serviceNamespace}.${serviceName}`;
@@ -51,7 +54,7 @@ export function getBaseDimensions(resource) {
51
54
  dimensions.cloudRoleName = String(serviceName);
52
55
  }
53
56
  }
54
- const serviceInstanceId = spanResourceAttributes[SemanticResourceAttributes.SERVICE_INSTANCE_ID];
57
+ const serviceInstanceId = spanResourceAttributes[SEMRESATTRS_SERVICE_INSTANCE_ID];
55
58
  dimensions.cloudRoleInstance = String(serviceInstanceId);
56
59
  }
57
60
  return dimensions;
@@ -60,11 +63,11 @@ export function getDependencyTarget(attributes) {
60
63
  if (!attributes) {
61
64
  return "";
62
65
  }
63
- const peerService = attributes[SemanticAttributes.PEER_SERVICE];
64
- const httpHost = attributes[SemanticAttributes.HTTP_HOST];
65
- const httpUrl = attributes[SemanticAttributes.HTTP_URL];
66
- const netPeerName = attributes[SemanticAttributes.NET_PEER_NAME];
67
- const netPeerIp = attributes[SemanticAttributes.NET_PEER_IP];
66
+ const peerService = attributes[SEMATTRS_PEER_SERVICE];
67
+ const httpHost = attributes[SEMATTRS_HTTP_HOST];
68
+ const httpUrl = attributes[SEMATTRS_HTTP_URL];
69
+ const netPeerName = attributes[SEMATTRS_NET_PEER_NAME];
70
+ const netPeerIp = attributes[SEMATTRS_NET_PEER_IP];
68
71
  if (peerService) {
69
72
  return String(peerService);
70
73
  }
@@ -88,8 +91,8 @@ export function isExceptionTelemetry(logRecord) {
88
91
  if (baseType && baseType === "ExceptionData") {
89
92
  return true;
90
93
  }
91
- else if (logRecord.attributes[SemanticAttributes.EXCEPTION_MESSAGE] ||
92
- logRecord.attributes[SemanticAttributes.EXCEPTION_TYPE]) {
94
+ else if (logRecord.attributes[SEMATTRS_EXCEPTION_MESSAGE] ||
95
+ logRecord.attributes[SEMATTRS_EXCEPTION_TYPE]) {
93
96
  return true;
94
97
  }
95
98
  return false;
@@ -100,14 +103,14 @@ export function isTraceTelemetry(logRecord) {
100
103
  if (baseType && baseType === "MessageData") {
101
104
  return true;
102
105
  }
103
- else if (!logRecord.attributes[SemanticAttributes.EXCEPTION_MESSAGE] &&
104
- !logRecord.attributes[SemanticAttributes.EXCEPTION_TYPE]) {
106
+ else if (!logRecord.attributes[SEMATTRS_EXCEPTION_MESSAGE] &&
107
+ !logRecord.attributes[SEMATTRS_EXCEPTION_TYPE]) {
105
108
  return true;
106
109
  }
107
110
  return false;
108
111
  }
109
112
  export function isSyntheticLoad(record) {
110
- const userAgent = String(record.attributes[SemanticAttributes.HTTP_USER_AGENT]);
113
+ const userAgent = String(record.attributes[SEMATTRS_HTTP_USER_AGENT]);
111
114
  return userAgent !== null && userAgent.includes("AlwaysOn") ? true : false;
112
115
  }
113
116
  export function convertDimensions(dimensions) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/metrics/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { Attributes } from \"@opentelemetry/api\";\nimport { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport {\n SemanticAttributes,\n SemanticResourceAttributes,\n} from \"@opentelemetry/semantic-conventions\";\nimport {\n MetricDependencyDimensions,\n MetricDimensionTypeKeys,\n MetricRequestDimensions,\n StandardMetricBaseDimensions,\n StandardMetricIds,\n StandardMetricPropertyNames,\n} from \"./types\";\nimport { LogRecord } from \"@opentelemetry/sdk-logs\";\nimport { Resource } from \"@opentelemetry/resources\";\n\nexport function getRequestDimensions(span: ReadableSpan): Attributes {\n const dimensions: MetricRequestDimensions = getBaseDimensions(span.resource);\n dimensions.metricId = StandardMetricIds.REQUEST_DURATION;\n const statusCode = String(span.attributes[\"http.status_code\"]);\n dimensions.requestResultCode = statusCode;\n dimensions.requestSuccess = statusCode === \"200\" ? \"True\" : \"False\";\n if (isSyntheticLoad(span)) {\n dimensions.operationSynthetic = \"True\";\n }\n return convertDimensions(dimensions) as Attributes;\n}\n\nexport function getDependencyDimensions(span: ReadableSpan): Attributes {\n const dimensions: MetricDependencyDimensions = getBaseDimensions(span.resource);\n dimensions.metricId = StandardMetricIds.DEPENDENCIES_DURATION;\n const statusCode = String(span.attributes[\"http.status_code\"]);\n dimensions.dependencyTarget = getDependencyTarget(span.attributes);\n dimensions.dependencyResultCode = statusCode;\n dimensions.dependencyType = \"http\";\n dimensions.dependencySuccess = statusCode === \"200\" ? \"True\" : \"False\";\n if (isSyntheticLoad(span)) {\n dimensions.operationSynthetic = \"True\";\n }\n return convertDimensions(dimensions) as Attributes;\n}\n\nexport function getExceptionDimensions(resource: Resource): Attributes {\n const dimensions: StandardMetricBaseDimensions = getBaseDimensions(resource);\n dimensions.metricId = StandardMetricIds.EXCEPTIONS_COUNT;\n return dimensions as Attributes;\n}\n\nexport function getTraceDimensions(resource: Resource): Attributes {\n const dimensions: StandardMetricBaseDimensions = getBaseDimensions(resource);\n dimensions.metricId = StandardMetricIds.TRACES_COUNT;\n return dimensions as Attributes;\n}\n\nexport function getBaseDimensions(resource: Resource): StandardMetricBaseDimensions {\n const dimensions: StandardMetricBaseDimensions = {};\n dimensions.IsAutocollected = \"True\";\n if (resource) {\n const spanResourceAttributes = resource.attributes;\n const serviceName = spanResourceAttributes[SemanticResourceAttributes.SERVICE_NAME];\n const serviceNamespace = spanResourceAttributes[SemanticResourceAttributes.SERVICE_NAMESPACE];\n if (serviceName) {\n if (serviceNamespace) {\n dimensions.cloudRoleName = `${serviceNamespace}.${serviceName}`;\n } else {\n dimensions.cloudRoleName = String(serviceName);\n }\n }\n const serviceInstanceId =\n spanResourceAttributes[SemanticResourceAttributes.SERVICE_INSTANCE_ID];\n dimensions.cloudRoleInstance = String(serviceInstanceId);\n }\n return dimensions;\n}\n\nexport function getDependencyTarget(attributes: Attributes): string {\n if (!attributes) {\n return \"\";\n }\n const peerService = attributes[SemanticAttributes.PEER_SERVICE];\n const httpHost = attributes[SemanticAttributes.HTTP_HOST];\n const httpUrl = attributes[SemanticAttributes.HTTP_URL];\n const netPeerName = attributes[SemanticAttributes.NET_PEER_NAME];\n const netPeerIp = attributes[SemanticAttributes.NET_PEER_IP];\n if (peerService) {\n return String(peerService);\n } else if (httpHost) {\n return String(httpHost);\n } else if (httpUrl) {\n return String(httpUrl);\n } else if (netPeerName) {\n return String(netPeerName);\n } else if (netPeerIp) {\n return String(netPeerIp);\n }\n return \"\";\n}\n\nexport function isExceptionTelemetry(logRecord: LogRecord) {\n const baseType = logRecord.attributes[\"_MS.baseType\"];\n // If Application Insights Legacy logs\n if (baseType && baseType === \"ExceptionData\") {\n return true;\n } else if (\n logRecord.attributes[SemanticAttributes.EXCEPTION_MESSAGE] ||\n logRecord.attributes[SemanticAttributes.EXCEPTION_TYPE]\n ) {\n return true;\n }\n return false;\n}\n\nexport function isTraceTelemetry(logRecord: LogRecord) {\n const baseType = logRecord.attributes[\"_MS.baseType\"];\n // If Application Insights Legacy logs\n if (baseType && baseType === \"MessageData\") {\n return true;\n } else if (\n !logRecord.attributes[SemanticAttributes.EXCEPTION_MESSAGE] &&\n !logRecord.attributes[SemanticAttributes.EXCEPTION_TYPE]\n ) {\n return true;\n }\n return false;\n}\n\nexport function isSyntheticLoad(record: LogRecord | ReadableSpan): boolean {\n const userAgent = String(record.attributes[SemanticAttributes.HTTP_USER_AGENT]);\n return userAgent !== null && userAgent.includes(\"AlwaysOn\") ? true : false;\n}\n\nexport function convertDimensions(\n dimensions: MetricDependencyDimensions | MetricRequestDimensions,\n): Attributes {\n let convertedDimensions: any = {};\n for (let dim in dimensions) {\n convertedDimensions[StandardMetricPropertyNames[dim as MetricDimensionTypeKeys]] = (\n dimensions as any\n )[dim];\n }\n return convertedDimensions as Attributes;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/metrics/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { Attributes, SpanStatusCode } from \"@opentelemetry/api\";\nimport { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport {\n SEMRESATTRS_SERVICE_NAME,\n SEMRESATTRS_SERVICE_NAMESPACE,\n SEMRESATTRS_SERVICE_INSTANCE_ID,\n SEMATTRS_PEER_SERVICE,\n SEMATTRS_HTTP_HOST,\n SEMATTRS_HTTP_URL,\n SEMATTRS_NET_PEER_NAME,\n SEMATTRS_NET_PEER_IP,\n SEMATTRS_EXCEPTION_MESSAGE,\n SEMATTRS_EXCEPTION_TYPE,\n SEMATTRS_HTTP_USER_AGENT,\n SEMATTRS_HTTP_STATUS_CODE,\n} from \"@opentelemetry/semantic-conventions\";\nimport {\n MetricDependencyDimensions,\n MetricDimensionTypeKeys,\n MetricRequestDimensions,\n StandardMetricBaseDimensions,\n StandardMetricIds,\n StandardMetricPropertyNames,\n} from \"./types\";\nimport { LogRecord } from \"@opentelemetry/sdk-logs\";\nimport { Resource } from \"@opentelemetry/resources\";\n\nexport function getRequestDimensions(span: ReadableSpan): Attributes {\n const dimensions: MetricRequestDimensions = getBaseDimensions(span.resource);\n dimensions.metricId = StandardMetricIds.REQUEST_DURATION;\n const statusCode = String(span.attributes[SEMATTRS_HTTP_STATUS_CODE]);\n dimensions.requestResultCode = statusCode;\n // OTel treats 4xx request responses as UNSET SpanStatusCode, but we should count them as failed\n dimensions.requestSuccess =\n span.status.code !== SpanStatusCode.ERROR && (Number(statusCode) || 0) < 400 ? \"True\" : \"False\";\n if (isSyntheticLoad(span)) {\n dimensions.operationSynthetic = \"True\";\n }\n return convertDimensions(dimensions) as Attributes;\n}\n\nexport function getDependencyDimensions(span: ReadableSpan): Attributes {\n const dimensions: MetricDependencyDimensions = getBaseDimensions(span.resource);\n dimensions.metricId = StandardMetricIds.DEPENDENCIES_DURATION;\n const statusCode = String(span.attributes[SEMATTRS_HTTP_STATUS_CODE]);\n dimensions.dependencyTarget = getDependencyTarget(span.attributes);\n dimensions.dependencyResultCode = statusCode;\n dimensions.dependencyType = \"http\";\n dimensions.dependencySuccess = span.status.code !== SpanStatusCode.ERROR ? \"True\" : \"False\";\n if (isSyntheticLoad(span)) {\n dimensions.operationSynthetic = \"True\";\n }\n return convertDimensions(dimensions) as Attributes;\n}\n\nexport function getExceptionDimensions(resource: Resource): Attributes {\n const dimensions: StandardMetricBaseDimensions = getBaseDimensions(resource);\n dimensions.metricId = StandardMetricIds.EXCEPTIONS_COUNT;\n return dimensions as Attributes;\n}\n\nexport function getTraceDimensions(resource: Resource): Attributes {\n const dimensions: StandardMetricBaseDimensions = getBaseDimensions(resource);\n dimensions.metricId = StandardMetricIds.TRACES_COUNT;\n return dimensions as Attributes;\n}\n\nexport function getBaseDimensions(resource: Resource): StandardMetricBaseDimensions {\n const dimensions: StandardMetricBaseDimensions = {};\n dimensions.IsAutocollected = \"True\";\n if (resource) {\n const spanResourceAttributes = resource.attributes;\n const serviceName = spanResourceAttributes[SEMRESATTRS_SERVICE_NAME];\n const serviceNamespace = spanResourceAttributes[SEMRESATTRS_SERVICE_NAMESPACE];\n if (serviceName) {\n if (serviceNamespace) {\n dimensions.cloudRoleName = `${serviceNamespace}.${serviceName}`;\n } else {\n dimensions.cloudRoleName = String(serviceName);\n }\n }\n const serviceInstanceId = spanResourceAttributes[SEMRESATTRS_SERVICE_INSTANCE_ID];\n dimensions.cloudRoleInstance = String(serviceInstanceId);\n }\n return dimensions;\n}\n\nexport function getDependencyTarget(attributes: Attributes): string {\n if (!attributes) {\n return \"\";\n }\n const peerService = attributes[SEMATTRS_PEER_SERVICE];\n const httpHost = attributes[SEMATTRS_HTTP_HOST];\n const httpUrl = attributes[SEMATTRS_HTTP_URL];\n const netPeerName = attributes[SEMATTRS_NET_PEER_NAME];\n const netPeerIp = attributes[SEMATTRS_NET_PEER_IP];\n if (peerService) {\n return String(peerService);\n } else if (httpHost) {\n return String(httpHost);\n } else if (httpUrl) {\n return String(httpUrl);\n } else if (netPeerName) {\n return String(netPeerName);\n } else if (netPeerIp) {\n return String(netPeerIp);\n }\n return \"\";\n}\n\nexport function isExceptionTelemetry(logRecord: LogRecord) {\n const baseType = logRecord.attributes[\"_MS.baseType\"];\n // If Application Insights Legacy logs\n if (baseType && baseType === \"ExceptionData\") {\n return true;\n } else if (\n logRecord.attributes[SEMATTRS_EXCEPTION_MESSAGE] ||\n logRecord.attributes[SEMATTRS_EXCEPTION_TYPE]\n ) {\n return true;\n }\n return false;\n}\n\nexport function isTraceTelemetry(logRecord: LogRecord) {\n const baseType = logRecord.attributes[\"_MS.baseType\"];\n // If Application Insights Legacy logs\n if (baseType && baseType === \"MessageData\") {\n return true;\n } else if (\n !logRecord.attributes[SEMATTRS_EXCEPTION_MESSAGE] &&\n !logRecord.attributes[SEMATTRS_EXCEPTION_TYPE]\n ) {\n return true;\n }\n return false;\n}\n\nexport function isSyntheticLoad(record: LogRecord | ReadableSpan): boolean {\n const userAgent = String(record.attributes[SEMATTRS_HTTP_USER_AGENT]);\n return userAgent !== null && userAgent.includes(\"AlwaysOn\") ? true : false;\n}\n\nexport function convertDimensions(\n dimensions: MetricDependencyDimensions | MetricRequestDimensions,\n): Attributes {\n let convertedDimensions: any = {};\n for (let dim in dimensions) {\n convertedDimensions[StandardMetricPropertyNames[dim as MetricDimensionTypeKeys]] = (\n dimensions as any\n )[dim];\n }\n return convertedDimensions as Attributes;\n}\n"]}
@@ -25,7 +25,7 @@ export class InternalConfig {
25
25
  // Default values
26
26
  this.azureMonitorExporterOptions = {};
27
27
  this.samplingRatio = 1;
28
- this.enableLiveMetrics = false;
28
+ this.enableLiveMetrics = true;
29
29
  this.enableStandardMetrics = true;
30
30
  this.enableTraceBasedSamplingForLogs = true;
31
31
  this.instrumentationOptions = {
@@ -47,7 +47,8 @@ export class InternalConfig {
47
47
  this.azureMonitorExporterOptions = Object.assign(this.azureMonitorExporterOptions, options.azureMonitorExporterOptions);
48
48
  this.instrumentationOptions = Object.assign(this.instrumentationOptions, options.instrumentationOptions);
49
49
  this.resource = Object.assign(this.resource, options.resource);
50
- this.samplingRatio = options.samplingRatio || this.samplingRatio;
50
+ this.samplingRatio =
51
+ options.samplingRatio !== undefined ? options.samplingRatio : this.samplingRatio;
51
52
  this.browserSdkLoaderOptions = Object.assign(this.browserSdkLoaderOptions, options.browserSdkLoaderOptions);
52
53
  this.enableLiveMetrics =
53
54
  options.enableLiveMetrics != undefined ? options.enableLiveMetrics : this.enableLiveMetrics;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/shared/config.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n Resource,\n ResourceDetectionConfig,\n detectResourcesSync,\n envDetectorSync,\n} from \"@opentelemetry/resources\";\nimport {\n BrowserSdkLoaderOptions,\n AzureMonitorOpenTelemetryOptions,\n InstrumentationOptions,\n} from \"../types\";\nimport { AzureMonitorExporterOptions } from \"@azure/monitor-opentelemetry-exporter\";\nimport { JsonConfig } from \"./jsonConfig\";\nimport { Logger } from \"./logging\";\nimport {\n azureAppServiceDetector,\n azureFunctionsDetector,\n azureVmDetector,\n} from \"@opentelemetry/resource-detector-azure\";\n\n/**\n * Azure Monitor OpenTelemetry Client Configuration\n */\nexport class InternalConfig implements AzureMonitorOpenTelemetryOptions {\n /** The rate of telemetry items tracked that should be transmitted (Default 1.0) */\n public samplingRatio: number;\n /** Azure Monitor Exporter Configuration */\n public azureMonitorExporterOptions: AzureMonitorExporterOptions;\n /**\n * OpenTelemetry Instrumentations configuration included as part of Azure Monitor (azureSdk, http, mongoDb, mySql, postgreSql, redis, redis4)\n */\n public instrumentationOptions: InstrumentationOptions;\n /** Enable Live Metrics feature */\n enableLiveMetrics?: boolean;\n /** Enable Standard Metrics feature */\n enableStandardMetrics?: boolean;\n /** Enable log sampling based on trace (Default true) */\n enableTraceBasedSamplingForLogs?: boolean;\n\n private _resource: Resource = Resource.empty();\n\n public set resource(resource: Resource) {\n this._resource = this._resource.merge(resource);\n }\n\n /**\n *Get OpenTelemetry Resource\n */\n public get resource(): Resource {\n return this._resource;\n }\n\n public browserSdkLoaderOptions: BrowserSdkLoaderOptions;\n\n /**\n * Initializes a new instance of the AzureMonitorOpenTelemetryOptions class.\n */\n constructor(options?: AzureMonitorOpenTelemetryOptions) {\n // Default values\n this.azureMonitorExporterOptions = {};\n this.samplingRatio = 1;\n this.enableLiveMetrics = false;\n this.enableStandardMetrics = true;\n this.enableTraceBasedSamplingForLogs = true;\n this.instrumentationOptions = {\n http: { enabled: true },\n azureSdk: { enabled: false },\n mongoDb: { enabled: false },\n mySql: { enabled: false },\n postgreSql: { enabled: false },\n redis: { enabled: false },\n redis4: { enabled: false },\n };\n this._setDefaultResource();\n this.browserSdkLoaderOptions = {\n enabled: false,\n connectionString: \"\",\n };\n\n if (options) {\n // Merge default with provided options\n this.azureMonitorExporterOptions = Object.assign(\n this.azureMonitorExporterOptions,\n options.azureMonitorExporterOptions,\n );\n this.instrumentationOptions = Object.assign(\n this.instrumentationOptions,\n options.instrumentationOptions,\n );\n this.resource = Object.assign(this.resource, options.resource);\n this.samplingRatio = options.samplingRatio || this.samplingRatio;\n this.browserSdkLoaderOptions = Object.assign(\n this.browserSdkLoaderOptions,\n options.browserSdkLoaderOptions,\n );\n this.enableLiveMetrics =\n options.enableLiveMetrics != undefined ? options.enableLiveMetrics : this.enableLiveMetrics;\n this.enableStandardMetrics =\n options.enableStandardMetrics != undefined\n ? options.enableStandardMetrics\n : this.enableStandardMetrics;\n this.enableTraceBasedSamplingForLogs =\n options.enableTraceBasedSamplingForLogs != undefined\n ? options.enableTraceBasedSamplingForLogs\n : this.enableTraceBasedSamplingForLogs;\n }\n // JSON configuration will take precedence over other settings\n this._mergeConfig();\n }\n\n private _mergeConfig() {\n try {\n const jsonConfig = JsonConfig.getInstance();\n this.samplingRatio =\n jsonConfig.samplingRatio !== undefined ? jsonConfig.samplingRatio : this.samplingRatio;\n this.browserSdkLoaderOptions = Object.assign(\n this.browserSdkLoaderOptions,\n jsonConfig.browserSdkLoaderOptions,\n );\n this.enableLiveMetrics =\n jsonConfig.enableLiveMetrics !== undefined\n ? jsonConfig.enableLiveMetrics\n : this.enableLiveMetrics;\n this.enableStandardMetrics =\n jsonConfig.enableStandardMetrics !== undefined\n ? jsonConfig.enableStandardMetrics\n : this.enableStandardMetrics;\n this.enableTraceBasedSamplingForLogs =\n jsonConfig.enableTraceBasedSamplingForLogs !== undefined\n ? jsonConfig.enableTraceBasedSamplingForLogs\n : this.enableTraceBasedSamplingForLogs;\n this.azureMonitorExporterOptions = Object.assign(\n this.azureMonitorExporterOptions,\n jsonConfig.azureMonitorExporterOptions,\n );\n this.instrumentationOptions = Object.assign(\n this.instrumentationOptions,\n jsonConfig.instrumentationOptions,\n );\n } catch (error) {\n Logger.getInstance().error(\"Failed to load JSON config file values.\", error);\n }\n }\n\n private _setDefaultResource(): void {\n let resource = Resource.default();\n // Load resource attributes from env\n const detectResourceConfig: ResourceDetectionConfig = {\n detectors: [envDetectorSync],\n };\n const envResource = detectResourcesSync(detectResourceConfig);\n resource = resource.merge(envResource) as Resource;\n\n // Load resource attributes from Azure\n const azureResource: Resource = detectResourcesSync({\n detectors: [azureAppServiceDetector, azureFunctionsDetector],\n });\n this._resource = resource.merge(azureResource) as Resource;\n\n const vmResource = detectResourcesSync({\n detectors: [azureVmDetector],\n });\n if (vmResource.asyncAttributesPending) {\n vmResource.waitForAsyncAttributes?.().then(() => {\n this._resource = this._resource.merge(vmResource) as Resource;\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/shared/config.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n Resource,\n ResourceDetectionConfig,\n detectResourcesSync,\n envDetectorSync,\n} from \"@opentelemetry/resources\";\nimport {\n BrowserSdkLoaderOptions,\n AzureMonitorOpenTelemetryOptions,\n InstrumentationOptions,\n} from \"../types\";\nimport { AzureMonitorExporterOptions } from \"@azure/monitor-opentelemetry-exporter\";\nimport { JsonConfig } from \"./jsonConfig\";\nimport { Logger } from \"./logging\";\nimport {\n azureAppServiceDetector,\n azureFunctionsDetector,\n azureVmDetector,\n} from \"@opentelemetry/resource-detector-azure\";\n\n/**\n * Azure Monitor OpenTelemetry Client Configuration\n */\nexport class InternalConfig implements AzureMonitorOpenTelemetryOptions {\n /** The rate of telemetry items tracked that should be transmitted (Default 1.0) */\n public samplingRatio: number;\n /** Azure Monitor Exporter Configuration */\n public azureMonitorExporterOptions: AzureMonitorExporterOptions;\n /**\n * OpenTelemetry Instrumentations configuration included as part of Azure Monitor (azureSdk, http, mongoDb, mySql, postgreSql, redis, redis4)\n */\n public instrumentationOptions: InstrumentationOptions;\n /** Enable Live Metrics feature */\n enableLiveMetrics?: boolean;\n /** Enable Standard Metrics feature */\n enableStandardMetrics?: boolean;\n /** Enable log sampling based on trace (Default true) */\n enableTraceBasedSamplingForLogs?: boolean;\n\n private _resource: Resource = Resource.empty();\n\n public set resource(resource: Resource) {\n this._resource = this._resource.merge(resource);\n }\n\n /**\n *Get OpenTelemetry Resource\n */\n public get resource(): Resource {\n return this._resource;\n }\n\n public browserSdkLoaderOptions: BrowserSdkLoaderOptions;\n\n /**\n * Initializes a new instance of the AzureMonitorOpenTelemetryOptions class.\n */\n constructor(options?: AzureMonitorOpenTelemetryOptions) {\n // Default values\n this.azureMonitorExporterOptions = {};\n this.samplingRatio = 1;\n this.enableLiveMetrics = true;\n this.enableStandardMetrics = true;\n this.enableTraceBasedSamplingForLogs = true;\n this.instrumentationOptions = {\n http: { enabled: true },\n azureSdk: { enabled: false },\n mongoDb: { enabled: false },\n mySql: { enabled: false },\n postgreSql: { enabled: false },\n redis: { enabled: false },\n redis4: { enabled: false },\n };\n this._setDefaultResource();\n this.browserSdkLoaderOptions = {\n enabled: false,\n connectionString: \"\",\n };\n\n if (options) {\n // Merge default with provided options\n this.azureMonitorExporterOptions = Object.assign(\n this.azureMonitorExporterOptions,\n options.azureMonitorExporterOptions,\n );\n this.instrumentationOptions = Object.assign(\n this.instrumentationOptions,\n options.instrumentationOptions,\n );\n this.resource = Object.assign(this.resource, options.resource);\n this.samplingRatio =\n options.samplingRatio !== undefined ? options.samplingRatio : this.samplingRatio;\n this.browserSdkLoaderOptions = Object.assign(\n this.browserSdkLoaderOptions,\n options.browserSdkLoaderOptions,\n );\n this.enableLiveMetrics =\n options.enableLiveMetrics != undefined ? options.enableLiveMetrics : this.enableLiveMetrics;\n this.enableStandardMetrics =\n options.enableStandardMetrics != undefined\n ? options.enableStandardMetrics\n : this.enableStandardMetrics;\n this.enableTraceBasedSamplingForLogs =\n options.enableTraceBasedSamplingForLogs != undefined\n ? options.enableTraceBasedSamplingForLogs\n : this.enableTraceBasedSamplingForLogs;\n }\n // JSON configuration will take precedence over other settings\n this._mergeConfig();\n }\n\n private _mergeConfig() {\n try {\n const jsonConfig = JsonConfig.getInstance();\n this.samplingRatio =\n jsonConfig.samplingRatio !== undefined ? jsonConfig.samplingRatio : this.samplingRatio;\n this.browserSdkLoaderOptions = Object.assign(\n this.browserSdkLoaderOptions,\n jsonConfig.browserSdkLoaderOptions,\n );\n this.enableLiveMetrics =\n jsonConfig.enableLiveMetrics !== undefined\n ? jsonConfig.enableLiveMetrics\n : this.enableLiveMetrics;\n this.enableStandardMetrics =\n jsonConfig.enableStandardMetrics !== undefined\n ? jsonConfig.enableStandardMetrics\n : this.enableStandardMetrics;\n this.enableTraceBasedSamplingForLogs =\n jsonConfig.enableTraceBasedSamplingForLogs !== undefined\n ? jsonConfig.enableTraceBasedSamplingForLogs\n : this.enableTraceBasedSamplingForLogs;\n this.azureMonitorExporterOptions = Object.assign(\n this.azureMonitorExporterOptions,\n jsonConfig.azureMonitorExporterOptions,\n );\n this.instrumentationOptions = Object.assign(\n this.instrumentationOptions,\n jsonConfig.instrumentationOptions,\n );\n } catch (error) {\n Logger.getInstance().error(\"Failed to load JSON config file values.\", error);\n }\n }\n\n private _setDefaultResource(): void {\n let resource = Resource.default();\n // Load resource attributes from env\n const detectResourceConfig: ResourceDetectionConfig = {\n detectors: [envDetectorSync],\n };\n const envResource = detectResourcesSync(detectResourceConfig);\n resource = resource.merge(envResource) as Resource;\n\n // Load resource attributes from Azure\n const azureResource: Resource = detectResourcesSync({\n detectors: [azureAppServiceDetector, azureFunctionsDetector],\n });\n this._resource = resource.merge(azureResource) as Resource;\n\n const vmResource = detectResourcesSync({\n detectors: [azureVmDetector],\n });\n if (vmResource.asyncAttributesPending) {\n vmResource.waitForAsyncAttributes?.().then(() => {\n this._resource = this._resource.merge(vmResource) as Resource;\n });\n }\n }\n}\n"]}
@@ -1,3 +1,6 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+ import { diag } from "@opentelemetry/api";
1
4
  import { SamplingDecision } from "@opentelemetry/sdk-trace-base";
2
5
  /**
3
6
  * ApplicationInsightsSampler is responsible for the following:
@@ -12,8 +15,10 @@ export class ApplicationInsightsSampler {
12
15
  */
13
16
  constructor(samplingRatio = 1) {
14
17
  this._samplingRatio = samplingRatio;
15
- if (this._samplingRatio > 1) {
16
- throw new Error("Invalid sampling rate, sampling rate must be a value in the range [0,1].");
18
+ if (this._samplingRatio > 1 ||
19
+ this._samplingRatio < 0 ||
20
+ !Number.isFinite(this._samplingRatio)) {
21
+ diag.warn("Invalid sampling rate, sampling rate must be a value in the range [0,1].");
17
22
  }
18
23
  this._sampleRate = Math.round(this._samplingRatio * 100);
19
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/traces/sampler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,gBAAgB,EAAkB,MAAM,+BAA+B,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,OAAO,0BAA0B;IAIrC;;;OAGG;IACH,YAAY,gBAAwB,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,YAAY;IACjB,aAAa;IACb,OAAgB,EAChB,OAAe;IACf,aAAa;IACb,QAAgB;IAChB,aAAa;IACb,QAAkB,EAClB,UAAsB;IACtB,aAAa;IACb,KAAa;QAEb,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;YAC5B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;YACjC,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACtE,CAAC;QACD,oCAAoC;QACpC,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;QAC9B,UAAU,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAChD,OAAO,WAAW;YAChB,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE;YAC3E,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpE,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,8BAA8B,IAAI,CAAC,cAAc,GAAG,CAAC;IAC9D,CAAC;IAEO,oBAAoB,CAAC,KAAa;QACxC,IAAI,SAAS,GAAG,CAAC,UAAU,CAAC;QAC5B,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC;QAEhB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QACxB,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,uGAAuG;YACvG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;IAClC,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { Link, Attributes, SpanKind, Context } from \"@opentelemetry/api\";\nimport { Sampler, SamplingDecision, SamplingResult } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * ApplicationInsightsSampler is responsible for the following:\n * Implements same trace id hashing algorithm so that traces are sampled the same across multiple nodes\n * Adds item count to span attribute if span is sampled (needed for ingestion service)\n * @param samplingRatio - 0 to 1 value.\n */\nexport class ApplicationInsightsSampler implements Sampler {\n private readonly _sampleRate: number;\n private readonly _samplingRatio: number;\n\n /**\n * Initializes a new instance of the ApplicationInsightsSampler class.\n * @param samplingRatio Value in the range [0,1], 1 meaning all data will sampled and 0 all Tracing data will be sampled out.\n */\n constructor(samplingRatio: number = 1) {\n this._samplingRatio = samplingRatio;\n if (this._samplingRatio > 1) {\n throw new Error(\"Invalid sampling rate, sampling rate must be a value in the range [0,1].\");\n }\n this._sampleRate = Math.round(this._samplingRatio * 100);\n }\n\n /**\n * Checks whether span needs to be created and tracked.\n *\n * @param context Parent Context which may contain a span.\n * @param traceId of the span to be created. It can be different from the\n * traceId in the {@link SpanContext}. Typically in situations when the\n * span to be created starts a new trace.\n * @param spanName of the span to be created.\n * @param spanKind of the span to be created.\n * @param attributes Initial set of SpanAttributes for the Span being constructed.\n * @param links Collection of links that will be associated with the Span to\n * be created. Typically useful for batch operations.\n * @returns a {@link SamplingResult}.\n */\n public shouldSample(\n // @ts-ignore\n context: Context,\n traceId: string,\n // @ts-ignore\n spanName: string,\n // @ts-ignore\n spanKind: SpanKind,\n attributes: Attributes,\n // @ts-ignore\n links: Link[],\n ): SamplingResult {\n let isSampledIn = false;\n if (this._sampleRate == 100) {\n isSampledIn = true;\n } else if (this._sampleRate == 0) {\n isSampledIn = false;\n } else {\n isSampledIn = this._getSamplingHashCode(traceId) < this._sampleRate;\n }\n // Add sample rate as span attribute\n attributes = attributes || {};\n attributes[\"_MS.sampleRate\"] = this._sampleRate;\n return isSampledIn\n ? { decision: SamplingDecision.RECORD_AND_SAMPLED, attributes: attributes }\n : { decision: SamplingDecision.RECORD, attributes: attributes };\n }\n\n /**\n * Return Sampler description\n */\n public toString(): string {\n return `ApplicationInsightsSampler{${this._samplingRatio}}`;\n }\n\n private _getSamplingHashCode(input: string): number {\n var csharpMin = -2147483648;\n var csharpMax = 2147483647;\n var hash = 5381;\n\n if (!input) {\n return 0;\n }\n\n while (input.length < 8) {\n input = input + input;\n }\n\n for (var i = 0; i < input.length; i++) {\n // JS doesn't respond to integer overflow by wrapping around. Simulate it with bitwise operators ( | 0)\n hash = ((((hash << 5) + hash) | 0) + input.charCodeAt(i)) | 0;\n }\n\n hash = hash <= csharpMin ? csharpMax : Math.abs(hash);\n return (hash / csharpMax) * 100;\n }\n}\n"]}
1
+ {"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/traces/sampler.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,OAAO,EAAuC,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAW,gBAAgB,EAAkB,MAAM,+BAA+B,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,OAAO,0BAA0B;IAIrC;;;OAGG;IACH,YAAY,gBAAwB,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IACE,IAAI,CAAC,cAAc,GAAG,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,CAAC;YACvB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EACrC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,YAAY;IACjB,aAAa;IACb,OAAgB,EAChB,OAAe;IACf,aAAa;IACb,QAAgB;IAChB,aAAa;IACb,QAAkB,EAClB,UAAsB;IACtB,aAAa;IACb,KAAa;QAEb,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;YAC5B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;YACjC,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACtE,CAAC;QACD,oCAAoC;QACpC,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;QAC9B,UAAU,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAChD,OAAO,WAAW;YAChB,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE;YAC3E,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpE,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,8BAA8B,IAAI,CAAC,cAAc,GAAG,CAAC;IAC9D,CAAC;IAEO,oBAAoB,CAAC,KAAa;QACxC,IAAI,SAAS,GAAG,CAAC,UAAU,CAAC;QAC5B,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC;QAEhB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QACxB,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,uGAAuG;YACvG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;IAClC,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { Link, Attributes, SpanKind, Context, diag } from \"@opentelemetry/api\";\nimport { Sampler, SamplingDecision, SamplingResult } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * ApplicationInsightsSampler is responsible for the following:\n * Implements same trace id hashing algorithm so that traces are sampled the same across multiple nodes\n * Adds item count to span attribute if span is sampled (needed for ingestion service)\n * @param samplingRatio - 0 to 1 value.\n */\nexport class ApplicationInsightsSampler implements Sampler {\n private readonly _sampleRate: number;\n private readonly _samplingRatio: number;\n\n /**\n * Initializes a new instance of the ApplicationInsightsSampler class.\n * @param samplingRatio Value in the range [0,1], 1 meaning all data will sampled and 0 all Tracing data will be sampled out.\n */\n constructor(samplingRatio: number = 1) {\n this._samplingRatio = samplingRatio;\n if (\n this._samplingRatio > 1 ||\n this._samplingRatio < 0 ||\n !Number.isFinite(this._samplingRatio)\n ) {\n diag.warn(\"Invalid sampling rate, sampling rate must be a value in the range [0,1].\");\n }\n this._sampleRate = Math.round(this._samplingRatio * 100);\n }\n\n /**\n * Checks whether span needs to be created and tracked.\n *\n * @param context Parent Context which may contain a span.\n * @param traceId of the span to be created. It can be different from the\n * traceId in the {@link SpanContext}. Typically in situations when the\n * span to be created starts a new trace.\n * @param spanName of the span to be created.\n * @param spanKind of the span to be created.\n * @param attributes Initial set of SpanAttributes for the Span being constructed.\n * @param links Collection of links that will be associated with the Span to\n * be created. Typically useful for batch operations.\n * @returns a {@link SamplingResult}.\n */\n public shouldSample(\n // @ts-ignore\n context: Context,\n traceId: string,\n // @ts-ignore\n spanName: string,\n // @ts-ignore\n spanKind: SpanKind,\n attributes: Attributes,\n // @ts-ignore\n links: Link[],\n ): SamplingResult {\n let isSampledIn = false;\n if (this._sampleRate == 100) {\n isSampledIn = true;\n } else if (this._sampleRate == 0) {\n isSampledIn = false;\n } else {\n isSampledIn = this._getSamplingHashCode(traceId) < this._sampleRate;\n }\n // Add sample rate as span attribute\n attributes = attributes || {};\n attributes[\"_MS.sampleRate\"] = this._sampleRate;\n return isSampledIn\n ? { decision: SamplingDecision.RECORD_AND_SAMPLED, attributes: attributes }\n : { decision: SamplingDecision.RECORD, attributes: attributes };\n }\n\n /**\n * Return Sampler description\n */\n public toString(): string {\n return `ApplicationInsightsSampler{${this._samplingRatio}}`;\n }\n\n private _getSamplingHashCode(input: string): number {\n var csharpMin = -2147483648;\n var csharpMax = 2147483647;\n var hash = 5381;\n\n if (!input) {\n return 0;\n }\n\n while (input.length < 8) {\n input = input + input;\n }\n\n for (var i = 0; i < input.length; i++) {\n // JS doesn't respond to integer overflow by wrapping around. Simulate it with bitwise operators ( | 0)\n hash = ((((hash << 5) + hash) | 0) + input.charCodeAt(i)) | 0;\n }\n\n hash = hash <= csharpMin ? csharpMax : Math.abs(hash);\n return (hash / csharpMax) * 100;\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  // Licensed under the MIT license.
3
3
  // Copyright (c) Microsoft Corporation.
4
4
  // Licensed under the MIT license.
5
- export const AZURE_MONITOR_OPENTELEMETRY_VERSION = "1.5.0";
5
+ export const AZURE_MONITOR_OPENTELEMETRY_VERSION = "1.6.0";
6
6
  export const AZURE_MONITOR_STATSBEAT_FEATURES = "AZURE_MONITOR_STATSBEAT_FEATURES";
7
7
  export const AZURE_MONITOR_PREFIX = "AZURE_MONITOR_PREFIX";
8
8
  export const AZURE_MONITOR_AUTO_ATTACH = "AZURE_MONITOR_AUTO_ATTACH";
@@ -34,6 +34,7 @@ export var StatsbeatFeature;
34
34
  StatsbeatFeature[StatsbeatFeature["BROWSER_SDK_LOADER"] = 4] = "BROWSER_SDK_LOADER";
35
35
  StatsbeatFeature[StatsbeatFeature["DISTRO"] = 8] = "DISTRO";
36
36
  StatsbeatFeature[StatsbeatFeature["LIVE_METRICS"] = 16] = "LIVE_METRICS";
37
+ StatsbeatFeature[StatsbeatFeature["SHIM"] = 32] = "SHIM";
37
38
  })(StatsbeatFeature || (StatsbeatFeature = {}));
38
39
  export var StatsbeatInstrumentation;
39
40
  (function (StatsbeatInstrumentation) {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,uCAAuC;AACvC,kCAAkC;AAwFlC,MAAM,CAAC,MAAM,mCAAmC,GAAG,OAAO,CAAC;AAC3D,MAAM,CAAC,MAAM,gCAAgC,GAAG,kCAAkC,CAAC;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,yCAAqB,CAAA;IACrB,gCAAY,CAAA;AACd,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,2CAA2C,CAAC;AAE7F;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,sCAAsC,CAAC;AAC9E;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,kDAAkD,CAAC;AAE/F,MAAM,CAAN,IAAY,gBAOX;AAPD,WAAY,gBAAgB;IAC1B,uDAAQ,CAAA;IACR,mEAAc,CAAA;IACd,uEAAgB,CAAA;IAChB,mFAAsB,CAAA;IACtB,2DAAU,CAAA;IACV,wEAAiB,CAAA;AACnB,CAAC,EAPW,gBAAgB,KAAhB,gBAAgB,QAO3B;AAED,MAAM,CAAN,IAAY,wBASX;AATD,WAAY,wBAAwB;IAClC,uEAAQ,CAAA;IACR,mGAAsB,CAAA;IACtB,6EAAW,CAAA;IACX,yEAAS,CAAA;IACT,yEAAS,CAAA;IACT,gFAAa,CAAA;IACb,4EAAW,CAAA;IACX,8EAAY,CAAA;AACd,CAAC,EATW,wBAAwB,KAAxB,wBAAwB,QASnC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { AzureMonitorExporterOptions } from \"@azure/monitor-opentelemetry-exporter\";\nimport { InstrumentationConfig } from \"@opentelemetry/instrumentation\";\nimport { Resource } from \"@opentelemetry/resources\";\nimport { LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * Azure Monitor OpenTelemetry Options\n */\nexport interface AzureMonitorOpenTelemetryOptions {\n /** Azure Monitor Exporter Configuration */\n azureMonitorExporterOptions?: AzureMonitorExporterOptions;\n /** OpenTelemetry Resource */\n resource?: Resource;\n /** The rate of telemetry items tracked that should be transmitted (Default 1.0) */\n samplingRatio?: number;\n /** Enable Live Metrics feature (Default false)*/\n enableLiveMetrics?: boolean;\n /** Enable Standard Metrics feature (Default true)*/\n enableStandardMetrics?: boolean;\n /** Enable log sampling based on trace (Default true) */\n enableTraceBasedSamplingForLogs?: boolean;\n /** OpenTelemetry Instrumentations options included as part of Azure Monitor (azureSdk, http, mongoDb, mySql, postgreSql, redis, redis4) */\n instrumentationOptions?: InstrumentationOptions;\n /** Application Insights Web Instrumentation options (enabled, connectionString, src, config)*/\n browserSdkLoaderOptions?: BrowserSdkLoaderOptions;\n /** An array of log record processors to register to the logger provider.*/\n logRecordProcessors?: LogRecordProcessor[];\n /** An array of span processors to register to the tracer provider.*/\n spanProcessors?: SpanProcessor[];\n}\n\n/**\n * OpenTelemetry Instrumentations Configuration interface\n */\nexport interface InstrumentationOptions {\n /** Azure SDK Instrumentation Config */\n azureSdk?: InstrumentationConfig;\n /** HTTP Instrumentation Config */\n http?: InstrumentationConfig;\n /** MongoDB Instrumentation Config */\n mongoDb?: InstrumentationConfig;\n /** MySQL Instrumentation Config */\n mySql?: InstrumentationConfig;\n /** PostgreSql Instrumentation Config */\n postgreSql?: InstrumentationConfig;\n /** Redis Instrumentation Config */\n redis?: InstrumentationConfig;\n /** Redis4 Instrumentation Config */\n redis4?: InstrumentationConfig;\n /** Bunyan Instrumentation Config */\n bunyan?: InstrumentationConfig;\n /** Winston Instrumentation Config */\n winston?: InstrumentationConfig;\n}\n\n/**\n * Statsbeat Feature and Instrumentation Options interface\n * @internal\n */\nexport interface StatsbeatOptions {\n /** Instrumentations */\n azureSdk?: boolean;\n mongoDb?: boolean;\n mySql?: boolean;\n postgreSql?: boolean;\n redis?: boolean;\n bunyan?: boolean;\n winston?: boolean;\n /** Features */\n liveMetrics?: boolean;\n browserSdkLoader?: boolean;\n aadHandling?: boolean;\n diskRetry?: boolean;\n}\n\n/**\n * Application Insights Web Instrumentation Configuration interface\n */\nexport interface BrowserSdkLoaderOptions {\n /** Browser SDK Loader Enable */\n enabled?: boolean;\n /** Browser SDK Loader Connection String */\n connectionString?: string;\n}\n\nexport const AZURE_MONITOR_OPENTELEMETRY_VERSION = \"1.5.0\";\nexport const AZURE_MONITOR_STATSBEAT_FEATURES = \"AZURE_MONITOR_STATSBEAT_FEATURES\";\nexport const AZURE_MONITOR_PREFIX = \"AZURE_MONITOR_PREFIX\";\nexport const AZURE_MONITOR_AUTO_ATTACH = \"AZURE_MONITOR_AUTO_ATTACH\";\n\nexport enum AttachTypePrefix {\n INTEGRATED_AUTO = \"i\",\n MANUAL = \"m\",\n}\n\n/**\n * Default Browser SDK Loader Source\n * @internal\n */\nexport const BROWSER_SDK_LOADER_DEFAULT_SOURCE = \"https://js.monitor.azure.com/scripts/b/ai\";\n\n/**\n * Default Breeze endpoint.\n * @internal\n */\nexport const DEFAULT_BREEZE_ENDPOINT = \"https://dc.services.visualstudio.com\";\n/**\n * Default Live Metrics endpoint.\n * @internal\n */\nexport const DEFAULT_LIVEMETRICS_ENDPOINT = \"https://global.livediagnostics.monitor.azure.com\";\n\nexport enum StatsbeatFeature {\n NONE = 0,\n DISK_RETRY = 1,\n AAD_HANDLING = 2,\n BROWSER_SDK_LOADER = 4,\n DISTRO = 8,\n LIVE_METRICS = 16,\n}\n\nexport enum StatsbeatInstrumentation {\n NONE = 0,\n AZURE_CORE_TRACING = 1,\n MONGODB = 2,\n MYSQL = 4,\n REDIS = 8,\n POSTGRES = 16,\n BUNYAN = 32,\n WINSTON = 64,\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,uCAAuC;AACvC,kCAAkC;AAwFlC,MAAM,CAAC,MAAM,mCAAmC,GAAG,OAAO,CAAC;AAC3D,MAAM,CAAC,MAAM,gCAAgC,GAAG,kCAAkC,CAAC;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,yCAAqB,CAAA;IACrB,gCAAY,CAAA;AACd,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,2CAA2C,CAAC;AAE7F;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,sCAAsC,CAAC;AAC9E;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,kDAAkD,CAAC;AAE/F,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC1B,uDAAQ,CAAA;IACR,mEAAc,CAAA;IACd,uEAAgB,CAAA;IAChB,mFAAsB,CAAA;IACtB,2DAAU,CAAA;IACV,wEAAiB,CAAA;IACjB,wDAAS,CAAA;AACX,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AAED,MAAM,CAAN,IAAY,wBASX;AATD,WAAY,wBAAwB;IAClC,uEAAQ,CAAA;IACR,mGAAsB,CAAA;IACtB,6EAAW,CAAA;IACX,yEAAS,CAAA;IACT,yEAAS,CAAA;IACT,gFAAa,CAAA;IACb,4EAAW,CAAA;IACX,8EAAY,CAAA;AACd,CAAC,EATW,wBAAwB,KAAxB,wBAAwB,QASnC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { AzureMonitorExporterOptions } from \"@azure/monitor-opentelemetry-exporter\";\nimport { InstrumentationConfig } from \"@opentelemetry/instrumentation\";\nimport { Resource } from \"@opentelemetry/resources\";\nimport { LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * Azure Monitor OpenTelemetry Options\n */\nexport interface AzureMonitorOpenTelemetryOptions {\n /** Azure Monitor Exporter Configuration */\n azureMonitorExporterOptions?: AzureMonitorExporterOptions;\n /** OpenTelemetry Resource */\n resource?: Resource;\n /** The rate of telemetry items tracked that should be transmitted (Default 1.0) */\n samplingRatio?: number;\n /** Enable Live Metrics feature (Default false)*/\n enableLiveMetrics?: boolean;\n /** Enable Standard Metrics feature (Default true)*/\n enableStandardMetrics?: boolean;\n /** Enable log sampling based on trace (Default true) */\n enableTraceBasedSamplingForLogs?: boolean;\n /** OpenTelemetry Instrumentations options included as part of Azure Monitor (azureSdk, http, mongoDb, mySql, postgreSql, redis, redis4) */\n instrumentationOptions?: InstrumentationOptions;\n /** Application Insights Web Instrumentation options (enabled, connectionString, src, config)*/\n browserSdkLoaderOptions?: BrowserSdkLoaderOptions;\n /** An array of log record processors to register to the logger provider.*/\n logRecordProcessors?: LogRecordProcessor[];\n /** An array of span processors to register to the tracer provider.*/\n spanProcessors?: SpanProcessor[];\n}\n\n/**\n * OpenTelemetry Instrumentations Configuration interface\n */\nexport interface InstrumentationOptions {\n /** Azure SDK Instrumentation Config */\n azureSdk?: InstrumentationConfig;\n /** HTTP Instrumentation Config */\n http?: InstrumentationConfig;\n /** MongoDB Instrumentation Config */\n mongoDb?: InstrumentationConfig;\n /** MySQL Instrumentation Config */\n mySql?: InstrumentationConfig;\n /** PostgreSql Instrumentation Config */\n postgreSql?: InstrumentationConfig;\n /** Redis Instrumentation Config */\n redis?: InstrumentationConfig;\n /** Redis4 Instrumentation Config */\n redis4?: InstrumentationConfig;\n /** Bunyan Instrumentation Config */\n bunyan?: InstrumentationConfig;\n /** Winston Instrumentation Config */\n winston?: InstrumentationConfig;\n}\n\n/**\n * Statsbeat Feature and Instrumentation Options interface\n * @internal\n */\nexport interface StatsbeatOptions {\n /** Instrumentations */\n azureSdk?: boolean;\n mongoDb?: boolean;\n mySql?: boolean;\n postgreSql?: boolean;\n redis?: boolean;\n bunyan?: boolean;\n winston?: boolean;\n /** Features */\n liveMetrics?: boolean;\n browserSdkLoader?: boolean;\n aadHandling?: boolean;\n diskRetry?: boolean;\n}\n\n/**\n * Application Insights Web Instrumentation Configuration interface\n */\nexport interface BrowserSdkLoaderOptions {\n /** Browser SDK Loader Enable */\n enabled?: boolean;\n /** Browser SDK Loader Connection String */\n connectionString?: string;\n}\n\nexport const AZURE_MONITOR_OPENTELEMETRY_VERSION = \"1.6.0\";\nexport const AZURE_MONITOR_STATSBEAT_FEATURES = \"AZURE_MONITOR_STATSBEAT_FEATURES\";\nexport const AZURE_MONITOR_PREFIX = \"AZURE_MONITOR_PREFIX\";\nexport const AZURE_MONITOR_AUTO_ATTACH = \"AZURE_MONITOR_AUTO_ATTACH\";\n\nexport enum AttachTypePrefix {\n INTEGRATED_AUTO = \"i\",\n MANUAL = \"m\",\n}\n\n/**\n * Default Browser SDK Loader Source\n * @internal\n */\nexport const BROWSER_SDK_LOADER_DEFAULT_SOURCE = \"https://js.monitor.azure.com/scripts/b/ai\";\n\n/**\n * Default Breeze endpoint.\n * @internal\n */\nexport const DEFAULT_BREEZE_ENDPOINT = \"https://dc.services.visualstudio.com\";\n/**\n * Default Live Metrics endpoint.\n * @internal\n */\nexport const DEFAULT_LIVEMETRICS_ENDPOINT = \"https://global.livediagnostics.monitor.azure.com\";\n\nexport enum StatsbeatFeature {\n NONE = 0,\n DISK_RETRY = 1,\n AAD_HANDLING = 2,\n BROWSER_SDK_LOADER = 4,\n DISTRO = 8,\n LIVE_METRICS = 16,\n SHIM = 32,\n}\n\nexport enum StatsbeatInstrumentation {\n NONE = 0,\n AZURE_CORE_TRACING = 1,\n MONGODB = 2,\n MYSQL = 4,\n REDIS = 8,\n POSTGRES = 16,\n BUNYAN = 32,\n WINSTON = 64,\n}\n"]}
@@ -1,3 +1,5 @@
1
+ import { envDetectorSync, hostDetectorSync, osDetectorSync, processDetectorSync, serviceInstanceIdDetectorSync, } from "@opentelemetry/resources";
2
+ import { diag } from "@opentelemetry/api";
1
3
  export function ignoreOutgoingRequestHook(request) {
2
4
  if (request && request.headers) {
3
5
  if ((request.headers["User-Agent"] &&
@@ -84,4 +86,44 @@ export function msToTimeSpan(ms) {
84
86
  const daysText = days > 0 ? `${days}.` : "";
85
87
  return `${daysText + hour}:${min}:${sec}`;
86
88
  }
89
+ // This function is a slight modification of an upstream otel util function -
90
+ // mainly for prioritizing the resource detectors customer may specify over
91
+ // env var & not enabling process detector by default.
92
+ export function parseResourceDetectorsFromEnvVar() {
93
+ var _a, _b;
94
+ const resourceDetectors = new Map([
95
+ ["env", envDetectorSync],
96
+ ["host", hostDetectorSync],
97
+ ["os", osDetectorSync],
98
+ ["process", processDetectorSync],
99
+ ["serviceinstance", serviceInstanceIdDetectorSync],
100
+ ]);
101
+ if (process.env.OTEL_NODE_RESOURCE_DETECTORS != null) {
102
+ const resourceDetectorsFromEnv = (_b = (_a = process.env.OTEL_NODE_RESOURCE_DETECTORS) === null || _a === void 0 ? void 0 : _a.split(",")) !== null && _b !== void 0 ? _b : [
103
+ "env",
104
+ "host",
105
+ "os",
106
+ ];
107
+ if (resourceDetectorsFromEnv.includes("all")) {
108
+ return [...resourceDetectors.values()];
109
+ }
110
+ if (resourceDetectorsFromEnv.includes("none")) {
111
+ return [];
112
+ }
113
+ return resourceDetectorsFromEnv.flatMap((detector) => {
114
+ const resourceDetector = resourceDetectors.get(detector);
115
+ if (!resourceDetector) {
116
+ diag.error(`Invalid resource detector "${detector}" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`);
117
+ return [];
118
+ }
119
+ return [resourceDetector];
120
+ });
121
+ }
122
+ else {
123
+ // leaving out the process detector as that can add many resource attributes
124
+ // with large values. Also not enabling service instance attributes by default
125
+ // as this is still experimental.
126
+ return [envDetectorSync, hostDetectorSync, osDetectorSync];
127
+ }
128
+ }
87
129
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport * as http from \"http\";\n\nexport function ignoreOutgoingRequestHook(request: http.RequestOptions): boolean {\n if (request && request.headers) {\n if (\n (request.headers[\"User-Agent\"] &&\n request.headers[\"User-Agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1) ||\n (request.headers[\"user-agent\"] &&\n request.headers[\"user-agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1)\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport const isWindows = (): boolean => {\n return process.platform === \"win32\";\n};\n\nexport const isLinux = (): boolean => {\n return process.platform === \"linux\";\n};\n\nexport const isDarwin = (): boolean => {\n return process.platform === \"darwin\";\n};\n\n/**\n * Get prefix for OS\n * Windows system: \"w\"\n * Linux system: \"l\"\n * non-Windows and non-Linux system: \"u\" (unknown)\n */\nexport const getOsPrefix = (): string => {\n return isWindows() ? \"w\" : isLinux() ? \"l\" : \"u\";\n};\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const isAppService = (): boolean => {\n return process.env.WEBSITE_SITE_NAME && !process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isFunctionApp = (): boolean => {\n return process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isAks = (): boolean => {\n return process.env.AKS_ARM_NAMESPACE_ID ? true : false;\n};\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * AKS: \"k\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const getResourceProvider = (): string => {\n if (isAppService()) {\n return \"a\";\n }\n if (isFunctionApp()) {\n return \"f\";\n }\n if (isAks()) {\n return \"k\";\n }\n return \"u\";\n};\n\n/**\n * Convert milliseconds to Breeze expected time.\n * @internal\n */\nexport function msToTimeSpan(ms: number): string {\n let totalms = ms;\n if (Number.isNaN(totalms) || totalms < 0 || !Number.isFinite(ms)) {\n totalms = 0;\n }\n\n let sec = ((totalms / 1000) % 60).toFixed(7).replace(/0{0,4}$/, \"\");\n let min = `${Math.floor(totalms / (1000 * 60)) % 60}`;\n let hour = `${Math.floor(totalms / (1000 * 60 * 60)) % 24}`;\n const days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n\n sec = sec.indexOf(\".\") < 2 ? `0${sec}` : sec;\n min = min.length < 2 ? `0${min}` : min;\n hour = hour.length < 2 ? `0${hour}` : hour;\n const daysText = days > 0 ? `${days}.` : \"\";\n\n return `${daysText + hour}:${min}:${sec}`;\n}\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport * as http from \"http\";\nimport {\n DetectorSync,\n envDetectorSync,\n hostDetectorSync,\n osDetectorSync,\n processDetectorSync,\n serviceInstanceIdDetectorSync,\n} from \"@opentelemetry/resources\";\nimport { diag } from \"@opentelemetry/api\";\n\nexport function ignoreOutgoingRequestHook(request: http.RequestOptions): boolean {\n if (request && request.headers) {\n if (\n (request.headers[\"User-Agent\"] &&\n request.headers[\"User-Agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1) ||\n (request.headers[\"user-agent\"] &&\n request.headers[\"user-agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1)\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport const isWindows = (): boolean => {\n return process.platform === \"win32\";\n};\n\nexport const isLinux = (): boolean => {\n return process.platform === \"linux\";\n};\n\nexport const isDarwin = (): boolean => {\n return process.platform === \"darwin\";\n};\n\n/**\n * Get prefix for OS\n * Windows system: \"w\"\n * Linux system: \"l\"\n * non-Windows and non-Linux system: \"u\" (unknown)\n */\nexport const getOsPrefix = (): string => {\n return isWindows() ? \"w\" : isLinux() ? \"l\" : \"u\";\n};\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const isAppService = (): boolean => {\n return process.env.WEBSITE_SITE_NAME && !process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isFunctionApp = (): boolean => {\n return process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isAks = (): boolean => {\n return process.env.AKS_ARM_NAMESPACE_ID ? true : false;\n};\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * AKS: \"k\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const getResourceProvider = (): string => {\n if (isAppService()) {\n return \"a\";\n }\n if (isFunctionApp()) {\n return \"f\";\n }\n if (isAks()) {\n return \"k\";\n }\n return \"u\";\n};\n\n/**\n * Convert milliseconds to Breeze expected time.\n * @internal\n */\nexport function msToTimeSpan(ms: number): string {\n let totalms = ms;\n if (Number.isNaN(totalms) || totalms < 0 || !Number.isFinite(ms)) {\n totalms = 0;\n }\n\n let sec = ((totalms / 1000) % 60).toFixed(7).replace(/0{0,4}$/, \"\");\n let min = `${Math.floor(totalms / (1000 * 60)) % 60}`;\n let hour = `${Math.floor(totalms / (1000 * 60 * 60)) % 24}`;\n const days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n\n sec = sec.indexOf(\".\") < 2 ? `0${sec}` : sec;\n min = min.length < 2 ? `0${min}` : min;\n hour = hour.length < 2 ? `0${hour}` : hour;\n const daysText = days > 0 ? `${days}.` : \"\";\n\n return `${daysText + hour}:${min}:${sec}`;\n}\n\n// This function is a slight modification of an upstream otel util function -\n// mainly for prioritizing the resource detectors customer may specify over\n// env var & not enabling process detector by default.\nexport function parseResourceDetectorsFromEnvVar(): Array<DetectorSync> {\n const resourceDetectors = new Map<string, DetectorSync>([\n [\"env\", envDetectorSync],\n [\"host\", hostDetectorSync],\n [\"os\", osDetectorSync],\n [\"process\", processDetectorSync],\n [\"serviceinstance\", serviceInstanceIdDetectorSync],\n ]);\n\n if (process.env.OTEL_NODE_RESOURCE_DETECTORS != null) {\n const resourceDetectorsFromEnv = process.env.OTEL_NODE_RESOURCE_DETECTORS?.split(\",\") ?? [\n \"env\",\n \"host\",\n \"os\",\n ];\n\n if (resourceDetectorsFromEnv.includes(\"all\")) {\n return [...resourceDetectors.values()];\n }\n\n if (resourceDetectorsFromEnv.includes(\"none\")) {\n return [];\n }\n\n return resourceDetectorsFromEnv.flatMap((detector) => {\n const resourceDetector = resourceDetectors.get(detector);\n if (!resourceDetector) {\n diag.error(\n `Invalid resource detector \"${detector}\" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`,\n );\n return [];\n }\n return [resourceDetector];\n });\n } else {\n // leaving out the process detector as that can add many resource attributes\n // with large values. Also not enabling service instance attributes by default\n // as this is still experimental.\n return [envDetectorSync, hostDetectorSync, osDetectorSync];\n }\n}\n"]}
@@ -7,6 +7,7 @@ class StatsbeatConfiguration {
7
7
  constructor() {
8
8
  // Initial Statsbeat options
9
9
  this.currentStatsbeatOptions = {};
10
+ this.initializedByShim = false;
10
11
  this.setStatsbeatFeatures = (statsbeatOptions) => {
11
12
  // Merge old statsbeat options with new statsbeat options overriding any common properties
12
13
  this.currentStatsbeatOptions = Object.assign(Object.assign({}, this.currentStatsbeatOptions), statsbeatOptions);
@@ -41,6 +42,9 @@ class StatsbeatConfiguration {
41
42
  if (statsbeatOptions.liveMetrics === true) {
42
43
  featureBitMap |= StatsbeatFeature.LIVE_METRICS;
43
44
  }
45
+ if (this.initializedByShim) {
46
+ featureBitMap |= StatsbeatFeature.SHIM;
47
+ }
44
48
  try {
45
49
  const currentFeaturesBitMap = Number(process.env[AZURE_MONITOR_STATSBEAT_FEATURES]);
46
50
  if (!isNaN(currentFeaturesBitMap)) {
@@ -55,6 +59,16 @@ class StatsbeatConfiguration {
55
59
  InternalLogger.getInstance().error("Failed call to JSON.stringify.", error);
56
60
  }
57
61
  };
62
+ // Check for shim initialization upon construction
63
+ try {
64
+ if (JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || "{}").feature &
65
+ StatsbeatFeature.SHIM) {
66
+ this.initializedByShim = true;
67
+ }
68
+ }
69
+ catch (error) {
70
+ InternalLogger.getInstance().error("Failed to parse statsbeat config environment variable.", error);
71
+ }
58
72
  }
59
73
  }
60
74
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"statsbeat.js","sourceRoot":"","sources":["../../../src/utils/statsbeat.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EACL,gCAAgC,EAChC,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE7D,IAAI,QAAgC,CAAC;AAErC,MAAM,sBAAsB;IAA5B;QACE,4BAA4B;QACpB,4BAAuB,GAAqB,EAAE,CAAC;QAEhD,yBAAoB,GAAG,CAAC,gBAAkC,EAAE,EAAE;YACnE,0FAA0F;YAC1F,IAAI,CAAC,uBAAuB,mCAAQ,IAAI,CAAC,uBAAuB,GAAK,gBAAgB,CAAE,CAAC;YAExF,IAAI,qBAAqB,GAAG,wBAAwB,CAAC,IAAI,CAAC;YAC1D,IAAI,gBAAgB,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACvC,qBAAqB,IAAI,wBAAwB,CAAC,kBAAkB,CAAC;YACvE,CAAC;YACD,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtC,qBAAqB,IAAI,wBAAwB,CAAC,OAAO,CAAC;YAC5D,CAAC;YACD,IAAI,gBAAgB,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACpC,qBAAqB,IAAI,wBAAwB,CAAC,KAAK,CAAC;YAC1D,CAAC;YACD,IAAI,gBAAgB,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACzC,qBAAqB,IAAI,wBAAwB,CAAC,QAAQ,CAAC;YAC7D,CAAC;YACD,IAAI,gBAAgB,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACpC,qBAAqB,IAAI,wBAAwB,CAAC,KAAK,CAAC;YAC1D,CAAC;YACD,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACrC,qBAAqB,IAAI,wBAAwB,CAAC,MAAM,CAAC;YAC3D,CAAC;YACD,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtC,qBAAqB,IAAI,wBAAwB,CAAC,OAAO,CAAC;YAC5D,CAAC;YAED,IAAI,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC;YAC1C,aAAa,IAAI,gBAAgB,CAAC,MAAM,CAAC;YAEzC,IAAI,gBAAgB,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC/C,aAAa,IAAI,gBAAgB,CAAC,kBAAkB,CAAC;YACvD,CAAC;YACD,oEAAoE;YACpE,IAAI,gBAAgB,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC1C,aAAa,IAAI,gBAAgB,CAAC,YAAY,CAAC;YACjD,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBACpF,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBAClC,aAAa,IAAI,qBAAqB,CAAC;gBACzC,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC7D,eAAe,EAAE,qBAAqB;oBACtC,OAAO,EAAE,aAAa;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n AZURE_MONITOR_STATSBEAT_FEATURES,\n StatsbeatFeature,\n StatsbeatInstrumentation,\n StatsbeatOptions,\n} from \"../types\";\nimport { Logger as InternalLogger } from \"../shared/logging\";\n\nlet instance: StatsbeatConfiguration;\n\nclass StatsbeatConfiguration {\n // Initial Statsbeat options\n private currentStatsbeatOptions: StatsbeatOptions = {};\n\n public setStatsbeatFeatures = (statsbeatOptions: StatsbeatOptions) => {\n // Merge old statsbeat options with new statsbeat options overriding any common properties\n this.currentStatsbeatOptions = { ...this.currentStatsbeatOptions, ...statsbeatOptions };\n\n let instrumentationBitMap = StatsbeatInstrumentation.NONE;\n if (statsbeatOptions.azureSdk === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.AZURE_CORE_TRACING;\n }\n if (statsbeatOptions.mongoDb === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.MONGODB;\n }\n if (statsbeatOptions.mySql === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.MYSQL;\n }\n if (statsbeatOptions.postgreSql === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.POSTGRES;\n }\n if (statsbeatOptions.redis === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.REDIS;\n }\n if (statsbeatOptions.bunyan === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.BUNYAN;\n }\n if (statsbeatOptions.winston === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.WINSTON;\n }\n\n let featureBitMap = StatsbeatFeature.NONE;\n featureBitMap |= StatsbeatFeature.DISTRO;\n\n if (statsbeatOptions.browserSdkLoader === true) {\n featureBitMap |= StatsbeatFeature.BROWSER_SDK_LOADER;\n }\n // Determines if the customer has activated the Live Metrics feature\n if (statsbeatOptions.liveMetrics === true) {\n featureBitMap |= StatsbeatFeature.LIVE_METRICS;\n }\n\n try {\n const currentFeaturesBitMap = Number(process.env[AZURE_MONITOR_STATSBEAT_FEATURES]);\n if (!isNaN(currentFeaturesBitMap)) {\n featureBitMap |= currentFeaturesBitMap;\n }\n process.env[AZURE_MONITOR_STATSBEAT_FEATURES] = JSON.stringify({\n instrumentation: instrumentationBitMap,\n feature: featureBitMap,\n });\n } catch (error) {\n InternalLogger.getInstance().error(\"Failed call to JSON.stringify.\", error);\n }\n };\n}\n\n/**\n * Singleton Statsbeat instance.\n * @internal\n */\nexport function getInstance(): StatsbeatConfiguration {\n if (!instance) {\n instance = new StatsbeatConfiguration();\n }\n return instance;\n}\n"]}
1
+ {"version":3,"file":"statsbeat.js","sourceRoot":"","sources":["../../../src/utils/statsbeat.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EACL,gCAAgC,EAChC,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE7D,IAAI,QAAgC,CAAC;AAErC,MAAM,sBAAsB;IAK1B;QAJA,4BAA4B;QACpB,4BAAuB,GAAqB,EAAE,CAAC;QAC/C,sBAAiB,GAAG,KAAK,CAAC;QAmB3B,yBAAoB,GAAG,CAAC,gBAAkC,EAAE,EAAE;YACnE,0FAA0F;YAC1F,IAAI,CAAC,uBAAuB,mCAAQ,IAAI,CAAC,uBAAuB,GAAK,gBAAgB,CAAE,CAAC;YAExF,IAAI,qBAAqB,GAAG,wBAAwB,CAAC,IAAI,CAAC;YAC1D,IAAI,gBAAgB,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACvC,qBAAqB,IAAI,wBAAwB,CAAC,kBAAkB,CAAC;YACvE,CAAC;YACD,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtC,qBAAqB,IAAI,wBAAwB,CAAC,OAAO,CAAC;YAC5D,CAAC;YACD,IAAI,gBAAgB,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACpC,qBAAqB,IAAI,wBAAwB,CAAC,KAAK,CAAC;YAC1D,CAAC;YACD,IAAI,gBAAgB,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACzC,qBAAqB,IAAI,wBAAwB,CAAC,QAAQ,CAAC;YAC7D,CAAC;YACD,IAAI,gBAAgB,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACpC,qBAAqB,IAAI,wBAAwB,CAAC,KAAK,CAAC;YAC1D,CAAC;YACD,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACrC,qBAAqB,IAAI,wBAAwB,CAAC,MAAM,CAAC;YAC3D,CAAC;YACD,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtC,qBAAqB,IAAI,wBAAwB,CAAC,OAAO,CAAC;YAC5D,CAAC;YAED,IAAI,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC;YAC1C,aAAa,IAAI,gBAAgB,CAAC,MAAM,CAAC;YAEzC,IAAI,gBAAgB,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC/C,aAAa,IAAI,gBAAgB,CAAC,kBAAkB,CAAC;YACvD,CAAC;YACD,oEAAoE;YACpE,IAAI,gBAAgB,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC1C,aAAa,IAAI,gBAAgB,CAAC,YAAY,CAAC;YACjD,CAAC;YAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,aAAa,IAAI,gBAAgB,CAAC,IAAI,CAAC;YACzC,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBACpF,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBAClC,aAAa,IAAI,qBAAqB,CAAC;gBACzC,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC7D,eAAe,EAAE,qBAAqB;oBACtC,OAAO,EAAE,aAAa;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC;QAtEA,kDAAkD;QAClD,IAAI,CAAC;YACH,IACE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO;gBACzE,gBAAgB,CAAC,IAAI,EACrB,CAAC;gBACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,WAAW,EAAE,CAAC,KAAK,CAChC,wDAAwD,EACxD,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;CAyDF;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n AZURE_MONITOR_STATSBEAT_FEATURES,\n StatsbeatFeature,\n StatsbeatInstrumentation,\n StatsbeatOptions,\n} from \"../types\";\nimport { Logger as InternalLogger } from \"../shared/logging\";\n\nlet instance: StatsbeatConfiguration;\n\nclass StatsbeatConfiguration {\n // Initial Statsbeat options\n private currentStatsbeatOptions: StatsbeatOptions = {};\n private initializedByShim = false;\n\n constructor() {\n // Check for shim initialization upon construction\n try {\n if (\n JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || \"{}\").feature &\n StatsbeatFeature.SHIM\n ) {\n this.initializedByShim = true;\n }\n } catch (error) {\n InternalLogger.getInstance().error(\n \"Failed to parse statsbeat config environment variable.\",\n error,\n );\n }\n }\n\n public setStatsbeatFeatures = (statsbeatOptions: StatsbeatOptions) => {\n // Merge old statsbeat options with new statsbeat options overriding any common properties\n this.currentStatsbeatOptions = { ...this.currentStatsbeatOptions, ...statsbeatOptions };\n\n let instrumentationBitMap = StatsbeatInstrumentation.NONE;\n if (statsbeatOptions.azureSdk === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.AZURE_CORE_TRACING;\n }\n if (statsbeatOptions.mongoDb === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.MONGODB;\n }\n if (statsbeatOptions.mySql === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.MYSQL;\n }\n if (statsbeatOptions.postgreSql === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.POSTGRES;\n }\n if (statsbeatOptions.redis === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.REDIS;\n }\n if (statsbeatOptions.bunyan === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.BUNYAN;\n }\n if (statsbeatOptions.winston === true) {\n instrumentationBitMap |= StatsbeatInstrumentation.WINSTON;\n }\n\n let featureBitMap = StatsbeatFeature.NONE;\n featureBitMap |= StatsbeatFeature.DISTRO;\n\n if (statsbeatOptions.browserSdkLoader === true) {\n featureBitMap |= StatsbeatFeature.BROWSER_SDK_LOADER;\n }\n // Determines if the customer has activated the Live Metrics feature\n if (statsbeatOptions.liveMetrics === true) {\n featureBitMap |= StatsbeatFeature.LIVE_METRICS;\n }\n\n if (this.initializedByShim) {\n featureBitMap |= StatsbeatFeature.SHIM;\n }\n\n try {\n const currentFeaturesBitMap = Number(process.env[AZURE_MONITOR_STATSBEAT_FEATURES]);\n if (!isNaN(currentFeaturesBitMap)) {\n featureBitMap |= currentFeaturesBitMap;\n }\n process.env[AZURE_MONITOR_STATSBEAT_FEATURES] = JSON.stringify({\n instrumentation: instrumentationBitMap,\n feature: featureBitMap,\n });\n } catch (error) {\n InternalLogger.getInstance().error(\"Failed call to JSON.stringify.\", error);\n }\n };\n}\n\n/**\n * Singleton Statsbeat instance.\n * @internal\n */\nexport function getInstance(): StatsbeatConfiguration {\n if (!instance) {\n instance = new StatsbeatConfiguration();\n }\n return instance;\n}\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@azure/monitor-opentelemetry",
3
3
  "author": "Microsoft Corporation",
4
4
  "sdk-type": "client",
5
- "version": "1.5.0",
5
+ "version": "1.6.0",
6
6
  "description": "Azure Monitor OpenTelemetry (Node.js)",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist-esm/src/index.js",
@@ -87,30 +87,30 @@
87
87
  "@azure/core-rest-pipeline": "^1.1.0",
88
88
  "@azure/functions": "^3.2.0",
89
89
  "@azure/logger": "^1.0.0",
90
- "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.23",
90
+ "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.24",
91
91
  "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5",
92
92
  "@microsoft/applicationinsights-web-snippet": "^1.1.2",
93
- "@opentelemetry/api": "^1.8.0",
94
- "@opentelemetry/api-logs": "^0.51.0",
95
- "@opentelemetry/core": "^1.24.0",
96
- "@opentelemetry/instrumentation": "^0.51.0",
97
- "@opentelemetry/instrumentation-bunyan": "^0.38.0",
98
- "@opentelemetry/instrumentation-http": "^0.51.0",
99
- "@opentelemetry/instrumentation-mongodb": "^0.43.0",
100
- "@opentelemetry/instrumentation-mysql": "^0.38.0",
101
- "@opentelemetry/instrumentation-pg": "^0.41.0",
102
- "@opentelemetry/instrumentation-redis": "^0.39.0",
103
- "@opentelemetry/instrumentation-redis-4": "^0.39.0",
104
- "@opentelemetry/instrumentation-winston": "^0.37.0",
105
- "@opentelemetry/resource-detector-azure": "^0.2.7",
106
- "@opentelemetry/resources": "^1.24.0",
107
- "@opentelemetry/sdk-logs": "^0.51.0",
108
- "@opentelemetry/sdk-metrics": "^1.24.0",
109
- "@opentelemetry/sdk-node": "^0.51.0",
110
- "@opentelemetry/sdk-trace-base": "^1.24.0",
111
- "@opentelemetry/sdk-trace-node": "^1.24.0",
112
- "@opentelemetry/semantic-conventions": "^1.24.0",
113
- "@opentelemetry/winston-transport": "^0.3.0",
93
+ "@opentelemetry/api": "^1.9.0",
94
+ "@opentelemetry/api-logs": "^0.52.0",
95
+ "@opentelemetry/core": "^1.25.0",
96
+ "@opentelemetry/instrumentation": "^0.52.0",
97
+ "@opentelemetry/instrumentation-bunyan": "^0.39.0",
98
+ "@opentelemetry/instrumentation-http": "^0.52.0",
99
+ "@opentelemetry/instrumentation-mongodb": "^0.45.0",
100
+ "@opentelemetry/instrumentation-mysql": "^0.39.0",
101
+ "@opentelemetry/instrumentation-pg": "^0.42.0",
102
+ "@opentelemetry/instrumentation-redis": "^0.40.0",
103
+ "@opentelemetry/instrumentation-redis-4": "^0.40.0",
104
+ "@opentelemetry/instrumentation-winston": "^0.38.0",
105
+ "@opentelemetry/resource-detector-azure": "^0.2.9",
106
+ "@opentelemetry/resources": "^1.25.0",
107
+ "@opentelemetry/sdk-logs": "^0.52.0",
108
+ "@opentelemetry/sdk-metrics": "^1.25.0",
109
+ "@opentelemetry/sdk-node": "^0.52.0",
110
+ "@opentelemetry/sdk-trace-base": "^1.25.0",
111
+ "@opentelemetry/sdk-trace-node": "^1.25.0",
112
+ "@opentelemetry/semantic-conventions": "^1.25.0",
113
+ "@opentelemetry/winston-transport": "^0.4.0",
114
114
  "tslib": "^2.6.2"
115
115
  },
116
116
  "sideEffects": false,