@oneuptime/common 12.0.34 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/Models/DatabaseModels/GlobalConfig.ts +12 -12
  2. package/Models/DatabaseModels/InventoryItem.ts +44 -1
  3. package/Models/DatabaseModels/NetworkDevice.ts +126 -0
  4. package/Server/EnvironmentConfig.ts +47 -16
  5. package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  7. package/Server/Infrastructure/Redis.ts +8 -8
  8. package/Server/Infrastructure/Status.ts +10 -4
  9. package/Server/Services/DatabaseService.ts +65 -13
  10. package/Server/Services/InventoryItemService.ts +31 -1
  11. package/Server/Services/MonitorTemplateService.ts +140 -19
  12. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +349 -41
  13. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
  14. package/Server/Services/NetworkDeviceService.ts +69 -0
  15. package/Server/Services/UserNotificationRuleService.ts +76 -25
  16. package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
  17. package/Server/Types/Database/QueryUtil.ts +56 -0
  18. package/Server/Types/Markdown.ts +93 -1
  19. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
  20. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +10 -1
  21. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
  22. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
  23. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
  24. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +202 -37
  25. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
  26. package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
  27. package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
  28. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
  29. package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
  30. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
  31. package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
  32. package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
  33. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
  34. package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
  35. package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
  36. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
  37. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
  38. package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
  39. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
  40. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
  41. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
  42. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
  43. package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
  44. package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
  45. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
  46. package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
  47. package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
  48. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
  49. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
  50. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
  51. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
  52. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
  53. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
  54. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
  55. package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
  56. package/Tests/Models/InventoryItemStatus.test.ts +147 -0
  57. package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
  58. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
  59. package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
  60. package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
  61. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
  62. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
  63. package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
  64. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
  65. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
  66. package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
  67. package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
  68. package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
  69. package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
  70. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
  71. package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
  72. package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
  73. package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
  74. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
  75. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
  76. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
  77. package/Tests/Server/Types/Markdown.test.ts +194 -1
  78. package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
  79. package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
  80. package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
  81. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
  82. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  83. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
  84. package/Tests/Server/Utils/EventLoop.test.ts +359 -0
  85. package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
  86. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
  87. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
  88. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
  89. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
  90. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
  91. package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
  92. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +224 -10
  93. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
  94. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
  95. package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
  96. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
  97. package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
  98. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
  99. package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
  100. package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
  101. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
  102. package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
  103. package/Tests/Types/JSONFunctions.test.ts +40 -0
  104. package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
  105. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
  106. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
  107. package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
  108. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
  109. package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
  110. package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
  111. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
  112. package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
  113. package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
  114. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
  115. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
  116. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
  117. package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
  118. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
  119. package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
  120. package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
  121. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
  122. package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
  123. package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
  124. package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
  125. package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
  126. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  127. package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
  128. package/Types/Dashboard/DashboardVariable.ts +8 -0
  129. package/Types/JSON.ts +4 -0
  130. package/Types/JSONFunctions.ts +16 -0
  131. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
  132. package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
  133. package/Types/SerializableObjectDictionary.ts +4 -0
  134. package/Types/Telemetry/InventoryLiveness.ts +56 -0
  135. package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
  136. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
  137. package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
  138. package/UI/esbuild-config.js +6 -0
  139. package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
  140. package/Utils/Dashboard/LabelVariable.ts +152 -0
  141. package/Utils/Dashboard/VariableUrlState.ts +27 -5
  142. package/Utils/MetricUnitUtil.ts +34 -0
  143. package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
  144. package/Utils/Monitor/MetricValueFormatter.ts +342 -0
  145. package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
  146. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
  147. package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
  148. package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
  149. package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
  150. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
  152. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
  153. package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
  154. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  155. package/build/dist/Server/EnvironmentConfig.js +44 -12
  156. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  157. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
  158. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
  159. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  160. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  161. package/build/dist/Server/Infrastructure/Redis.js +8 -8
  162. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  163. package/build/dist/Server/Infrastructure/Status.js +10 -4
  164. package/build/dist/Server/Infrastructure/Status.js.map +1 -1
  165. package/build/dist/Server/Services/DatabaseService.js +58 -13
  166. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  167. package/build/dist/Server/Services/InventoryItemService.js +28 -1
  168. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  169. package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
  170. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  171. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +270 -37
  172. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  173. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
  174. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  175. package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
  176. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  177. package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
  178. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  179. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
  180. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  181. package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
  182. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  183. package/build/dist/Server/Types/Markdown.js +75 -0
  184. package/build/dist/Server/Types/Markdown.js.map +1 -1
  185. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
  186. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  187. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +10 -1
  188. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  189. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
  190. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
  191. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
  192. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  193. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
  194. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  195. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +166 -35
  196. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  197. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
  198. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  199. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
  200. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
  201. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
  202. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
  203. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
  204. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  205. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
  206. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
  207. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
  208. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  209. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
  210. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  211. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
  212. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  213. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
  214. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
  215. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  216. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  217. package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
  218. package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
  219. package/build/dist/Types/JSON.js +1 -0
  220. package/build/dist/Types/JSON.js.map +1 -1
  221. package/build/dist/Types/JSONFunctions.js +13 -0
  222. package/build/dist/Types/JSONFunctions.js.map +1 -1
  223. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
  224. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  225. package/build/dist/Types/SerializableObjectDictionary.js +4 -0
  226. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  227. package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
  228. package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
  229. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
  230. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
  231. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
  232. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  233. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
  234. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
  235. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
  236. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
  237. package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
  238. package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
  239. package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
  240. package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
  241. package/build/dist/Utils/MetricUnitUtil.js +26 -0
  242. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  243. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
  244. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
  245. package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
  246. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
  247. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
  248. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
  249. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
  250. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  251. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
  252. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  253. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
  254. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
  255. package/jest.config.json +2 -0
  256. package/package.json +1 -1
  257. package/test-setup.sh +9 -9
  258. package/tsconfig.json +51 -11
  259. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
