@fluidframework/telemetry-utils 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606

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 (79) hide show
  1. package/dist/config.d.ts +1 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +4 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/error.d.ts +1 -1
  6. package/dist/error.d.ts.map +1 -1
  7. package/dist/error.js.map +1 -1
  8. package/dist/errorLogging.d.ts +1 -1
  9. package/dist/errorLogging.d.ts.map +1 -1
  10. package/dist/errorLogging.js.map +1 -1
  11. package/dist/eventEmitterWithErrorHandling.d.ts +1 -1
  12. package/dist/eventEmitterWithErrorHandling.d.ts.map +1 -1
  13. package/dist/eventEmitterWithErrorHandling.js +2 -2
  14. package/dist/eventEmitterWithErrorHandling.js.map +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/logger.d.ts +2 -2
  19. package/dist/logger.d.ts.map +1 -1
  20. package/dist/logger.js +1 -1
  21. package/dist/logger.js.map +1 -1
  22. package/dist/mockLogger.d.ts.map +1 -1
  23. package/dist/mockLogger.js.map +1 -1
  24. package/dist/sampledTelemetryHelper.d.ts +2 -2
  25. package/dist/sampledTelemetryHelper.d.ts.map +1 -1
  26. package/dist/sampledTelemetryHelper.js.map +1 -1
  27. package/dist/utils.d.ts +4 -0
  28. package/dist/utils.d.ts.map +1 -1
  29. package/dist/utils.js +4 -0
  30. package/dist/utils.js.map +1 -1
  31. package/lib/config.d.ts +1 -1
  32. package/lib/config.d.ts.map +1 -1
  33. package/lib/config.js +4 -0
  34. package/lib/config.js.map +1 -1
  35. package/lib/error.d.ts +1 -1
  36. package/lib/error.d.ts.map +1 -1
  37. package/lib/error.js.map +1 -1
  38. package/lib/errorLogging.d.ts +1 -1
  39. package/lib/errorLogging.d.ts.map +1 -1
  40. package/lib/errorLogging.js.map +1 -1
  41. package/lib/eventEmitterWithErrorHandling.d.ts +1 -1
  42. package/lib/eventEmitterWithErrorHandling.d.ts.map +1 -1
  43. package/lib/eventEmitterWithErrorHandling.js.map +1 -1
  44. package/lib/index.d.ts.map +1 -1
  45. package/lib/index.js.map +1 -1
  46. package/lib/logger.d.ts +2 -2
  47. package/lib/logger.d.ts.map +1 -1
  48. package/lib/logger.js +2 -2
  49. package/lib/logger.js.map +1 -1
  50. package/lib/mockLogger.d.ts.map +1 -1
  51. package/lib/mockLogger.js.map +1 -1
  52. package/lib/sampledTelemetryHelper.d.ts +2 -2
  53. package/lib/sampledTelemetryHelper.d.ts.map +1 -1
  54. package/lib/sampledTelemetryHelper.js.map +1 -1
  55. package/lib/test/errorLogging.spec.js +2 -2
  56. package/lib/test/errorLogging.spec.js.map +1 -1
  57. package/lib/test/errorTypeLoggingTest.spec.js +2 -2
  58. package/lib/test/errorTypeLoggingTest.spec.js.map +1 -1
  59. package/lib/test/performanceEvent.spec.js +1 -1
  60. package/lib/test/performanceEvent.spec.js.map +1 -1
  61. package/lib/test/sampledTelemetryHelper.spec.js.map +1 -1
  62. package/lib/test/telemetryLogger.spec.js.map +1 -1
  63. package/lib/test/thresholdCounter.spec.js.map +1 -1
  64. package/lib/test/utils.spec.js +2 -2
  65. package/lib/test/utils.spec.js.map +1 -1
  66. package/lib/utils.d.ts +4 -0
  67. package/lib/utils.d.ts.map +1 -1
  68. package/lib/utils.js +4 -0
  69. package/lib/utils.js.map +1 -1
  70. package/package.json +13 -10
  71. package/src/config.ts +3 -2
  72. package/src/error.ts +1 -1
  73. package/src/errorLogging.ts +3 -3
  74. package/src/eventEmitterWithErrorHandling.ts +2 -1
  75. package/src/index.ts +1 -0
  76. package/src/logger.ts +6 -6
  77. package/src/mockLogger.ts +1 -1
  78. package/src/sampledTelemetryHelper.ts +2 -2
  79. package/src/utils.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"errorTypeLoggingTest.spec.js","sourceRoot":"","sources":["../../src/test/errorTypeLoggingTest.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { FluidErrorTypes } from \"@fluidframework/core-interfaces\";\nimport { GenericError, DataCorruptionError } from \"../error.js\";\nimport { MockLogger } from \"../mockLogger.js\";\nimport { createChildLogger } from \"../logger.js\";\n\ndescribe(\"Check if the errorType field matches after sending/receiving via Container error classes\", () => {\n\t// In all tests below, the `stack` prop will be left out of validation because it is difficult to properly\n\t// mock a stack for a mocked error.\n\tlet mockLogger: MockLogger;\n\tbeforeEach(() => {\n\t\tmockLogger = new MockLogger();\n\t});\n\n\tdescribe(\"Send and receive GenericError instances\", () => {\n\t\tit(\"Send and receive a GenericError with no attached error.\", () => {\n\t\t\tconst testError = new GenericError(\"genericError\");\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\t// Dangling error objects of any type will be ignored (see constructor):\n\t\tit(\"Send and receive a GenericError with a dangling error of any type.\", () => {\n\t\t\tconst testError = new GenericError(\"genericError\", \"placeholder\");\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t\tit(\"Send and receive a GenericError with a dangling error of object type.\", () => {\n\t\t\tconst testErrorObj = new Error(\"some error\");\n\t\t\tconst testError = new GenericError(\"genericError\", testErrorObj);\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Send and receive DataCorruptionError instances\", () => {\n\t\tit(\"Send and receive a DataCorruptionError.\", () => {\n\t\t\tconst testError = new DataCorruptionError(\"dataCorruptionError\", {\n\t\t\t\tclientId: \"clientId\",\n\t\t\t\tsequenceNumber: 0,\n\t\t\t\tmessage1: \"message1\",\n\t\t\t\tmessage2: \"message2\",\n\t\t\t\texampleExtraTelemetryProp: \"exampleExtraTelemetryProp\",\n\t\t\t});\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"dataCorruptionError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.dataCorruptionError,\n\t\t\t\t\t\terror: \"dataCorruptionError\",\n\t\t\t\t\t\tclientId: \"clientId\",\n\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\tmessage1: \"message1\",\n\t\t\t\t\t\tmessage2: \"message2\",\n\t\t\t\t\t\texampleExtraTelemetryProp: \"exampleExtraTelemetryProp\",\n\t\t\t\t\t\tdataProcessingError: 1,\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Send errors using a logger from createChildLogger\", () => {\n\t\tit(\"Send and receive a GenericError.\", () => {\n\t\t\tconst childLogger = createChildLogger({\n\t\t\t\tlogger: mockLogger,\n\t\t\t\tnamespace: \"errorTypeTestNamespace\",\n\t\t\t});\n\t\t\tconst testError = new GenericError(\"genericError\");\n\t\t\tchildLogger.sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"errorTypeTestNamespace:A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"errorTypeLoggingTest.spec.js","sourceRoot":"","sources":["../../src/test/errorTypeLoggingTest.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { FluidErrorTypes } from \"@fluidframework/core-interfaces\";\nimport { DataCorruptionError, GenericError } from \"../error.js\";\nimport { createChildLogger } from \"../logger.js\";\nimport { MockLogger } from \"../mockLogger.js\";\n\ndescribe(\"Check if the errorType field matches after sending/receiving via Container error classes\", () => {\n\t// In all tests below, the `stack` prop will be left out of validation because it is difficult to properly\n\t// mock a stack for a mocked error.\n\tlet mockLogger: MockLogger;\n\tbeforeEach(() => {\n\t\tmockLogger = new MockLogger();\n\t});\n\n\tdescribe(\"Send and receive GenericError instances\", () => {\n\t\tit(\"Send and receive a GenericError with no attached error.\", () => {\n\t\t\tconst testError = new GenericError(\"genericError\");\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\t// Dangling error objects of any type will be ignored (see constructor):\n\t\tit(\"Send and receive a GenericError with a dangling error of any type.\", () => {\n\t\t\tconst testError = new GenericError(\"genericError\", \"placeholder\");\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t\tit(\"Send and receive a GenericError with a dangling error of object type.\", () => {\n\t\t\tconst testErrorObj = new Error(\"some error\");\n\t\t\tconst testError = new GenericError(\"genericError\", testErrorObj);\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Send and receive DataCorruptionError instances\", () => {\n\t\tit(\"Send and receive a DataCorruptionError.\", () => {\n\t\t\tconst testError = new DataCorruptionError(\"dataCorruptionError\", {\n\t\t\t\tclientId: \"clientId\",\n\t\t\t\tsequenceNumber: 0,\n\t\t\t\tmessage1: \"message1\",\n\t\t\t\tmessage2: \"message2\",\n\t\t\t\texampleExtraTelemetryProp: \"exampleExtraTelemetryProp\",\n\t\t\t});\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"dataCorruptionError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.dataCorruptionError,\n\t\t\t\t\t\terror: \"dataCorruptionError\",\n\t\t\t\t\t\tclientId: \"clientId\",\n\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\tmessage1: \"message1\",\n\t\t\t\t\t\tmessage2: \"message2\",\n\t\t\t\t\t\texampleExtraTelemetryProp: \"exampleExtraTelemetryProp\",\n\t\t\t\t\t\tdataProcessingError: 1,\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Send errors using a logger from createChildLogger\", () => {\n\t\tit(\"Send and receive a GenericError.\", () => {\n\t\t\tconst childLogger = createChildLogger({\n\t\t\t\tlogger: mockLogger,\n\t\t\t\tnamespace: \"errorTypeTestNamespace\",\n\t\t\t});\n\t\t\tconst testError = new GenericError(\"genericError\");\n\t\t\tchildLogger.sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"errorTypeTestNamespace:A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "node:assert";
6
- import { TelemetryLogger, PerformanceEvent } from "../logger.js";
6
+ import { PerformanceEvent, TelemetryLogger } from "../logger.js";
7
7
  class MockLogger extends TelemetryLogger {
8
8
  constructor() {
9
9
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"performanceEvent.spec.js","sourceRoot":"","sources":["../../src/test/performanceEvent.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport { TelemetryLogger, PerformanceEvent } from \"../logger.js\";\nimport { ITelemetryLoggerExt } from \"../telemetryTypes.js\";\n\nclass MockLogger extends TelemetryLogger implements ITelemetryLoggerExt {\n\tpublic errorsLogged: number = 0;\n\tpublic eventsLogged: number = 0;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tif (event.category === \"error\") {\n\t\t\t++this.errorsLogged;\n\t\t}\n\n\t\t++this.eventsLogged;\n\t}\n}\n\ndescribe(\"PerformanceEvent\", () => {\n\tlet logger: MockLogger;\n\tlet callbackCalls = 0;\n\n\tconst callback = (): void => {\n\t\tcallbackCalls++;\n\t};\n\tconst asyncCallback = async (event: PerformanceEvent): Promise<string | void> => {\n\t\tconst outerPromise: Promise<string> = new Promise((resolve, reject) => {\n\t\t\tPromise.resolve(\"A\")\n\t\t\t\t.finally(() => {\n\t\t\t\t\treject(new Error(\"B\"));\n\t\t\t\t})\n\t\t\t\t.then((val) => {\n\t\t\t\t\tevent.end({ val });\n\t\t\t\t\tresolve(\"C\");\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t});\n\n\t\tcallbackCalls++;\n\t\treturn outerPromise.catch(() => {});\n\t};\n\n\tbeforeEach(() => {\n\t\tcallbackCalls = 0;\n\t\tlogger = new MockLogger();\n\t});\n\n\tit(\"Cancel then End\", async () => {\n\t\tawait PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{ eventName: \"Testing\" },\n\t\t\tasyncCallback,\n\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\ttrue,\n\t\t);\n\t\tassert.equal(logger.errorsLogged, 0, \"Shouldn't have logged any errors\");\n\t});\n\n\tdescribe(\"Event sampling\", () => {\n\t\tit(\"Events are logged at least once\", async () => {\n\t\t\tawait PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingAsyncOnce\" },\n\t\t\t\tasyncCallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\ttrue,\n\t\t\t\t100, // sampleThreshold\n\t\t\t);\n\n\t\t\tPerformanceEvent.timedExec(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingSyncOnce\" },\n\t\t\t\tcallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t100, // sampleThreshold\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 2);\n\t\t\tassert.equal(logger.eventsLogged, 4);\n\t\t});\n\n\t\tit(\"No sampling by default\", async () => {\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from({ length: 100 }).map(async (_) =>\n\t\t\t\t\tPerformanceEvent.timedExecAsync(\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t{ eventName: \"TestingAsync\" },\n\t\t\t\t\t\tasyncCallback,\n\t\t\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tArray.from({ length: 100 }).map((_) =>\n\t\t\t\tPerformanceEvent.timedExec(logger, { eventName: \"TestingSync\" }, callback, {\n\t\t\t\t\tstart: true,\n\t\t\t\t\tend: true,\n\t\t\t\t\tcancel: \"generic\",\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 200);\n\t\t\tassert.equal(logger.eventsLogged, 200 * 2);\n\t\t});\n\n\t\tit(\"Sampling for async\", async () => {\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from({ length: 100 }).map(async (_) =>\n\t\t\t\t\tPerformanceEvent.timedExecAsync(\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t{ eventName: \"TestingAsync\" },\n\t\t\t\t\t\tasyncCallback,\n\t\t\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t20, // sampleThreshold\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 100);\n\t\t\tassert.equal(\n\t\t\t\tlogger.eventsLogged,\n\t\t\t\t10,\n\t\t\t\t\"With sampling threshold of 20, expecting 100 calls to produce 10 events (5 start, 5 cancel)\",\n\t\t\t);\n\n\t\t\t// Event with a different category gets logged\n\t\t\tawait PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingAsync\", category: \"error\" },\n\t\t\t\tasyncCallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\ttrue,\n\t\t\t\t20, // sampleThreshold\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 101);\n\t\t\tassert.equal(logger.eventsLogged, 12, \"Expecting two extra events\");\n\t\t});\n\n\t\tit(\"Sampling for sync\", async () => {\n\t\t\tArray.from({ length: 100 }).map((_) =>\n\t\t\t\tPerformanceEvent.timedExec(\n\t\t\t\t\tlogger,\n\t\t\t\t\t{ eventName: \"TestingSync\" },\n\t\t\t\t\tcallback,\n\t\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t\t20, // sampleThreshold\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 100);\n\t\t\tassert.equal(\n\t\t\t\tlogger.eventsLogged,\n\t\t\t\t10,\n\t\t\t\t\"With sampling threshold of 20, expecting 100 calls to produce 10 events (5 start, 5 cancel)\",\n\t\t\t);\n\n\t\t\t// Event with a different category gets logged\n\t\t\tPerformanceEvent.timedExec(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingSync\", category: \"error\" },\n\t\t\t\tcallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t20, // sampleThreshold\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 101);\n\t\t\tassert.equal(logger.eventsLogged, 12, \"Expecting two extra events\");\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"performanceEvent.spec.js","sourceRoot":"","sources":["../../src/test/performanceEvent.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGjE,MAAM,UAAW,SAAQ,eAAe;IAIvC;QACC,KAAK,EAAE,CAAC;QAJF,iBAAY,GAAW,CAAC,CAAC;QACzB,iBAAY,GAAW,CAAC,CAAC;IAIhC,CAAC;IAED,IAAI,CAAC,KAA0B;QAC9B,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE;YAC/B,EAAE,IAAI,CAAC,YAAY,CAAC;SACpB;QAED,EAAE,IAAI,CAAC,YAAY,CAAC;IACrB,CAAC;CACD;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,IAAI,MAAkB,CAAC;IACvB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC3B,aAAa,EAAE,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,KAAK,EAAE,KAAuB,EAA0B,EAAE;QAC/E,MAAM,YAAY,GAAoB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;iBAClB,OAAO,CAAC,GAAG,EAAE;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,aAAa,EAAE,CAAC;QAChB,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACf,aAAa,GAAG,CAAC,CAAC;QAClB,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,gBAAgB,CAAC,cAAc,CACpC,MAAM,EACN,EAAE,SAAS,EAAE,SAAS,EAAE,EACxB,aAAa,EACb,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,IAAI,CACJ,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,gBAAgB,CAAC,cAAc,CACpC,MAAM,EACN,EAAE,SAAS,EAAE,kBAAkB,EAAE,EACjC,aAAa,EACb,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,IAAI,EACJ,GAAG,CACH,CAAC;YAEF,gBAAgB,CAAC,SAAS,CACzB,MAAM,EACN,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAChC,QAAQ,EACR,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,GAAG,CACH,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAC3C,gBAAgB,CAAC,cAAc,CAC9B,MAAM,EACN,EAAE,SAAS,EAAE,cAAc,EAAE,EAC7B,aAAa,EACb,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,IAAI,CACJ,CACD,CACD,CAAC;YAEF,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE;gBAC1E,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,IAAI;gBACT,MAAM,EAAE,SAAS;aACjB,CAAC,CACF,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YACnC,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAC3C,gBAAgB,CAAC,cAAc,CAC9B,MAAM,EACN,EAAE,SAAS,EAAE,cAAc,EAAE,EAC7B,aAAa,EACb,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,IAAI,EACJ,EAAE,CACF,CACD,CACD,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,YAAY,EACnB,EAAE,EACF,6FAA6F,CAC7F,CAAC;YAEF,8CAA8C;YAC9C,MAAM,gBAAgB,CAAC,cAAc,CACpC,MAAM,EACN,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,EAChD,aAAa,EACb,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,IAAI,EACJ,EAAE,CACF,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,4BAA4B,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,gBAAgB,CAAC,SAAS,CACzB,MAAM,EACN,EAAE,SAAS,EAAE,aAAa,EAAE,EAC5B,QAAQ,EACR,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,EAAE,CACF,CACD,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,YAAY,EACnB,EAAE,EACF,6FAA6F,CAC7F,CAAC;YAEF,8CAA8C;YAC9C,gBAAgB,CAAC,SAAS,CACzB,MAAM,EACN,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC/C,QAAQ,EACR,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAC7C,EAAE,CACF,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,4BAA4B,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport { PerformanceEvent, TelemetryLogger } from \"../logger.js\";\nimport { ITelemetryLoggerExt } from \"../telemetryTypes.js\";\n\nclass MockLogger extends TelemetryLogger implements ITelemetryLoggerExt {\n\tpublic errorsLogged: number = 0;\n\tpublic eventsLogged: number = 0;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tif (event.category === \"error\") {\n\t\t\t++this.errorsLogged;\n\t\t}\n\n\t\t++this.eventsLogged;\n\t}\n}\n\ndescribe(\"PerformanceEvent\", () => {\n\tlet logger: MockLogger;\n\tlet callbackCalls = 0;\n\n\tconst callback = (): void => {\n\t\tcallbackCalls++;\n\t};\n\tconst asyncCallback = async (event: PerformanceEvent): Promise<string | void> => {\n\t\tconst outerPromise: Promise<string> = new Promise((resolve, reject) => {\n\t\t\tPromise.resolve(\"A\")\n\t\t\t\t.finally(() => {\n\t\t\t\t\treject(new Error(\"B\"));\n\t\t\t\t})\n\t\t\t\t.then((val) => {\n\t\t\t\t\tevent.end({ val });\n\t\t\t\t\tresolve(\"C\");\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t});\n\n\t\tcallbackCalls++;\n\t\treturn outerPromise.catch(() => {});\n\t};\n\n\tbeforeEach(() => {\n\t\tcallbackCalls = 0;\n\t\tlogger = new MockLogger();\n\t});\n\n\tit(\"Cancel then End\", async () => {\n\t\tawait PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{ eventName: \"Testing\" },\n\t\t\tasyncCallback,\n\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\ttrue,\n\t\t);\n\t\tassert.equal(logger.errorsLogged, 0, \"Shouldn't have logged any errors\");\n\t});\n\n\tdescribe(\"Event sampling\", () => {\n\t\tit(\"Events are logged at least once\", async () => {\n\t\t\tawait PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingAsyncOnce\" },\n\t\t\t\tasyncCallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\ttrue,\n\t\t\t\t100, // sampleThreshold\n\t\t\t);\n\n\t\t\tPerformanceEvent.timedExec(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingSyncOnce\" },\n\t\t\t\tcallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t100, // sampleThreshold\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 2);\n\t\t\tassert.equal(logger.eventsLogged, 4);\n\t\t});\n\n\t\tit(\"No sampling by default\", async () => {\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from({ length: 100 }).map(async (_) =>\n\t\t\t\t\tPerformanceEvent.timedExecAsync(\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t{ eventName: \"TestingAsync\" },\n\t\t\t\t\t\tasyncCallback,\n\t\t\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tArray.from({ length: 100 }).map((_) =>\n\t\t\t\tPerformanceEvent.timedExec(logger, { eventName: \"TestingSync\" }, callback, {\n\t\t\t\t\tstart: true,\n\t\t\t\t\tend: true,\n\t\t\t\t\tcancel: \"generic\",\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 200);\n\t\t\tassert.equal(logger.eventsLogged, 200 * 2);\n\t\t});\n\n\t\tit(\"Sampling for async\", async () => {\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from({ length: 100 }).map(async (_) =>\n\t\t\t\t\tPerformanceEvent.timedExecAsync(\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t{ eventName: \"TestingAsync\" },\n\t\t\t\t\t\tasyncCallback,\n\t\t\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t20, // sampleThreshold\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 100);\n\t\t\tassert.equal(\n\t\t\t\tlogger.eventsLogged,\n\t\t\t\t10,\n\t\t\t\t\"With sampling threshold of 20, expecting 100 calls to produce 10 events (5 start, 5 cancel)\",\n\t\t\t);\n\n\t\t\t// Event with a different category gets logged\n\t\t\tawait PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingAsync\", category: \"error\" },\n\t\t\t\tasyncCallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\ttrue,\n\t\t\t\t20, // sampleThreshold\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 101);\n\t\t\tassert.equal(logger.eventsLogged, 12, \"Expecting two extra events\");\n\t\t});\n\n\t\tit(\"Sampling for sync\", async () => {\n\t\t\tArray.from({ length: 100 }).map((_) =>\n\t\t\t\tPerformanceEvent.timedExec(\n\t\t\t\t\tlogger,\n\t\t\t\t\t{ eventName: \"TestingSync\" },\n\t\t\t\t\tcallback,\n\t\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t\t20, // sampleThreshold\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 100);\n\t\t\tassert.equal(\n\t\t\t\tlogger.eventsLogged,\n\t\t\t\t10,\n\t\t\t\t\"With sampling threshold of 20, expecting 100 calls to produce 10 events (5 start, 5 cancel)\",\n\t\t\t);\n\n\t\t\t// Event with a different category gets logged\n\t\t\tPerformanceEvent.timedExec(\n\t\t\t\tlogger,\n\t\t\t\t{ eventName: \"TestingSync\", category: \"error\" },\n\t\t\t\tcallback,\n\t\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t\t\t20, // sampleThreshold\n\t\t\t);\n\n\t\t\tassert.equal(callbackCalls, 101);\n\t\t\tassert.equal(logger.eventsLogged, 12, \"Expecting two extra events\");\n\t\t});\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sampledTelemetryHelper.spec.js","sourceRoot":"","sources":["../../src/test/sampledTelemetryHelper.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"node:assert\";\nimport type {\n\tITelemetryBaseEvent,\n\tITelemetryBaseProperties,\n} from \"@fluidframework/core-interfaces\";\n\nimport { SampledTelemetryHelper } from \"../sampledTelemetryHelper.js\";\nimport {\n\tITelemetryLoggerExt,\n\ttype ITelemetryErrorEventExt,\n\ttype ITelemetryPerformanceEventExt,\n\ttype ITelemetryGenericEventExt,\n} from \"../telemetryTypes.js\";\n\n/**\n * Test logger with only the necessary functionality used by the SampledTelemetryHelper\n * so we can test it.\n */\nclass TestLogger implements ITelemetryLoggerExt {\n\tpublic events: ITelemetryPerformanceEventExt[] = [];\n\n\tsendPerformanceEvent(event: ITelemetryPerformanceEventExt, error?: unknown): void {\n\t\tthis.events.push(event);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\tsendTelemetryEvent(event: ITelemetryGenericEventExt, error?: unknown): void {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\tsendErrorEvent(event: ITelemetryErrorEventExt, error?: unknown): void {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\tsupportsTags?: true | undefined;\n}\n\nconst standardEventProperties = [\"eventName\", \"duration\", \"count\"];\nconst aggregateProperties = [\"totalDuration\", \"minDuration\", \"maxDuration\"];\n\ndescribe(\"SampledTelemetryHelper\", () => {\n\tlet logger: TestLogger;\n\n\tbeforeEach(() => {\n\t\tlogger = new TestLogger();\n\t});\n\n\tit(\"only writes event after correct number of samples\", () => {\n\t\tconst sampling = 10;\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, sampling);\n\t\tfor (let i = 0; i < sampling - 1; i++) {\n\t\t\thelper.measure(() => {});\n\t\t}\n\t\tassert.strictEqual(logger.events.length, 0);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\n\t\t// Again to make sure the internal counter is reset correctly\n\t\tfor (let i = 0; i < sampling - 1; i++) {\n\t\t\thelper.measure(() => {});\n\t\t}\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 2);\n\t});\n\n\tit(\"does not include aggregate properties when it shouldn't\", () => {\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, 1, false);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(event, standardEventProperties, true);\n\t\tassert.strictEqual(event.count, 1);\n\t});\n\n\tit(\"includes aggregate properties when it should\", () => {\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, 1, true);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(event, [...standardEventProperties, ...aggregateProperties], true);\n\t\tassert.strictEqual(event.count, 1);\n\t});\n\n\tit(\"includes properties from base event when no aggregate properties are included\", () => {\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\", myProp: \"myValue\" },\n\t\t\tlogger,\n\t\t\t1,\n\t\t\tfalse,\n\t\t);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(event, [...standardEventProperties, \"myProp\"], true);\n\t\tassert.strictEqual(event.count, 1);\n\t\tassert.strictEqual(event.myProp, \"myValue\");\n\t});\n\n\tit(\"includes properties from base event when aggregate properties are included\", () => {\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\", myProp: \"myValue\" },\n\t\t\tlogger,\n\t\t\t1,\n\t\t\ttrue,\n\t\t);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(\n\t\t\tevent,\n\t\t\t[...standardEventProperties, ...aggregateProperties, \"myProp\"],\n\t\t\ttrue,\n\t\t);\n\t\tassert.strictEqual(event.count, 1);\n\t\tassert.strictEqual(event.myProp, \"myValue\");\n\t});\n\n\tit(\"tracks buckets separately and includes per-bucket properties\", () => {\n\t\tconst bucket1 = \"bucket1\";\n\t\tconst bucket2 = \"bucket2\";\n\t\tconst bucketProperties: Map<string, ITelemetryBaseProperties> = new Map<\n\t\t\tstring,\n\t\t\tITelemetryBaseProperties\n\t\t>([\n\t\t\t[bucket1, { prop1: \"value1\" }],\n\t\t\t[bucket2, { prop2: \"value2\" }],\n\t\t]);\n\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\" },\n\t\t\tlogger,\n\t\t\t3,\n\t\t\tfalse,\n\t\t\tbucketProperties,\n\t\t);\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\thelper.measure(() => {}, bucket1);\n\t\t}\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\thelper.measure(() => {}, bucket2);\n\t\t}\n\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop1 === \"value1\").length, 3);\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop2 === \"value2\").length, 2);\n\t});\n\n\tit(\"bucket properties do not override measurement properties\", () => {\n\t\t// If the names of the properties specified by the consumers for a bucket overlap with the names\n\t\t// of the standard properties we put in the telemetry events, our values should not be overwritten\n\t\t// by the custom properties.\n\n\t\tconst bucket1 = \"bucket1\";\n\t\tconst bucketProperties: Map<string, ITelemetryBaseProperties> = new Map<\n\t\t\tstring,\n\t\t\tITelemetryBaseProperties\n\t\t>([\n\t\t\t// Here just using a duration value that we can be sure will not be the actual value, to make sure the\n\t\t\t// actuals is different from this one (since it's much harder to guarantee an exact duration\n\t\t\t// value to test for equality).\n\t\t\t[bucket1, { duration: 1000, count: 1000 }],\n\t\t]);\n\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\" },\n\t\t\tlogger,\n\t\t\t1,\n\t\t\tfalse,\n\t\t\tbucketProperties,\n\t\t);\n\t\thelper.measure(() => {}, bucket1);\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tassert.strictEqual(event.count, 1);\n\t\tassert(event.duration !== bucketProperties.get(\"bucket1\")!.duration);\n\t});\n\n\tit(\"generates telemetry event from buffered data when disposed\", () => {\n\t\t// Logging several buckets to make sure they are all flushed. We can only distingush the events based on the\n\t\t// custom properties added to the event for each bucket\n\t\tconst bucket1 = \"bucket1\";\n\t\tconst bucket2 = \"bucket2\";\n\t\tconst bucketProperties: Map<string, ITelemetryBaseProperties> = new Map<\n\t\t\tstring,\n\t\t\tITelemetryBaseProperties\n\t\t>([\n\t\t\t[bucket1, { prop1: \"value1\" }],\n\t\t\t[bucket2, { prop2: \"value2\" }],\n\t\t]);\n\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\" },\n\t\t\tlogger,\n\t\t\t5,\n\t\t\tfalse,\n\t\t\tbucketProperties,\n\t\t);\n\n\t\t// Only measure 4 times when we need 5 samples before writing the telemetry event\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\thelper.measure(() => {}, bucket1);\n\t\t\thelper.measure(() => {}, bucket2);\n\t\t}\n\n\t\t// Nothing should have been logged yet\n\t\tassert.strictEqual(logger.events.length, 0);\n\n\t\t// After disposing, there should be one event for each bucket\n\t\thelper.dispose();\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop1 === \"value1\").length, 1);\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop2 === \"value2\").length, 1);\n\t});\n\n\tit(\"no event is generated on dispose if there's no pending 'buffered' data\", () => {\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, 2);\n\n\t\t// Nothing should have been logged after the first call\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 0);\n\n\t\t// On the second call, we should have 1 event\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\n\t\t// After disposing, there should still be just one event\n\t\thelper.dispose();\n\t\tassert.strictEqual(logger.events.length, 1);\n\t});\n});\n\nfunction ensurePropertiesExist(\n\tobject: ITelemetryPerformanceEventExt,\n\tpropNames: string[],\n\tnoExtraProperties: boolean = false,\n): void {\n\tfor (const name of propNames) {\n\t\tassert.strictEqual(object[name] !== undefined, true);\n\t}\n\n\tif (noExtraProperties) {\n\t\tconst actualNumberOfProps = Object.keys(object).length;\n\t\tconst expectedNumberOfProps = propNames.length;\n\t\tif (actualNumberOfProps !== expectedNumberOfProps) {\n\t\t\tassert.fail(\n\t\t\t\t`Object contains unexpected properties ` +\n\t\t\t\t\t`(${actualNumberOfProps} found, ${expectedNumberOfProps}) expected)`,\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"sampledTelemetryHelper.spec.js","sourceRoot":"","sources":["../../src/test/sampledTelemetryHelper.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"node:assert\";\nimport type {\n\tITelemetryBaseEvent,\n\tITelemetryBaseProperties,\n} from \"@fluidframework/core-interfaces\";\n\nimport { SampledTelemetryHelper } from \"../sampledTelemetryHelper.js\";\nimport {\n\ttype ITelemetryErrorEventExt,\n\ttype ITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\ttype ITelemetryPerformanceEventExt,\n} from \"../telemetryTypes.js\";\n\n/**\n * Test logger with only the necessary functionality used by the SampledTelemetryHelper\n * so we can test it.\n */\nclass TestLogger implements ITelemetryLoggerExt {\n\tpublic events: ITelemetryPerformanceEventExt[] = [];\n\n\tsendPerformanceEvent(event: ITelemetryPerformanceEventExt, error?: unknown): void {\n\t\tthis.events.push(event);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\tsendTelemetryEvent(event: ITelemetryGenericEventExt, error?: unknown): void {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\tsendErrorEvent(event: ITelemetryErrorEventExt, error?: unknown): void {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\tsupportsTags?: true | undefined;\n}\n\nconst standardEventProperties = [\"eventName\", \"duration\", \"count\"];\nconst aggregateProperties = [\"totalDuration\", \"minDuration\", \"maxDuration\"];\n\ndescribe(\"SampledTelemetryHelper\", () => {\n\tlet logger: TestLogger;\n\n\tbeforeEach(() => {\n\t\tlogger = new TestLogger();\n\t});\n\n\tit(\"only writes event after correct number of samples\", () => {\n\t\tconst sampling = 10;\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, sampling);\n\t\tfor (let i = 0; i < sampling - 1; i++) {\n\t\t\thelper.measure(() => {});\n\t\t}\n\t\tassert.strictEqual(logger.events.length, 0);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\n\t\t// Again to make sure the internal counter is reset correctly\n\t\tfor (let i = 0; i < sampling - 1; i++) {\n\t\t\thelper.measure(() => {});\n\t\t}\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 2);\n\t});\n\n\tit(\"does not include aggregate properties when it shouldn't\", () => {\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, 1, false);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(event, standardEventProperties, true);\n\t\tassert.strictEqual(event.count, 1);\n\t});\n\n\tit(\"includes aggregate properties when it should\", () => {\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, 1, true);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(event, [...standardEventProperties, ...aggregateProperties], true);\n\t\tassert.strictEqual(event.count, 1);\n\t});\n\n\tit(\"includes properties from base event when no aggregate properties are included\", () => {\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\", myProp: \"myValue\" },\n\t\t\tlogger,\n\t\t\t1,\n\t\t\tfalse,\n\t\t);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(event, [...standardEventProperties, \"myProp\"], true);\n\t\tassert.strictEqual(event.count, 1);\n\t\tassert.strictEqual(event.myProp, \"myValue\");\n\t});\n\n\tit(\"includes properties from base event when aggregate properties are included\", () => {\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\", myProp: \"myValue\" },\n\t\t\tlogger,\n\t\t\t1,\n\t\t\ttrue,\n\t\t);\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tensurePropertiesExist(\n\t\t\tevent,\n\t\t\t[...standardEventProperties, ...aggregateProperties, \"myProp\"],\n\t\t\ttrue,\n\t\t);\n\t\tassert.strictEqual(event.count, 1);\n\t\tassert.strictEqual(event.myProp, \"myValue\");\n\t});\n\n\tit(\"tracks buckets separately and includes per-bucket properties\", () => {\n\t\tconst bucket1 = \"bucket1\";\n\t\tconst bucket2 = \"bucket2\";\n\t\tconst bucketProperties: Map<string, ITelemetryBaseProperties> = new Map<\n\t\t\tstring,\n\t\t\tITelemetryBaseProperties\n\t\t>([\n\t\t\t[bucket1, { prop1: \"value1\" }],\n\t\t\t[bucket2, { prop2: \"value2\" }],\n\t\t]);\n\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\" },\n\t\t\tlogger,\n\t\t\t3,\n\t\t\tfalse,\n\t\t\tbucketProperties,\n\t\t);\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\thelper.measure(() => {}, bucket1);\n\t\t}\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\thelper.measure(() => {}, bucket2);\n\t\t}\n\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop1 === \"value1\").length, 3);\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop2 === \"value2\").length, 2);\n\t});\n\n\tit(\"bucket properties do not override measurement properties\", () => {\n\t\t// If the names of the properties specified by the consumers for a bucket overlap with the names\n\t\t// of the standard properties we put in the telemetry events, our values should not be overwritten\n\t\t// by the custom properties.\n\n\t\tconst bucket1 = \"bucket1\";\n\t\tconst bucketProperties: Map<string, ITelemetryBaseProperties> = new Map<\n\t\t\tstring,\n\t\t\tITelemetryBaseProperties\n\t\t>([\n\t\t\t// Here just using a duration value that we can be sure will not be the actual value, to make sure the\n\t\t\t// actuals is different from this one (since it's much harder to guarantee an exact duration\n\t\t\t// value to test for equality).\n\t\t\t[bucket1, { duration: 1000, count: 1000 }],\n\t\t]);\n\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\" },\n\t\t\tlogger,\n\t\t\t1,\n\t\t\tfalse,\n\t\t\tbucketProperties,\n\t\t);\n\t\thelper.measure(() => {}, bucket1);\n\t\tassert.strictEqual(logger.events.length, 1);\n\t\tconst event = logger.events[0];\n\t\tassert.strictEqual(event.count, 1);\n\t\tassert(event.duration !== bucketProperties.get(\"bucket1\")!.duration);\n\t});\n\n\tit(\"generates telemetry event from buffered data when disposed\", () => {\n\t\t// Logging several buckets to make sure they are all flushed. We can only distingush the events based on the\n\t\t// custom properties added to the event for each bucket\n\t\tconst bucket1 = \"bucket1\";\n\t\tconst bucket2 = \"bucket2\";\n\t\tconst bucketProperties: Map<string, ITelemetryBaseProperties> = new Map<\n\t\t\tstring,\n\t\t\tITelemetryBaseProperties\n\t\t>([\n\t\t\t[bucket1, { prop1: \"value1\" }],\n\t\t\t[bucket2, { prop2: \"value2\" }],\n\t\t]);\n\n\t\tconst helper = new SampledTelemetryHelper(\n\t\t\t{ eventName: \"testEvent\" },\n\t\t\tlogger,\n\t\t\t5,\n\t\t\tfalse,\n\t\t\tbucketProperties,\n\t\t);\n\n\t\t// Only measure 4 times when we need 5 samples before writing the telemetry event\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\thelper.measure(() => {}, bucket1);\n\t\t\thelper.measure(() => {}, bucket2);\n\t\t}\n\n\t\t// Nothing should have been logged yet\n\t\tassert.strictEqual(logger.events.length, 0);\n\n\t\t// After disposing, there should be one event for each bucket\n\t\thelper.dispose();\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop1 === \"value1\").length, 1);\n\t\tassert.strictEqual(logger.events.filter((x) => x.prop2 === \"value2\").length, 1);\n\t});\n\n\tit(\"no event is generated on dispose if there's no pending 'buffered' data\", () => {\n\t\tconst helper = new SampledTelemetryHelper({ eventName: \"testEvent\" }, logger, 2);\n\n\t\t// Nothing should have been logged after the first call\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 0);\n\n\t\t// On the second call, we should have 1 event\n\t\thelper.measure(() => {});\n\t\tassert.strictEqual(logger.events.length, 1);\n\n\t\t// After disposing, there should still be just one event\n\t\thelper.dispose();\n\t\tassert.strictEqual(logger.events.length, 1);\n\t});\n});\n\nfunction ensurePropertiesExist(\n\tobject: ITelemetryPerformanceEventExt,\n\tpropNames: string[],\n\tnoExtraProperties: boolean = false,\n): void {\n\tfor (const name of propNames) {\n\t\tassert.strictEqual(object[name] !== undefined, true);\n\t}\n\n\tif (noExtraProperties) {\n\t\tconst actualNumberOfProps = Object.keys(object).length;\n\t\tconst expectedNumberOfProps = propNames.length;\n\t\tif (actualNumberOfProps !== expectedNumberOfProps) {\n\t\t\tassert.fail(\n\t\t\t\t`Object contains unexpected properties ` +\n\t\t\t\t\t`(${actualNumberOfProps} found, ${expectedNumberOfProps}) expected)`,\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryLogger.spec.js","sourceRoot":"","sources":["../../src/test/telemetryLogger.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"node:assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport {\n\tITelemetryLoggerPropertyBags,\n\tITelemetryLoggerPropertyBag,\n\tTelemetryLogger,\n\tconvertToBasePropertyType,\n} from \"../logger.js\";\nimport {\n\tITaggedTelemetryPropertyTypeExt,\n\tTelemetryEventPropertyTypeExt,\n} from \"../telemetryTypes.js\";\n\nclass TestTelemetryLogger extends TelemetryLogger {\n\tpublic events: ITelemetryBaseEvent[] = [];\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tthis.events.push(this.prepareEvent(event));\n\t}\n}\n\nconst allCases: ITelemetryLoggerPropertyBag[] = [\n\t{},\n\t{ allProp: 1 },\n\t{ allGetter: (): number => 1 },\n\t{ allProp: 1, allGetter: (): number => 1 },\n];\nconst errorCases: ITelemetryLoggerPropertyBag[] = [\n\t{},\n\t{ errorProp: 2 },\n\t{ errorGetter: (): number => 2 },\n\t{ errorProp: 2, errorGetter: (): number => 2 },\n];\n\n// eslint-disable-next-line unicorn/no-array-reduce\nconst propertyCases: (ITelemetryLoggerPropertyBags | undefined)[] = allCases.reduce<\n\tITelemetryLoggerPropertyBags[]\n>((pv, all) => {\n\tpv.push(...errorCases.map((error) => ({ all, error })));\n\treturn pv;\n}, []);\npropertyCases.push(\n\t...allCases.map((all) => ({ all, error: all })),\n\t...allCases,\n\t...errorCases,\n\tundefined,\n);\n\ndescribe(\"TelemetryLogger\", () => {\n\tdescribe(\"Properties\", () => {\n\t\tit(\"send\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.send({ category: \"anything\", eventName: \"whatever\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"anything\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\tconst propsKeys = Object.keys(props?.all ?? {});\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendErrorEvent\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.sendErrorEvent({ eventName: \"whatever\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"error\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\t// should include error props too\n\t\t\t\tconst expected = { error: \"whatever\", ...props?.all, ...props?.error };\n\t\t\t\tconst propsKeys = Object.keys(expected);\n\t\t\t\tfor (const k of propsKeys) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n\t\t\t\t\tconst e = typeof expected[k] === \"function\" ? expected[k]() : expected[k];\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tevent[k],\n\t\t\t\t\t\te,\n\t\t\t\t\t\t`${k} value does not match.\n actual: ${JSON.stringify(event[k])} expected: ${JSON.stringify(e)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendErrorEvent with error field\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.sendErrorEvent({ eventName: \"whatever\", error: \"bad\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"error\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\t// should include error props too\n\t\t\t\tconst expected = { error: \"bad\", ...props?.all, ...props?.error };\n\t\t\t\tconst propsKeys = Object.keys(expected);\n\t\t\t\tfor (const k of propsKeys) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n\t\t\t\t\tconst e = typeof expected[k] === \"function\" ? expected[k]() : expected[k];\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tevent[k],\n\t\t\t\t\t\te,\n\t\t\t\t\t\t`${k} value does not match.\n actual: ${JSON.stringify(event[k])} expected: ${JSON.stringify(e)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendErrorEvent with error object\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tconst error = new Error(\"badMessage\");\n\t\t\t\tlogger.sendErrorEvent({ eventName: \"whatever\" }, error);\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"error\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\t// should include error props too\n\t\t\t\tconst expected = {\n\t\t\t\t\terror: error.message,\n\t\t\t\t\t...props?.all,\n\t\t\t\t\t...props?.error,\n\t\t\t\t};\n\t\t\t\tconst propsKeys = Object.keys(expected);\n\t\t\t\tfor (const k of propsKeys) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n\t\t\t\t\tconst e = typeof expected[k] === \"function\" ? expected[k]() : expected[k];\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tevent[k],\n\t\t\t\t\t\te,\n\t\t\t\t\t\t`${k} value does not match.\n actual: ${JSON.stringify(event[k])} expected: ${JSON.stringify(e)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// +4 for category, event name, message and stack\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 4,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendTelemetryEvent\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.sendTelemetryEvent({ eventName: \"whatever\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"generic\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\tconst propsKeys = Object.keys(props?.all ?? {});\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t});\n});\n\ndescribe(\"convertToBasePropertyType\", () => {\n\tdescribe(\"tagged properties\", () => {\n\t\tit(\"tagged number\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: 123,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: 123,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged string\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"test\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"test\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged boolean\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: true,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: true,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged array\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: [true, \"test\"],\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: JSON.stringify([true, \"test\"]),\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged flat object\", () => {\n\t\t\tconst value: TelemetryEventPropertyTypeExt = {\n\t\t\t\ta: 1,\n\t\t\t\tb: \"two\",\n\t\t\t\tc: true,\n\t\t\t\td: [false, \"okay\"],\n\t\t\t};\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: JSON.stringify(value),\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t});\n\tdescribe(\"untagged properties\", () => {\n\t\tit(\"number\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = 123;\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = 123;\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"string\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = \"test\";\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = \"test\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"boolean\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = true;\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = true;\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"undefined\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = undefined;\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = undefined;\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"array\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = [true, \"test\"];\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = JSON.stringify([true, \"test\"]);\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"flat object\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = {\n\t\t\t\ta: 1,\n\t\t\t\tb: \"two\",\n\t\t\t\tc: true,\n\t\t\t\td: [false, \"okay\"],\n\t\t\t\te: undefined,\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = JSON.stringify(property);\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"flat object with only undefined\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = {\n\t\t\t\te: undefined,\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = \"{}\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t});\n\t// Note the \"as any\" required in each of these cases.\n\t// These are unexpected, but it's good to have coverage to ensure they behave \"well enough\"\n\t// (e.g. they shouldn't crash)\n\tdescribe(\"Check various invalid (per typings) cases\", () => {\n\t\tit(\"nested ITaggedTelemetryPropertyTypeExt\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tvalue: { value: true, tag: \"tag\" } as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: '{\"value\":true,\"tag\":\"tag\"}',\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"nested non ITaggedTelemetryPropertyTypeExt\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tvalue: { foo: 3, bar: { x: 5 } as unknown } as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: '{\"foo\":3,\"bar\":{\"x\":5}}',\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged function\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: function x() {\n\t\t\t\t\treturn 54;\n\t\t\t\t} as unknown as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"INVALID PROPERTY (typed as function)\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged null value\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\tvalue: null as unknown as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"null\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged symbol\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: Symbol(\"Test\") as unknown as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"INVALID PROPERTY (typed as symbol)\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"nested object\", () => {\n\t\t\tconst nestedObject = {\n\t\t\t\tfoo: { foo: true, test: \"test\" },\n\t\t\t\ttest: \"test\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(\n\t\t\t\tnestedObject as unknown as\n\t\t\t\t\t| TelemetryEventPropertyTypeExt\n\t\t\t\t\t| ITaggedTelemetryPropertyTypeExt,\n\t\t\t);\n\t\t\tconst expected = '{\"foo\":{\"foo\":true,\"test\":\"test\"},\"test\":\"test\"}';\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"function\", () => {\n\t\t\tconst converted = convertToBasePropertyType(function x() {\n\t\t\t\treturn 54;\n\t\t\t} as unknown as TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt);\n\t\t\tconst expected = \"INVALID PROPERTY (typed as function)\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"null\", () => {\n\t\t\tconst converted = convertToBasePropertyType(\n\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\tnull as unknown as TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt,\n\t\t\t);\n\t\t\tconst expected = \"null\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"symbol\", () => {\n\t\t\tconst converted = convertToBasePropertyType(\n\t\t\t\tSymbol(\"Test\") as unknown as\n\t\t\t\t\t| TelemetryEventPropertyTypeExt\n\t\t\t\t\t| ITaggedTelemetryPropertyTypeExt,\n\t\t\t);\n\t\t\tconst expected = \"INVALID PROPERTY (typed as symbol)\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"telemetryLogger.spec.js","sourceRoot":"","sources":["../../src/test/telemetryLogger.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"node:assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport {\n\tITelemetryLoggerPropertyBag,\n\tITelemetryLoggerPropertyBags,\n\tTelemetryLogger,\n\tconvertToBasePropertyType,\n} from \"../logger.js\";\nimport {\n\tITaggedTelemetryPropertyTypeExt,\n\tTelemetryEventPropertyTypeExt,\n} from \"../telemetryTypes.js\";\n\nclass TestTelemetryLogger extends TelemetryLogger {\n\tpublic events: ITelemetryBaseEvent[] = [];\n\tpublic send(event: ITelemetryBaseEvent): void {\n\t\tthis.events.push(this.prepareEvent(event));\n\t}\n}\n\nconst allCases: ITelemetryLoggerPropertyBag[] = [\n\t{},\n\t{ allProp: 1 },\n\t{ allGetter: (): number => 1 },\n\t{ allProp: 1, allGetter: (): number => 1 },\n];\nconst errorCases: ITelemetryLoggerPropertyBag[] = [\n\t{},\n\t{ errorProp: 2 },\n\t{ errorGetter: (): number => 2 },\n\t{ errorProp: 2, errorGetter: (): number => 2 },\n];\n\n// eslint-disable-next-line unicorn/no-array-reduce\nconst propertyCases: (ITelemetryLoggerPropertyBags | undefined)[] = allCases.reduce<\n\tITelemetryLoggerPropertyBags[]\n>((pv, all) => {\n\tpv.push(...errorCases.map((error) => ({ all, error })));\n\treturn pv;\n}, []);\npropertyCases.push(\n\t...allCases.map((all) => ({ all, error: all })),\n\t...allCases,\n\t...errorCases,\n\tundefined,\n);\n\ndescribe(\"TelemetryLogger\", () => {\n\tdescribe(\"Properties\", () => {\n\t\tit(\"send\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.send({ category: \"anything\", eventName: \"whatever\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"anything\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\tconst propsKeys = Object.keys(props?.all ?? {});\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendErrorEvent\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.sendErrorEvent({ eventName: \"whatever\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"error\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\t// should include error props too\n\t\t\t\tconst expected = { error: \"whatever\", ...props?.all, ...props?.error };\n\t\t\t\tconst propsKeys = Object.keys(expected);\n\t\t\t\tfor (const k of propsKeys) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n\t\t\t\t\tconst e = typeof expected[k] === \"function\" ? expected[k]() : expected[k];\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tevent[k],\n\t\t\t\t\t\te,\n\t\t\t\t\t\t`${k} value does not match.\n actual: ${JSON.stringify(event[k])} expected: ${JSON.stringify(e)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendErrorEvent with error field\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.sendErrorEvent({ eventName: \"whatever\", error: \"bad\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"error\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\t// should include error props too\n\t\t\t\tconst expected = { error: \"bad\", ...props?.all, ...props?.error };\n\t\t\t\tconst propsKeys = Object.keys(expected);\n\t\t\t\tfor (const k of propsKeys) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n\t\t\t\t\tconst e = typeof expected[k] === \"function\" ? expected[k]() : expected[k];\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tevent[k],\n\t\t\t\t\t\te,\n\t\t\t\t\t\t`${k} value does not match.\n actual: ${JSON.stringify(event[k])} expected: ${JSON.stringify(e)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendErrorEvent with error object\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tconst error = new Error(\"badMessage\");\n\t\t\t\tlogger.sendErrorEvent({ eventName: \"whatever\" }, error);\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"error\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\t// should include error props too\n\t\t\t\tconst expected = {\n\t\t\t\t\terror: error.message,\n\t\t\t\t\t...props?.all,\n\t\t\t\t\t...props?.error,\n\t\t\t\t};\n\t\t\t\tconst propsKeys = Object.keys(expected);\n\t\t\t\tfor (const k of propsKeys) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n\t\t\t\t\tconst e = typeof expected[k] === \"function\" ? expected[k]() : expected[k];\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tevent[k],\n\t\t\t\t\t\te,\n\t\t\t\t\t\t`${k} value does not match.\n actual: ${JSON.stringify(event[k])} expected: ${JSON.stringify(e)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// +4 for category, event name, message and stack\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 4,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"sendTelemetryEvent\", () => {\n\t\t\tfor (const props of propertyCases) {\n\t\t\t\tconst logger = new TestTelemetryLogger(\"namespace\", props);\n\t\t\t\tlogger.sendTelemetryEvent({ eventName: \"whatever\" });\n\t\t\t\tassert.strictEqual(logger.events.length, 1);\n\t\t\t\tconst event = logger.events[0];\n\t\t\t\tassert.strictEqual(event.category, \"generic\");\n\t\t\t\tassert.strictEqual(event.eventName, \"namespace:whatever\");\n\t\t\t\tconst eventKeys = Object.keys(event);\n\t\t\t\tconst propsKeys = Object.keys(props?.all ?? {});\n\t\t\t\t// +2 for category and event name\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\teventKeys.length,\n\t\t\t\t\tpropsKeys.length + 2,\n\t\t\t\t\t`actual:\\n${JSON.stringify(event)}\\nexpected:${\n\t\t\t\t\t\tprops ? JSON.stringify(props) : \"undefined\"\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t});\n});\n\ndescribe(\"convertToBasePropertyType\", () => {\n\tdescribe(\"tagged properties\", () => {\n\t\tit(\"tagged number\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: 123,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: 123,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged string\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"test\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"test\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged boolean\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: true,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: true,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged array\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: [true, \"test\"],\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: JSON.stringify([true, \"test\"]),\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged flat object\", () => {\n\t\t\tconst value: TelemetryEventPropertyTypeExt = {\n\t\t\t\ta: 1,\n\t\t\t\tb: \"two\",\n\t\t\t\tc: true,\n\t\t\t\td: [false, \"okay\"],\n\t\t\t};\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: JSON.stringify(value),\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t});\n\tdescribe(\"untagged properties\", () => {\n\t\tit(\"number\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = 123;\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = 123;\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"string\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = \"test\";\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = \"test\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"boolean\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = true;\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = true;\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"undefined\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = undefined;\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = undefined;\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"array\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = [true, \"test\"];\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = JSON.stringify([true, \"test\"]);\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"flat object\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = {\n\t\t\t\ta: 1,\n\t\t\t\tb: \"two\",\n\t\t\t\tc: true,\n\t\t\t\td: [false, \"okay\"],\n\t\t\t\te: undefined,\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = JSON.stringify(property);\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"flat object with only undefined\", () => {\n\t\t\tconst property: TelemetryEventPropertyTypeExt = {\n\t\t\t\te: undefined,\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(property);\n\t\t\tconst expected: TelemetryEventPropertyTypeExt = \"{}\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t});\n\t// Note the \"as any\" required in each of these cases.\n\t// These are unexpected, but it's good to have coverage to ensure they behave \"well enough\"\n\t// (e.g. they shouldn't crash)\n\tdescribe(\"Check various invalid (per typings) cases\", () => {\n\t\tit(\"nested ITaggedTelemetryPropertyTypeExt\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tvalue: { value: true, tag: \"tag\" } as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: '{\"value\":true,\"tag\":\"tag\"}',\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"nested non ITaggedTelemetryPropertyTypeExt\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tvalue: { foo: 3, bar: { x: 5 } as unknown } as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: '{\"foo\":3,\"bar\":{\"x\":5}}',\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged function\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: function x() {\n\t\t\t\t\treturn 54;\n\t\t\t\t} as unknown as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"INVALID PROPERTY (typed as function)\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged null value\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\tvalue: null as unknown as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"null\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"tagged symbol\", () => {\n\t\t\tconst taggedProperty: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: Symbol(\"Test\") as unknown as TelemetryEventPropertyTypeExt,\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(taggedProperty);\n\t\t\tconst expected: ITaggedTelemetryPropertyTypeExt = {\n\t\t\t\tvalue: \"INVALID PROPERTY (typed as symbol)\",\n\t\t\t\ttag: \"tag\",\n\t\t\t};\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"nested object\", () => {\n\t\t\tconst nestedObject = {\n\t\t\t\tfoo: { foo: true, test: \"test\" },\n\t\t\t\ttest: \"test\",\n\t\t\t};\n\t\t\tconst converted = convertToBasePropertyType(\n\t\t\t\tnestedObject as unknown as\n\t\t\t\t\t| TelemetryEventPropertyTypeExt\n\t\t\t\t\t| ITaggedTelemetryPropertyTypeExt,\n\t\t\t);\n\t\t\tconst expected = '{\"foo\":{\"foo\":true,\"test\":\"test\"},\"test\":\"test\"}';\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"function\", () => {\n\t\t\tconst converted = convertToBasePropertyType(function x() {\n\t\t\t\treturn 54;\n\t\t\t} as unknown as TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt);\n\t\t\tconst expected = \"INVALID PROPERTY (typed as function)\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"null\", () => {\n\t\t\tconst converted = convertToBasePropertyType(\n\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\tnull as unknown as TelemetryEventPropertyTypeExt | ITaggedTelemetryPropertyTypeExt,\n\t\t\t);\n\t\t\tconst expected = \"null\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t\tit(\"symbol\", () => {\n\t\t\tconst converted = convertToBasePropertyType(\n\t\t\t\tSymbol(\"Test\") as unknown as\n\t\t\t\t\t| TelemetryEventPropertyTypeExt\n\t\t\t\t\t| ITaggedTelemetryPropertyTypeExt,\n\t\t\t);\n\t\t\tconst expected = \"INVALID PROPERTY (typed as symbol)\";\n\t\t\tassert.deepStrictEqual(converted, expected);\n\t\t});\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"thresholdCounter.spec.js","sourceRoot":"","sources":["../../src/test/thresholdCounter.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAQ1D,MAAM,mBAAmB;IAAzB;QACQ,WAAM,GAAgC,EAAE,CAAC;IAiBjD,CAAC;IAfO,IAAI,CAAC,MAA2B;QACtC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAEM,kBAAkB,CAAC,MAAiC,EAAE,MAAgB;QAC5E,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAEM,cAAc,CAAC,MAA+B,EAAE,MAAgB;QACtE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAEM,oBAAoB,CAAC,KAAoC,EAAE,MAAgB;QACjF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;CACD;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,IAAI,MAA2B,CAAC;IAChC,IAAI,MAAwB,CAAC;IAC7B,MAAM,SAAS,GAAG,GAAG,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACnC,MAAM,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAE1B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEpC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"node:assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport { ThresholdCounter } from \"../thresholdCounter.js\";\nimport {\n\tITelemetryLoggerExt,\n\ttype ITelemetryGenericEventExt,\n\ttype ITelemetryErrorEventExt,\n\ttype ITelemetryPerformanceEventExt,\n} from \"../telemetryTypes.js\";\n\nclass FakeTelemetryLogger implements ITelemetryLoggerExt {\n\tpublic events: ITelemetryGenericEventExt[] = [];\n\n\tpublic send(_event: ITelemetryBaseEvent): void {\n\t\tassert.fail(\"Should not be called\");\n\t}\n\n\tpublic sendTelemetryEvent(_event: ITelemetryGenericEventExt, _error?: unknown): void {\n\t\tassert.fail(\"Should not be called\");\n\t}\n\n\tpublic sendErrorEvent(_event: ITelemetryErrorEventExt, _error?: unknown): void {\n\t\tassert.fail(\"Should not be called\");\n\t}\n\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEventExt, _error?: unknown): void {\n\t\tthis.events.push(event);\n\t}\n}\n\ndescribe(\"ThresholdCounter\", () => {\n\tlet logger: FakeTelemetryLogger;\n\tlet sender: ThresholdCounter;\n\tconst threshold = 100;\n\n\tbeforeEach(() => {\n\t\tlogger = new FakeTelemetryLogger();\n\t\tsender = new ThresholdCounter(threshold, logger);\n\t});\n\n\tit(\"Send only if it passes threshold\", () => {\n\t\tsender.send(\"event_1\", threshold);\n\t\tsender.send(\"event_2\", threshold + 1);\n\t\tsender.send(\"event_3\", threshold - 1);\n\t\tsender.send(\"event_4\", 0);\n\n\t\tassert.strictEqual(logger.events.length, 2);\n\t\tassert.deepStrictEqual(logger.events[0], { eventName: \"event_1\", value: threshold });\n\t\tassert.deepStrictEqual(logger.events[1], { eventName: \"event_2\", value: threshold + 1 });\n\t});\n\n\tit(\"Send only if value is multiple\", () => {\n\t\tsender.sendIfMultiple(\"event_1\", threshold);\n\t\tsender.sendIfMultiple(\"event_2\", threshold * 2);\n\t\tsender.sendIfMultiple(\"event_3\", threshold - 1);\n\t\tsender.sendIfMultiple(\"event_4\", 0);\n\n\t\tassert.strictEqual(logger.events.length, 2);\n\t\tassert.deepStrictEqual(logger.events[0], { eventName: \"event_1\", value: threshold });\n\t\tassert.deepStrictEqual(logger.events[1], { eventName: \"event_2\", value: threshold * 2 });\n\t});\n});\n"]}
1
+ {"version":3,"file":"thresholdCounter.spec.js","sourceRoot":"","sources":["../../src/test/thresholdCounter.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAQjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,mBAAmB;IAAzB;QACQ,WAAM,GAAgC,EAAE,CAAC;IAiBjD,CAAC;IAfO,IAAI,CAAC,MAA2B;QACtC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAEM,kBAAkB,CAAC,MAAiC,EAAE,MAAgB;QAC5E,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAEM,cAAc,CAAC,MAA+B,EAAE,MAAgB;QACtE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAEM,oBAAoB,CAAC,KAAoC,EAAE,MAAgB;QACjF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;CACD;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,IAAI,MAA2B,CAAC;IAChC,IAAI,MAAwB,CAAC;IAC7B,MAAM,SAAS,GAAG,GAAG,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACnC,MAAM,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAE1B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEpC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"node:assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport {\n\ttype ITelemetryErrorEventExt,\n\ttype ITelemetryGenericEventExt,\n\tITelemetryLoggerExt,\n\ttype ITelemetryPerformanceEventExt,\n} from \"../telemetryTypes.js\";\nimport { ThresholdCounter } from \"../thresholdCounter.js\";\n\nclass FakeTelemetryLogger implements ITelemetryLoggerExt {\n\tpublic events: ITelemetryGenericEventExt[] = [];\n\n\tpublic send(_event: ITelemetryBaseEvent): void {\n\t\tassert.fail(\"Should not be called\");\n\t}\n\n\tpublic sendTelemetryEvent(_event: ITelemetryGenericEventExt, _error?: unknown): void {\n\t\tassert.fail(\"Should not be called\");\n\t}\n\n\tpublic sendErrorEvent(_event: ITelemetryErrorEventExt, _error?: unknown): void {\n\t\tassert.fail(\"Should not be called\");\n\t}\n\n\tpublic sendPerformanceEvent(event: ITelemetryPerformanceEventExt, _error?: unknown): void {\n\t\tthis.events.push(event);\n\t}\n}\n\ndescribe(\"ThresholdCounter\", () => {\n\tlet logger: FakeTelemetryLogger;\n\tlet sender: ThresholdCounter;\n\tconst threshold = 100;\n\n\tbeforeEach(() => {\n\t\tlogger = new FakeTelemetryLogger();\n\t\tsender = new ThresholdCounter(threshold, logger);\n\t});\n\n\tit(\"Send only if it passes threshold\", () => {\n\t\tsender.send(\"event_1\", threshold);\n\t\tsender.send(\"event_2\", threshold + 1);\n\t\tsender.send(\"event_3\", threshold - 1);\n\t\tsender.send(\"event_4\", 0);\n\n\t\tassert.strictEqual(logger.events.length, 2);\n\t\tassert.deepStrictEqual(logger.events[0], { eventName: \"event_1\", value: threshold });\n\t\tassert.deepStrictEqual(logger.events[1], { eventName: \"event_2\", value: threshold + 1 });\n\t});\n\n\tit(\"Send only if value is multiple\", () => {\n\t\tsender.sendIfMultiple(\"event_1\", threshold);\n\t\tsender.sendIfMultiple(\"event_2\", threshold * 2);\n\t\tsender.sendIfMultiple(\"event_3\", threshold - 1);\n\t\tsender.sendIfMultiple(\"event_4\", 0);\n\n\t\tassert.strictEqual(logger.events.length, 2);\n\t\tassert.deepStrictEqual(logger.events[0], { eventName: \"event_1\", value: threshold });\n\t\tassert.deepStrictEqual(logger.events[1], { eventName: \"event_2\", value: threshold * 2 });\n\t});\n});\n"]}
@@ -3,9 +3,9 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "node:assert";
6
- import { createSampledLogger } from "../utils.js";
7
- import { TelemetryDataTag, tagCodeArtifacts, tagData } from "../logger.js";
8
6
  import { mixinMonitoringContext } from "../config.js";
7
+ import { TelemetryDataTag, tagCodeArtifacts, tagData } from "../logger.js";
8
+ import { createSampledLogger } from "../utils.js";
9
9
  describe("tagData", () => {
10
10
  it("tagData with data", () => {
11
11
  const taggedData = tagData(TelemetryDataTag.CodeArtifact, { foo: "bar" });
@@ -1 +1 @@
1
- {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../src/test/utils.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAM/C,OAAO,EAAiB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtD,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAsB;YACnC,GAAG,EAAE;gBACJ,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,gBAAgB,CAAC,YAAY;aAClC;SACD,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACjC,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAA+B,EAAE,CAAC;QAChD,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE;YACzD,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,CAAC;SACT,CAAC,CAAC;QACH,MAAM,QAAQ,GAA+B;YAC5C,GAAG,EAAE;gBACJ,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,gBAAgB,CAAC,YAAY;aAClC;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,gBAAgB,CAAC,YAAY;aAClC;SACD,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,IAAI,MAAM,GAAwD,EAAE,CAAC;IAErE,SAAS,0BAA0B,CAClC,gBAA8C;QAE9C,MAAM,MAAM,GAAwB;YACnC,IAAI,CAAC,KAA0B;gBAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YACD,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YACD,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YACD,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;SACD,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,QAAqC,EAAuB,EAAE,CAAC,CAAC;YACvF,YAAY,EAAE,CAAC,IAAY,EAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;SAC3D,CAAC,CAAC;QAEH,OAAO,sBAAsB,CAAC,MAAM,EAAE,cAAc,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACtF,CAAC;IAED;;OAEG;IACH,+DAA+D;IAC/D,SAAS,4BAA4B,CAAC,OAAiC;QACtE,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,OAAO;YACN,MAAM,EAAE,GAAY,EAAE;gBACrB,UAAU,EAAE,CAAC;gBACb,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC;gBAC7D,IAAI,YAAY,EAAE;oBACjB,UAAU,GAAG,CAAC,CAAC;iBACf;gBACD,OAAO,YAAY,CAAC;YACrB,CAAC;SACD,CAAC;IACH,CAAC;IAED,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAClF,MAAM,gBAAgB,GAAG;YACxB,iCAAiC,EAAE,IAAI;SACvC,CAAC;QACF,MAAM,MAAM,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;QAE5D,MAAM,qBAAqB,GAAG,mBAAmB,CAChD,MAAM,EACN,4BAA4B,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CACjD,CAAC;QACF,MAAM,wBAAwB,GAAG,mBAAmB,CACnD,MAAM,EACN,4BAA4B,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CACjD,CAAC;QAEF,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACzC,qBAAqB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;YAC7E,wBAAwB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;SAClF;QACD,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,MAAM,EACjE,eAAe,CACf,CAAC;QACF,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC,MAAM,EACnE,eAAe,CACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oGAAoG,EAAE,GAAG,EAAE;QAC7G,MAAM,gBAAgB,GAAG;YACxB,iCAAiC,EAAE,IAAI;SACvC,CAAC;QACF,MAAM,MAAM,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;QAE5D,wDAAwD;QACxD,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAE1D,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACzC,qBAAqB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;SAC7E;QACD,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,MAAM,EACjE,eAAe,CACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qGAAqG,EAAE,GAAG,EAAE;QAC9G,MAAM,gBAAgB,GAAG;YACxB,iCAAiC,EAAE,KAAK;SACxC,CAAC;QACF,MAAM,MAAM,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;QAE5D,wFAAwF;QACxF,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAE1D,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACzC,qBAAqB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;SAC7E;QACD,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,MAAM,EACjE,eAAe,CACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,gBAAgB,GAAG;YACxB,iCAAiC,EAAE,KAAK;SACxC,CAAC;QACF,MAAM,MAAM,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;QAE5D,MAAM,qBAAqB,GAAG,mBAAmB,CAChD,MAAM,EACN,4BAA4B,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CACjD,CAAC;QACF,MAAM,wBAAwB,GAAG,mBAAmB,CACnD,MAAM,EACN,4BAA4B,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CACjD,CAAC;QACF,MAAM,wBAAwB,GAAG,mBAAmB,CACnD,MAAM,EACN,4BAA4B,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CACjD,CAAC;QAEF,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACzC,qBAAqB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;YAC7E,wBAAwB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;YACnF,wBAAwB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;SAClF;QAED,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,MAAM,EACjE,eAAe,CACf,CAAC;QACF,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,eAAe,CAAC,CAAC,MAAM,EACpE,eAAe,GAAG,CAAC,CACnB,CAAC;QACF,MAAM,CAAC,KAAK,CACX,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC,MAAM,EACnE,eAAe,GAAG,CAAC,CACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC3E,MAAM,gBAAgB,GAAG;YACxB,iCAAiC,EAAE,KAAK;SACxC,CAAC;QACF,MAAM,MAAM,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;QAU5D,IAAI,qBAAqB,GAAG,CAAC,CAAC;QAC9B,IAAI,qBAAqB,GAAG,EAAE,CAAC;QAC/B,IAAI,sBAAsB,GAAG,IAAI,CAAC;QAClC,IAAI,wBAAwB,GAAG,OAAO,CAAC;QAEvC,wDAAwD;QACxD,MAAM,iBAAiB,GAAG,CACzB,UAAkB,EAClB,UAAkB,EAClB,WAAoB,EACpB,OAAe,EACL,EAAE;YACZ,MAAM,YAAY,GACjB,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,KAAK,IAAI,IAAI,OAAO,KAAK,OAAO,CAAC;YAEjF,OAAO,YAAY,CAAC;QACrB,CAAC,CAAC;QACF,mBAAmB;QAEnB,MAAM,kBAAkB,GAAkB;YACzC,MAAM,EAAE,GAAG,EAAE,CACZ,iBAAiB,CAChB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,CACxB;SACF,CAAC;QAEF,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAE3E,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,WAAW,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAChB,yEAAyE;gBACzE,qBAAqB,GAAG,CAAC,EAAE,CAAC;gBAC5B,qBAAqB,GAAG,CAAC,CAAC;gBAC1B,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,wBAAwB,GAAG,OAAO,CAAC;aACnC;iBAAM;gBACN,6EAA6E;gBAC7E,qBAAqB,GAAG,CAAC,CAAC;gBAC1B,qBAAqB,GAAG,EAAE,CAAC;gBAC3B,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,wBAAwB,GAAG,WAAW,CAAC;aACvC;YAED,kBAAkB,CAAC,IAAI,CAAC;gBACvB,QAAQ,EAAE,SAAS;gBACnB,SAAS;gBACT,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,qBAAqB;gBACjC,UAAU,EAAE,qBAAqB;gBACjC,WAAW,EAAE,sBAAsB;gBACnC,aAAa,EAAE,wBAAwB;aACvC,CAAC,CAAC;SACH;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;YAClC,MAAM,UAAU,GAAG,KAAqB,CAAC;YACzC,MAAM,CAAC,KAAK,CACX,iBAAiB,CAChB,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,aAAa,CACxB,EACD,IAAI,CACJ,CAAC;SACF;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAA+B,EAAE,CAAC;QAChD,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,kCAAkC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QAC1E,MAAM,UAAU,GAAG,gBAAgB,CAAC;YACnC,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,SAAS;SACf,CAAC,CAAC;QACH,MAAM,QAAQ,GAA+B;YAC5C,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,gBAAgB,CAAC,YAAY;aAClC;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,gBAAgB,CAAC,YAAY;aAClC;YACD,OAAO,EAAE;gBACR,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,gBAAgB,CAAC,YAAY;aAClC;SACD,CAAC;QACF,MAAM,CAAC,eAAe,CACrB,UAAU,EACV,QAAQ,EACR,uDAAuD,CACvD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACvE,MAAM,UAAU,GAAG,gBAAgB,CAAC;YACnC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK;YACnB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACf,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;QAE1C,MAAM,CAAC,eAAe,CACrB,WAAW,EACX;YACC,GAAG,EAAE,gBAAgB,CAAC,YAAY;YAClC,KAAK,EAAE,KAAK;SACZ,EACD,sCAAsC,CACtC,CAAC;QACF,MAAM,CAAC,eAAe,CACrB,WAAW,EACX;YACC,GAAG,EAAE,gBAAgB,CAAC,YAAY;YAClC,KAAK,EAAE,CAAC;SACR,EACD,sCAAsC,CACtC,CAAC;QACF,MAAM,CAAC,eAAe,CACrB,YAAY,EACZ;YACC,GAAG,EAAE,gBAAgB,CAAC,YAAY;YAClC,KAAK,EAAE,IAAI;SACX,EACD,uCAAuC,CACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC3F,MAAM,mBAAmB,GAAG;YAC3B,GAAG,EAAE,gBAAgB,CAAC,YAAY;YAClC,KAAK,EAAE,KAAK;SACZ,CAAC;QACF,MAAM,mBAAmB,GAAG;YAC3B,GAAG,EAAE,gBAAgB,CAAC,YAAY;YAClC,KAAK,EAAE,CAAC;SACR,CAAC;QACF,MAAM,oBAAoB,GAAG;YAC5B,GAAG,EAAE,gBAAgB,CAAC,YAAY;YAClC,KAAK,EAAE,IAAI;SACX,CAAC;QAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC;YACnC,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;YACzB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;YACrB,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;SACzB,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,CAAC,eAAe,CACrB,UAAU,CAAC,MAAM,EACjB,mBAAmB,EACnB,wCAAwC,CACxC,CAAC;QACF,MAAM,CAAC,eAAe,CACrB,UAAU,CAAC,MAAM,EACjB,mBAAmB,EACnB,wCAAwC,CACxC,CAAC;QACF,MAAM,CAAC,eAAe,CACrB,UAAU,CAAC,OAAO,EAClB,oBAAoB,EACpB,yCAAyC,CACzC,CAAC;QAEF,+BAA+B;QAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,CAAC,eAAe,CACrB,WAAW,EACX,mBAAmB,EACnB,sCAAsC,CACtC,CAAC;QACF,MAAM,CAAC,eAAe,CACrB,WAAW,EACX,mBAAmB,EACnB,sCAAsC,CACtC,CAAC;QACF,MAAM,CAAC,eAAe,CACrB,YAAY,EACZ,oBAAoB,EACpB,uCAAuC,CACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport {\n\tConfigTypes,\n\tIConfigProviderBase,\n\tITelemetryBaseEvent,\n} from \"@fluidframework/core-interfaces\";\nimport { IEventSampler, createSampledLogger } from \"../utils.js\";\nimport { TelemetryDataTag, tagCodeArtifacts, tagData } from \"../logger.js\";\nimport { mixinMonitoringContext } from \"../config.js\";\nimport { ITelemetryGenericEventExt, ITelemetryLoggerExt } from \"../telemetryTypes.js\";\n\ndescribe(\"tagData\", () => {\n\tit(\"tagData with data\", () => {\n\t\tconst taggedData = tagData(TelemetryDataTag.CodeArtifact, { foo: \"bar\" });\n\t\tconst expected: typeof taggedData = {\n\t\t\tfoo: {\n\t\t\t\tvalue: \"bar\",\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t};\n\t\tassert.deepStrictEqual(taggedData, expected);\n\t});\n\tit(\"tagData with undefined\", () => {\n\t\tconst taggedData = tagData(TelemetryDataTag.CodeArtifact, { none: undefined });\n\t\tconst expected: Partial<typeof taggedData> = {};\n\t\tassert.deepStrictEqual(taggedData, expected);\n\t});\n\n\tit(\"tagData with complex object\", () => {\n\t\tconst taggedData = tagData(TelemetryDataTag.CodeArtifact, {\n\t\t\tfoo: \"bar\",\n\t\t\tnone: undefined,\n\t\t\tnumber: 0,\n\t\t});\n\t\tconst expected: Partial<typeof taggedData> = {\n\t\t\tfoo: {\n\t\t\t\tvalue: \"bar\",\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t\tnumber: {\n\t\t\t\tvalue: 0,\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t};\n\n\t\tassert.deepEqual(taggedData, expected);\n\t});\n});\n\ndescribe(\"Sampling\", () => {\n\tlet events: (ITelemetryBaseEvent | ITelemetryGenericEventExt)[] = [];\n\n\tfunction getMockLoggerExtWithConfig(\n\t\tconfigDictionary?: Record<string, ConfigTypes>,\n\t): ITelemetryLoggerExt {\n\t\tconst logger: ITelemetryLoggerExt = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t\tsendTelemetryEvent: (event) => {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t\tsendErrorEvent: (event) => {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t\tsendPerformanceEvent: (event) => {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t};\n\n\t\tconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\t\t\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n\t\t});\n\n\t\treturn mixinMonitoringContext(logger, configProvider(configDictionary ?? {})).logger;\n\t}\n\n\t/**\n\t * Creates an event sampler that uses a systematic approach to sampling (Sampling every nth event)\n\t */\n\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\tfunction createSystematicEventSampler(options: { samplingRate: number }): IEventSampler {\n\t\tlet eventCount = -1;\n\t\treturn {\n\t\t\tsample: (): boolean => {\n\t\t\t\teventCount++;\n\t\t\t\tconst shouldSample = eventCount % options.samplingRate === 0;\n\t\t\t\tif (shouldSample) {\n\t\t\t\t\teventCount = 0;\n\t\t\t\t}\n\t\t\t\treturn shouldSample;\n\t\t\t},\n\t\t};\n\t}\n\n\tbeforeEach(() => {\n\t\tevents = [];\n\t});\n\n\tit(\"Events are not sampled if DisableSampling telemetry flag is set to true\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": true,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\tconst loggerWithoutSampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 1 }),\n\t\t);\n\t\tconst loggerWithEvery5Sampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 5 }),\n\t\t);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t\tloggerWithEvery5Sampling.send({ category: \"generic\", eventName: \"oneEveryFive\" });\n\t\t}\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"oneEveryFive\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t});\n\n\tit(\"Events are not sampled if DisableSampling telemetry flag is set to true and no sampler is provided\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": true,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\t// Sampling is enabled AND there was no sampler provided\n\t\tconst loggerWithoutSampling = createSampledLogger(logger);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t}\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t});\n\n\tit(\"Events are not sampled if DisableSampling telemetry flag is set to false but no sampler is provided\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": false,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\t// Sampling is enabled however there was no sampler provided so all events will be sent.\n\t\tconst loggerWithoutSampling = createSampledLogger(logger);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t}\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t});\n\n\tit(\"Systematic Sampling works as expected\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": false,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\tconst loggerWithoutSampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 1 }),\n\t\t);\n\t\tconst loggerWithEvery3Sampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 3 }),\n\t\t);\n\t\tconst loggerWithEvery5Sampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 5 }),\n\t\t);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t\tloggerWithEvery3Sampling.send({ category: \"generic\", eventName: \"oneEveryThree\" });\n\t\t\tloggerWithEvery5Sampling.send({ category: \"generic\", eventName: \"oneEveryFive\" });\n\t\t}\n\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"oneEveryThree\").length,\n\t\t\ttotalEventCount / 3,\n\t\t);\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"oneEveryFive\").length,\n\t\t\ttotalEventCount / 5,\n\t\t);\n\t});\n\n\tit(\"Event Sampler works as expected with externally controlled state\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": false,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\tinterface ExampleEvent extends ITelemetryBaseEvent {\n\t\t\teventNumber: number;\n\t\t\tappNumber1: number;\n\t\t\tappNumber2: number;\n\t\t\tappBoolean1: boolean;\n\t\t\tappModeString: string;\n\t\t}\n\n\t\tlet exampleAppDataNumber1 = 0;\n\t\tlet exampleAppDataNumber2 = 10;\n\t\tlet exampleAppDataBoolean1 = true;\n\t\tlet exampleAppDataModeString = \"ready\";\n\n\t\t/* eslint-disable unicorn/consistent-function-scoping */\n\t\tconst shouldSampleEvent = (\n\t\t\tappNumber1: number,\n\t\t\tappNumber2: number,\n\t\t\tappBoolean1: boolean,\n\t\t\tappMode: string,\n\t\t): boolean => {\n\t\t\tconst shouldSample =\n\t\t\t\tappNumber1 < 1 && appNumber2 > 1 && appBoolean1 === true && appMode === \"ready\";\n\n\t\t\treturn shouldSample;\n\t\t};\n\t\t/* eslint-enable */\n\n\t\tconst customEventSampler: IEventSampler = {\n\t\t\tsample: () =>\n\t\t\t\tshouldSampleEvent(\n\t\t\t\t\texampleAppDataNumber1,\n\t\t\t\t\texampleAppDataNumber2,\n\t\t\t\t\texampleAppDataBoolean1,\n\t\t\t\t\texampleAppDataModeString,\n\t\t\t\t),\n\t\t};\n\n\t\tconst loggerWithSampling = createSampledLogger(logger, customEventSampler);\n\n\t\tconst totalEventCount = 20;\n\t\tconst eventName = \"testEvent\";\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\t// These values should cause events to be emitted (sampler returns false)\n\t\t\t\texampleAppDataNumber1 = -10;\n\t\t\t\texampleAppDataNumber2 = 2;\n\t\t\t\texampleAppDataBoolean1 = true;\n\t\t\t\texampleAppDataModeString = \"ready\";\n\t\t\t} else {\n\t\t\t\t// These values should cause events to not be emitted (sampler returns true)\n\t\t\t\texampleAppDataNumber1 = 0;\n\t\t\t\texampleAppDataNumber2 = 10;\n\t\t\t\texampleAppDataBoolean1 = true;\n\t\t\t\texampleAppDataModeString = \"not_ready\";\n\t\t\t}\n\n\t\t\tloggerWithSampling.send({\n\t\t\t\tcategory: \"generic\",\n\t\t\t\teventName,\n\t\t\t\teventNumber: i,\n\t\t\t\tappNumber1: exampleAppDataNumber1,\n\t\t\t\tappNumber2: exampleAppDataNumber2,\n\t\t\t\tappBoolean1: exampleAppDataBoolean1,\n\t\t\t\tappModeString: exampleAppDataModeString,\n\t\t\t});\n\t\t}\n\n\t\tconst emittedEvents = events.filter((event) => event.eventName === eventName);\n\t\tassert.equal(emittedEvents.length === 10, true);\n\t\tfor (const event of emittedEvents) {\n\t\t\tconst typedEvent = event as ExampleEvent;\n\t\t\tassert.equal(\n\t\t\t\tshouldSampleEvent(\n\t\t\t\t\ttypedEvent.appNumber1,\n\t\t\t\t\ttypedEvent.appNumber2,\n\t\t\t\t\ttypedEvent.appBoolean1,\n\t\t\t\t\ttypedEvent.appModeString,\n\t\t\t\t),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\t});\n});\n\ndescribe(\"tagCodeArtifacts\", () => {\n\tit(\"tagCodeArtifacts with undefined\", () => {\n\t\tconst taggedData = tagCodeArtifacts({ node: undefined });\n\t\tconst expected: Partial<typeof taggedData> = {};\n\t\tassert.deepStrictEqual(taggedData, expected, \"undefined not tagged as expected\");\n\t});\n\n\tit(\"tagCodeArtifacts with TelemetryBaseEventPropertyType properties\", () => {\n\t\tconst taggedData = tagCodeArtifacts({\n\t\t\tstring: \"foo\",\n\t\t\tnumber: 0,\n\t\t\tboolean: true,\n\t\t\tnone: undefined,\n\t\t});\n\t\tconst expected: Partial<typeof taggedData> = {\n\t\t\tstring: {\n\t\t\t\tvalue: \"foo\",\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t\tnumber: {\n\t\t\t\tvalue: 0,\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t\tboolean: {\n\t\t\t\tvalue: true,\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t};\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData,\n\t\t\texpected,\n\t\t\t\"TelemetryBaseEventPropertyType not tagged as expected\",\n\t\t);\n\t});\n\n\tit(\"tagCodeArtifacts with TelemetryBaseEventPropertyType getters\", () => {\n\t\tconst taggedData = tagCodeArtifacts({\n\t\t\tstring: () => \"foo\",\n\t\t\tnumber: () => 0,\n\t\t\tboolean: () => true,\n\t\t});\n\t\tconst stringValue = taggedData.string();\n\t\tconst numberValue = taggedData.number();\n\t\tconst booleanValue = taggedData.boolean();\n\n\t\tassert.deepStrictEqual(\n\t\t\tstringValue,\n\t\t\t{\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: \"foo\",\n\t\t\t},\n\t\t\t\"string getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tnumberValue,\n\t\t\t{\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: 0,\n\t\t\t},\n\t\t\t\"number getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tbooleanValue,\n\t\t\t{\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: true,\n\t\t\t},\n\t\t\t\"boolean getter not tagged as expected\",\n\t\t);\n\t});\n\n\tit(\"tagCodeArtifacts with both TelemetryBaseEventPropertyType properties and getters\", () => {\n\t\tconst expectedStringValue = {\n\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\tvalue: \"foo\",\n\t\t};\n\t\tconst expectedNumberValue = {\n\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\tvalue: 0,\n\t\t};\n\t\tconst expectedBooleanValue = {\n\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\tvalue: true,\n\t\t};\n\n\t\tconst taggedData = tagCodeArtifacts({\n\t\t\tstring: \"foo\",\n\t\t\tnumber: 0,\n\t\t\tboolean: true,\n\t\t\tstringGetter: () => \"foo\",\n\t\t\tnumberGetter: () => 0,\n\t\t\tbooleanGetter: () => true,\n\t\t});\n\n\t\t// Validate basic properties are tagged.\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData.string,\n\t\t\texpectedStringValue,\n\t\t\t\"string property not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData.number,\n\t\t\texpectedNumberValue,\n\t\t\t\"number property not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData.boolean,\n\t\t\texpectedBooleanValue,\n\t\t\t\"boolean property not tagged as expected\",\n\t\t);\n\n\t\t// Validate getters are tagged.\n\t\tconst stringValue = taggedData.stringGetter();\n\t\tconst numberValue = taggedData.numberGetter();\n\t\tconst booleanValue = taggedData.booleanGetter();\n\t\tassert.deepStrictEqual(\n\t\t\tstringValue,\n\t\t\texpectedStringValue,\n\t\t\t\"string getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tnumberValue,\n\t\t\texpectedNumberValue,\n\t\t\t\"number getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tbooleanValue,\n\t\t\texpectedBooleanValue,\n\t\t\t\"boolean getter not tagged as expected\",\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../src/test/utils.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport {\n\tConfigTypes,\n\tIConfigProviderBase,\n\tITelemetryBaseEvent,\n} from \"@fluidframework/core-interfaces\";\nimport { mixinMonitoringContext } from \"../config.js\";\nimport { TelemetryDataTag, tagCodeArtifacts, tagData } from \"../logger.js\";\nimport { ITelemetryGenericEventExt, ITelemetryLoggerExt } from \"../telemetryTypes.js\";\nimport { IEventSampler, createSampledLogger } from \"../utils.js\";\n\ndescribe(\"tagData\", () => {\n\tit(\"tagData with data\", () => {\n\t\tconst taggedData = tagData(TelemetryDataTag.CodeArtifact, { foo: \"bar\" });\n\t\tconst expected: typeof taggedData = {\n\t\t\tfoo: {\n\t\t\t\tvalue: \"bar\",\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t};\n\t\tassert.deepStrictEqual(taggedData, expected);\n\t});\n\tit(\"tagData with undefined\", () => {\n\t\tconst taggedData = tagData(TelemetryDataTag.CodeArtifact, { none: undefined });\n\t\tconst expected: Partial<typeof taggedData> = {};\n\t\tassert.deepStrictEqual(taggedData, expected);\n\t});\n\n\tit(\"tagData with complex object\", () => {\n\t\tconst taggedData = tagData(TelemetryDataTag.CodeArtifact, {\n\t\t\tfoo: \"bar\",\n\t\t\tnone: undefined,\n\t\t\tnumber: 0,\n\t\t});\n\t\tconst expected: Partial<typeof taggedData> = {\n\t\t\tfoo: {\n\t\t\t\tvalue: \"bar\",\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t\tnumber: {\n\t\t\t\tvalue: 0,\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t};\n\n\t\tassert.deepEqual(taggedData, expected);\n\t});\n});\n\ndescribe(\"Sampling\", () => {\n\tlet events: (ITelemetryBaseEvent | ITelemetryGenericEventExt)[] = [];\n\n\tfunction getMockLoggerExtWithConfig(\n\t\tconfigDictionary?: Record<string, ConfigTypes>,\n\t): ITelemetryLoggerExt {\n\t\tconst logger: ITelemetryLoggerExt = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t\tsendTelemetryEvent: (event) => {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t\tsendErrorEvent: (event) => {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t\tsendPerformanceEvent: (event) => {\n\t\t\t\tevents.push(event);\n\t\t\t},\n\t\t};\n\n\t\tconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\t\t\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n\t\t});\n\n\t\treturn mixinMonitoringContext(logger, configProvider(configDictionary ?? {})).logger;\n\t}\n\n\t/**\n\t * Creates an event sampler that uses a systematic approach to sampling (Sampling every nth event)\n\t */\n\t// eslint-disable-next-line unicorn/consistent-function-scoping\n\tfunction createSystematicEventSampler(options: { samplingRate: number }): IEventSampler {\n\t\tlet eventCount = -1;\n\t\treturn {\n\t\t\tsample: (): boolean => {\n\t\t\t\teventCount++;\n\t\t\t\tconst shouldSample = eventCount % options.samplingRate === 0;\n\t\t\t\tif (shouldSample) {\n\t\t\t\t\teventCount = 0;\n\t\t\t\t}\n\t\t\t\treturn shouldSample;\n\t\t\t},\n\t\t};\n\t}\n\n\tbeforeEach(() => {\n\t\tevents = [];\n\t});\n\n\tit(\"Events are not sampled if DisableSampling telemetry flag is set to true\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": true,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\tconst loggerWithoutSampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 1 }),\n\t\t);\n\t\tconst loggerWithEvery5Sampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 5 }),\n\t\t);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t\tloggerWithEvery5Sampling.send({ category: \"generic\", eventName: \"oneEveryFive\" });\n\t\t}\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"oneEveryFive\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t});\n\n\tit(\"Events are not sampled if DisableSampling telemetry flag is set to true and no sampler is provided\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": true,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\t// Sampling is enabled AND there was no sampler provided\n\t\tconst loggerWithoutSampling = createSampledLogger(logger);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t}\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t});\n\n\tit(\"Events are not sampled if DisableSampling telemetry flag is set to false but no sampler is provided\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": false,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\t// Sampling is enabled however there was no sampler provided so all events will be sent.\n\t\tconst loggerWithoutSampling = createSampledLogger(logger);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t}\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t});\n\n\tit(\"Systematic Sampling works as expected\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": false,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\tconst loggerWithoutSampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 1 }),\n\t\t);\n\t\tconst loggerWithEvery3Sampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 3 }),\n\t\t);\n\t\tconst loggerWithEvery5Sampling = createSampledLogger(\n\t\t\tlogger,\n\t\t\tcreateSystematicEventSampler({ samplingRate: 5 }),\n\t\t);\n\n\t\tconst totalEventCount = 15;\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tloggerWithoutSampling.send({ category: \"generic\", eventName: \"noSampling\" });\n\t\t\tloggerWithEvery3Sampling.send({ category: \"generic\", eventName: \"oneEveryThree\" });\n\t\t\tloggerWithEvery5Sampling.send({ category: \"generic\", eventName: \"oneEveryFive\" });\n\t\t}\n\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"noSampling\").length,\n\t\t\ttotalEventCount,\n\t\t);\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"oneEveryThree\").length,\n\t\t\ttotalEventCount / 3,\n\t\t);\n\t\tassert.equal(\n\t\t\tevents.filter((event) => event.eventName === \"oneEveryFive\").length,\n\t\t\ttotalEventCount / 5,\n\t\t);\n\t});\n\n\tit(\"Event Sampler works as expected with externally controlled state\", () => {\n\t\tconst injectedSettings = {\n\t\t\t\"Fluid.Telemetry.DisableSampling\": false,\n\t\t};\n\t\tconst logger = getMockLoggerExtWithConfig(injectedSettings);\n\n\t\tinterface ExampleEvent extends ITelemetryBaseEvent {\n\t\t\teventNumber: number;\n\t\t\tappNumber1: number;\n\t\t\tappNumber2: number;\n\t\t\tappBoolean1: boolean;\n\t\t\tappModeString: string;\n\t\t}\n\n\t\tlet exampleAppDataNumber1 = 0;\n\t\tlet exampleAppDataNumber2 = 10;\n\t\tlet exampleAppDataBoolean1 = true;\n\t\tlet exampleAppDataModeString = \"ready\";\n\n\t\t/* eslint-disable unicorn/consistent-function-scoping */\n\t\tconst shouldSampleEvent = (\n\t\t\tappNumber1: number,\n\t\t\tappNumber2: number,\n\t\t\tappBoolean1: boolean,\n\t\t\tappMode: string,\n\t\t): boolean => {\n\t\t\tconst shouldSample =\n\t\t\t\tappNumber1 < 1 && appNumber2 > 1 && appBoolean1 === true && appMode === \"ready\";\n\n\t\t\treturn shouldSample;\n\t\t};\n\t\t/* eslint-enable */\n\n\t\tconst customEventSampler: IEventSampler = {\n\t\t\tsample: () =>\n\t\t\t\tshouldSampleEvent(\n\t\t\t\t\texampleAppDataNumber1,\n\t\t\t\t\texampleAppDataNumber2,\n\t\t\t\t\texampleAppDataBoolean1,\n\t\t\t\t\texampleAppDataModeString,\n\t\t\t\t),\n\t\t};\n\n\t\tconst loggerWithSampling = createSampledLogger(logger, customEventSampler);\n\n\t\tconst totalEventCount = 20;\n\t\tconst eventName = \"testEvent\";\n\t\tfor (let i = 0; i < totalEventCount; i++) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\t// These values should cause events to be emitted (sampler returns false)\n\t\t\t\texampleAppDataNumber1 = -10;\n\t\t\t\texampleAppDataNumber2 = 2;\n\t\t\t\texampleAppDataBoolean1 = true;\n\t\t\t\texampleAppDataModeString = \"ready\";\n\t\t\t} else {\n\t\t\t\t// These values should cause events to not be emitted (sampler returns true)\n\t\t\t\texampleAppDataNumber1 = 0;\n\t\t\t\texampleAppDataNumber2 = 10;\n\t\t\t\texampleAppDataBoolean1 = true;\n\t\t\t\texampleAppDataModeString = \"not_ready\";\n\t\t\t}\n\n\t\t\tloggerWithSampling.send({\n\t\t\t\tcategory: \"generic\",\n\t\t\t\teventName,\n\t\t\t\teventNumber: i,\n\t\t\t\tappNumber1: exampleAppDataNumber1,\n\t\t\t\tappNumber2: exampleAppDataNumber2,\n\t\t\t\tappBoolean1: exampleAppDataBoolean1,\n\t\t\t\tappModeString: exampleAppDataModeString,\n\t\t\t});\n\t\t}\n\n\t\tconst emittedEvents = events.filter((event) => event.eventName === eventName);\n\t\tassert.equal(emittedEvents.length === 10, true);\n\t\tfor (const event of emittedEvents) {\n\t\t\tconst typedEvent = event as ExampleEvent;\n\t\t\tassert.equal(\n\t\t\t\tshouldSampleEvent(\n\t\t\t\t\ttypedEvent.appNumber1,\n\t\t\t\t\ttypedEvent.appNumber2,\n\t\t\t\t\ttypedEvent.appBoolean1,\n\t\t\t\t\ttypedEvent.appModeString,\n\t\t\t\t),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\t});\n});\n\ndescribe(\"tagCodeArtifacts\", () => {\n\tit(\"tagCodeArtifacts with undefined\", () => {\n\t\tconst taggedData = tagCodeArtifacts({ node: undefined });\n\t\tconst expected: Partial<typeof taggedData> = {};\n\t\tassert.deepStrictEqual(taggedData, expected, \"undefined not tagged as expected\");\n\t});\n\n\tit(\"tagCodeArtifacts with TelemetryBaseEventPropertyType properties\", () => {\n\t\tconst taggedData = tagCodeArtifacts({\n\t\t\tstring: \"foo\",\n\t\t\tnumber: 0,\n\t\t\tboolean: true,\n\t\t\tnone: undefined,\n\t\t});\n\t\tconst expected: Partial<typeof taggedData> = {\n\t\t\tstring: {\n\t\t\t\tvalue: \"foo\",\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t\tnumber: {\n\t\t\t\tvalue: 0,\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t\tboolean: {\n\t\t\t\tvalue: true,\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t},\n\t\t};\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData,\n\t\t\texpected,\n\t\t\t\"TelemetryBaseEventPropertyType not tagged as expected\",\n\t\t);\n\t});\n\n\tit(\"tagCodeArtifacts with TelemetryBaseEventPropertyType getters\", () => {\n\t\tconst taggedData = tagCodeArtifacts({\n\t\t\tstring: () => \"foo\",\n\t\t\tnumber: () => 0,\n\t\t\tboolean: () => true,\n\t\t});\n\t\tconst stringValue = taggedData.string();\n\t\tconst numberValue = taggedData.number();\n\t\tconst booleanValue = taggedData.boolean();\n\n\t\tassert.deepStrictEqual(\n\t\t\tstringValue,\n\t\t\t{\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: \"foo\",\n\t\t\t},\n\t\t\t\"string getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tnumberValue,\n\t\t\t{\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: 0,\n\t\t\t},\n\t\t\t\"number getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tbooleanValue,\n\t\t\t{\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\tvalue: true,\n\t\t\t},\n\t\t\t\"boolean getter not tagged as expected\",\n\t\t);\n\t});\n\n\tit(\"tagCodeArtifacts with both TelemetryBaseEventPropertyType properties and getters\", () => {\n\t\tconst expectedStringValue = {\n\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\tvalue: \"foo\",\n\t\t};\n\t\tconst expectedNumberValue = {\n\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\tvalue: 0,\n\t\t};\n\t\tconst expectedBooleanValue = {\n\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\tvalue: true,\n\t\t};\n\n\t\tconst taggedData = tagCodeArtifacts({\n\t\t\tstring: \"foo\",\n\t\t\tnumber: 0,\n\t\t\tboolean: true,\n\t\t\tstringGetter: () => \"foo\",\n\t\t\tnumberGetter: () => 0,\n\t\t\tbooleanGetter: () => true,\n\t\t});\n\n\t\t// Validate basic properties are tagged.\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData.string,\n\t\t\texpectedStringValue,\n\t\t\t\"string property not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData.number,\n\t\t\texpectedNumberValue,\n\t\t\t\"number property not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\ttaggedData.boolean,\n\t\t\texpectedBooleanValue,\n\t\t\t\"boolean property not tagged as expected\",\n\t\t);\n\n\t\t// Validate getters are tagged.\n\t\tconst stringValue = taggedData.stringGetter();\n\t\tconst numberValue = taggedData.numberGetter();\n\t\tconst booleanValue = taggedData.booleanGetter();\n\t\tassert.deepStrictEqual(\n\t\t\tstringValue,\n\t\t\texpectedStringValue,\n\t\t\t\"string getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tnumberValue,\n\t\t\texpectedNumberValue,\n\t\t\t\"number getter not tagged as expected\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tbooleanValue,\n\t\t\texpectedBooleanValue,\n\t\t\t\"boolean getter not tagged as expected\",\n\t\t);\n\t});\n});\n"]}
package/lib/utils.d.ts CHANGED
@@ -1,3 +1,7 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
1
5
  import { ITelemetryLoggerExt } from "./telemetryTypes.js";
2
6
  /**
3
7
  * An object that contains a callback used in conjunction with the {@link createSampledLogger} utility function to provide custom logic for sampling events.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAA6B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAErF;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IACnE;;;;;;;OAOG;IACH,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,mBAAmB,EAC3B,YAAY,CAAC,EAAE,aAAa,GAC1B,uBAAuB,CAiCzB"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAA6B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAErF;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IACnE;;;;;;;OAOG;IACH,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,mBAAmB,EAC3B,YAAY,CAAC,EAAE,aAAa,GAC1B,uBAAuB,CAiCzB"}
package/lib/utils.js CHANGED
@@ -1,3 +1,7 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
1
5
  import { loggerToMonitoringContext } from "./config.js";
2
6
  /**
3
7
  * Wraps around an existing logger matching the {@link ITelemetryLoggerExt} interface and provides the ability to only log a subset of events using a sampling strategy provided by an ${@link IEventSampler}.
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAgCxD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAClC,MAA2B,EAC3B,YAA4B;IAE5B,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GACvB,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC,IAAI,KAAK,CAAC;IAEjF,MAAM,aAAa,GAAG;QACrB,IAAI,EAAE,CAAC,KAA0B,EAAQ,EAAE;YAC1C,2DAA2D;YAC3D,gIAAgI;YAChI,2LAA2L;YAC3L,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACnB;QACF,CAAC;QACD,kBAAkB,EAAE,CAAC,KAAgC,EAAQ,EAAE;YAC9D,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;aACjC;QACF,CAAC;QACD,cAAc,EAAE,CAAC,KAAgC,EAAQ,EAAE;YAC1D,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;aAC7B;QACF,CAAC;QACD,oBAAoB,EAAE,CAAC,KAAgC,EAAQ,EAAE;YAChE,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;aACnC;QACF,CAAC;QACD,kBAAkB;KAClB,CAAC;IAEF,OAAO,aAAa,CAAC;AACtB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport { loggerToMonitoringContext } from \"./config.js\";\nimport { ITelemetryGenericEventExt, ITelemetryLoggerExt } from \"./telemetryTypes.js\";\n\n/**\n * An object that contains a callback used in conjunction with the {@link createSampledLogger} utility function to provide custom logic for sampling events.\n *\n * @internal\n */\nexport interface IEventSampler {\n\t/**\n\t * @returns true if the event should be sampled or false if not\n\t */\n\tsample: () => boolean | undefined;\n}\n\n/**\n * A telemetry logger that has sampling capabilities\n *\n * @internal\n */\nexport interface ISampledTelemetryLogger extends ITelemetryLoggerExt {\n\t/**\n\t * Indicates if the feature flag to disable sampling is set.\n\t *\n\t * @remarks Exposed to enable some advanced scenarios where the code using the sampled logger\n\t * could take advantage of skipping the execution of some logic when it can determine\n\t * it won't be necessary because the telemetry event that needs it wouldn't be\n\t * emitted anyway.\n\t */\n\tisSamplingDisabled: boolean;\n}\n\n/**\n * Wraps around an existing logger matching the {@link ITelemetryLoggerExt} interface and provides the ability to only log a subset of events using a sampling strategy provided by an ${@link IEventSampler}.\n * You can chose to not provide an event sampler which is effectively a no-op, meaning that it will be treated as if the sampler always returns true.\n *\n * @remarks\n * The sampling functionality uses the Fluid telemetry logging configuration along with the optionally provided event sampling callback to determine whether an event should\n * be logged or not.\n *\n * Configuration object parameters:\n * 'Fluid.Telemetry.DisableSampling': if this config value is set to true, all events will be unsampled and therefore logged.\n * Otherwise only a sample will be logged according to the provided event sampler callback.\n *\n * Note that the same sampler is used for all APIs of the returned logger. If you want separate events flowing through the returned logger to be sampled separately, the {@link IEventSampler} you provide should track them separately.\n *\n * @internal\n */\nexport function createSampledLogger(\n\tlogger: ITelemetryLoggerExt,\n\teventSampler?: IEventSampler,\n): ISampledTelemetryLogger {\n\tconst monitoringContext = loggerToMonitoringContext(logger);\n\tconst isSamplingDisabled =\n\t\tmonitoringContext.config.getBoolean(\"Fluid.Telemetry.DisableSampling\") ?? false;\n\n\tconst sampledLogger = {\n\t\tsend: (event: ITelemetryBaseEvent): void => {\n\t\t\t// The sampler uses the following logic for sending events:\n\t\t\t// 1. If isSamplingDisabled is true, then this means events should be unsampled. Therefore we send the event without any checks.\n\t\t\t// 2. If isSamplingDisabled is false, then event should be sampled using the event sampler, if the sampler is not defined just send all events, other use the eventSampler.sample() method.\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.send(event);\n\t\t\t}\n\t\t},\n\t\tsendTelemetryEvent: (event: ITelemetryGenericEventExt): void => {\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.sendTelemetryEvent(event);\n\t\t\t}\n\t\t},\n\t\tsendErrorEvent: (event: ITelemetryGenericEventExt): void => {\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.sendErrorEvent(event);\n\t\t\t}\n\t\t},\n\t\tsendPerformanceEvent: (event: ITelemetryGenericEventExt): void => {\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.sendPerformanceEvent(event);\n\t\t\t}\n\t\t},\n\t\tisSamplingDisabled,\n\t};\n\n\treturn sampledLogger;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAgCxD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAClC,MAA2B,EAC3B,YAA4B;IAE5B,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GACvB,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC,IAAI,KAAK,CAAC;IAEjF,MAAM,aAAa,GAAG;QACrB,IAAI,EAAE,CAAC,KAA0B,EAAQ,EAAE;YAC1C,2DAA2D;YAC3D,gIAAgI;YAChI,2LAA2L;YAC3L,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACnB;QACF,CAAC;QACD,kBAAkB,EAAE,CAAC,KAAgC,EAAQ,EAAE;YAC9D,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;aACjC;QACF,CAAC;QACD,cAAc,EAAE,CAAC,KAAgC,EAAQ,EAAE;YAC1D,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;aAC7B;QACF,CAAC;QACD,oBAAoB,EAAE,CAAC,KAAgC,EAAQ,EAAE;YAChE,IAAI,kBAAkB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC9E,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;aACnC;QACF,CAAC;QACD,kBAAkB;KAClB,CAAC;IAEF,OAAO,aAAa,CAAC;AACtB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport { loggerToMonitoringContext } from \"./config.js\";\nimport { ITelemetryGenericEventExt, ITelemetryLoggerExt } from \"./telemetryTypes.js\";\n\n/**\n * An object that contains a callback used in conjunction with the {@link createSampledLogger} utility function to provide custom logic for sampling events.\n *\n * @internal\n */\nexport interface IEventSampler {\n\t/**\n\t * @returns true if the event should be sampled or false if not\n\t */\n\tsample: () => boolean | undefined;\n}\n\n/**\n * A telemetry logger that has sampling capabilities\n *\n * @internal\n */\nexport interface ISampledTelemetryLogger extends ITelemetryLoggerExt {\n\t/**\n\t * Indicates if the feature flag to disable sampling is set.\n\t *\n\t * @remarks Exposed to enable some advanced scenarios where the code using the sampled logger\n\t * could take advantage of skipping the execution of some logic when it can determine\n\t * it won't be necessary because the telemetry event that needs it wouldn't be\n\t * emitted anyway.\n\t */\n\tisSamplingDisabled: boolean;\n}\n\n/**\n * Wraps around an existing logger matching the {@link ITelemetryLoggerExt} interface and provides the ability to only log a subset of events using a sampling strategy provided by an ${@link IEventSampler}.\n * You can chose to not provide an event sampler which is effectively a no-op, meaning that it will be treated as if the sampler always returns true.\n *\n * @remarks\n * The sampling functionality uses the Fluid telemetry logging configuration along with the optionally provided event sampling callback to determine whether an event should\n * be logged or not.\n *\n * Configuration object parameters:\n * 'Fluid.Telemetry.DisableSampling': if this config value is set to true, all events will be unsampled and therefore logged.\n * Otherwise only a sample will be logged according to the provided event sampler callback.\n *\n * Note that the same sampler is used for all APIs of the returned logger. If you want separate events flowing through the returned logger to be sampled separately, the {@link IEventSampler} you provide should track them separately.\n *\n * @internal\n */\nexport function createSampledLogger(\n\tlogger: ITelemetryLoggerExt,\n\teventSampler?: IEventSampler,\n): ISampledTelemetryLogger {\n\tconst monitoringContext = loggerToMonitoringContext(logger);\n\tconst isSamplingDisabled =\n\t\tmonitoringContext.config.getBoolean(\"Fluid.Telemetry.DisableSampling\") ?? false;\n\n\tconst sampledLogger = {\n\t\tsend: (event: ITelemetryBaseEvent): void => {\n\t\t\t// The sampler uses the following logic for sending events:\n\t\t\t// 1. If isSamplingDisabled is true, then this means events should be unsampled. Therefore we send the event without any checks.\n\t\t\t// 2. If isSamplingDisabled is false, then event should be sampled using the event sampler, if the sampler is not defined just send all events, other use the eventSampler.sample() method.\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.send(event);\n\t\t\t}\n\t\t},\n\t\tsendTelemetryEvent: (event: ITelemetryGenericEventExt): void => {\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.sendTelemetryEvent(event);\n\t\t\t}\n\t\t},\n\t\tsendErrorEvent: (event: ITelemetryGenericEventExt): void => {\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.sendErrorEvent(event);\n\t\t\t}\n\t\t},\n\t\tsendPerformanceEvent: (event: ITelemetryGenericEventExt): void => {\n\t\t\tif (isSamplingDisabled || eventSampler === undefined || eventSampler.sample()) {\n\t\t\t\tlogger.sendPerformanceEvent(event);\n\t\t\t}\n\t\t},\n\t\tisSamplingDisabled,\n\t};\n\n\treturn sampledLogger;\n}\n"]}