@azure/monitor-opentelemetry-exporter 1.0.0-beta.4 → 1.0.0-beta.7

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +11 -13
  3. package/dist/index.js +701 -355
  4. package/dist-esm/src/Declarations/Constants.js +1 -26
  5. package/dist-esm/src/Declarations/Constants.js.map +1 -1
  6. package/dist-esm/src/config.js +2 -4
  7. package/dist-esm/src/config.js.map +1 -1
  8. package/dist-esm/src/export/trace.js +5 -4
  9. package/dist-esm/src/export/trace.js.map +1 -1
  10. package/dist-esm/src/generated/applicationInsightsClient.js +13 -9
  11. package/dist-esm/src/generated/applicationInsightsClient.js.map +1 -1
  12. package/dist-esm/src/generated/applicationInsightsClientContext.js +13 -11
  13. package/dist-esm/src/generated/applicationInsightsClientContext.js.map +1 -1
  14. package/dist-esm/src/generated/models/index.js +47 -1
  15. package/dist-esm/src/generated/models/index.js.map +1 -1
  16. package/dist-esm/src/generated/models/mappers.js +25 -4
  17. package/dist-esm/src/generated/models/mappers.js.map +1 -1
  18. package/dist-esm/src/generated/models/parameters.js +6 -1
  19. package/dist-esm/src/generated/models/parameters.js.map +1 -1
  20. package/dist-esm/src/platform/nodejs/constants.js +1 -1
  21. package/dist-esm/src/platform/nodejs/constants.js.map +1 -1
  22. package/dist-esm/src/platform/nodejs/context/context.js +12 -82
  23. package/dist-esm/src/platform/nodejs/context/context.js.map +1 -1
  24. package/dist-esm/src/platform/nodejs/httpSender.js +23 -4
  25. package/dist-esm/src/platform/nodejs/httpSender.js.map +1 -1
  26. package/dist-esm/src/platform/nodejs/persist/fileAccessControl.js +171 -0
  27. package/dist-esm/src/platform/nodejs/persist/fileAccessControl.js.map +1 -0
  28. package/dist-esm/src/platform/nodejs/persist/fileSystemPersist.js +40 -19
  29. package/dist-esm/src/platform/nodejs/persist/fileSystemPersist.js.map +1 -1
  30. package/dist-esm/src/types.js.map +1 -1
  31. package/dist-esm/src/utils/breezeUtils.js +5 -4
  32. package/dist-esm/src/utils/breezeUtils.js.map +1 -1
  33. package/dist-esm/src/utils/constants/applicationinsights.js +9 -31
  34. package/dist-esm/src/utils/constants/applicationinsights.js.map +1 -1
  35. package/dist-esm/src/utils/eventhub.js +1 -1
  36. package/dist-esm/src/utils/eventhub.js.map +1 -1
  37. package/dist-esm/src/utils/spanUtils.js +253 -100
  38. package/dist-esm/src/utils/spanUtils.js.map +1 -1
  39. package/package.json +37 -24
  40. package/types/monitor-opentelemetry-exporter.d.ts +7 -2
  41. package/dist-esm/src/utils/constants/span/dbAttributes.js +0 -14
  42. package/dist-esm/src/utils/constants/span/dbAttributes.js.map +0 -1
  43. package/dist-esm/src/utils/constants/span/grpcAttributes.js +0 -14
  44. package/dist-esm/src/utils/constants/span/grpcAttributes.js.map +0 -1
  45. package/dist-esm/src/utils/constants/span/httpAttributes.js +0 -24
  46. package/dist-esm/src/utils/constants/span/httpAttributes.js.map +0 -1
