@oneuptime/common 12.0.30 → 12.0.31

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 (489) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  5. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  6. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  7. package/Models/DatabaseModels/Index.ts +2 -0
  8. package/Models/DatabaseModels/NetworkDevice.ts +113 -3
  9. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  10. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  11. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
  12. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  13. package/Server/API/GlobalConfigAPI.ts +362 -183
  14. package/Server/API/TelemetryAPI.ts +42 -4
  15. package/Server/EnvironmentConfig.ts +112 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  19. package/Server/Middleware/MultipartFormData.ts +118 -32
  20. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  21. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  22. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  23. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  24. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  25. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  26. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  27. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  28. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  29. package/Server/Services/AlertReminderRuleService.ts +9 -1
  30. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  31. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  32. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  33. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  34. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  35. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  36. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  37. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  38. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  40. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  41. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  43. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  44. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  45. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  46. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  47. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  48. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  49. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  50. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  52. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  53. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  54. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/Index.ts +2 -0
  57. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  58. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  59. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  60. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  61. package/Server/Services/KubernetesResourceService.ts +5 -1
  62. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  63. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  64. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  65. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  66. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  67. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  68. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  69. package/Server/Services/NetworkDeviceService.ts +209 -1
  70. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  71. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  72. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  73. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  74. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  79. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  80. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  81. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  82. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  83. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  85. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  86. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  87. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  88. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  92. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  93. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  94. package/Server/Services/UserService.ts +27 -0
  95. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  97. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  98. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  99. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  100. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  101. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  102. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  103. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  104. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  105. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  106. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  107. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  108. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  109. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  110. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  111. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  112. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  113. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  114. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  115. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  116. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  117. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
  118. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  119. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  120. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  121. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  122. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  123. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  124. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  125. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  126. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  127. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  128. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  129. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  130. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  131. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  132. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  133. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  134. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  135. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  136. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  137. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  138. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  139. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  140. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  141. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  142. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  143. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  144. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  145. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  146. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  147. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  148. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  149. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  150. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  151. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  152. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  153. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  154. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  155. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  156. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  157. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  158. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  159. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  160. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  161. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  162. package/Tests/UI/Components/XAxis.test.ts +270 -5
  163. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  164. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  165. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  166. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  167. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  168. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  169. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  170. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  171. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  172. package/Types/Date.ts +39 -0
  173. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  174. package/Types/Permission.ts +96 -0
  175. package/Types/Rum/SessionReplay.ts +21 -0
  176. package/Types/Telemetry/SourceMap.ts +8 -0
  177. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  178. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  179. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  180. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  181. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
  182. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
  183. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
  184. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  185. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  186. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  187. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  188. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  189. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  190. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  191. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  192. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  193. package/UI/Components/Feed/FeedItem.tsx +4 -5
  194. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  195. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  196. package/UI/Components/Image/Image.tsx +20 -3
  197. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  198. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  199. package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
  200. package/UI/Components/Table/TableHeader.tsx +64 -48
  201. package/UI/Components/Table/TableRow.tsx +13 -3
  202. package/UI/Styles/Theme.css +38 -0
  203. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  204. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  205. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  206. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  207. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  208. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  209. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  210. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  211. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  212. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  214. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  216. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  218. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  220. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  221. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  222. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
  224. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  225. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  226. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  227. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  228. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
  229. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  230. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  231. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  232. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  233. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  234. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  235. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  236. package/build/dist/Server/EnvironmentConfig.js +83 -0
  237. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  244. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  245. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  246. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  247. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  248. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  249. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  250. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  251. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  252. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  253. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  254. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  255. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  256. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  257. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  258. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  259. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  260. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  261. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  262. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  263. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  264. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  265. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  266. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  267. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  268. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  269. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  270. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  271. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  272. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  273. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  274. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  275. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  276. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  277. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  278. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  279. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  280. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  281. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  282. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  283. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  284. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  285. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  286. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  287. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  288. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  289. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  290. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  291. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  292. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  293. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  294. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  295. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  297. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  299. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  300. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  301. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  302. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  303. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  304. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  305. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  306. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  307. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  308. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  309. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  310. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  311. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  312. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  313. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  314. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  315. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  316. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  317. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  318. package/build/dist/Server/Services/Index.js +2 -0
  319. package/build/dist/Server/Services/Index.js.map +1 -1
  320. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  321. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  322. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  323. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  324. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  325. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  326. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  327. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  328. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  329. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  330. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  331. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  332. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  333. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  334. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  335. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  336. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  337. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  338. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  339. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  340. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  341. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  342. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  343. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  344. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  345. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  346. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  347. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  348. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  349. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  350. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  351. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  352. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  353. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  354. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  355. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  356. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  357. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  358. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  359. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  360. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  361. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  362. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  363. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  364. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  365. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  367. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  368. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  369. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  370. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  371. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  372. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  373. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  374. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  375. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  376. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  377. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  378. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  379. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  380. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  381. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  382. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  383. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  384. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  385. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  386. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  387. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  388. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  389. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  390. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  391. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  392. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  393. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  394. package/build/dist/Server/Services/UserService.js +25 -0
  395. package/build/dist/Server/Services/UserService.js.map +1 -1
  396. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  397. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  398. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  399. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  400. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  401. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  402. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  403. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  404. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  405. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  406. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  407. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  408. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  409. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  410. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  411. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  412. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  413. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  414. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  415. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  416. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  417. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  418. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  419. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  420. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  421. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  422. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  423. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  424. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  425. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  426. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  427. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  428. package/build/dist/Types/Date.js +27 -0
  429. package/build/dist/Types/Date.js.map +1 -1
  430. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  431. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  432. package/build/dist/Types/Permission.js +86 -0
  433. package/build/dist/Types/Permission.js.map +1 -1
  434. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  435. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  436. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  437. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  438. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  439. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  440. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  441. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  442. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  443. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  444. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
  445. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  446. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
  447. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  448. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
  449. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  450. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  451. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  452. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  453. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  454. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  455. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  456. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  457. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  458. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  459. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  460. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  461. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  462. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  463. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  464. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  465. package/build/dist/UI/Components/Image/Image.js +6 -1
  466. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  467. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  468. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  469. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  470. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  471. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
  472. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  473. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  474. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  475. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  476. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  477. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  478. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  479. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  480. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  481. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  482. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  483. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  484. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  485. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  486. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  487. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  488. package/jest.config.json +1 -0
  489. package/package.json +2 -2