@@ -116,9 +116,9 @@ describe("MonitorCriteriaMessageBuilder — metric unit labelling", () => {
116
116
  });
117
117
 
118
118
  // Observed value carries the unit.
119
- expect(message).toContain("latest 0.06 sec");
120
- expect(message).toContain("min 0.06 sec");
121
- expect(message).toContain("max 0.06 sec");
119
+ expect(message).toContain("latest 60 ms");
120
+ expect(message).toContain("min 60 ms");
121
+ expect(message).toContain("max 60 ms");
122
122
  // Threshold in the expectation clause carries the same unit.
123
123
  expect(message).toContain("greater than 5 sec");
124
124
  });
@@ -150,11 +150,20 @@ describe("MonitorCriteriaMessageBuilder — metric unit labelling", () => {
150
150
  matchMessage: null,
151
151
  });
152
152
 
153
- expect(message).toContain("latest 0.50 sec");
153
+ expect(message).toContain("latest 500 ms");
154
154
  expect(message).toContain("greater than 2 sec");
155
155
  });
156
156
 
157
- test("omits the unit for dimensionless ratio metrics (native unit '1')", () => {
157
+ /*
158
+ * A ratio metric carries OTel's dimensionless "1" over samples that are
159
+ * fractions in [0, 1]. Printing "0.06 1" is meaningless and printing a
160
+ * bare "0.06" reads as 0.06% when the value is 6%.
161
+ *
162
+ * The fired-alert email has rendered this as "6.00%" since CompareCriteria
163
+ * adopted MetricValueFormatter; this line — the monitor's own evaluation
164
+ * log for the SAME sample — used to say "0.06". Both now agree.
165
+ */
166
+ test("renders a dimensionless ratio metric as the percentage it means", () => {
158
167
  const criteriaFilter: CriteriaFilter = {
159
168
  checkOn: CheckOn.MetricValue,
160
169
  filterType: FilterType.GreaterThan,
@@ -179,12 +188,50 @@ describe("MonitorCriteriaMessageBuilder — metric unit labelling", () => {
179
188
  matchMessage: null,
180
189
  });
181
190
 
182
- expect(message).toContain("latest 0.06");
183
- // No stray "0.06 1" and no unit on the threshold.
191
+ expect(message).toContain("latest 6.00%");
192
+ // Never the dimensionless marker, and never the unscaled fraction.
184
193
  expect(message).not.toContain("0.06 1");
185
- expect(message).toContain("greater than 0.9");
194
+ expect(message).not.toContain("latest 0.06");
195
+ // The threshold is scaled the same way, so the two halves agree.
196
+ expect(message).toContain("greater than 90.00%");
186
197
  expect(message).not.toContain("greater than 0.9 1");
187
198
  });
199
+
200
+ /*
201
+ * The control for the rule above: "1" is only a percentage when the
202
+ * metric NAME says the value is a fraction. A counter carrying "1" —
203
+ * cumulative layout shift is the canonical one — keeps its bare number.
204
+ */
205
+ test("a non-fraction metric carrying '1' keeps its bare number", () => {
206
+ const criteriaFilter: CriteriaFilter = {
207
+ checkOn: CheckOn.MetricValue,
208
+ filterType: FilterType.GreaterThan,
209
+ value: "0.25",
210
+ metricMonitorOptions: {
211
+ metricAlias: "a",
212
+ metricAggregationType: EvaluateOverTimeType.Average,
213
+ },
214
+ };
215
+
216
+ const inputs: ReturnType<typeof buildInputs> = buildInputs({
217
+ metricNativeUnit: "1",
218
+ metricName: "browser.cumulative_layout_shift",
219
+ sampleValues: [0.31],
220
+ criteriaFilter,
221
+ });
222
+
223
+ const message: string =
224
+ MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage({
225
+ ...inputs,
226
+ didMeetCriteria: false,
227
+ matchMessage: null,
228
+ });
229
+
230
+ expect(message).toContain("latest 0.31");
231
+ expect(message).not.toContain("0.31 1");
232
+ expect(message).not.toContain("31.00%");
233
+ expect(message).toContain("greater than 0.25");
234
+ });
188
235
  });
189
236
 
190
237
  /*
@@ -221,7 +268,7 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
221
268
  });
222
269
 
223
270
  expect(message).toBe(
224
- "Metric Value (a) recorded latest 0.06 sec (min 0.06 sec, max 0.06 sec) across 3 data points. (expected to be greater than 5 sec using average).",
271
+ "Metric Value (a) recorded latest 60 ms (min 60 ms, max 60 ms) across 3 data points. (expected to be greater than 5 sec using average).",
225
272
  );
226
273
  });
227
274
 
@@ -251,10 +298,10 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
251
298
  });
252
299
 
253
300
  expect(message).toBe(
254
- "Metric Value (a) recorded latest 10.00 sec (min 8.00 sec, max 12.00 sec) across 3 data points. (expected to be less than 5 sec using average).",
301
+ "Metric Value (a) recorded latest 10 sec (min 8 sec, max 12 sec) across 3 data points. (expected to be less than 5 sec using average).",
255
302
  );
256
303
  // The unit rides both the observed value and the "less than N unit" clause.
257
- expect(message).toContain("latest 10.00 sec");
304
+ expect(message).toContain("latest 10 sec");
258
305
  expect(message).toContain("less than 5 sec");
259
306
  });
260
307
 
@@ -286,7 +333,7 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
286
333
  });
287
334
 
288
335
  expect(message).toBe(
289
- "Metric Value (a) recorded latest 3.50 sec (min 1.50 sec, max 3.50 sec) across 3 data points. (expected to be greater than 2 sec using maximum value).",
336
+ "Metric Value (a) recorded latest 3.5 sec (min 1.5 sec, max 3.5 sec) across 3 data points. (expected to be greater than 2 sec using maximum value).",
290
337
  );
291
338
  // The raw ms magnitudes never leak into the rendered line.
292
339
  expect(message).not.toContain("1500");
@@ -329,14 +376,14 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
329
376
  * observed value and the threshold, even though "1.00" appears in the text.
330
377
  */
331
378
  expect(message).toBe(
332
- "Metric Value (a) recorded latest 1.00 (min 0.95, max 1.00) across 3 data points. (expected to be greater than 0.9 using average).",
379
+ "Metric Value (a) recorded latest 100.00% (min 95.00%, max 100.00%) across 3 data points. (expected to be greater than 90.00% using average).",
333
380
  );
334
381
  /*
335
382
  * Neither the value nor the threshold carries a unit: each number is
336
383
  * immediately followed by punctuation/wording, never a " 1" unit suffix.
337
384
  */
338
- expect(message).toContain("latest 1.00 (min 0.95, max 1.00)");
339
- expect(message).toContain("greater than 0.9 using average");
385
+ expect(message).toContain("latest 100.00% (min 95.00%, max 100.00%)");
386
+ expect(message).toContain("greater than 90.00% using average");
340
387
  });