@@ -0,0 +1,171 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+ import * as fs from "fs";
4
+ import * as os from "os";
5
+ import * as child_process from "child_process";
6
+ import { diag } from "@opentelemetry/api";
7
+ export class FileAccessControl {
8
+ // Check if file access control could be enabled
9
+ static checkFileProtection() {
10
+ if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION &&
11
+ !FileAccessControl.OS_FILE_PROTECTION_CHECKED) {
12
+ FileAccessControl.OS_FILE_PROTECTION_CHECKED = true;
13
+ // Node's chmod levels do not appropriately restrict file access on Windows
14
+ // Use the built-in command line tool ICACLS on Windows to properly restrict
15
+ // access to the temporary directory used for disk retry mode.
16
+ if (FileAccessControl.USE_ICACLS) {
17
+ // This should be async - but it's currently safer to have this synchronous
18
+ // This guarantees we can immediately fail setDiskRetryMode if we need to
19
+ try {
20
+ FileAccessControl.OS_PROVIDES_FILE_PROTECTION = fs.existsSync(FileAccessControl.ICACLS_PATH);
21
+ }
22
+ catch (e) {
23
+ // Ignore error
24
+ }
25
+ if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {
26
+ diag.warn("Could not find ICACLS in expected location! This is necessary to use disk retry mode on Windows.");
27
+ }
28
+ }
29
+ else {
30
+ // chmod works everywhere else
31
+ FileAccessControl.OS_PROVIDES_FILE_PROTECTION = true;
32
+ }
33
+ }
34
+ }
35
+ static async applyACLRules(directory) {
36
+ if (FileAccessControl.USE_ICACLS) {
37
+ if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {
38
+ // Avoid multiple calls race condition by setting ACLED_DIRECTORIES to false for this directory immediately
39
+ // If batches are being failed faster than the processes spawned below return, some data won't be stored to disk
40
+ // This is better than the alternative of potentially infinitely spawned processes
41
+ FileAccessControl.ACLED_DIRECTORIES[directory] = false;
42
+ try {
43
+ // Restrict this directory to only current user and administrator access
44
+ let identity = await this._getACLIdentity();
45
+ await this._runICACLS(this._getACLArguments(directory, identity));
46
+ FileAccessControl.ACLED_DIRECTORIES[directory] = true;
47
+ }
48
+ catch (ex) {
49
+ FileAccessControl.ACLED_DIRECTORIES[directory] = false; // false is used to cache failed (vs undefined which is "not yet tried")
50
+ throw ex;
51
+ }
52
+ }
53
+ else {
54
+ if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {
55
+ throw new Error("Setting ACL restrictions did not succeed (cached result)");
56
+ }
57
+ }
58
+ }
59
+ }
60
+ static applyACLRulesSync(directory) {
61
+ if (FileAccessControl.USE_ICACLS) {
62
+ // For performance, only run ACL rules if we haven't already during this session
63
+ if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {
64
+ this._runICACLSSync(this._getACLArguments(directory, this._getACLIdentitySync()));
65
+ FileAccessControl.ACLED_DIRECTORIES[directory] = true; // If we get here, it succeeded. _runIACLSSync will throw on failures
66
+ return;
67
+ }
68
+ else if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {
69
+ // falsy but not undefined
70
+ throw new Error("Setting ACL restrictions did not succeed (cached result)");
71
+ }
72
+ }
73
+ }
74
+ static _runICACLS(args) {
75
+ return new Promise((resolve, reject) => {
76
+ var aclProc = child_process.spawn(FileAccessControl.ICACLS_PATH, args, {
77
+ windowsHide: true,
78
+ });
79
+ aclProc.on("error", (e) => reject(e));
80
+ aclProc.on("close", (code) => {
81
+ if (code === 0) {
82
+ resolve();
83
+ }
84
+ else {
85
+ reject(new Error(`Setting ACL restrictions did not succeed (ICACLS returned code ${code})`));
86
+ }
87
+ });
88
+ });
89
+ }
90
+ static _runICACLSSync(args) {
91
+ // Some very old versions of Node (< 0.11) don't have this
92
+ if (child_process.spawnSync) {
93
+ var aclProc = child_process.spawnSync(FileAccessControl.ICACLS_PATH, args, {
94
+ windowsHide: true,
95
+ });
96
+ if (aclProc.error) {
97
+ throw aclProc.error;
98
+ }
99
+ else if (aclProc.status !== 0) {
100
+ throw new Error(`Setting ACL restrictions did not succeed (ICACLS returned code ${aclProc.status})`);
101
+ }
102
+ }
103
+ else {
104
+ throw new Error("Could not synchronously call ICACLS under current version of Node.js");
105
+ }
106
+ }
107
+ static _getACLIdentity() {
108
+ return new Promise((resolve, reject) => {
109
+ if (FileAccessControl.ACL_IDENTITY) {
110
+ resolve(FileAccessControl.ACL_IDENTITY);
111
+ }
112
+ var psProc = child_process.spawn(FileAccessControl.POWERSHELL_PATH, ["-Command", "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name"], {
113
+ windowsHide: true,
114
+ stdio: ["ignore", "pipe", "pipe"], // Needed to prevent hanging on Win 7
115
+ });
116
+ let data = "";
117
+ psProc.stdout.on("data", (d) => (data += d));
118
+ psProc.on("error", (e) => reject(e));
119
+ psProc.on("close", (code) => {
120
+ FileAccessControl.ACL_IDENTITY = data && data.trim();
121
+ if (code === 0) {
122
+ resolve(FileAccessControl.ACL_IDENTITY);
123
+ }
124
+ else {
125
+ reject(new Error(`Getting ACL identity did not succeed (PS returned code ${code})`));
126
+ }
127
+ });
128
+ });
129
+ }
130
+ static _getACLIdentitySync() {
131
+ if (FileAccessControl.ACL_IDENTITY) {
132
+ return FileAccessControl.ACL_IDENTITY;
133
+ }
134
+ // Some very old versions of Node (< 0.11) don't have this
135
+ if (child_process.spawnSync) {
136
+ var psProc = child_process.spawnSync(FileAccessControl.POWERSHELL_PATH, ["-Command", "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name"], {
137
+ windowsHide: true,
138
+ stdio: ["ignore", "pipe", "pipe"], // Needed to prevent hanging on Win 7
139
+ });
140
+ if (psProc.error) {
141
+ throw psProc.error;
142
+ }
143
+ else if (psProc.status !== 0) {
144
+ throw new Error(`Getting ACL identity did not succeed (PS returned code ${psProc.status})`);
145
+ }
146
+ FileAccessControl.ACL_IDENTITY = psProc.stdout && psProc.stdout.toString().trim();
147
+ return FileAccessControl.ACL_IDENTITY;
148
+ }
149
+ else {
150
+ throw new Error("Could not synchronously get ACL identity under current version of Node.js");
151
+ }
152
+ }
153
+ static _getACLArguments(directory, identity) {
154
+ return [
155
+ directory,
156
+ "/grant",
157
+ "*S-1-5-32-544:(OI)(CI)F",
158
+ "/grant",
159
+ `${identity}:(OI)(CI)F`,
160
+ "/inheritance:r",
161
+ ]; // Remove all inherited permissions
162
+ }
163
+ }
164
+ FileAccessControl.ICACLS_PATH = `${process.env.systemdrive}/windows/system32/icacls.exe`;
165
+ FileAccessControl.POWERSHELL_PATH = `${process.env.systemdrive}/windows/system32/windowspowershell/v1.0/powershell.exe`;
166
+ FileAccessControl.ACLED_DIRECTORIES = {};
167
+ FileAccessControl.ACL_IDENTITY = null;
168
+ FileAccessControl.OS_FILE_PROTECTION_CHECKED = false;
169
+ FileAccessControl.OS_PROVIDES_FILE_PROTECTION = false;
170
+ FileAccessControl.USE_ICACLS = os.type() === "Windows_NT";
171
+ //# sourceMappingURL=fileAccessControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileAccessControl.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileAccessControl.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as child_process from \"child_process\";\nimport { diag } from \"@opentelemetry/api\";\n\nexport class FileAccessControl {\n private static ICACLS_PATH = `${process.env.systemdrive}/windows/system32/icacls.exe`;\n private static POWERSHELL_PATH = `${process.env.systemdrive}/windows/system32/windowspowershell/v1.0/powershell.exe`;\n private static ACLED_DIRECTORIES: { [id: string]: boolean } = {};\n private static ACL_IDENTITY: string | null = null;\n private static OS_FILE_PROTECTION_CHECKED = false;\n public static OS_PROVIDES_FILE_PROTECTION = false;\n public static USE_ICACLS = os.type() === \"Windows_NT\";\n\n // Check if file access control could be enabled\n public static checkFileProtection() {\n if (\n !FileAccessControl.OS_PROVIDES_FILE_PROTECTION &&\n !FileAccessControl.OS_FILE_PROTECTION_CHECKED\n ) {\n FileAccessControl.OS_FILE_PROTECTION_CHECKED = true;\n // Node's chmod levels do not appropriately restrict file access on Windows\n // Use the built-in command line tool ICACLS on Windows to properly restrict\n // access to the temporary directory used for disk retry mode.\n if (FileAccessControl.USE_ICACLS) {\n // This should be async - but it's currently safer to have this synchronous\n // This guarantees we can immediately fail setDiskRetryMode if we need to\n try {\n FileAccessControl.OS_PROVIDES_FILE_PROTECTION = fs.existsSync(\n FileAccessControl.ICACLS_PATH\n );\n } catch (e) {\n // Ignore error\n }\n if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {\n diag.warn(\n \"Could not find ICACLS in expected location! This is necessary to use disk retry mode on Windows.\"\n );\n }\n } else {\n // chmod works everywhere else\n FileAccessControl.OS_PROVIDES_FILE_PROTECTION = true;\n }\n }\n }\n\n public static async applyACLRules(directory: string): Promise<void> {\n if (FileAccessControl.USE_ICACLS) {\n if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {\n // Avoid multiple calls race condition by setting ACLED_DIRECTORIES to false for this directory immediately\n // If batches are being failed faster than the processes spawned below return, some data won't be stored to disk\n // This is better than the alternative of potentially infinitely spawned processes\n FileAccessControl.ACLED_DIRECTORIES[directory] = false;\n try {\n // Restrict this directory to only current user and administrator access\n let identity = await this._getACLIdentity();\n await this._runICACLS(this._getACLArguments(directory, identity));\n FileAccessControl.ACLED_DIRECTORIES[directory] = true;\n } catch (ex) {\n FileAccessControl.ACLED_DIRECTORIES[directory] = false; // false is used to cache failed (vs undefined which is \"not yet tried\")\n throw ex;\n }\n } else {\n if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {\n throw new Error(\"Setting ACL restrictions did not succeed (cached result)\");\n }\n }\n }\n }\n\n public static applyACLRulesSync(directory: string) {\n if (FileAccessControl.USE_ICACLS) {\n // For performance, only run ACL rules if we haven't already during this session\n if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {\n this._runICACLSSync(this._getACLArguments(directory, this._getACLIdentitySync()));\n FileAccessControl.ACLED_DIRECTORIES[directory] = true; // If we get here, it succeeded. _runIACLSSync will throw on failures\n return;\n } else if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {\n // falsy but not undefined\n throw new Error(\"Setting ACL restrictions did not succeed (cached result)\");\n }\n }\n }\n\n private static _runICACLS(args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n var aclProc = child_process.spawn(FileAccessControl.ICACLS_PATH, args, <any>{\n windowsHide: true,\n });\n aclProc.on(\"error\", (e: Error) => reject(e));\n aclProc.on(\"close\", (code: number) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(`Setting ACL restrictions did not succeed (ICACLS returned code ${code})`)\n );\n }\n });\n });\n }\n\n private static _runICACLSSync(args: string[]) {\n // Some very old versions of Node (< 0.11) don't have this\n if (child_process.spawnSync) {\n var aclProc = child_process.spawnSync(FileAccessControl.ICACLS_PATH, args, <any>{\n windowsHide: true,\n });\n if (aclProc.error) {\n throw aclProc.error;\n } else if (aclProc.status !== 0) {\n throw new Error(\n `Setting ACL restrictions did not succeed (ICACLS returned code ${aclProc.status})`\n );\n }\n } else {\n throw new Error(\"Could not synchronously call ICACLS under current version of Node.js\");\n }\n }\n\n private static _getACLIdentity(): Promise<string> {\n return new Promise((resolve, reject) => {\n if (FileAccessControl.ACL_IDENTITY) {\n resolve(FileAccessControl.ACL_IDENTITY);\n }\n var psProc = child_process.spawn(\n FileAccessControl.POWERSHELL_PATH,\n [\"-Command\", \"[System.Security.Principal.WindowsIdentity]::GetCurrent().Name\"],\n <any>{\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"], // Needed to prevent hanging on Win 7\n }\n );\n let data = \"\";\n psProc.stdout.on(\"data\", (d: string) => (data += d));\n psProc.on(\"error\", (e: Error) => reject(e));\n psProc.on(\"close\", (code: number) => {\n FileAccessControl.ACL_IDENTITY = data && data.trim();\n if (code === 0) {\n resolve(FileAccessControl.ACL_IDENTITY);\n } else {\n reject(new Error(`Getting ACL identity did not succeed (PS returned code ${code})`));\n }\n });\n });\n }\n\n private static _getACLIdentitySync() {\n if (FileAccessControl.ACL_IDENTITY) {\n return FileAccessControl.ACL_IDENTITY;\n }\n // Some very old versions of Node (< 0.11) don't have this\n if (child_process.spawnSync) {\n var psProc = child_process.spawnSync(\n FileAccessControl.POWERSHELL_PATH,\n [\"-Command\", \"[System.Security.Principal.WindowsIdentity]::GetCurrent().Name\"],\n <any>{\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"], // Needed to prevent hanging on Win 7\n }\n );\n if (psProc.error) {\n throw psProc.error;\n } else if (psProc.status !== 0) {\n throw new Error(`Getting ACL identity did not succeed (PS returned code ${psProc.status})`);\n }\n FileAccessControl.ACL_IDENTITY = psProc.stdout && psProc.stdout.toString().trim();\n return FileAccessControl.ACL_IDENTITY;\n } else {\n throw new Error(\"Could not synchronously get ACL identity under current version of Node.js\");\n }\n }\n\n private static _getACLArguments(directory: string, identity: string) {\n return [\n directory,\n \"/grant\",\n \"*S-1-5-32-544:(OI)(CI)F\", // Full permission for Administrators\n \"/grant\",\n `${identity}:(OI)(CI)F`, // Full permission for current user\n \"/inheritance:r\",\n ]; // Remove all inherited permissions\n }\n}\n"]}
@@ -5,6 +5,7 @@ import * as os from "os";
5
5
  import * as path from "path";
