@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
@@ -1,49 +1,83 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT license.
3
+ import os from "os";
3
4
  import { URL } from "url";
4
5
  import { hrTimeToMilliseconds } from "@opentelemetry/core";
5
6
  import { diag, SpanKind, SpanStatusCode } from "@opentelemetry/api";
6
- import { ResourceAttributes } from "@opentelemetry/semantic-conventions";
7
- import { HTTP_METHOD, HTTP_ROUTE, HTTP_URL, HTTP_STATUS_CODE } from "./constants/span/httpAttributes";
8
- import { AI_CLOUD_ROLE, AI_CLOUD_ROLE_INSTACE, AI_OPERATION_ID, AI_OPERATION_PARENT_ID, AI_OPERATION_NAME, MS_LINKS, INPROC } from "./constants/applicationinsights";
9
- import { GRPC_METHOD, GRPC_STATUS_CODE } from "./constants/span/grpcAttributes";
7
+ import { SemanticResourceAttributes, SemanticAttributes, DbSystemValues, } from "@opentelemetry/semantic-conventions";
10
8
  import { msToTimeSpan } from "./breezeUtils";
11
9
  import { getInstance } from "../platform";
12
- import { DB_NAME, DB_STATEMENT } from "./constants/span/dbAttributes";
13
10
  import { parseEventHubSpan } from "./eventhub";
11
+ import { DependencyTypes, MS_LINKS } from "./constants/applicationinsights";
14
12
  import { AzNamespace, MicrosoftEventHub } from "./constants/span/azAttributes";
13
+ import { KnownContextTagKeys, } from "../generated";
15
14
  function createTagsFromSpan(span) {
16
15
  const context = getInstance();
17
16
  const tags = Object.assign({}, context.tags);
18
- tags[AI_OPERATION_ID] = span.spanContext().traceId;
17
+ tags[KnownContextTagKeys.AiOperationId] = span.spanContext().traceId;
19
18
  if (span.parentSpanId) {
20
- tags[AI_OPERATION_PARENT_ID] = span.parentSpanId;
19
+ tags[KnownContextTagKeys.AiOperationParentId] = span.parentSpanId;
21
20
  }
22
21
  if (span.resource && span.resource.attributes) {
23
- const serviceName = span.resource.attributes[ResourceAttributes.SERVICE_NAME];
24
- const serviceNamespace = span.resource.attributes[ResourceAttributes.SERVICE_NAMESPACE];
25
- const serviceInstanceId = span.resource.attributes[ResourceAttributes.SERVICE_INSTANCE_ID];
22
+ const serviceName = span.resource.attributes[SemanticResourceAttributes.SERVICE_NAME];
23
+ const serviceNamespace = span.resource.attributes[SemanticResourceAttributes.SERVICE_NAMESPACE];
26
24
  if (serviceName) {
27
25
  if (serviceNamespace) {
28
- tags[AI_CLOUD_ROLE] = `${serviceNamespace}.${serviceName}`;
26
+ tags[KnownContextTagKeys.AiCloudRole] = `${serviceNamespace}.${serviceName}`;
29
27
  }
30
28
  else {
31
- tags[AI_CLOUD_ROLE] = String(serviceName);
29
+ tags[KnownContextTagKeys.AiCloudRole] = String(serviceName);
32
30
  }
33
31
  }
32
+ const serviceInstanceId = span.resource.attributes[SemanticResourceAttributes.SERVICE_INSTANCE_ID];
34
33
  if (serviceInstanceId) {
35
- tags[AI_CLOUD_ROLE_INSTACE] = String(serviceInstanceId);
34
+ tags[KnownContextTagKeys.AiCloudRoleInstance] = String(serviceInstanceId);
35
+ }
36
+ else {
37
+ tags[KnownContextTagKeys.AiCloudRoleInstance] = os && os.hostname();
38
+ }
39
+ const endUserId = span.resource.attributes[SemanticAttributes.ENDUSER_ID];
40
+ if (endUserId) {
41
+ tags[KnownContextTagKeys.AiUserId] = String(endUserId);
36
42
  }
37
43
  }
38
- // @todo: is this for RequestData only?
39
- if ((span.kind === SpanKind.SERVER || span.kind === SpanKind.CONSUMER) &&
40
- span.attributes[GRPC_METHOD]) {
41
- tags[AI_OPERATION_NAME] = String(span.attributes[GRPC_METHOD]);
44
+ if (span.kind === SpanKind.SERVER) {
45
+ const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];
46
+ const httpClientIp = span.attributes[SemanticAttributes.HTTP_CLIENT_IP];
47
+ const netPeerIp = span.attributes[SemanticAttributes.NET_PEER_IP];
48
+ if (httpMethod) {
49
+ const httpRoute = span.attributes[SemanticAttributes.HTTP_ROUTE];
50
+ const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];
51
+ tags[KnownContextTagKeys.AiOperationName] = span.name; // Default
52
+ if (httpRoute) {
53
+ tags[KnownContextTagKeys.AiOperationName] = `${httpMethod} ${httpRoute}`;
54
+ }
55
+ else if (httpUrl) {
56
+ try {
57
+ let url = new URL(String(httpUrl));
58
+ tags[KnownContextTagKeys.AiOperationName] = `${httpMethod} ${url.pathname}`;
59
+ }
60
+ catch (ex) { }
61
+ }
62
+ if (httpClientIp) {
63
+ tags[KnownContextTagKeys.AiLocationIp] = String(httpClientIp);
64
+ }
65
+ else if (netPeerIp) {
66
+ tags[KnownContextTagKeys.AiLocationIp] = String(netPeerIp);
67
+ }
68
+ }
69
+ else {
70
+ tags[KnownContextTagKeys.AiOperationName] = span.name;
71
+ if (netPeerIp) {
72
+ tags[KnownContextTagKeys.AiLocationIp] = String(netPeerIp);
73
+ }
74
+ }
42
75
  }