@@ -0,0 +1,520 @@
1
+ import MonitorLabelRuleEngineService from "../../../Server/Services/MonitorLabelRuleEngineService";
2
+ import MonitorLabelRuleService from "../../../Server/Services/MonitorLabelRuleService";
3
+ import MonitorFeedService from "../../../Server/Services/MonitorFeedService";
4
+ import MonitorService from "../../../Server/Services/MonitorService";
5
+ import LabelService from "../../../Server/Services/LabelService";
6
+ import Label from "../../../Models/DatabaseModels/Label";
7
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
8
+ import MonitorLabelRule from "../../../Models/DatabaseModels/MonitorLabelRule";
9
+ import ObjectID from "../../../Types/ObjectID";
10
+ import logger from "../../../Server/Utils/Logger";
11
+ import FindBy from "../../../Server/Types/Database/FindBy";
12
+ import { MAX_RULES_EVALUATED_PER_PROJECT } from "../../../Utils/Rules/RuleEngineLimits";
13
+ import { describe, expect, it, afterEach } from "@jest/globals";
14
+
15
+ /*
16
+ * Contract under test - how many of a project's monitor label rules one
17
+ * evaluation actually looks at.
18
+ *
19
+ * The engine read its rules with `limit: 100, skip: 0`. Nothing paged past
20
+ * that, so in a project with 1,243 enabled rules the 1,143 oldest were
21
+ * fetched by nobody and matched nothing. A bulk import of 1,000+ monitors
22
+ * came out with roughly the handful of monitors the newest 100 rules
23
+ * happened to cover, and the rest sat unlabelled - indistinguishable, from
24
+ * the outside, from a queue that never drains (OneUptime/oneuptime#3506).
25
+ *
26
+ * The numbers below are the reporter's: 1,243 rules, with the rule that
27
+ * matches sitting well past the old cutoff.
28
+ */
29
+
30
+ const PROJECT_ID: ObjectID = new ObjectID(
31
+ "22222222-2222-4222-8222-222222222222",
32
+ );
33
+ const MONITOR_ID: ObjectID = new ObjectID(
34
+ "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
35
+ );
36
+ const UNIT_LABEL_ID: ObjectID = new ObjectID(
37
+ "11111111-1111-4111-8111-111111111111",
38
+ );
39
+ const SITE_LABEL_ID: ObjectID = new ObjectID(
40
+ "33333333-3333-4333-8333-333333333333",
41
+ );
42
+
43
+ // The reporter's rule count.
44
+ const RULES_IN_PROJECT: number = 1243;
45
+ // What the engine used to read, and the whole of the bug.
46
+ const OLD_RULE_FETCH_LIMIT: number = 100;
47
+
48
+ function fakeLabel(id: ObjectID): Label {
49
+ return { id: id, _id: id.toString() } as unknown as Label;
50
+ }
51
+
52
+ // The monitor as onCreateSuccess hands it to the engine: ids only.
53
+ function ruleTarget(): Monitor {
54
+ return {
55
+ id: MONITOR_ID,
56
+ _id: MONITOR_ID.toString(),
57
+ projectId: PROJECT_ID,
58
+ } as unknown as Monitor;
59
+ }
60
+
61
+ // The row the engine re-reads to match on.
62
+ function fakeMonitorDetails(overrides: Record<string, unknown> = {}): Monitor {
63
+ return {
64
+ id: MONITOR_ID,
65
+ _id: MONITOR_ID.toString(),
66
+ projectId: PROJECT_ID,
67
+ name: "WB1396 - Core Switch",
68
+ labels: [],
69
+ ...overrides,
70
+ } as unknown as Monitor;
71
+ }
72
+
73
+ function fakeRule(
74
+ index: number,
75
+ data: Record<string, unknown> = {},
76
+ ): MonitorLabelRule {
77
+ return {
78
+ id: new ObjectID(
79
+ `77777777-7777-4777-8777-${index.toString().padStart(12, "0")}`,
80
+ ),
81
+ name: `Unit Label - Rule ${index}`,
82
+ labelsToAdd: [fakeLabel(UNIT_LABEL_ID)],
83
+ ...data,
84
+ } as unknown as MonitorLabelRule;
85
+ }
86
+
87
+ /*
88
+ * A project whose rules are one-per-unit, as the reporter's is: every rule
89
+ * keys on a different unit code and only `matchingIndex` names this
90
+ * monitor's. Ordered the way the engine reads them (createdAt descending),
91
+ * so `matchingIndex` is a position in the list the engine walks - the point
92
+ * being that it is past 100.
93
+ */
94
+ function projectWithRules(data: {
95
+ ruleCount: number;
96
+ matchingIndex: number;
97
+ }): Array<MonitorLabelRule> {
98
+ const rules: Array<MonitorLabelRule> = [];
99
+
100
+ for (let index: number = 0; index < data.ruleCount; index++) {
101
+ rules.push(
102
+ fakeRule(index, {
103
+ monitorNamePattern:
104
+ index === data.matchingIndex ? "WB1396" : `WB${9000 + index}`,
105
+ name:
106
+ index === data.matchingIndex
107
+ ? "Unit Label - WB1396"
108
+ : `Unit Label - WB${9000 + index}`,
109
+ }),
110
+ );
111
+ }
112
+
113
+ return rules;
114
+ }
115
+
116
+ /*
117
+ * The engine attaches through the relation query builder rather than a model
118
+ * write, so the assertion surface is the `.add(ids)` call at the end of that
119
+ * chain.
120
+ */
121
+ function mockLabelAttach(): jest.Mock {
122
+ const addSpy: jest.Mock = jest.fn().mockResolvedValue(undefined);
123
+
124
+ jest.spyOn(MonitorService, "getRepository").mockReturnValue({
125
+ createQueryBuilder: (): any => {
126
+ return {
127
+ relation: (): any => {
128
+ return {
129
+ of: (): any => {
130
+ return { add: addSpy };
131
+ },
132
+ };
133
+ },
134
+ };
135
+ },
136
+ } as any);
137
+
138
+ return addSpy;
139
+ }
140
+
141
+ /*
142
+ * Stands in for the database: answers the engine's rule read with the page
143
+ * it actually asked for, so a query that asks for 100 rules gets 100 rules
144
+ * and no more. Without this the mock would hand back every rule regardless
145
+ * of the limit and the bug would be invisible to the test.
146
+ */
147
+ function mockRuleFetch(rules: Array<MonitorLabelRule>): jest.Mock {
148
+ const findBySpy: jest.Mock = jest.fn(
149
+ async (findBy: FindBy<MonitorLabelRule>) => {
150
+ const skip: number = Number(findBy.skip ?? 0);
151
+ const limit: number = Number(findBy.limit ?? 0);
152
+ return rules.slice(skip, skip + limit);
153
+ },
154
+ );
155
+
156
+ jest
157
+ .spyOn(MonitorLabelRuleService, "findBy")
158
+ .mockImplementation(findBySpy as any);
159
+
160
+ return findBySpy;
161
+ }
162
+
163
+ function mockFeedItem(): jest.Mock {
164
+ jest.spyOn(LabelService, "findBy").mockResolvedValue([
165
+ {
166
+ id: UNIT_LABEL_ID,
167
+ name: "WB1396",
168
+ } as unknown as Label,
169
+ ]);
170
+
171
+ const feedSpy: jest.Mock = jest.fn().mockResolvedValue(undefined);
172
+
173
+ jest
174
+ .spyOn(MonitorFeedService, "createMonitorFeedItem")
175
+ .mockImplementation(feedSpy as any);
176
+
177
+ return feedSpy;
178
+ }
179
+
180
+ describe("MonitorLabelRuleEngineService - rule fetch is not capped at 100", () => {
181
+ afterEach(() => {
182
+ jest.restoreAllMocks();
183
+ });
184
+
185
+ /*
186
+ * The reported bug, end to end: the reporter's "Unit Label - WB1396" rule
187
+ * against the monitor their dashboard showed as "No labels attached".
188
+ */
189
+ it("labels a monitor from a rule that sits past the old 100-rule cutoff", async () => {
190
+ const rules: Array<MonitorLabelRule> = projectWithRules({
191
+ ruleCount: RULES_IN_PROJECT,
192
+ matchingIndex: 1200,
193
+ });
194
+
195
+ // The premise of the test: the only matching rule was out of reach.
196
+ expect(1200).toBeGreaterThan(OLD_RULE_FETCH_LIMIT);
197
+
198
+ mockRuleFetch(rules);
199
+ jest
200
+ .spyOn(MonitorService, "findOneById")
201
+ .mockResolvedValue(fakeMonitorDetails());
202
+ const addSpy: jest.Mock = mockLabelAttach();
203
+ mockFeedItem();
204
+
205
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
206
+
207
+ expect(addSpy).toHaveBeenCalledTimes(1);
208
+ expect(addSpy.mock.calls[0]![0]).toEqual([UNIT_LABEL_ID.toString()]);
209
+ });
210
+
211
+ it("asks the database for the project's whole rule set in one read", async () => {
212
+ const findBySpy: jest.Mock = mockRuleFetch(
213
+ projectWithRules({
214
+ ruleCount: RULES_IN_PROJECT,
215
+ matchingIndex: 1200,
216
+ }),
217
+ );
218
+ jest
219
+ .spyOn(MonitorService, "findOneById")
220
+ .mockResolvedValue(fakeMonitorDetails());
221
+ mockLabelAttach();
222
+ mockFeedItem();
223
+
224
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
225
+
226
+ expect(findBySpy).toHaveBeenCalledTimes(1);
227
+
228
+ const findBy: FindBy<MonitorLabelRule> = findBySpy.mock
229
+ .calls[0]![0] as FindBy<MonitorLabelRule>;
230
+
231
+ expect(Number(findBy.limit)).toBe(MAX_RULES_EVALUATED_PER_PROJECT);
232
+ expect(Number(findBy.skip)).toBe(0);
233
+ expect(Number(findBy.limit)).toBeGreaterThan(RULES_IN_PROJECT);
234
+ expect(findBy.query).toMatchObject({
235
+ projectId: PROJECT_ID,
236
+ isEnabled: true,
237
+ });
238
+ });
239
+
240
+ /*
241
+ * The counterfactual, stated as a test so the regression cannot come back
242
+ * quietly: with the old limit in place this same project and monitor
243
+ * produce no labels at all.
244
+ */
245
+ it("would have attached nothing under the old 100-rule limit", async () => {
246
+ const rules: Array<MonitorLabelRule> = projectWithRules({
247
+ ruleCount: RULES_IN_PROJECT,
248
+ matchingIndex: 1200,
249
+ });
250
+
251
+ const reachableUnderOldLimit: Array<MonitorLabelRule> = rules.slice(
252
+ 0,
253
+ OLD_RULE_FETCH_LIMIT,
254
+ );
255
+
256
+ mockRuleFetch(reachableUnderOldLimit);
257
+ jest
258
+ .spyOn(MonitorService, "findOneById")
259
+ .mockResolvedValue(fakeMonitorDetails());
260
+ const addSpy: jest.Mock = mockLabelAttach();
261
+ mockFeedItem();
262
+
263
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
264
+
265
+ expect(addSpy).not.toHaveBeenCalled();
266
+ });
267
+
268
+ /*
269
+ * The ceiling is only a ceiling if crossing it is audible. A read that
270
+ * comes back exactly full is indistinguishable from a truncated one, so it
271
+ * has to be reported - otherwise 10,000 is the old 100-rule cliff moved
272
+ * 100x further out, and the next #3506 arrives the same way this one did:
273
+ * as a customer noticing bare monitors, with nothing in the logs.
274
+ */
275
+ it("logs an error when the read comes back at the ceiling", async () => {
276
+ const errorSpy: jest.SpyInstance = jest
277
+ .spyOn(logger, "error")
278
+ .mockImplementation(() => {});
279
+
280
+ mockRuleFetch(
281
+ projectWithRules({
282
+ ruleCount: MAX_RULES_EVALUATED_PER_PROJECT,
283
+ matchingIndex: 0,
284
+ }),
285
+ );
286
+ jest
287
+ .spyOn(MonitorService, "findOneById")
288
+ .mockResolvedValue(fakeMonitorDetails());
289
+ mockLabelAttach();
290
+ mockFeedItem();
291
+
292
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
293
+
294
+ const truncationLogs: Array<unknown> = errorSpy.mock.calls.filter(
295
+ (call: Array<unknown>) => {
296
+ return (
297
+ typeof call[0] === "string" && call[0].includes("MonitorLabelRule")
298
+ );
299
+ },
300
+ );
301
+
302
+ expect(truncationLogs).toHaveLength(1);
303
+ expect(String(truncationLogs[0])).toContain("NOT being evaluated");
304
+ });
305
+
306
+ // ...and stays quiet for the project size that actually broke.
307
+ it("stays silent at the reporter's 1,243 rules", async () => {
308
+ const errorSpy: jest.SpyInstance = jest
309
+ .spyOn(logger, "error")
310
+ .mockImplementation(() => {});
311
+
312
+ mockRuleFetch(
313
+ projectWithRules({
314
+ ruleCount: RULES_IN_PROJECT,
315
+ matchingIndex: 1200,
316
+ }),
317
+ );
318
+ jest
319
+ .spyOn(MonitorService, "findOneById")
320
+ .mockResolvedValue(fakeMonitorDetails());
321
+ mockLabelAttach();
322
+ mockFeedItem();
323
+
324
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
325
+
326
+ expect(errorSpy).not.toHaveBeenCalled();
327
+ });
328
+
329
+ /*
330
+ * A rule at the very end of a full-size project still runs. This is the
331
+ * boundary the constant itself promises.
332
+ */
333
+ it("evaluates the last rule of a project sitting at the ceiling", async () => {
334
+ const ruleCount: number = MAX_RULES_EVALUATED_PER_PROJECT;
335
+
336
+ mockRuleFetch(
337
+ projectWithRules({
338
+ ruleCount: ruleCount,
339
+ matchingIndex: ruleCount - 1,
340
+ }),
341
+ );
342
+ jest
343
+ .spyOn(MonitorService, "findOneById")
344
+ .mockResolvedValue(fakeMonitorDetails());
345
+ const addSpy: jest.Mock = mockLabelAttach();
346
+ mockFeedItem();
347
+
348
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
349
+
350
+ expect(addSpy).toHaveBeenCalledTimes(1);
351
+ });
352
+ });
353
+
354
+ describe("MonitorLabelRuleEngineService - matching across a large rule set", () => {
355
+ afterEach(() => {
356
+ jest.restoreAllMocks();
357
+ });
358
+
359
+ it("unions the labels of every matching rule and attaches each once", async () => {
360
+ const rules: Array<MonitorLabelRule> = projectWithRules({
361
+ ruleCount: RULES_IN_PROJECT,
362
+ matchingIndex: 1200,
363
+ });
364
+
365
+ // A second rule, further down still, adding a different label.
366
+ rules[1240] = fakeRule(1240, {
367
+ name: "Site Label - WB1396",
368
+ monitorNamePattern: "WB1396",
369
+ labelsToAdd: [fakeLabel(SITE_LABEL_ID)],
370
+ });
371
+
372
+ // And a third repeating the first rule's label - it must not double up.
373
+ rules[1241] = fakeRule(1241, {
374
+ name: "Duplicate Unit Label - WB1396",
375
+ monitorNamePattern: "wb1396",
376
+ labelsToAdd: [fakeLabel(UNIT_LABEL_ID)],
377
+ });
378
+
379
+ mockRuleFetch(rules);
380
+ jest
381
+ .spyOn(MonitorService, "findOneById")
382
+ .mockResolvedValue(fakeMonitorDetails());
383
+ const addSpy: jest.Mock = mockLabelAttach();
384
+ mockFeedItem();
385
+
386
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
387
+
388
+ expect(addSpy).toHaveBeenCalledTimes(1);
389
+
390
+ const attached: Array<string> = addSpy.mock.calls[0]![0] as Array<string>;
391
+
392
+ expect(attached).toHaveLength(2);
393
+ expect(attached).toEqual(
394
+ expect.arrayContaining([
395
+ UNIT_LABEL_ID.toString(),
396
+ SITE_LABEL_ID.toString(),
397
+ ]),
398
+ );
399
+ });
400
+
401
+ /*
402
+ * Re-labelling is additive, so a monitor that already carries everything
403
+ * its rules attach must not produce an insert - the join table's primary
404
+ * key would reject it.
405
+ */
406
+ it("attaches nothing when the monitor already carries the matched labels", async () => {
407
+ mockRuleFetch(
408
+ projectWithRules({
409
+ ruleCount: RULES_IN_PROJECT,
410
+ matchingIndex: 1200,
411
+ }),
412
+ );
413
+ jest.spyOn(MonitorService, "findOneById").mockResolvedValue(
414
+ fakeMonitorDetails({
415
+ labels: [fakeLabel(UNIT_LABEL_ID)],
416
+ }),
417
+ );
418
+ const addSpy: jest.Mock = mockLabelAttach();
419
+ mockFeedItem();
420
+
421
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
422
+
423
+ expect(addSpy).not.toHaveBeenCalled();
424
+ });
425
+
426
+ /*
427
+ * One unparseable pattern among a thousand rules is a typo in one row, not
428
+ * a reason for the other 1,242 to stop being evaluated.
429
+ */
430
+ it("keeps evaluating later rules after an invalid regex", async () => {
431
+ const rules: Array<MonitorLabelRule> = projectWithRules({
432
+ ruleCount: RULES_IN_PROJECT,
433
+ matchingIndex: 1200,
434
+ });
435
+
436
+ rules[500] = fakeRule(500, {
437
+ name: "Broken Rule",
438
+ monitorNamePattern: "switch-(01",
439
+ });
440
+
441
+ mockRuleFetch(rules);
442
+ jest
443
+ .spyOn(MonitorService, "findOneById")
444
+ .mockResolvedValue(fakeMonitorDetails());
445
+ const addSpy: jest.Mock = mockLabelAttach();
446
+ mockFeedItem();
447
+
448
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
449
+
450
+ expect(addSpy).toHaveBeenCalledTimes(1);
451
+ expect(addSpy.mock.calls[0]![0]).toEqual([UNIT_LABEL_ID.toString()]);
452
+ });
453
+
454
+ /*
455
+ * The engine writes the labels back onto the in-memory monitor so the
456
+ * owner-rule engine, which runs next in the same onCreateSuccess chain,
457
+ * can key on them. A rule found past position 100 has to land there too.
458
+ */
459
+ it("syncs the in-memory monitor with the labels a late rule added", async () => {
460
+ mockRuleFetch(
461
+ projectWithRules({
462
+ ruleCount: RULES_IN_PROJECT,
463
+ matchingIndex: 1200,
464
+ }),
465
+ );
466
+ jest
467
+ .spyOn(MonitorService, "findOneById")
468
+ .mockResolvedValue(fakeMonitorDetails());
469
+ mockLabelAttach();
470
+ mockFeedItem();
471
+
472
+ const monitor: Monitor = ruleTarget();
473
+
474
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(monitor);
475
+
476
+ expect(
477
+ (monitor.labels || []).map((label: Label) => {
478
+ return label.id?.toString();
479
+ }),
480
+ ).toEqual([UNIT_LABEL_ID.toString()]);
481
+ });
482
+
483
+ it("names the rule that fired in the monitor's feed", async () => {
484
+ mockRuleFetch(
485
+ projectWithRules({
486
+ ruleCount: RULES_IN_PROJECT,
487
+ matchingIndex: 1200,
488
+ }),
489
+ );
490
+ jest
491
+ .spyOn(MonitorService, "findOneById")
492
+ .mockResolvedValue(fakeMonitorDetails());
493
+ mockLabelAttach();
494
+ const feedSpy: jest.Mock = mockFeedItem();
495
+
496
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
497
+
498
+ expect(feedSpy).toHaveBeenCalledTimes(1);
499
+
500
+ const feedItem: { feedInfoInMarkdown: string } = feedSpy.mock
501
+ .calls[0]![0] as { feedInfoInMarkdown: string };
502
+
503
+ expect(feedItem.feedInfoInMarkdown).toContain("Unit Label - WB1396");
504
+ expect(feedItem.feedInfoInMarkdown).toContain("WB1396");
505
+ });
506
+
507
+ // A project with no rules must not pay for a monitor read it cannot use.
508
+ it("does not read the monitor when the project has no enabled rules", async () => {
509
+ mockRuleFetch([]);
510
+ const findOneByIdSpy: jest.SpyInstance = jest
511
+ .spyOn(MonitorService, "findOneById")
512
+ .mockResolvedValue(fakeMonitorDetails());
513
+ const addSpy: jest.Mock = mockLabelAttach();
514
+
515
+ await MonitorLabelRuleEngineService.applyRulesToMonitor(ruleTarget());
516
+
517
+ expect(findOneByIdSpy).not.toHaveBeenCalled();
518
+ expect(addSpy).not.toHaveBeenCalled();
519
+ });
520
+ });