341
388
 
342
389
  /*
@@ -375,11 +422,11 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
375
422
  });
376
423
 
377
424
  expect(message).toBe(
378
- "Metric Value (a) recorded latest 6.00 % across 1 data point. (expected to be greater than 90 % using average).",
425
+ "Metric Value (a) recorded latest 6.00% across 1 data point. (expected to be greater than 90.00% using average).",
379
426
  );
380
427
  // Both the converted observed value and the threshold carry the "%" unit.
381
- expect(message).toContain("latest 6.00 %");
382
- expect(message).toContain("greater than 90 %");
428
+ expect(message).toContain("latest 6.00%");
429
+ expect(message).toContain("greater than 90.00%");
383
430
  // The raw fraction magnitude never leaks into the rendered line.
384
431
  expect(message).not.toContain("0.06");
385
432
  // Singular grammar for the lone sample — no "(min .., max ..)" clause.
@@ -488,7 +535,7 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
488
535
  });
489
536
 
490
537
  expect(message).toBe(
491
- "Metric Value (a) recorded latest 7.00 sec across 1 data point. (expected to be greater than 5 sec using average).",
538
+ "Metric Value (a) recorded latest 7 sec across 1 data point. (expected to be greater than 5 sec using average).",
492
539
  );
493
540
  // Singular grammar, and no "(min .., max ..)" clause for a lone sample.
494
541
  expect(message).toContain("across 1 data point.");
@@ -522,7 +569,7 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
522
569
  });
523
570
 
524
571
  expect(message).toBe(
525
- "Metric Value (a) recorded latest 100.00 ms (min 100.00 ms, max 100.00 ms) across 3 data points. (expected to equal 100 ms using average).",
572
+ "Metric Value (a) recorded latest 100 ms (min 100 ms, max 100 ms) across 3 data points. (expected to equal 100 ms using average).",
526
573
  );
527
574
  });
528
575
 
@@ -552,7 +599,7 @@ describe("MonitorCriteriaMessageBuilder.buildCriteriaFilterMessage — Evaluatio
552
599
  });
553
600
 
554
601
  expect(message).toBe(
555
- "Metric Value (a) recorded latest 70.00 ms (min 55.00 ms, max 70.00 ms) across 3 data points. (expected to be greater than or equal to 50 ms using maximum value).",
602
+ "Metric Value (a) recorded latest 70 ms (min 55 ms, max 70 ms) across 3 data points. (expected to be greater than or equal to 50 ms using maximum value).",
556
603
  );
557
604
  });
558
605
 
@@ -318,7 +318,7 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
318
318
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
319
319
 
320
320
  expect(observation).toBe(
321
- "Metric Value (a) recorded latest 0.06 sec (min 0.06 sec, max 0.06 sec) across 3 data points.",
321
+ "Metric Value (a) recorded latest 60 ms (min 60 ms, max 60 ms) across 3 data points.",
322
322
  );
323
323
  });
324
324
 
@@ -339,7 +339,7 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
339
339
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
340
340
 
341
341
  expect(observation).toBe(
342
- "Metric Value (a) recorded latest 60.00 ms (min 40.00 ms, max 60.00 ms) across 2 data points.",
342
+ "Metric Value (a) recorded latest 60 ms (min 40 ms, max 60 ms) across 2 data points.",
343
343
  );
344
344
  });
345
345
 
@@ -364,9 +364,9 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
364
364
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
365
365
 
366
366
  expect(observation).toBe(
367
- "Metric Value (a) recorded latest 2.50 sec across 1 data point.",
367
+ "Metric Value (a) recorded latest 2.5 sec across 1 data point.",
368
368
  );
369
- expect(observation).toContain("2.50 sec");
369
+ expect(observation).toContain("2.5 sec");
370
370
  });
371
371
 
372
372
  /*
@@ -389,9 +389,9 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
389
389
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
390
390
 
391
391
  expect(observation).toBe(
392
- "Metric Value (a) recorded latest 2.50 GB across 1 data point.",
392
+ "Metric Value (a) recorded latest 2.5 GB across 1 data point.",
393
393
  );
394
- expect(observation).toContain("2.50 GB");
394
+ expect(observation).toContain("2.5 GB");
395
395
  });
396
396
 
397
397
  /*
@@ -413,13 +413,30 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
413
413
  const observation: string | null =
414
414
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
415
415
 
416
+ /*
417
+ * The user mislabelled a millisecond metric as megabytes. The
418
+ * conversion still no-ops — ms and MB are different families — so the
419
+ * SAMPLE is untouched at 5000, and the renderer then takes the label
420
+ * at its word and reads 5000 MB out as "5 GB". Every string this
421
+ * sentence can produce is wrong, because the configuration is; what
422
+ * this test pins is that the mislabelling is passed through rather
423
+ * than silently repaired.
424
+ */
416
425
  expect(observation).toBe(
417
- "Metric Value (a) recorded latest 5000.00 MB across 1 data point.",
426
+ "Metric Value (a) recorded latest 5 GB across 1 data point.",
418
427
  );