6
6
  import { diag } from "@opentelemetry/api";
7
7
  import { DEFAULT_EXPORTER_CONFIG } from "../../../config";
8
+ import { FileAccessControl } from "./fileAccessControl";
8
9
  import { confirmDirExists, getShallowDirectorySize } from "./fileSystemHelpers";
9
10
  import { promisify } from "util";
10
11
  const statAsync = promisify(fs.stat);
@@ -21,36 +22,56 @@ export class FileSystemPersist {
21
22
  this.fileRetemptionPeriod = 7 * 24 * 60 * 60 * 1000; // 7 days
22
23
  this.cleanupTimeOut = 60 * 60 * 1000; // 1 hour
23
24
  this.maxBytesOnDisk = 50000000; // ~50MB
25
+ this._tempDirectory = "";
24
26
  this._fileCleanupTimer = null;
25
27
  this._options = Object.assign(Object.assign({}, DEFAULT_EXPORTER_CONFIG), options);
28
+ this._enabled = true;
29
+ FileAccessControl.checkFileProtection();
30
+ if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {
31
+ this._enabled = false;
32
+ diag.error("Sufficient file protection capabilities were not detected. Files will not be persisted");
33
+ }
26
34
  if (!this._options.instrumentationKey) {
27
- diag.error(`No instrumentation key was provided to FileSystemPersister. Files may not be properly persisted`);
35
+ this._enabled = false;
36
+ diag.error(`No instrumentation key was provided to FileSystemPersister. Files will not be persisted`);
28
37
  }
29
- this._tempDirectory = path.join(os.tmpdir(), FileSystemPersist.TEMPDIR_PREFIX + this._options.instrumentationKey);
30
- // Starts file cleanup task
31
- if (!this._fileCleanupTimer) {
32
- this._fileCleanupTimer = setTimeout(() => {
33
- this._fileCleanupTask();
34
- }, this.cleanupTimeOut);
35
- this._fileCleanupTimer.unref();
38
+ if (this._enabled) {
39
+ this._tempDirectory = path.join(os.tmpdir(), FileSystemPersist.TEMPDIR_PREFIX + this._options.instrumentationKey);
40
+ // Starts file cleanup task
41
+ if (!this._fileCleanupTimer) {
42
+ this._fileCleanupTimer = setTimeout(() => {
43
+ this._fileCleanupTask();
44
+ }, this.cleanupTimeOut);
45
+ this._fileCleanupTimer.unref();
46
+ }
36
47
  }
37
48
  }
38
49
  push(value) {
39
- diag.debug("Pushing value to persistent storage", value.toString());
40
- return this._storeToDisk(JSON.stringify(value));
50
+ if (this._enabled) {
51
+ diag.debug("Pushing value to persistent storage", value.toString());
52
+ return this._storeToDisk(JSON.stringify(value));
53
+ }
54
+ return new Promise((resolve) => {
55
+ resolve(false);
56
+ });
41
57
  }
42
58
  async shift() {
43
- diag.debug("Searching for filesystem persisted files");
44
- try {
45
- const buffer = await this._getFirstFileOnDisk();
46
- if (buffer) {
47
- return JSON.parse(buffer.toString("utf8"));
59
+ if (this._enabled) {
60
+ diag.debug("Searching for filesystem persisted files");
61
+ try {
62
+ const buffer = await this._getFirstFileOnDisk();
63
+ if (buffer) {
64
+ return JSON.parse(buffer.toString("utf8"));
65
+ }
48
66
  }
67
+ catch (e) {
68
+ diag.debug("Failed to read persisted file", e);
69
+ }
70
+ return null;
49
71
  }
50
- catch (e) {
51
- diag.debug("Failed to read persisted file", e);
52
- }
53
- return null;
72
+ return new Promise((resolve) => {
73
+ resolve(null);
74
+ });
54
75
  }
55
76
  /**
56
77
  * Check for temp telemetry files
@@ -1 +1 @@
1
- {"version":3,"file":"fileSystemPersist.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileSystemPersist.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACrC,MAAM,YAAY,GAAG,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC3C,MAAM,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAc5B,YAAY,UAAgD,EAAE;QAT9D,yBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;QACzD,mBAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;QAC1C,mBAAc,GAAW,QAAU,CAAC,CAAC,QAAQ;QAGrC,sBAAiB,GAAwB,IAAI,CAAC;QAKpD,IAAI,CAAC,QAAQ,mCAAQ,uBAAuB,GAAK,OAAO,CAAE,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE;YACrC,IAAI,CAAC,KAAK,CACR,iGAAiG,CAClG,CAAC;SACH;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAC7B,EAAE,CAAC,MAAM,EAAE,EACX,iBAAiB,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CACpE,CAAC;QACF,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACvC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;SAChC;IACH,CAAC;IAED,IAAI,CAAC,KAAgB;QACnB,IAAI,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACvD,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAChD,IAAI,MAAM,EAAE;gBACV,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;aAC5C;SACF;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;SAChD;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB;QAC/B,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE;gBACvB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAC7D,CAAC;gBACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtB,OAAO,IAAI,CAAC;iBACb;qBAAM;oBACL,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;oBAC3D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAC9C,kDAAkD;oBAClD,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC5B,OAAO,OAAO,CAAC;iBAChB;aACF;YACD,OAAO,IAAI,CAAC;SACb;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACvB,yDAAyD;gBACzD,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,MAAM,CAAC,CAAC;aACT;SACF;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,OAAe;QACxC,IAAI;YACF,MAAM,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC7C;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/E,OAAO,KAAK,CAAC;SACd;QAED,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;gBAC9B,IAAI,CAAC,IAAI,CACP,gFAAgF,IAAI,EAAE,CACvF,CAAC;gBACF,OAAO,KAAK,CAAC;aACd;SACF;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1F,OAAO,KAAK,CAAC;SACd;QAED,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,eAAe,EAAE,CAAC;QAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAE9D,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;QACrD,IAAI;YACF,MAAM,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;SAC9D;QAAC,OAAO,UAAU,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,+CAA+C,EAAE,UAAU,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE;gBACvB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAC7D,CAAC;gBACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtB,OAAO,KAAK,CAAC;iBACd;qBAAM;oBACL,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;wBAC3B,mBAAmB;wBACnB,MAAM,gBAAgB,GAAS,IAAI,IAAI,CACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3D,CAAC;wBACF,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,gBAAgB,CAAC;wBACrF,IAAI,OAAO,EAAE;4BACX,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;4BACtD,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;yBAC7B;oBACH,CAAC,CAAC,CAAC;oBACH,OAAO,IAAI,CAAC;iBACb;aACF;YACD,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,yDAAyD,EAAE,KAAK,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;SACd;IACH,CAAC;;AAtJM,gCAAc,GAAG,oBAAoB,CAAC;AAEtC,iCAAe,GAAG,UAAU,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { diag } from \"@opentelemetry/api\";\nimport { PersistentStorage } from \"../../../types\";\nimport { DEFAULT_EXPORTER_CONFIG, AzureExporterInternalConfig } from \"../../../config\";\nimport { confirmDirExists, getShallowDirectorySize } from \"./fileSystemHelpers\";\nimport { promisify } from \"util\";\n\nconst statAsync = promisify(fs.stat);\nconst readdirAsync = promisify(fs.readdir);\nconst readFileAsync = promisify(fs.readFile);\nconst unlinkAsync = promisify(fs.unlink);\nconst writeFileAsync = promisify(fs.writeFile);\n\n/**\n * File system persist class.\n * @internal\n */\nexport class FileSystemPersist implements PersistentStorage {\n static TEMPDIR_PREFIX = \"ot-azure-exporter-\";\n\n static FILENAME_SUFFIX = \".ai.json\";\n\n fileRetemptionPeriod = 7 * 24 * 60 * 60 * 1000; // 7 days\n cleanupTimeOut = 60 * 60 * 1000; // 1 hour\n maxBytesOnDisk: number = 50_000_000; // ~50MB\n\n private _tempDirectory: string;\n private _fileCleanupTimer: NodeJS.Timer | null = null;\n\n private readonly _options: AzureExporterInternalConfig;\n\n constructor(options: Partial<AzureExporterInternalConfig> = {}) {\n this._options = { ...DEFAULT_EXPORTER_CONFIG, ...options };\n if (!this._options.instrumentationKey) {\n diag.error(\n `No instrumentation key was provided to FileSystemPersister. Files may not be properly persisted`\n );\n }\n this._tempDirectory = path.join(\n os.tmpdir(),\n FileSystemPersist.TEMPDIR_PREFIX + this._options.instrumentationKey\n );\n // Starts file cleanup task\n if (!this._fileCleanupTimer) {\n this._fileCleanupTimer = setTimeout(() => {\n this._fileCleanupTask();\n }, this.cleanupTimeOut);\n this._fileCleanupTimer.unref();\n }\n }\n\n push(value: unknown[]): Promise<boolean> {\n diag.debug(\"Pushing value to persistent storage\", value.toString());\n return this._storeToDisk(JSON.stringify(value));\n }\n\n async shift(): Promise<unknown> {\n diag.debug(\"Searching for filesystem persisted files\");\n try {\n const buffer = await this._getFirstFileOnDisk();\n if (buffer) {\n return JSON.parse(buffer.toString(\"utf8\"));\n }\n } catch (e) {\n diag.debug(\"Failed to read persisted file\", e);\n }\n return null;\n }\n\n /**\n * Check for temp telemetry files\n * reads the first file if exist, deletes it and tries to send its load\n */\n private async _getFirstFileOnDisk(): Promise<Buffer | null> {\n try {\n const stats = await statAsync(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdirAsync(this._tempDirectory);\n const files = origFiles.filter((f) =>\n path.basename(f).includes(FileSystemPersist.FILENAME_SUFFIX)\n );\n if (files.length === 0) {\n return null;\n } else {\n const firstFile = files[0];\n const filePath = path.join(this._tempDirectory, firstFile);\n const payload = await readFileAsync(filePath);\n // delete the file first to prevent double sending\n await unlinkAsync(filePath);\n return payload;\n }\n }\n return null;\n } catch (e) {\n if (e.code === \"ENOENT\") {\n // File does not exist -- return null instead of throwing\n return null;\n } else {\n throw e;\n }\n }\n }\n\n private async _storeToDisk(payload: string): Promise<boolean> {\n try {\n await confirmDirExists(this._tempDirectory);\n } catch (error) {\n diag.warn(`Error while checking/creating directory: `, error && error.message);\n return false;\n }\n\n try {\n const size = await getShallowDirectorySize(this._tempDirectory);\n if (size > this.maxBytesOnDisk) {\n diag.warn(\n `Not saving data due to max size limit being met. Directory size in bytes is: ${size}`\n );\n return false;\n }\n } catch (error) {\n diag.warn(`Error while checking size of persistence directory: `, error && error.message);\n return false;\n }\n\n const fileName = `${new Date().getTime()}${FileSystemPersist.FILENAME_SUFFIX}`;\n const fileFullPath = path.join(this._tempDirectory, fileName);\n\n // Mode 600 is w/r for creator and no read access for others\n diag.info(`saving data to disk at: ${fileFullPath}`);\n try {\n await writeFileAsync(fileFullPath, payload, { mode: 0o600 });\n } catch (writeError) {\n diag.warn(`Error writing file to persistent file storage`, writeError);\n return false;\n }\n return true;\n }\n\n private async _fileCleanupTask(): Promise<boolean> {\n try {\n const stats = await statAsync(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdirAsync(this._tempDirectory);\n const files = origFiles.filter((f) =>\n path.basename(f).includes(FileSystemPersist.FILENAME_SUFFIX)\n );\n if (files.length === 0) {\n return false;\n } else {\n files.forEach(async (file) => {\n // Check expiration\n const fileCreationDate: Date = new Date(\n parseInt(file.split(FileSystemPersist.FILENAME_SUFFIX)[0])\n );\n const expired = new Date(+new Date() - this.fileRetemptionPeriod) > fileCreationDate;\n if (expired) {\n const filePath = path.join(this._tempDirectory, file);\n await unlinkAsync(filePath);\n }\n });\n return true;\n }\n }\n return false;\n } catch (error) {\n diag.info(`Failed cleanup of persistent file storage expired files`, error);\n return false;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"fileSystemPersist.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileSystemPersist.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { diag } from \"@opentelemetry/api\";\nimport { PersistentStorage } from \"../../../types\";\nimport { DEFAULT_EXPORTER_CONFIG, AzureExporterInternalConfig } from \"../../../config\";\nimport { FileAccessControl } from \"./fileAccessControl\";\nimport { confirmDirExists, getShallowDirectorySize } from \"./fileSystemHelpers\";\nimport { promisify } from \"util\";\n\nconst statAsync = promisify(fs.stat);\nconst readdirAsync = promisify(fs.readdir);\nconst readFileAsync = promisify(fs.readFile);\nconst unlinkAsync = promisify(fs.unlink);\nconst writeFileAsync = promisify(fs.writeFile);\n\n/**\n * File system persist class.\n * @internal\n */\nexport class FileSystemPersist implements PersistentStorage {\n static TEMPDIR_PREFIX = \"ot-azure-exporter-\";\n\n static FILENAME_SUFFIX = \".ai.json\";\n\n fileRetemptionPeriod = 7 * 24 * 60 * 60 * 1000; // 7 days\n cleanupTimeOut = 60 * 60 * 1000; // 1 hour\n maxBytesOnDisk: number = 50_000_000; // ~50MB\n\n private _enabled: boolean;\n private _tempDirectory: string = \"\";\n private _fileCleanupTimer: NodeJS.Timer | null = null;\n\n private readonly _options: AzureExporterInternalConfig;\n\n constructor(options: Partial<AzureExporterInternalConfig> = {}) {\n this._options = { ...DEFAULT_EXPORTER_CONFIG, ...options };\n this._enabled = true;\n FileAccessControl.checkFileProtection();\n\n if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {\n this._enabled = false;\n diag.error(\n \"Sufficient file protection capabilities were not detected. Files will not be persisted\"\n );\n }\n\n if (!this._options.instrumentationKey) {\n this._enabled = false;\n diag.error(\n `No instrumentation key was provided to FileSystemPersister. Files will not be persisted`\n );\n }\n if (this._enabled) {\n this._tempDirectory = path.join(\n os.tmpdir(),\n FileSystemPersist.TEMPDIR_PREFIX + this._options.instrumentationKey\n );\n // Starts file cleanup task\n if (!this._fileCleanupTimer) {\n this._fileCleanupTimer = setTimeout(() => {\n this._fileCleanupTask();\n }, this.cleanupTimeOut);\n this._fileCleanupTimer.unref();\n }\n }\n }\n\n push(value: unknown[]): Promise<boolean> {\n if (this._enabled) {\n diag.debug(\"Pushing value to persistent storage\", value.toString());\n return this._storeToDisk(JSON.stringify(value));\n }\n return new Promise((resolve) => {\n resolve(false);\n });\n }\n\n async shift(): Promise<unknown> {\n if (this._enabled) {\n diag.debug(\"Searching for filesystem persisted files\");\n try {\n const buffer = await this._getFirstFileOnDisk();\n if (buffer) {\n return JSON.parse(buffer.toString(\"utf8\"));\n }\n } catch (e) {\n diag.debug(\"Failed to read persisted file\", e);\n }\n return null;\n }\n return new Promise((resolve) => {\n resolve(null);\n });\n }\n\n /**\n * Check for temp telemetry files\n * reads the first file if exist, deletes it and tries to send its load\n */\n private async _getFirstFileOnDisk(): Promise<Buffer | null> {\n try {\n const stats = await statAsync(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdirAsync(this._tempDirectory);\n const files = origFiles.filter((f) =>\n path.basename(f).includes(FileSystemPersist.FILENAME_SUFFIX)\n );\n if (files.length === 0) {\n return null;\n } else {\n const firstFile = files[0];\n const filePath = path.join(this._tempDirectory, firstFile);\n const payload = await readFileAsync(filePath);\n // delete the file first to prevent double sending\n await unlinkAsync(filePath);\n return payload;\n }\n }\n return null;\n } catch (e) {\n if (e.code === \"ENOENT\") {\n // File does not exist -- return null instead of throwing\n return null;\n } else {\n throw e;\n }\n }\n }\n\n private async _storeToDisk(payload: string): Promise<boolean> {\n try {\n await confirmDirExists(this._tempDirectory);\n } catch (error) {\n diag.warn(`Error while checking/creating directory: `, error && error.message);\n return false;\n }\n\n try {\n const size = await getShallowDirectorySize(this._tempDirectory);\n if (size > this.maxBytesOnDisk) {\n diag.warn(\n `Not saving data due to max size limit being met. Directory size in bytes is: ${size}`\n );\n return false;\n }\n } catch (error) {\n diag.warn(`Error while checking size of persistence directory: `, error && error.message);\n return false;\n }\n\n const fileName = `${new Date().getTime()}${FileSystemPersist.FILENAME_SUFFIX}`;\n const fileFullPath = path.join(this._tempDirectory, fileName);\n\n // Mode 600 is w/r for creator and no read access for others\n diag.info(`saving data to disk at: ${fileFullPath}`);\n try {\n await writeFileAsync(fileFullPath, payload, { mode: 0o600 });\n } catch (writeError) {\n diag.warn(`Error writing file to persistent file storage`, writeError);\n return false;\n }\n return true;\n }\n\n private async _fileCleanupTask(): Promise<boolean> {\n try {\n const stats = await statAsync(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdirAsync(this._tempDirectory);\n const files = origFiles.filter((f) =>\n path.basename(f).includes(FileSystemPersist.FILENAME_SUFFIX)\n );\n if (files.length === 0) {\n return false;\n } else {\n files.forEach(async (file) => {\n // Check expiration\n const fileCreationDate: Date = new Date(\n parseInt(file.split(FileSystemPersist.FILENAME_SUFFIX)[0])\n );\n const expired = new Date(+new Date() - this.fileRetemptionPeriod) > fileCreationDate;\n if (expired) {\n const filePath = path.join(this._tempDirectory, file);\n await unlinkAsync(filePath);\n }\n });\n return true;\n }\n }\n return false;\n } catch (error) {\n diag.info(`Failed cleanup of persistent file storage expired files`, error);\n return false;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ContextTagKeys } from \"./generated\";\n\n/**\n * Azure Monitor envelope tags.\n * @internal\n */\nexport type Tags = { [key in ContextTagKeys]: string };\n/**\n * Azure Monitor envelope property type.\n * @internal\n */\nexport type PropertyType = string | number | boolean | object | Array<PropertyType>;\n/**\n * Azure Monitor envelope properties.\n * @internal\n */\nexport type Properties = { [key: string]: Properties | PropertyType };\n/**\n * Azure Monitor envelope links.\n * @internal\n */\nexport interface MSLink {\n operation_Id: string;\n id: string;\n}\n/**\n * Azure Monitor envelope measurements.\n * @internal\n */\nexport type Measurements = { [key: string]: number };\n/**\n * Exporter sender result.\n * @internal\n */\nexport type SenderResult = { statusCode: number; result: string };\n\n/**\n * Exporter sender.\n * @internal\n */\nexport interface Sender {\n send(payload: unknown[]): Promise<SenderResult>;\n shutdown(): Promise<void>;\n handlePermanentRedirect(location: string | undefined): void;\n}\n\n/**\n * Exporter persistent storage.\n * @internal\n */\nexport interface PersistentStorage {\n shift(): Promise<unknown>;\n push(value: unknown[]): Promise<boolean>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ContextTagKeys } from \"./generated\";\n\n/**\n * Azure Monitor envelope tags.\n * @internal\n */\nexport type Tags = { [key in ContextTagKeys]: string };\n/**\n * Azure Monitor envelope property type.\n * @internal\n */\nexport type PropertyType = string | number | boolean | object | Array<PropertyType>;\n/**\n * Azure Monitor envelope properties.\n * @internal\n */\nexport type Properties = { [key: string]: Properties | PropertyType };\n/**\n * Azure Monitor envelope links.\n * @internal\n */\nexport interface MSLink {\n operation_Id: string;\n id: string;\n}\n/**\n * Azure Monitor envelope measurements.\n * @internal\n */\nexport type Measurements = { [key: string]: number };\n/**\n * Exporter sender result.\n * @internal\n */\nexport type SenderResult = { statusCode: number | undefined; result: string };\n\n/**\n * Exporter sender.\n * @internal\n */\nexport interface Sender {\n send(payload: unknown[]): Promise<SenderResult>;\n shutdown(): Promise<void>;\n handlePermanentRedirect(location: string | undefined): void;\n}\n\n/**\n * Exporter persistent storage.\n * @internal\n */\nexport interface PersistentStorage {\n shift(): Promise<unknown>;\n push(value: unknown[]): Promise<boolean>;\n}\n"]}
@@ -5,12 +5,13 @@
5
5
  * @internal
6
6
  */
7
7
  export function isRetriable(statusCode) {
8
- return (statusCode === 206 || // Retriable
8
+ return (statusCode === 206 || // Partial Accept
9
+ statusCode === 401 || // Unauthorized
10
+ statusCode === 403 || // Forbidden
9
11
  statusCode === 408 || // Timeout
10
- statusCode === 429 || // Throttle
11
- statusCode === 439 || // Quota
12
+ statusCode === 429 || // Too many requests
12
13
  statusCode === 500 || // Server Error
13
- statusCode === 503 // Server Unavilable
14
+ statusCode === 503 // Server Unavailable
14
15
  );
15
16
  }
16
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"breezeUtils.js","sourceRoot":"","sources":["../../../src/utils/breezeUtils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAsBlC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,CACL,UAAU,KAAK,GAAG,IAAI,YAAY;QAClC,UAAU,KAAK,GAAG,IAAI,UAAU;QAChC,UAAU,KAAK,GAAG,IAAI,WAAW;QACjC,UAAU,KAAK,GAAG,IAAI,QAAQ;QAC9B,UAAU,KAAK,GAAG,IAAI,eAAe;QACrC,UAAU,KAAK,GAAG,CAAC,oBAAoB;KACxC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAChE,OAAO,GAAG,CAAC,CAAC;KACb;IAED,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACtD,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAEzD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5C,OAAO,GAAG,QAAQ,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5C,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Breeze errors.\n * @internal\n */\nexport interface BreezeError {\n index: number;\n statusCode: number;\n message: string;\n}\n\n/**\n * Breeze response definition.\n * @internal\n */\nexport interface BreezeResponse {\n itemsReceived: number;\n itemsAccepted: number;\n errors: BreezeError[];\n}\n\n/**\n * Breeze retriable status codes.\n * @internal\n */\nexport function isRetriable(statusCode: number): boolean {\n return (\n statusCode === 206 || // Retriable\n statusCode === 408 || // Timeout\n statusCode === 429 || // Throttle\n statusCode === 439 || // Quota\n statusCode === 500 || // Server Error\n statusCode === 503 // Server Unavilable\n );\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":"breezeUtils.js","sourceRoot":"","sources":["../../../src/utils/breezeUtils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAsBlC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,CACL,UAAU,KAAK,GAAG,IAAI,iBAAiB;QACvC,UAAU,KAAK,GAAG,IAAI,eAAe;QACrC,UAAU,KAAK,GAAG,IAAI,YAAY;QAClC,UAAU,KAAK,GAAG,IAAI,UAAU;QAChC,UAAU,KAAK,GAAG,IAAI,oBAAoB;QAC1C,UAAU,KAAK,GAAG,IAAI,eAAe;QACrC,UAAU,KAAK,GAAG,CAAC,qBAAqB;KACzC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAChE,OAAO,GAAG,CAAC,CAAC;KACb;IAED,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACtD,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAEzD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5C,OAAO,GAAG,QAAQ,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5C,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Breeze errors.\n * @internal\n */\nexport interface BreezeError {\n index: number;\n statusCode: number;\n message: string;\n}\n\n/**\n * Breeze response definition.\n * @internal\n */\nexport interface BreezeResponse {\n itemsReceived: number;\n itemsAccepted: number;\n errors: BreezeError[];\n}\n\n/**\n * Breeze retriable status codes.\n * @internal\n */\nexport function isRetriable(statusCode: number): boolean {\n return (\n statusCode === 206 || // Partial Accept\n statusCode === 401 || // Unauthorized\n statusCode === 403 || // Forbidden\n statusCode === 408 || // Timeout\n statusCode === 429 || // Too many requests\n statusCode === 500 || // Server Error\n statusCode === 503 // Server Unavailable\n );\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,40 +1,10 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT license.
3
- /**
4
- * AI cloud role tag name.
5
- * @internal
6
- */
7
- export const AI_CLOUD_ROLE = "ai.cloud.role";
8
- /**
9
- * AI cloud role isntance tag name.
10
- * @internal
11
- */
12
- export const AI_CLOUD_ROLE_INSTACE = "ai.cloud.roleInstance";
13
- /**
14
- * AI operation Id tag name.
15
- * @internal
16
- */
17
- export const AI_OPERATION_ID = "ai.operation.id";
18
- /**
19
- * AI operation parent Id tag name.
20
- * @internal
21
- */
22
- export const AI_OPERATION_PARENT_ID = "ai.operation.parentId";
23
- /**
24
- * AI operation tag name.
25
- * @internal
26
- */
27
- export const AI_OPERATION_NAME = "ai.operation.name";
28
3
  /**
29
4
  * AI MS Links.
30
5
  * @internal
31
6
  */
32
7
  export const MS_LINKS = "_MS.links";
33
- /**
34
- * AI InProc attribute.
35
- * @internal
36
- */
37
- export const INPROC = "InProc";
38
8
  /**
39
9
  * AI enqueued time attribute.
40
10
  * @internal
@@ -49,5 +19,13 @@ export const TIME_SINCE_ENQUEUED = "timeSinceEnqueued";
49
19
  * AzureMonitorTraceExporter version.
50
20
  * @internal
51
21
  */
52
- export const packageVersion = "1.0.0-beta.4";
22
+ export const packageVersion = "1.0.0-beta.7";
23
+ export var DependencyTypes;
24
+ (function (DependencyTypes) {
25
+ DependencyTypes["InProc"] = "InProc";
26
+ DependencyTypes["QueueMessage"] = "Queue Message";
27
+ DependencyTypes["Sql"] = "SQL";
28
+ DependencyTypes["Http"] = "Http";
29
+ DependencyTypes["Grpc"] = "GRPC";
30
+ })(DependencyTypes || (DependencyTypes = {}));
53
31
  //# sourceMappingURL=applicationinsights.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"applicationinsights.js","sourceRoot":"","sources":["../../../../src/utils/constants/applicationinsights.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AACjD;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAC9D;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AACrD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC;AAC/B;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAC5C;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AACvD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * AI cloud role tag name.\n * @internal\n */\nexport const AI_CLOUD_ROLE = \"ai.cloud.role\";\n/**\n * AI cloud role isntance tag name.\n * @internal\n */\nexport const AI_CLOUD_ROLE_INSTACE = \"ai.cloud.roleInstance\";\n/**\n * AI operation Id tag name.\n * @internal\n */\nexport const AI_OPERATION_ID = \"ai.operation.id\";\n/**\n * AI operation parent Id tag name.\n * @internal\n */\nexport const AI_OPERATION_PARENT_ID = \"ai.operation.parentId\";\n/**\n * AI operation tag name.\n * @internal\n */\nexport const AI_OPERATION_NAME = \"ai.operation.name\";\n/**\n * AI MS Links.\n * @internal\n */\nexport const MS_LINKS = \"_MS.links\";\n/**\n * AI InProc attribute.\n * @internal\n */\nexport const INPROC = \"InProc\";\n/**\n * AI enqueued time attribute.\n * @internal\n */\nexport const ENQUEUED_TIME = \"enqueuedTime\";\n/**\n * AI time since enqueued attribute.\n * @internal\n */\nexport const TIME_SINCE_ENQUEUED = \"timeSinceEnqueued\";\n/**\n * AzureMonitorTraceExporter version.\n * @internal\n */\nexport const packageVersion = \"1.0.0-beta.4\";\n"]}
1
+ {"version":3,"file":"applicationinsights.js","sourceRoot":"","sources":["../../../../src/utils/constants/applicationinsights.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAC5C;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AACvD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,iDAA8B,CAAA;IAC9B,8BAAW,CAAA;IACX,gCAAa,CAAA;IACb,gCAAa,CAAA;AACf,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * AI MS Links.\n * @internal\n */\nexport const MS_LINKS = \"_MS.links\";\n/**\n * AI enqueued time attribute.\n * @internal\n */\nexport const ENQUEUED_TIME = \"enqueuedTime\";\n/**\n * AI time since enqueued attribute.\n * @internal\n */\nexport const TIME_SINCE_ENQUEUED = \"timeSinceEnqueued\";\n/**\n * AzureMonitorTraceExporter version.\n * @internal\n */\nexport const packageVersion = \"1.0.0-beta.7\";\n\nexport enum DependencyTypes {\n InProc = \"InProc\",\n QueueMessage = \"Queue Message\",\n Sql = \"SQL\",\n Http = \"Http\",\n Grpc = \"GRPC\",\n}\n"]}
@@ -4,7 +4,7 @@ import { SpanKind } from "@opentelemetry/api";
4
4
  import { hrTimeToMilliseconds } from "@opentelemetry/core";
5
5
  import { SemanticAttributes } from "@opentelemetry/semantic-conventions";
6
6
  import { TIME_SINCE_ENQUEUED, ENQUEUED_TIME } from "./constants/applicationinsights";
7
- import { AzNamespace, MessageBusDestination } from "./constants/span/azAttributes";
7
+ import { AzNamespace, MessageBusDestination, } from "./constants/span/azAttributes";
8
8
  /**
9
9
  * Average span.links[].attributes.enqueuedTime
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"eventhub.js","sourceRoot":"","sources":["../../../src/utils/eventhub.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EACL,WAAW,EACX,qBAAqB,EAEtB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,oBAAoB,GAAG,CAAC,IAAkB,EAAE,EAAE;IAClD,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;QACpC,MAAM,YAAY,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,aAAa,CAAoB,CAAC;QACpE,IAAI,YAAY,EAAE;YAChB,iBAAiB,IAAI,CAAC,CAAC;YACvB,eAAe,IAAI,WAAW,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7E;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAkB,EAClB,QAA4C,EACtC,EAAE;IACR,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAA6B,CAAC;IAC3E,MAAM,WAAW,GAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,aAAa,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC/B,SAAS,CAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB;IACnE,MAAM,qBAAqB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,SAAS,CAAW,CAAC;IAE9F,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,QAAQ,CAAC,MAAM;YAClB,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;YAC1B,QAAQ,CAAC,MAAM,GAAG,GAAG,WAAW,IAAI,qBAAqB,EAAE,CAAC;YAC5D,MAAM;QACR,KAAK,QAAQ,CAAC,QAAQ;YACpB,QAAQ,CAAC,IAAI,GAAG,mBAAmB,SAAS,EAAE,CAAC;YAC/C,QAAQ,CAAC,MAAM,GAAG,GAAG,WAAW,IAAI,qBAAqB,EAAE,CAAC;YAC5D,MAAM;QACR,KAAK,QAAQ,CAAC,QAAQ;YACpB,QAAQ,CAAC,IAAI,GAAG,mBAAmB,SAAS,EAAE,CAAC;YAC9C,QAAgB,CAAC,MAAM,GAAG,GAAG,WAAW,IAAI,qBAAqB,EAAE,CAAC;YACrE,QAAQ,CAAC,YAAY,mCAChB,QAAQ,CAAC,YAAY,KACxB,CAAC,mBAAmB,CAAC,EAAE,oBAAoB,CAAC,IAAI,CAAC,GAClD,CAAC;YACF,MAAM;QACR,QAAQ,CAAC,QAAQ;KAClB;AACH,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { SpanKind } from \"@opentelemetry/api\";\nimport { hrTimeToMilliseconds } from \"@opentelemetry/core\";\nimport { SemanticAttributes } from \"@opentelemetry/semantic-conventions\";\nimport { ReadableSpan } from \"@opentelemetry/tracing\";\nimport { RemoteDependencyData, RequestData } from \"../generated\";\nimport { TIME_SINCE_ENQUEUED, ENQUEUED_TIME } from \"./constants/applicationinsights\";\nimport {\n AzNamespace,\n MessageBusDestination,\n MicrosoftEventHub\n} from \"./constants/span/azAttributes\";\n\n/**\n * Average span.links[].attributes.enqueuedTime\n */\nconst getTimeSinceEnqueued = (span: ReadableSpan) => {\n let countEnqueueDiffs = 0;\n let sumEnqueueDiffs = 0;\n const startTimeMs = hrTimeToMilliseconds(span.startTime);\n\n span.links.forEach(({ attributes }) => {\n const enqueuedTime = attributes?.[ENQUEUED_TIME] as string | number;\n if (enqueuedTime) {\n countEnqueueDiffs += 1;\n sumEnqueueDiffs += startTimeMs - (parseFloat(enqueuedTime.toString()) || 0);\n }\n });\n\n return Math.max(sumEnqueueDiffs / (countEnqueueDiffs || 1), 0);\n};\n\n/**\n * Implementation of Mapping to Azure Monitor\n *\n * https://gist.github.com/lmolkova/e4215c0f44a49ef824983382762e6b92#mapping-to-azure-monitor-application-insights-telemetry\n * @internal\n */\nexport const parseEventHubSpan = (\n span: ReadableSpan,\n baseData: RequestData | RemoteDependencyData\n): void => {\n const namespace = span.attributes[AzNamespace] as typeof MicrosoftEventHub;\n const peerAddress = ((span.attributes[SemanticAttributes.NET_PEER_NAME] ||\n span.attributes[\"peer.address\"] ||\n \"unknown\") as string).replace(/\\/$/g, \"\"); // remove trailing \"/\"\n const messageBusDestination = (span.attributes[MessageBusDestination] || \"unknown\") as string;\n\n switch (span.kind) {\n case SpanKind.CLIENT:\n baseData.type = namespace;\n baseData.target = `${peerAddress}/${messageBusDestination}`;\n break;\n case SpanKind.PRODUCER:\n baseData.type = `Queue Message | ${namespace}`;\n baseData.target = `${peerAddress}/${messageBusDestination}`;\n break;\n case SpanKind.CONSUMER:\n baseData.type = `Queue Message | ${namespace}`;\n (baseData as any).source = `${peerAddress}/${messageBusDestination}`;\n baseData.measurements = {\n ...baseData.measurements,\n [TIME_SINCE_ENQUEUED]: getTimeSinceEnqueued(span)\n };\n break;\n default: // no op\n }\n};\n"]}
1
+ {"version":3,"file":"eventhub.js","sourceRoot":"","sources":["../../../src/utils/eventhub.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EACL,WAAW,EACX,qBAAqB,GAEtB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,oBAAoB,GAAG,CAAC,IAAkB,EAAE,EAAE;IAClD,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;QACpC,MAAM,YAAY,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,aAAa,CAAoB,CAAC;QACpE,IAAI,YAAY,EAAE;YAChB,iBAAiB,IAAI,CAAC,CAAC;YACvB,eAAe,IAAI,WAAW,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7E;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAkB,EAClB,QAA4C,EACtC,EAAE;IACR,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAA6B,CAAC;IAC3E,MAAM,WAAW,GACf,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,aAAa,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC/B,SAAS,CACZ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB;IAC7C,MAAM,qBAAqB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,SAAS,CAAW,CAAC;IAE9F,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,QAAQ,CAAC,MAAM;YAClB,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;YAC1B,QAAQ,CAAC,MAAM,GAAG,GAAG,WAAW,IAAI,qBAAqB,EAAE,CAAC;YAC5D,MAAM;QACR,KAAK,QAAQ,CAAC,QAAQ;YACpB,QAAQ,CAAC,IAAI,GAAG,mBAAmB,SAAS,EAAE,CAAC;YAC/C,QAAQ,CAAC,MAAM,GAAG,GAAG,WAAW,IAAI,qBAAqB,EAAE,CAAC;YAC5D,MAAM;QACR,KAAK,QAAQ,CAAC,QAAQ;YACpB,QAAQ,CAAC,IAAI,GAAG,mBAAmB,SAAS,EAAE,CAAC;YAC9C,QAAgB,CAAC,MAAM,GAAG,GAAG,WAAW,IAAI,qBAAqB,EAAE,CAAC;YACrE,QAAQ,CAAC,YAAY,mCAChB,QAAQ,CAAC,YAAY,KACxB,CAAC,mBAAmB,CAAC,EAAE,oBAAoB,CAAC,IAAI,CAAC,GAClD,CAAC;YACF,MAAM;QACR,QAAQ,CAAC,QAAQ;KAClB;AACH,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { SpanKind } from \"@opentelemetry/api\";\nimport { hrTimeToMilliseconds } from \"@opentelemetry/core\";\nimport { SemanticAttributes } from \"@opentelemetry/semantic-conventions\";\nimport { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { RemoteDependencyData, RequestData } from \"../generated\";\nimport { TIME_SINCE_ENQUEUED, ENQUEUED_TIME } from \"./constants/applicationinsights\";\nimport {\n AzNamespace,\n MessageBusDestination,\n MicrosoftEventHub,\n} from \"./constants/span/azAttributes\";\n\n/**\n * Average span.links[].attributes.enqueuedTime\n */\nconst getTimeSinceEnqueued = (span: ReadableSpan) => {\n let countEnqueueDiffs = 0;\n let sumEnqueueDiffs = 0;\n const startTimeMs = hrTimeToMilliseconds(span.startTime);\n\n span.links.forEach(({ attributes }) => {\n const enqueuedTime = attributes?.[ENQUEUED_TIME] as string | number;\n if (enqueuedTime) {\n countEnqueueDiffs += 1;\n sumEnqueueDiffs += startTimeMs - (parseFloat(enqueuedTime.toString()) || 0);\n }\n });\n\n return Math.max(sumEnqueueDiffs / (countEnqueueDiffs || 1), 0);\n};\n\n/**\n * Implementation of Mapping to Azure Monitor\n *\n * https://gist.github.com/lmolkova/e4215c0f44a49ef824983382762e6b92#mapping-to-azure-monitor-application-insights-telemetry\n * @internal\n */\nexport const parseEventHubSpan = (\n span: ReadableSpan,\n baseData: RequestData | RemoteDependencyData\n): void => {\n const namespace = span.attributes[AzNamespace] as typeof MicrosoftEventHub;\n const peerAddress = (\n (span.attributes[SemanticAttributes.NET_PEER_NAME] ||\n span.attributes[\"peer.address\"] ||\n \"unknown\") as string\n ).replace(/\\/$/g, \"\"); // remove trailing \"/\"\n const messageBusDestination = (span.attributes[MessageBusDestination] || \"unknown\") as string;\n\n switch (span.kind) {\n case SpanKind.CLIENT:\n baseData.type = namespace;\n baseData.target = `${peerAddress}/${messageBusDestination}`;\n break;\n case SpanKind.PRODUCER:\n baseData.type = `Queue Message | ${namespace}`;\n baseData.target = `${peerAddress}/${messageBusDestination}`;\n break;\n case SpanKind.CONSUMER:\n baseData.type = `Queue Message | ${namespace}`;\n (baseData as any).source = `${peerAddress}/${messageBusDestination}`;\n baseData.measurements = {\n ...baseData.measurements,\n [TIME_SINCE_ENQUEUED]: getTimeSinceEnqueued(span),\n };\n break;\n default: // no op\n }\n};\n"]}