43
- if ((span.kind === SpanKind.SERVER || span.kind === SpanKind.CONSUMER) &&
44
- span.attributes[HTTP_METHOD] &&
45
- span.attributes[HTTP_ROUTE]) {
46
- tags[AI_OPERATION_NAME] = `${span.attributes[HTTP_METHOD]} ${span.attributes[HTTP_ROUTE]}`;
76
+ // TODO: Operation Name and Location IP TBD for non server spans
77
+ const httpUserAgent = span.attributes[SemanticAttributes.HTTP_USER_AGENT];
78
+ if (httpUserAgent) {
79
+ // TODO: Not exposed in Swagger, need to update def
80
+ tags["ai.user.userAgent"] = String(httpUserAgent);
47
81
  }
48
82
  return tags;
49
83
  }
@@ -51,99 +85,223 @@ function createPropertiesFromSpan(span) {
51
85
  const properties = {};
52
86
  const measurements = {};
53
87
  for (const key of Object.keys(span.attributes)) {
54
- if (!(key.startsWith("http.") || key.startsWith("rpc.") || key.startsWith("db."))) {
88
+ if (!(key.startsWith("http.") ||
89
+ key.startsWith("rpc.") ||
90
+ key.startsWith("db.") ||
91
+ key.startsWith("peer.") ||
92
+ key.startsWith("net."))) {
55
93
  properties[key] = span.attributes[key];
56
94
  }
57
95
  }
58
96
  const links = span.links.map((link) => ({
59
97
  operation_Id: link.context.traceId,
60
- id: link.context.spanId
98
+ id: link.context.spanId,
61
99
  }));
62
100
  if (links.length > 0) {
63
101
  properties[MS_LINKS] = JSON.stringify(links);
64
102
  }
65
103
  return [properties, measurements];
66
104
  }
105
+ function isSqlDB(dbSystem) {
106
+ return (dbSystem === DbSystemValues.DB2 ||
107
+ dbSystem === DbSystemValues.DERBY ||
108
+ dbSystem === DbSystemValues.MARIADB ||
109
+ dbSystem === DbSystemValues.MSSQL ||
110
+ dbSystem === DbSystemValues.ORACLE ||
111
+ dbSystem === DbSystemValues.SQLITE ||
112
+ dbSystem === DbSystemValues.OTHER_SQL ||
113
+ dbSystem === DbSystemValues.HSQLDB ||
114
+ dbSystem === DbSystemValues.H2);
115
+ }
116
+ function getUrl(span) {
117
+ const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];
118
+ if (httpMethod) {
119
+ const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];
120
+ if (httpUrl) {
121
+ return String(httpUrl);
122
+ }
123
+ else {
124
+ const httpScheme = span.attributes[SemanticAttributes.HTTP_SCHEME];
125
+ const httpTarget = span.attributes[SemanticAttributes.HTTP_TARGET];
126
+ if (httpScheme && httpTarget) {
127
+ const httpHost = span.attributes[SemanticAttributes.HTTP_HOST];
128
+ if (httpHost) {
129
+ return `${httpScheme}://${httpHost}${httpTarget}`;
130
+ }
131
+ else {
132
+ const netPeerPort = span.attributes[SemanticAttributes.NET_PEER_PORT];
133
+ if (netPeerPort) {
134
+ const netPeerName = span.attributes[SemanticAttributes.NET_PEER_NAME];
135
+ if (netPeerName) {
136
+ return `${httpScheme}://${netPeerName}:${netPeerPort}${httpTarget}`;
137
+ }
138
+ else {
139
+ const netPeerIp = span.attributes[SemanticAttributes.NET_PEER_IP];
140
+ if (netPeerIp) {
141
+ return `${httpScheme}://${netPeerIp}:${netPeerPort}${httpTarget}`;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ return "";
150
+ }
151
+ function getDependencyTarget(span) {
152
+ const peerService = span.attributes[SemanticAttributes.PEER_SERVICE];
153
+ const httpHost = span.attributes[SemanticAttributes.HTTP_HOST];
154
+ const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];
155
+ const netPeerName = span.attributes[SemanticAttributes.NET_PEER_NAME];
156
+ const netPeerIp = span.attributes[SemanticAttributes.NET_PEER_IP];
157
+ if (peerService) {
158
+ return String(peerService);
159
+ }
160
+ else if (httpHost) {
161
+ return String(httpHost);
162
+ }
163
+ else if (httpUrl) {
164
+ return String(httpUrl);
165
+ }
166
+ else if (netPeerName) {
167
+ return String(netPeerName);
168
+ }
169
+ else if (netPeerIp) {
170
+ return String(netPeerIp);
171
+ }
172
+ return "";
173
+ }
67
174
  function createDependencyData(span) {
68
- const data = {
175
+ const remoteDependencyData = {
69
176
  name: span.name,
70
- id: `|${span.spanContext().traceId}.${span.spanContext().spanId}.`,
71
- success: span.status.code === SpanStatusCode.OK,
72
- resultCode: String(span.status.code),
73
- target: span.attributes[HTTP_URL],
177
+ id: `${span.spanContext().spanId}`,
178
+ success: span.status.code != SpanStatusCode.ERROR,
179
+ resultCode: "0",
74
180
  type: "Dependency",
75
181
  duration: msToTimeSpan(hrTimeToMilliseconds(span.duration)),
76
- version: 1
182
+ version: 2,
77
183
  };
78
- if (span.attributes[HTTP_STATUS_CODE]) {
79
- data.type = "HTTP";
80
- data.resultCode = String(span.attributes[HTTP_STATUS_CODE]);
184
+ if (span.kind === SpanKind.PRODUCER) {
185
+ remoteDependencyData.type = DependencyTypes.QueueMessage;
81
186
  }
82
- if (span.attributes[GRPC_STATUS_CODE] !== undefined) {
83
- data.type = "GRPC";
84
- data.resultCode = String(span.attributes[GRPC_STATUS_CODE]);
187
+ if (span.kind === SpanKind.INTERNAL && span.parentSpanId) {
188
+ remoteDependencyData.type = DependencyTypes.InProc;
85
189
  }
86
- if (span.attributes[GRPC_METHOD]) {
87
- data.target = String(span.attributes[GRPC_METHOD]);
88
- data.data = String(span.attributes[GRPC_METHOD]);
190
+ const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];
191
+ const dbSystem = span.attributes[SemanticAttributes.DB_SYSTEM];
192
+ const rpcSystem = span.attributes[SemanticAttributes.RPC_SYSTEM];
193
+ // HTTP Dependency
194
+ if (httpMethod) {
195
+ const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];
196
+ if (httpUrl) {
197
+ try {
198
+ let dependencyUrl = new URL(String(httpUrl));
199
+ remoteDependencyData.name = `${httpMethod} ${dependencyUrl.pathname}`;
200
+ }
201
+ catch (ex) { }
202
+ }
203
+ remoteDependencyData.type = DependencyTypes.Http;
204
+ remoteDependencyData.data = getUrl(span);
205
+ const httpStatusCode = span.attributes[SemanticAttributes.HTTP_STATUS_CODE];
206
+ if (httpStatusCode) {
207
+ remoteDependencyData.resultCode = String(httpStatusCode);
208
+ }
209
+ let target = getDependencyTarget(span);
210
+ if (target) {
211
+ try {
212
+ // Remove default port
213
+ let portRegex = new RegExp(/(https?)(:\/\/.*)(:\d+)(\S*)/);
214
+ let res = portRegex.exec(target);
215
+ if (res != null) {
216
+ let protocol = res[1];
217
+ let port = res[3];
218
+ if ((protocol == "https" && port == ":443") || (protocol == "http" && port == ":80")) {
219
+ // Drop port
220
+ target = res[1] + res[2] + res[4];
221
+ }
222
+ }
223
+ }
224
+ catch (error) { }
225
+ remoteDependencyData.target = `${target}`;
226
+ }
89
227
  }
90
- if (span.attributes[HTTP_URL]) {
91
- const url = new URL(span.attributes[HTTP_URL]);
92
- data.target = url.hostname;
93
- data.data = url.href;
94
- if (span.attributes[HTTP_METHOD]) {
95
- data.name = `${span.attributes[HTTP_METHOD]} ${url.pathname}`;
228
+ // DB Dependency
229
+ else if (dbSystem) {
230
+ // TODO: Remove special logic when Azure UX supports OpenTelemetry dbSystem
231
+ if (String(dbSystem) === DbSystemValues.MYSQL) {
232
+ remoteDependencyData.type = "mysql";
233
+ }
234
+ else if (String(dbSystem) === DbSystemValues.POSTGRESQL) {
235
+ remoteDependencyData.type = "postgresql";
236
+ }
237
+ else if (String(dbSystem) === DbSystemValues.MONGODB) {
238
+ remoteDependencyData.type = "mongodb";
239
+ }
240
+ else if (String(dbSystem) === DbSystemValues.REDIS) {
241
+ remoteDependencyData.type = "redis";
242
+ }
243
+ else if (isSqlDB(String(dbSystem))) {
244
+ remoteDependencyData.type = "SQL";
245
+ }
246
+ else {
247
+ remoteDependencyData.type = String(dbSystem);
248
+ }
249
+ const dbStatement = span.attributes[SemanticAttributes.DB_STATEMENT];
250
+ const dbOperation = span.attributes[SemanticAttributes.DB_OPERATION];
251
+ if (dbStatement) {
252
+ remoteDependencyData.data = String(dbStatement);
253
+ }
254
+ else if (dbOperation) {
255
+ remoteDependencyData.data = String(dbOperation);
256
+ }
257
+ let target = getDependencyTarget(span);
258
+ const dbName = span.attributes[SemanticAttributes.DB_NAME];
259
+ if (target) {
260
+ remoteDependencyData.target = dbName ? `${target}|${dbName}` : `${target}`;
261
+ }
262
+ else {
263
+ remoteDependencyData.target = dbName ? `${dbName}` : `${dbSystem}`;
96
264
  }
97
265
  }
98
- if (span.attributes[DB_STATEMENT]) {
99
- data.name = String(span.attributes[DB_STATEMENT]);
100
- data.data = String(span.attributes[DB_STATEMENT]);
101
- data.type = "DB";
102
- if (span.attributes[DB_NAME]) {
103
- data.target = String(span.attributes[DB_NAME]);
266
+ // grpc Dependency
267
+ else if (rpcSystem) {
268
+ remoteDependencyData.type = DependencyTypes.Grpc;
269
+ const grpcStatusCode = span.attributes[SemanticAttributes.RPC_GRPC_STATUS_CODE];
270
+ if (grpcStatusCode) {
271
+ remoteDependencyData.resultCode = String(grpcStatusCode);
272
+ }
273
+ let target = getDependencyTarget(span);
274
+ if (target) {
275
+ remoteDependencyData.target = `${target}`;
276
+ }
277
+ else if (rpcSystem) {
278
+ remoteDependencyData.target = String(rpcSystem);
104
279
  }
105
280
  }
106
- return data;
281
+ return remoteDependencyData;
107
282
  }
108
283
  function createRequestData(span) {
109
- const data = {
110
- name: span.name,
111
- id: `|${span.spanContext().traceId}.${span.spanContext().spanId}.`,
112
- success: span.status.code === SpanStatusCode.OK,
113
- responseCode: String(span.status.code),
284
+ const requestData = {
285
+ id: `${span.spanContext().spanId}`,
286
+ success: span.status.code != SpanStatusCode.ERROR,
287
+ responseCode: "0",
114
288
  duration: msToTimeSpan(hrTimeToMilliseconds(span.duration)),
115
- version: 1,
116
- source: undefined
289
+ version: 2,
290
+ source: undefined,
117
291
  };
118
- if (span.attributes[HTTP_METHOD]) {
119
- data.name = span.attributes[HTTP_METHOD];
120
- if (span.attributes[HTTP_STATUS_CODE]) {
121
- data.responseCode = String(span.attributes[HTTP_STATUS_CODE]);
292
+ const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];
293
+ const grpcStatusCode = span.attributes[SemanticAttributes.RPC_GRPC_STATUS_CODE];
294
+ if (httpMethod) {
295
+ requestData.url = getUrl(span);
296
+ const httpStatusCode = span.attributes[SemanticAttributes.HTTP_STATUS_CODE];
297
+ if (httpStatusCode) {
298
+ requestData.responseCode = String(httpStatusCode);
122
299
  }
123
- if (span.attributes[HTTP_URL]) {
124
- data.url = span.attributes[HTTP_URL];
125
- }
126
- if (span.attributes[HTTP_ROUTE]) {
127
- data.name = `${span.attributes[HTTP_METHOD]} ${span.attributes[HTTP_ROUTE]}`;
128
- }
129
- else if (span.attributes[HTTP_URL]) {
130
- const url = new URL(span.attributes[HTTP_URL]);
131
- data.name = `${span.attributes[HTTP_METHOD]} ${url.pathname}`;
132
- }
133
- }
134
- if (span.attributes[GRPC_STATUS_CODE]) {
135
- data.responseCode = String(span.attributes[GRPC_STATUS_CODE]);
136
300
  }
137
- if (span.attributes[GRPC_METHOD]) {
138
- data.url = String(span.attributes[GRPC_METHOD]);
301
+ else if (grpcStatusCode) {
302
+ requestData.responseCode = String(grpcStatusCode);
139
303
  }
140
- return data;
141
- }
142
- function createInProcData(span) {
143
- const data = createDependencyData(span);
144
- data.type = INPROC;
145
- data.success = true;
146
- return data;
304
+ return requestData;
147
305
  }
148
306
  /**
149
307
  * Span to Azure envelope parsing.
@@ -161,6 +319,7 @@ export function readableSpanToEnvelope(span, ikey) {
161
319
  switch (span.kind) {
162
320
  case SpanKind.CLIENT:
163
321
  case SpanKind.PRODUCER:
322
+ case SpanKind.INTERNAL:
164
323
  name = "Microsoft.ApplicationInsights.RemoteDependency";
165
324
  baseType = "RemoteDependencyData";
166
325
  baseData = createDependencyData(span);
@@ -170,26 +329,20 @@ export function readableSpanToEnvelope(span, ikey) {
170
329
  name = "Microsoft.ApplicationInsights.Request";
171
330
  baseType = "RequestData";
172
331
  baseData = createRequestData(span);
173
- break;
174
- case SpanKind.INTERNAL:
175
- baseType = "RemoteDependencyData";
176
- name = "Microsoft.ApplicationInsights.RemoteDependency";
177
- baseData = createInProcData(span);
332
+ baseData.name = tags[KnownContextTagKeys.AiOperationName];
178
333
  break;
179
334
  default:
180
335
  // never
181
336
  diag.error(`Unsupported span kind ${span.kind}`);
182
337
  throw new Error(`Unsupported span kind ${span.kind}`);
183
338
  }
184
- if (span.attributes[AzNamespace] === MicrosoftEventHub) {
185
- parseEventHubSpan(span, baseData);
186
- }
187
- else if (span.attributes[AzNamespace]) {
188
- switch (span.kind) {
189
- case SpanKind.INTERNAL:
190
- baseData.type = `${INPROC} | ${span.attributes[AzNamespace]}`;
191
- break;
192
- default: // no op
339
+ // Azure SDK
340
+ if (span.attributes[AzNamespace]) {
341
+ if (span.kind === SpanKind.INTERNAL) {
342
+ baseData.type = `${DependencyTypes.InProc} | ${span.attributes[AzNamespace]}`;
343
+ }
344
+ if (span.attributes[AzNamespace] === MicrosoftEventHub) {
345
+ parseEventHubSpan(span, baseData);
193
346
  }
194
347
  }
195
348
  return {
@@ -202,8 +355,8 @@ export function readableSpanToEnvelope(span, ikey) {
202
355
  data: {
203
356
  baseType,
204
357
  baseData: Object.assign(Object.assign({}, baseData), { properties,
205
- measurements })
206
- }
358
+ measurements }),
359
+ },
207
360
  };
208
361
  }
209
362
  //# sourceMappingURL=spanUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spanUtils.js","sourceRoot":"","sources":["../../../src/utils/spanUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { URL } from \"url\";\nimport { ReadableSpan } from \"@opentelemetry/tracing\";\nimport { hrTimeToMilliseconds } from \"@opentelemetry/core\";\nimport { diag, SpanKind, SpanStatusCode, Link } from \"@opentelemetry/api\";\nimport { ResourceAttributes } from \"@opentelemetry/semantic-conventions\";\nimport { Tags, Properties, MSLink, Measurements } from \"../types\";\nimport {\n HTTP_METHOD,\n HTTP_ROUTE,\n HTTP_URL,\n HTTP_STATUS_CODE\n} from \"./constants/span/httpAttributes\";\nimport {\n AI_CLOUD_ROLE,\n AI_CLOUD_ROLE_INSTACE,\n AI_OPERATION_ID,\n AI_OPERATION_PARENT_ID,\n AI_OPERATION_NAME,\n MS_LINKS,\n INPROC\n} from \"./constants/applicationinsights\";\nimport { GRPC_METHOD, GRPC_STATUS_CODE } from \"./constants/span/grpcAttributes\";\nimport { msToTimeSpan } from \"./breezeUtils\";\nimport { getInstance } from \"../platform\";\nimport { DB_NAME, DB_STATEMENT } from \"./constants/span/dbAttributes\";\nimport { parseEventHubSpan } from \"./eventhub\";\nimport { AzNamespace, MicrosoftEventHub } from \"./constants/span/azAttributes\";\nimport { RemoteDependencyData, RequestData, TelemetryItem as Envelope } from \"../generated\";\n\nfunction createTagsFromSpan(span: ReadableSpan): Tags {\n const context = getInstance();\n const tags: Tags = { ...context.tags };\n\n tags[AI_OPERATION_ID] = span.spanContext().traceId;\n if (span.parentSpanId) {\n tags[AI_OPERATION_PARENT_ID] = span.parentSpanId;\n }\n if (span.resource && span.resource.attributes) {\n const serviceName = span.resource.attributes[ResourceAttributes.SERVICE_NAME];\n const serviceNamespace = span.resource.attributes[ResourceAttributes.SERVICE_NAMESPACE];\n const serviceInstanceId = span.resource.attributes[ResourceAttributes.SERVICE_INSTANCE_ID];\n if (serviceName) {\n if (serviceNamespace) {\n tags[AI_CLOUD_ROLE] = `${serviceNamespace}.${serviceName}`;\n } else {\n tags[AI_CLOUD_ROLE] = String(serviceName);\n }\n }\n if (serviceInstanceId) {\n tags[AI_CLOUD_ROLE_INSTACE] = String(serviceInstanceId);\n }\n }\n\n // @todo: is this for RequestData only?\n if (\n (span.kind === SpanKind.SERVER || span.kind === SpanKind.CONSUMER) &&\n span.attributes[GRPC_METHOD]\n ) {\n tags[AI_OPERATION_NAME] = String(span.attributes[GRPC_METHOD]);\n }\n if (\n (span.kind === SpanKind.SERVER || span.kind === SpanKind.CONSUMER) &&\n span.attributes[HTTP_METHOD] &&\n span.attributes[HTTP_ROUTE]\n ) {\n tags[AI_OPERATION_NAME] = `${span.attributes[HTTP_METHOD] as string} ${span.attributes[\n HTTP_ROUTE\n ] as string}`;\n }\n return tags;\n}\n\nfunction createPropertiesFromSpan(span: ReadableSpan): [Properties, Measurements] {\n const properties: Properties = {};\n const measurements: Measurements = {};\n\n for (const key of Object.keys(span.attributes)) {\n if (!(key.startsWith(\"http.\") || key.startsWith(\"rpc.\") || key.startsWith(\"db.\"))) {\n properties[key] = span.attributes[key] as string;\n }\n }\n\n const links: MSLink[] = span.links.map((link: Link) => ({\n operation_Id: link.context.traceId,\n id: link.context.spanId\n }));\n\n if (links.length > 0) {\n properties[MS_LINKS] = JSON.stringify(links);\n }\n\n return [properties, measurements];\n}\n\nfunction createDependencyData(span: ReadableSpan): RemoteDependencyData {\n const data: RemoteDependencyData = {\n name: span.name,\n id: `|${span.spanContext().traceId}.${span.spanContext().spanId}.`,\n success: span.status.code === SpanStatusCode.OK,\n resultCode: String(span.status.code),\n target: span.attributes[HTTP_URL] as string | undefined,\n type: \"Dependency\",\n duration: msToTimeSpan(hrTimeToMilliseconds(span.duration)),\n version: 1\n };\n\n if (span.attributes[HTTP_STATUS_CODE]) {\n data.type = \"HTTP\";\n data.resultCode = String(span.attributes[HTTP_STATUS_CODE]);\n }\n\n if (span.attributes[GRPC_STATUS_CODE] !== undefined) {\n data.type = \"GRPC\";\n data.resultCode = String(span.attributes[GRPC_STATUS_CODE]);\n }\n\n if (span.attributes[GRPC_METHOD]) {\n data.target = String(span.attributes[GRPC_METHOD]);\n data.data = String(span.attributes[GRPC_METHOD]);\n }\n\n if (span.attributes[HTTP_URL]) {\n const url = new URL(span.attributes[HTTP_URL] as string);\n data.target = url.hostname;\n data.data = url.href;\n\n if (span.attributes[HTTP_METHOD]) {\n data.name = `${span.attributes[HTTP_METHOD] as string} ${url.pathname}`;\n }\n }\n\n if (span.attributes[DB_STATEMENT]) {\n data.name = String(span.attributes[DB_STATEMENT]);\n data.data = String(span.attributes[DB_STATEMENT]);\n data.type = \"DB\";\n if (span.attributes[DB_NAME]) {\n data.target = String(span.attributes[DB_NAME]);\n }\n }\n\n return data;\n}\n\nfunction createRequestData(span: ReadableSpan): RequestData {\n const data: RequestData = {\n name: span.name,\n id: `|${span.spanContext().traceId}.${span.spanContext().spanId}.`,\n success: span.status.code === SpanStatusCode.OK,\n responseCode: String(span.status.code),\n duration: msToTimeSpan(hrTimeToMilliseconds(span.duration)),\n version: 1,\n source: undefined\n };\n\n if (span.attributes[HTTP_METHOD]) {\n data.name = span.attributes[HTTP_METHOD] as string;\n\n if (span.attributes[HTTP_STATUS_CODE]) {\n data.responseCode = String(span.attributes[HTTP_STATUS_CODE]);\n }\n\n if (span.attributes[HTTP_URL]) {\n data.url = span.attributes[HTTP_URL] as string;\n }\n\n if (span.attributes[HTTP_ROUTE]) {\n data.name = `${span.attributes[HTTP_METHOD] as string} ${span.attributes[\n HTTP_ROUTE\n ] as string}`;\n } else if (span.attributes[HTTP_URL]) {\n const url = new URL(span.attributes[HTTP_URL] as string);\n data.name = `${span.attributes[HTTP_METHOD] as string} ${url.pathname}`;\n }\n }\n\n if (span.attributes[GRPC_STATUS_CODE]) {\n data.responseCode = String(span.attributes[GRPC_STATUS_CODE]);\n }\n if (span.attributes[GRPC_METHOD]) {\n data.url = String(span.attributes[GRPC_METHOD]);\n }\n\n return data;\n}\n\nfunction createInProcData(span: ReadableSpan): RemoteDependencyData {\n const data = createDependencyData(span);\n data.type = INPROC;\n data.success = true;\n return data;\n}\n\n/**\n * Span to Azure envelope parsing.\n * @internal\n */\nexport function readableSpanToEnvelope(span: ReadableSpan, ikey: string): Envelope {\n let name: string;\n let baseType: \"RemoteDependencyData\" | \"RequestData\";\n const sampleRate = 100;\n let baseData: RemoteDependencyData | RequestData;\n\n const time = new Date(hrTimeToMilliseconds(span.startTime));\n const instrumentationKey = ikey;\n const tags = createTagsFromSpan(span);\n const [properties, measurements] = createPropertiesFromSpan(span);\n switch (span.kind) {\n case SpanKind.CLIENT:\n case SpanKind.PRODUCER:\n name = \"Microsoft.ApplicationInsights.RemoteDependency\";\n baseType = \"RemoteDependencyData\";\n baseData = createDependencyData(span);\n break;\n case SpanKind.SERVER:\n case SpanKind.CONSUMER:\n name = \"Microsoft.ApplicationInsights.Request\";\n baseType = \"RequestData\";\n baseData = createRequestData(span);\n break;\n case SpanKind.INTERNAL:\n baseType = \"RemoteDependencyData\";\n name = \"Microsoft.ApplicationInsights.RemoteDependency\";\n baseData = createInProcData(span);\n break;\n default:\n // never\n diag.error(`Unsupported span kind ${span.kind}`);\n throw new Error(`Unsupported span kind ${span.kind}`);\n }\n\n if (span.attributes[AzNamespace] === MicrosoftEventHub) {\n parseEventHubSpan(span, baseData);\n } else if (span.attributes[AzNamespace]) {\n switch (span.kind) {\n case SpanKind.INTERNAL:\n (baseData as RemoteDependencyData).type = `${INPROC} | ${span.attributes[AzNamespace]}`;\n break;\n default: // no op\n }\n }\n\n return {\n name,\n sampleRate,\n time,\n instrumentationKey,\n tags,\n version: 1,\n data: {\n baseType,\n baseData: {\n ...baseData,\n properties,\n measurements\n }\n }\n };\n}\n"]}
1
+ {"version":3,"file":"spanUtils.js","sourceRoot":"","sources":["../../../src/utils/spanUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport os from \"os\";\nimport { URL } from \"url\";\nimport { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { hrTimeToMilliseconds } from \"@opentelemetry/core\";\nimport { diag, SpanKind, SpanStatusCode, Link } from \"@opentelemetry/api\";\nimport {\n SemanticResourceAttributes,\n SemanticAttributes,\n DbSystemValues,\n} from \"@opentelemetry/semantic-conventions\";\n\nimport { Tags, Properties, MSLink, Measurements } from \"../types\";\nimport { msToTimeSpan } from \"./breezeUtils\";\nimport { getInstance } from \"../platform\";\nimport { parseEventHubSpan } from \"./eventhub\";\nimport { DependencyTypes, MS_LINKS } from \"./constants/applicationinsights\";\nimport { AzNamespace, MicrosoftEventHub } from \"./constants/span/azAttributes\";\nimport {\n RemoteDependencyData,\n RequestData,\n TelemetryItem as Envelope,\n KnownContextTagKeys,\n} from \"../generated\";\n\nfunction createTagsFromSpan(span: ReadableSpan): Tags {\n const context = getInstance();\n const tags: Tags = { ...context.tags };\n\n tags[KnownContextTagKeys.AiOperationId] = span.spanContext().traceId;\n if (span.parentSpanId) {\n tags[KnownContextTagKeys.AiOperationParentId] = span.parentSpanId;\n }\n if (span.resource && span.resource.attributes) {\n const serviceName = span.resource.attributes[SemanticResourceAttributes.SERVICE_NAME];\n const serviceNamespace = span.resource.attributes[SemanticResourceAttributes.SERVICE_NAMESPACE];\n if (serviceName) {\n if (serviceNamespace) {\n tags[KnownContextTagKeys.AiCloudRole] = `${serviceNamespace}.${serviceName}`;\n } else {\n tags[KnownContextTagKeys.AiCloudRole] = String(serviceName);\n }\n }\n const serviceInstanceId =\n span.resource.attributes[SemanticResourceAttributes.SERVICE_INSTANCE_ID];\n if (serviceInstanceId) {\n tags[KnownContextTagKeys.AiCloudRoleInstance] = String(serviceInstanceId);\n } else {\n tags[KnownContextTagKeys.AiCloudRoleInstance] = os && os.hostname();\n }\n const endUserId = span.resource.attributes[SemanticAttributes.ENDUSER_ID];\n if (endUserId) {\n tags[KnownContextTagKeys.AiUserId] = String(endUserId);\n }\n }\n if (span.kind === SpanKind.SERVER) {\n const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];\n const httpClientIp = span.attributes[SemanticAttributes.HTTP_CLIENT_IP];\n const netPeerIp = span.attributes[SemanticAttributes.NET_PEER_IP];\n if (httpMethod) {\n const httpRoute = span.attributes[SemanticAttributes.HTTP_ROUTE];\n const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];\n tags[KnownContextTagKeys.AiOperationName] = span.name; // Default\n if (httpRoute) {\n tags[KnownContextTagKeys.AiOperationName] = `${httpMethod as string} ${\n httpRoute as string\n }`;\n } else if (httpUrl) {\n try {\n let url = new URL(String(httpUrl));\n tags[KnownContextTagKeys.AiOperationName] = `${httpMethod} ${url.pathname}`;\n } catch (ex) {}\n }\n if (httpClientIp) {\n tags[KnownContextTagKeys.AiLocationIp] = String(httpClientIp);\n } else if (netPeerIp) {\n tags[KnownContextTagKeys.AiLocationIp] = String(netPeerIp);\n }\n } else {\n tags[KnownContextTagKeys.AiOperationName] = span.name;\n if (netPeerIp) {\n tags[KnownContextTagKeys.AiLocationIp] = String(netPeerIp);\n }\n }\n }\n // TODO: Operation Name and Location IP TBD for non server spans\n\n const httpUserAgent = span.attributes[SemanticAttributes.HTTP_USER_AGENT];\n if (httpUserAgent) {\n // TODO: Not exposed in Swagger, need to update def\n tags[\"ai.user.userAgent\"] = String(httpUserAgent);\n }\n\n return tags;\n}\n\nfunction createPropertiesFromSpan(span: ReadableSpan): [Properties, Measurements] {\n const properties: Properties = {};\n const measurements: Measurements = {};\n\n for (const key of Object.keys(span.attributes)) {\n if (\n !(\n key.startsWith(\"http.\") ||\n key.startsWith(\"rpc.\") ||\n key.startsWith(\"db.\") ||\n key.startsWith(\"peer.\") ||\n key.startsWith(\"net.\")\n )\n ) {\n properties[key] = span.attributes[key] as string;\n }\n }\n\n const links: MSLink[] = span.links.map((link: Link) => ({\n operation_Id: link.context.traceId,\n id: link.context.spanId,\n }));\n\n if (links.length > 0) {\n properties[MS_LINKS] = JSON.stringify(links);\n }\n\n return [properties, measurements];\n}\n\nfunction isSqlDB(dbSystem: string) {\n return (\n dbSystem === DbSystemValues.DB2 ||\n dbSystem === DbSystemValues.DERBY ||\n dbSystem === DbSystemValues.MARIADB ||\n dbSystem === DbSystemValues.MSSQL ||\n dbSystem === DbSystemValues.ORACLE ||\n dbSystem === DbSystemValues.SQLITE ||\n dbSystem === DbSystemValues.OTHER_SQL ||\n dbSystem === DbSystemValues.HSQLDB ||\n dbSystem === DbSystemValues.H2\n );\n}\n\nfunction getUrl(span: ReadableSpan): string {\n const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];\n if (httpMethod) {\n const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];\n if (httpUrl) {\n return String(httpUrl);\n } else {\n const httpScheme = span.attributes[SemanticAttributes.HTTP_SCHEME];\n const httpTarget = span.attributes[SemanticAttributes.HTTP_TARGET];\n if (httpScheme && httpTarget) {\n const httpHost = span.attributes[SemanticAttributes.HTTP_HOST];\n if (httpHost) {\n return `${httpScheme}://${httpHost}${httpTarget}`;\n } else {\n const netPeerPort = span.attributes[SemanticAttributes.NET_PEER_PORT];\n if (netPeerPort) {\n const netPeerName = span.attributes[SemanticAttributes.NET_PEER_NAME];\n if (netPeerName) {\n return `${httpScheme}://${netPeerName}:${netPeerPort}${httpTarget}`;\n } else {\n const netPeerIp = span.attributes[SemanticAttributes.NET_PEER_IP];\n if (netPeerIp) {\n return `${httpScheme}://${netPeerIp}:${netPeerPort}${httpTarget}`;\n }\n }\n }\n }\n }\n }\n }\n return \"\";\n}\n\nfunction getDependencyTarget(span: ReadableSpan): string {\n const peerService = span.attributes[SemanticAttributes.PEER_SERVICE];\n const httpHost = span.attributes[SemanticAttributes.HTTP_HOST];\n const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];\n const netPeerName = span.attributes[SemanticAttributes.NET_PEER_NAME];\n const netPeerIp = span.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\nfunction createDependencyData(span: ReadableSpan): RemoteDependencyData {\n const remoteDependencyData: RemoteDependencyData = {\n name: span.name, //Default\n id: `${span.spanContext().spanId}`,\n success: span.status.code != SpanStatusCode.ERROR,\n resultCode: \"0\",\n type: \"Dependency\",\n duration: msToTimeSpan(hrTimeToMilliseconds(span.duration)),\n version: 2,\n };\n if (span.kind === SpanKind.PRODUCER) {\n remoteDependencyData.type = DependencyTypes.QueueMessage;\n }\n if (span.kind === SpanKind.INTERNAL && span.parentSpanId) {\n remoteDependencyData.type = DependencyTypes.InProc;\n }\n\n const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];\n const dbSystem = span.attributes[SemanticAttributes.DB_SYSTEM];\n const rpcSystem = span.attributes[SemanticAttributes.RPC_SYSTEM];\n // HTTP Dependency\n if (httpMethod) {\n const httpUrl = span.attributes[SemanticAttributes.HTTP_URL];\n if (httpUrl) {\n try {\n let dependencyUrl = new URL(String(httpUrl));\n remoteDependencyData.name = `${httpMethod} ${dependencyUrl.pathname}`;\n } catch (ex) {}\n }\n remoteDependencyData.type = DependencyTypes.Http;\n remoteDependencyData.data = getUrl(span);\n const httpStatusCode = span.attributes[SemanticAttributes.HTTP_STATUS_CODE];\n if (httpStatusCode) {\n remoteDependencyData.resultCode = String(httpStatusCode);\n }\n let target = getDependencyTarget(span);\n if (target) {\n try {\n // Remove default port\n let portRegex = new RegExp(/(https?)(:\\/\\/.*)(:\\d+)(\\S*)/);\n let res = portRegex.exec(target);\n if (res != null) {\n let protocol = res[1];\n let port = res[3];\n if ((protocol == \"https\" && port == \":443\") || (protocol == \"http\" && port == \":80\")) {\n // Drop port\n target = res[1] + res[2] + res[4];\n }\n }\n } catch (error) {}\n remoteDependencyData.target = `${target}`;\n }\n }\n // DB Dependency\n else if (dbSystem) {\n // TODO: Remove special logic when Azure UX supports OpenTelemetry dbSystem\n if (String(dbSystem) === DbSystemValues.MYSQL) {\n remoteDependencyData.type = \"mysql\";\n } else if (String(dbSystem) === DbSystemValues.POSTGRESQL) {\n remoteDependencyData.type = \"postgresql\";\n } else if (String(dbSystem) === DbSystemValues.MONGODB) {\n remoteDependencyData.type = \"mongodb\";\n } else if (String(dbSystem) === DbSystemValues.REDIS) {\n remoteDependencyData.type = \"redis\";\n } else if (isSqlDB(String(dbSystem))) {\n remoteDependencyData.type = \"SQL\";\n } else {\n remoteDependencyData.type = String(dbSystem);\n }\n const dbStatement = span.attributes[SemanticAttributes.DB_STATEMENT];\n const dbOperation = span.attributes[SemanticAttributes.DB_OPERATION];\n if (dbStatement) {\n remoteDependencyData.data = String(dbStatement);\n } else if (dbOperation) {\n remoteDependencyData.data = String(dbOperation);\n }\n let target = getDependencyTarget(span);\n const dbName = span.attributes[SemanticAttributes.DB_NAME];\n if (target) {\n remoteDependencyData.target = dbName ? `${target}|${dbName}` : `${target}`;\n } else {\n remoteDependencyData.target = dbName ? `${dbName}` : `${dbSystem}`;\n }\n }\n // grpc Dependency\n else if (rpcSystem) {\n remoteDependencyData.type = DependencyTypes.Grpc;\n const grpcStatusCode = span.attributes[SemanticAttributes.RPC_GRPC_STATUS_CODE];\n if (grpcStatusCode) {\n remoteDependencyData.resultCode = String(grpcStatusCode);\n }\n let target = getDependencyTarget(span);\n if (target) {\n remoteDependencyData.target = `${target}`;\n } else if (rpcSystem) {\n remoteDependencyData.target = String(rpcSystem);\n }\n }\n return remoteDependencyData;\n}\n\nfunction createRequestData(span: ReadableSpan): RequestData {\n const requestData: RequestData = {\n id: `${span.spanContext().spanId}`,\n success: span.status.code != SpanStatusCode.ERROR,\n responseCode: \"0\",\n duration: msToTimeSpan(hrTimeToMilliseconds(span.duration)),\n version: 2,\n source: undefined,\n };\n const httpMethod = span.attributes[SemanticAttributes.HTTP_METHOD];\n const grpcStatusCode = span.attributes[SemanticAttributes.RPC_GRPC_STATUS_CODE];\n if (httpMethod) {\n requestData.url = getUrl(span);\n const httpStatusCode = span.attributes[SemanticAttributes.HTTP_STATUS_CODE];\n if (httpStatusCode) {\n requestData.responseCode = String(httpStatusCode);\n }\n } else if (grpcStatusCode) {\n requestData.responseCode = String(grpcStatusCode);\n }\n return requestData;\n}\n\n/**\n * Span to Azure envelope parsing.\n * @internal\n */\nexport function readableSpanToEnvelope(span: ReadableSpan, ikey: string): Envelope {\n let name: string;\n let baseType: \"RemoteDependencyData\" | \"RequestData\";\n const sampleRate = 100;\n let baseData: RemoteDependencyData | RequestData;\n\n const time = new Date(hrTimeToMilliseconds(span.startTime));\n const instrumentationKey = ikey;\n const tags = createTagsFromSpan(span);\n const [properties, measurements] = createPropertiesFromSpan(span);\n switch (span.kind) {\n case SpanKind.CLIENT:\n case SpanKind.PRODUCER:\n case SpanKind.INTERNAL:\n name = \"Microsoft.ApplicationInsights.RemoteDependency\";\n baseType = \"RemoteDependencyData\";\n baseData = createDependencyData(span);\n break;\n case SpanKind.SERVER:\n case SpanKind.CONSUMER:\n name = \"Microsoft.ApplicationInsights.Request\";\n baseType = \"RequestData\";\n baseData = createRequestData(span);\n baseData.name = tags[KnownContextTagKeys.AiOperationName];\n break;\n default:\n // never\n diag.error(`Unsupported span kind ${span.kind}`);\n throw new Error(`Unsupported span kind ${span.kind}`);\n }\n\n // Azure SDK\n if (span.attributes[AzNamespace]) {\n if (span.kind === SpanKind.INTERNAL) {\n baseData.type = `${DependencyTypes.InProc} | ${span.attributes[AzNamespace]}`;\n }\n if (span.attributes[AzNamespace] === MicrosoftEventHub) {\n parseEventHubSpan(span, baseData);\n }\n }\n\n return {\n name,\n sampleRate,\n time,\n instrumentationKey,\n tags,\n version: 1,\n data: {\n baseType,\n baseData: {\n ...baseData,\n properties,\n measurements,\n },\n },\n };\n}\n"]}