419
- // Unconverted value passed through.
420
- expect(observation).toContain("5000.00");
421
- // But labelled with the (incompatible) threshold unit.
422
- expect(observation).toContain("MB");
428
+ expect(observation).toContain("5 GB");
429
+ /*
430
+ * Still reported in the threshold unit's FAMILY — the label the user
431
+ * chose won, which is the behaviour this test guards. It reads "GB"
432
+ * rather than "MB" only because the ladder rescales within that family;
433
+ * the alternative would be to drop the user's unit when it looks
434
+ * incompatible, which would hide the misconfiguration entirely.
435
+ */
436
+ expect(observation).not.toContain("ms");
437
+ expect(
438
+ MonitorCriteriaObservationBuilder.getMetricValueDisplayUnit(inputs),
439
+ ).toBe("MB");
423
440
  });
424
441
 
425
442
  /*
@@ -486,7 +503,7 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
486
503
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
487
504
 
488
505
  expect(observation).toBe(
489
- "Metric Value (a) recorded latest 60.00 ms (min 40.00 ms, max 60.00 ms) across 2 data points.",
506
+ "Metric Value (a) recorded latest 60 ms (min 40 ms, max 60 ms) across 2 data points.",
490
507
  );
491
508
  });
492
509
 
@@ -532,7 +549,7 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
532
549
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
533
550
 
534
551
  expect(observation).toBe(
535
- "Metric Value (b) recorded latest 3.00 sec (min 1.00 sec, max 3.00 sec) across 3 data points.",
552
+ "Metric Value (b) recorded latest 3 sec (min 1 sec, max 3 sec) across 3 data points.",
536
553
  );
537
554
  // The a-series (ms, 40/60) must not leak in.
538
555
  expect(observation).not.toContain("(a)");
@@ -562,7 +579,7 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
562
579
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
563
580
 
564
581
  expect(observation).toBe(
565
- "Metric Value (a) recorded latest 6.00 % across 1 data point.",
582
+ "Metric Value (a) recorded latest 6.00% across 1 data point.",
566
583
  );
567
584
 
568
585
  const unit: string | undefined =
@@ -630,7 +647,7 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
630
647
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
631
648
 
632
649
  expect(observation).toBe(
633
- "Metric Value (c) recorded latest 2.50 sec (min 1.50 sec, max 2.50 sec) across 2 data points.",
650
+ "Metric Value (c) recorded latest 2.5 sec (min 1.5 sec, max 2.5 sec) across 2 data points.",
634
651
  );
635
652
  // The formula alias, not the base query, is summarized.
636
653
  expect(observation).toContain("(c)");
@@ -659,9 +676,9 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
659
676
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
660
677
 
661
678
  expect(observation).toBe(
662
- "Metric Value (a) recorded latest 1.50 gbit across 1 data point.",
679
+ "Metric Value (a) recorded latest 1.5 Gbit across 1 data point.",
663
680
  );
664
- expect(observation).toContain("1.50 gbit");
681
+ expect(observation).toContain("1.5 Gbit");
665
682
  });
666
683
 
667
684
  /*
@@ -686,10 +703,10 @@ describe("MonitorCriteriaObservationBuilder.describeFilterObservation — metric
686
703
  MonitorCriteriaObservationBuilder.describeFilterObservation(inputs);
687
704
 
688
705
  expect(observation).toBe(
689
- "Metric Value (a) recorded latest 5.00 sec across 1 data point.",
706
+ "Metric Value (a) recorded latest 5 sec across 1 data point.",
690
707
  );
691
708
  // Unconverted value, but labelled with the threshold unit.
692
- expect(observation).toContain("5.00 sec");
709
+ expect(observation).toContain("5 sec");
693
710
  });
694
711
  });
695
712