@oneuptime/common 12.0.30 → 12.0.32

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 (645) 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/AlertState.ts +0 -2
  5. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  6. package/Models/DatabaseModels/Domain.ts +1 -1
  7. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  8. package/Models/DatabaseModels/Incident.ts +1 -1
  9. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  10. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  11. package/Models/DatabaseModels/Index.ts +4 -0
  12. package/Models/DatabaseModels/MetricType.ts +0 -2
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
  14. package/Models/DatabaseModels/MonitorTest.ts +0 -2
  15. package/Models/DatabaseModels/NetworkDevice.ts +234 -5
  16. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  17. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  18. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
  19. package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
  20. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
  21. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
  23. package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
  24. package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
  25. package/Models/DatabaseModels/StatusPageResource.ts +0 -2
  26. package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  28. package/Server/API/GlobalConfigAPI.ts +362 -183
  29. package/Server/API/TelemetryAPI.ts +42 -4
  30. package/Server/EnvironmentConfig.ts +112 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  35. package/Server/Middleware/MultipartFormData.ts +118 -32
  36. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  40. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  41. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  43. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  44. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  45. package/Server/Services/AlertReminderRuleService.ts +9 -1
  46. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  47. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/DatabaseService.ts +39 -9
  54. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  57. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  58. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  64. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  66. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  68. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  69. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  70. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  71. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  72. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  73. package/Server/Services/Index.ts +4 -0
  74. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/KubernetesResourceService.ts +5 -1
  79. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  80. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  81. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  82. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  83. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  86. package/Server/Services/NetworkDeviceRoleService.ts +90 -0
  87. package/Server/Services/NetworkDeviceService.ts +209 -1
  88. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  93. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  94. package/Server/Services/ProjectService.ts +85 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  100. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  101. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  103. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  104. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  109. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  110. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  111. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +0 -6
  114. package/Server/Services/UserService.ts +27 -0
  115. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  116. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  117. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  118. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  119. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  120. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  121. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  122. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  123. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  124. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  125. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  126. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  127. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  128. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  129. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  130. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  131. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
  132. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
  133. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
  134. package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
  135. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  136. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  137. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
  138. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
  139. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
  140. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  141. package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
  142. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  143. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  144. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  145. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
  146. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  147. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  148. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  149. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  151. package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
  152. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  153. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  154. package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
  155. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  156. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  157. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  158. package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
  159. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
  160. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
  161. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  162. package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
  163. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  164. package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
  165. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
  166. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  167. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  168. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  169. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  170. package/Tests/Server/Utils/BasicCron.test.ts +283 -0
  171. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  172. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  173. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  174. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
  175. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  176. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  177. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  178. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  179. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  180. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  181. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  182. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  183. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  184. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  185. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  186. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  187. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  188. package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
  189. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  190. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  191. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  192. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  193. package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
  194. package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
  195. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  196. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  197. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  198. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  199. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
  201. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  202. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  205. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  206. package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
  207. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  208. package/Tests/UI/Components/XAxis.test.ts +270 -5
  209. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  210. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  211. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  212. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  213. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
  214. package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
  215. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
  216. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
  217. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  218. package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
  219. package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
  220. package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
  221. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  222. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  223. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  224. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  225. package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
  226. package/Tests/Utils/Slug.test.ts +61 -1
  227. package/Tests/jest.setup.ts +19 -0
  228. package/Types/Date.ts +39 -0
  229. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
  230. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  231. package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
  232. package/Types/Permission.ts +141 -0
  233. package/Types/Rum/SessionReplay.ts +21 -0
  234. package/Types/Telemetry/SourceMap.ts +8 -0
  235. package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
  236. package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
  237. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
  238. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  239. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  240. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  241. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  242. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
  243. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
  244. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
  245. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  246. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  247. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
  248. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  249. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  250. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  251. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  252. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  253. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  254. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  255. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  256. package/UI/Components/Feed/FeedItem.tsx +4 -5
  257. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  258. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  259. package/UI/Components/Image/Image.tsx +20 -3
  260. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  261. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  262. package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
  263. package/UI/Components/Navbar/NavBar.tsx +62 -13
  264. package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
  265. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
  266. package/UI/Components/SideMenu/SideMenu.tsx +12 -2
  267. package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
  268. package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
  269. package/UI/Components/Table/TableHeader.tsx +64 -48
  270. package/UI/Components/Table/TableRow.tsx +13 -3
  271. package/UI/Styles/Theme.css +38 -0
  272. package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
  273. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
  274. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  275. package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
  276. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
  277. package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
  278. package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
  279. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  280. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  281. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  282. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  283. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  284. package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
  285. package/Utils/Slug.ts +34 -1
  286. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  287. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  288. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  289. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  290. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  291. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
  293. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  295. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Domain.js +1 -1
  297. package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  299. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  300. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  301. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  303. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  305. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  307. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
  309. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
  311. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
  313. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
  322. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
  323. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
  324. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
  326. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
  328. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
  330. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
  332. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
  334. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
  336. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  338. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  339. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  340. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/EnvironmentConfig.js +83 -0
  344. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  356. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  357. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  374. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  375. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  376. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  377. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DatabaseService.js +31 -5
  390. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +4 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
  456. package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
  457. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  458. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  468. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  469. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  470. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/ProjectService.js +65 -0
  472. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  473. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  474. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  475. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  476. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  482. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  483. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  492. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  493. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  502. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  504. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  508. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  509. package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
  510. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  511. package/build/dist/Server/Services/UserService.js +25 -0
  512. package/build/dist/Server/Services/UserService.js.map +1 -1
  513. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  514. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  518. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  519. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  520. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  521. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  522. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  524. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  527. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  528. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  529. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  530. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  531. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  532. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  533. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  534. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  535. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  536. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  538. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  539. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  540. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  542. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  543. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  544. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  545. package/build/dist/Types/Date.js +27 -0
  546. package/build/dist/Types/Date.js.map +1 -1
  547. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  548. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  549. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
  550. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
  551. package/build/dist/Types/Permission.js +126 -0
  552. package/build/dist/Types/Permission.js.map +1 -1
  553. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  554. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  556. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  558. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
  560. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  562. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  563. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  564. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
  570. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  571. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
  572. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
  574. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  575. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
  576. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  579. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  580. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  582. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  583. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  584. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  585. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  586. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  587. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  588. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  589. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  590. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  592. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  593. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  594. package/build/dist/UI/Components/Image/Image.js +6 -1
  595. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  596. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  597. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  598. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  599. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  600. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
  601. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  602. package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
  603. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  604. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  605. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  606. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
  607. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  608. package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
  609. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  610. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
  611. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  612. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
  613. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  614. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  615. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  616. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  617. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  618. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
  619. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
  620. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
  621. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
  622. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  623. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  624. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
  625. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
  626. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
  627. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  628. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
  629. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  630. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
  631. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
  632. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  633. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  636. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  637. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  638. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  639. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  640. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  641. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
  642. package/build/dist/Utils/Slug.js +31 -1
  643. package/build/dist/Utils/Slug.js.map +1 -1
  644. package/jest.config.json +1 -0
  645. package/package.json +2 -2
@@ -0,0 +1,503 @@
1
+ import Label from "../../../../Models/DatabaseModels/Label";
2
+ import MetricType from "../../../../Models/DatabaseModels/MetricType";
3
+ import GlobalConfigService from "../../../../Server/Services/GlobalConfigService";
4
+ import MetricService from "../../../../Server/Services/MetricService";
5
+ import ServiceService from "../../../../Server/Services/ServiceService";
6
+ import { getJestSpyOn } from "../../../Spy";
7
+ import MonitorMetricUtil from "../../../../Server/Utils/Monitor/MonitorMetricUtil";
8
+ import logger from "../../../../Server/Utils/Logger";
9
+ import { MaxCapturedMetricAttributes } from "../../../../Server/Utils/Monitor/CapturedMetricAttributeUtil";
10
+ import { AllResourceIdentityLabelKeys } from "../../../../Server/Utils/Monitor/SeriesResourceLabels";
11
+ import TelemetryUtil from "../../../../Server/Utils/Telemetry/Telemetry";
12
+ import Dictionary from "../../../../Types/Dictionary";
13
+ import { JSONObject } from "../../../../Types/JSON";
14
+ import CapturedMetric from "../../../../Types/Monitor/CustomCodeMonitor/CapturedMetric";
15
+ import ObjectID from "../../../../Types/ObjectID";
16
+ import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
17
+ import ServiceType from "../../../../Types/Telemetry/ServiceType";
18
+ import {
19
+ afterEach,
20
+ beforeEach,
21
+ describe,
22
+ expect,
23
+ jest,
24
+ test,
25
+ } from "@jest/globals";
26
+
27
+ /*
28
+ * ---------------------------------------------------------------------------
29
+ * Regression suite for GitHub issue #3514
30
+ * ---------------------------------------------------------------------------
31
+ *
32
+ * The report was that a Custom JavaScript Code Monitor calling only
33
+ * `oneuptime.captureMetric()` auto-created a phantom Service row. It does not,
34
+ * and the first block below pins that down end to end: everything this path
35
+ * writes is a ClickHouse Metric row owned by the MONITOR
36
+ * (primaryEntityType = ServiceType.Monitor, primaryEntityId = the monitor id),
37
+ * and the MetricType it catalogues is never associated with any Service.
38
+ *
39
+ * What the investigation DID find in that path is the inverse problem, and it
40
+ * is the reason the rest of this file exists. Script-supplied attribute keys
41
+ * were copied into the metric row with only five names reserved, so a script
42
+ * could stamp `service.name` / `oneuptime.host.id` / `k8s.cluster.name` on its
43
+ * own datapoints. Those are not decoration — SeriesResourceLabels treats them
44
+ * as the series' resource identity. A stamped `resource.service.name` files
45
+ * the monitor's datapoints straight onto an unrelated Service's Metrics tab,
46
+ * which pins that raw attribute rather than the owning entity id; and any
47
+ * metric monitor grouped by one of these keys turns it into a series label,
48
+ * from where SeriesResourceLinker attaches the named resource to the alerts
49
+ * and incidents that series opens, AlertOwnerRuleEngineService pages that
50
+ * resource's owners, and MonitorMaintenanceSuppression silences the series
51
+ * during a maintenance window on it.
52
+ */
53
+
54
+ const PROJECT_ID: ObjectID = new ObjectID(
55
+ "11111111-1111-4111-8111-111111111111",
56
+ );
57
+ const MONITOR_ID: ObjectID = new ObjectID(
58
+ "22222222-2222-4222-8222-222222222222",
59
+ );
60
+ const PROBE_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
61
+
62
+ const CUSTOM_METRIC_NAME: string = "cursor.usage.lines_accepted";
63
+ const CUSTOM_ROW_NAME: string = `custom.monitor.${CUSTOM_METRIC_NAME}`;
64
+
65
+ function makeLabel(name: string): Label {
66
+ const label: Label = new Label();
67
+ label.name = name;
68
+ return label;
69
+ }
70
+
71
+ describe("MonitorMetricUtil custom metric attributes (issue #3514)", () => {
72
+ let insertedRows: Array<JSONObject>;
73
+ let indexedMetricNames: Dictionary<MetricType>;
74
+
75
+ beforeEach(() => {
76
+ insertedRows = [];
77
+ indexedMetricNames = {};
78
+
79
+ jest
80
+ .spyOn(GlobalConfigService, "findOneBy")
81
+ .mockResolvedValue(null as never);
82
+ jest
83
+ .spyOn(MetricService, "insertJsonRows")
84
+ .mockImplementation(async (rows: Array<JSONObject>): Promise<void> => {
85
+ insertedRows.push(...rows);
86
+ });
87
+ jest
88
+ .spyOn(TelemetryUtil, "indexMetricNameServiceNameMap")
89
+ .mockImplementation(
90
+ async (data: {
91
+ projectId: ObjectID;
92
+ metricNameServiceNameMap: Dictionary<MetricType>;
93
+ }): Promise<void> => {
94
+ Object.assign(indexedMetricNames, data.metricNameServiceNameMap);
95
+ return undefined;
96
+ },
97
+ );
98
+ });
99
+
100
+ afterEach(() => {
101
+ jest.restoreAllMocks();
102
+ });
103
+
104
+ async function captureMetrics(
105
+ capturedMetrics: Array<CapturedMetric>,
106
+ options: {
107
+ monitorLabels?: Array<Label>;
108
+ monitorCustomFields?: JSONObject;
109
+ } = {},
110
+ ): Promise<void> {
111
+ const response: ProbeMonitorResponse = {
112
+ projectId: PROJECT_ID,
113
+ monitorId: MONITOR_ID,
114
+ monitorStepId: ObjectID.generate(),
115
+ probeId: PROBE_ID,
116
+ failureCause: "",
117
+ monitoredAt: new Date("2026-08-10T12:00:00.000Z"),
118
+ customCodeMonitorResponse: {
119
+ logMessages: [],
120
+ scriptError: undefined,
121
+ result: undefined,
122
+ executionTimeInMS: 10,
123
+ capturedMetrics: capturedMetrics,
124
+ },
125
+ } as unknown as ProbeMonitorResponse;
126
+
127
+ await MonitorMetricUtil.saveMonitorMetrics({
128
+ monitorId: MONITOR_ID,
129
+ projectId: PROJECT_ID,
130
+ dataToProcess: response,
131
+ monitorName: "Cursor usage ingest — daily",
132
+ probeName: "London Probe",
133
+ monitorLabels: options.monitorLabels,
134
+ monitorCustomFields: options.monitorCustomFields,
135
+ });
136
+ }
137
+
138
+ function customMetricRow(): JSONObject {
139
+ const row: JSONObject | undefined = insertedRows.find(
140
+ (candidate: JSONObject) => {
141
+ return candidate["name"] === CUSTOM_ROW_NAME;
142
+ },
143
+ );
144
+
145
+ expect(row).toBeDefined();
146
+
147
+ return row as JSONObject;
148
+ }
149
+
150
+ function customMetricAttributes(): JSONObject {
151
+ return customMetricRow()["attributes"] as JSONObject;
152
+ }
153
+
154
+ describe("the reported behaviour: captureMetric and Service rows", () => {
155
+ test("owns its metric rows by MONITOR, never by a Service", async () => {
156
+ await captureMetrics([
157
+ { name: CUSTOM_METRIC_NAME, value: 1234, attributes: {} },
158
+ ]);
159
+
160
+ const row: JSONObject = customMetricRow();
161
+
162
+ expect(row["primaryEntityType"]).toBe(ServiceType.Monitor);
163
+ expect(row["primaryEntityId"]).toBe(MONITOR_ID.toString());
164
+
165
+ /*
166
+ * The columns ingest fills in for an OTLP resource. A monitor metric has
167
+ * no OTel resource, so leaving them unset is what keeps this row out of
168
+ * the entity registry — and out of the Services list.
169
+ */
170
+ expect(row["entityKeys"]).toBeUndefined();
171
+ expect(row["serviceEntityKey"]).toBeUndefined();
172
+ });
173
+
174
+ test("catalogues the metric name without associating any Service", async () => {
175
+ await captureMetrics([
176
+ { name: CUSTOM_METRIC_NAME, value: 1234, attributes: {} },
177
+ ]);
178
+
179
+ const metricType: MetricType | undefined =
180
+ indexedMetricNames[CUSTOM_ROW_NAME];
181
+
182
+ expect(metricType).toBeDefined();
183
+ expect(metricType?.name).toBe(CUSTOM_ROW_NAME);
184
+
185
+ /*
186
+ * `services` left unset is what makes TelemetryUtil's junction insert a
187
+ * no-op. A Service attached here would be the closest this path could
188
+ * ever come to the reported phantom service.
189
+ */
190
+ expect(metricType?.services).toBeUndefined();
191
+ });
192
+
193
+ test("stamps no attribute that names a Service, even when the script tries", async () => {
194
+ await captureMetrics([
195
+ {
196
+ name: CUSTOM_METRIC_NAME,
197
+ value: 1234,
198
+ attributes: {
199
+ "service.name": "Cursor",
200
+ "resource.service.name": "Cursor",
201
+ "oneuptime.service.name": "Cursor",
202
+ "oneuptime.service.id": "44444444-4444-4444-8444-444444444444",
203
+ "ai.tool": "cursor",
204
+ },
205
+ },
206
+ ]);
207
+
208
+ const attributes: JSONObject = customMetricAttributes();
209
+
210
+ expect(attributes["service.name"]).toBeUndefined();
211
+ expect(attributes["resource.service.name"]).toBeUndefined();
212
+ expect(attributes["oneuptime.service.name"]).toBeUndefined();
213
+ expect(attributes["oneuptime.service.id"]).toBeUndefined();
214
+
215
+ // The script's own dimension is untouched.
216
+ expect(attributes["ai.tool"]).toBe("cursor");
217
+ });
218
+
219
+ test("creates no Service row — the literal claim in the issue", async () => {
220
+ /*
221
+ * The narrowest possible statement of what was reported. Postgres has
222
+ * exactly one automatic Service creator
223
+ * (OpenTelemetryIngestService.findOrCreateTelemetryService, itself the
224
+ * only production caller of ServiceService.create), so a spy on that
225
+ * one method is a complete assertion for this path.
226
+ */
227
+ const create: jest.SpyInstance<any, any> = getJestSpyOn(
228
+ ServiceService,
229
+ "create",
230
+ );
231
+
232
+ await captureMetrics([
233
+ {
234
+ name: CUSTOM_METRIC_NAME,
235
+ value: 1234,
236
+ attributes: { "service.name": "Cursor", "ai.tool": "cursor" },
237
+ },
238
+ ]);
239
+
240
+ expect(create).not.toHaveBeenCalled();
241
+ });
242
+ });
243
+
244
+ describe("resource identity cannot be claimed by a script", () => {
245
+ test("drops every key the series-label resolver reads as resource identity", async () => {
246
+ const attributes: JSONObject = {};
247
+ for (const key of AllResourceIdentityLabelKeys) {
248
+ attributes[key] = "borrowed";
249
+ }
250
+ attributes["region"] = "us-east-1";
251
+
252
+ await captureMetrics([
253
+ { name: CUSTOM_METRIC_NAME, value: 1, attributes: attributes },
254
+ ]);
255
+
256
+ const recorded: JSONObject = customMetricAttributes();
257
+
258
+ for (const key of AllResourceIdentityLabelKeys) {
259
+ expect(recorded[key]).toBeUndefined();
260
+ }
261
+
262
+ expect(recorded["region"]).toBe("us-east-1");
263
+ });
264
+
265
+ test("drops the monitor's own identity attributes so a script cannot re-file its data", async () => {
266
+ await captureMetrics([
267
+ {
268
+ name: CUSTOM_METRIC_NAME,
269
+ value: 1,
270
+ attributes: {
271
+ monitorId: "99999999-9999-4999-8999-999999999999",
272
+ projectId: "88888888-8888-4888-8888-888888888888",
273
+ monitorName: "Some Other Monitor",
274
+ probeName: "Some Other Probe",
275
+ probeId: "77777777-7777-4777-8777-777777777777",
276
+ isCustomMetric: "false",
277
+ },
278
+ },
279
+ ]);
280
+
281
+ const attributes: JSONObject = customMetricAttributes();
282
+
283
+ expect(attributes["monitorId"]).toBe(MONITOR_ID.toString());
284
+ expect(attributes["projectId"]).toBe(PROJECT_ID.toString());
285
+ expect(attributes["monitorName"]).toBe("Cursor usage ingest — daily");
286
+ expect(attributes["probeName"]).toBe("London Probe");
287
+ expect(attributes["probeId"]).toBe(PROBE_ID.toString());
288
+ expect(attributes["isCustomMetric"]).toBe("true");
289
+ });
290
+
291
+ test("drops a spoofed oneuptime.label.* even when the monitor has NO labels of its own", async () => {
292
+ /*
293
+ * The old guarantee came from merging the monitor's real labels last,
294
+ * which does nothing at all for a monitor that has none — so this case
295
+ * used to record the spoofed value verbatim.
296
+ */
297
+ await captureMetrics([
298
+ {
299
+ name: CUSTOM_METRIC_NAME,
300
+ value: 1,
301
+ attributes: { "oneuptime.label.product": "spoofed" },
302
+ },
303
+ ]);
304
+
305
+ expect(
306
+ customMetricAttributes()["oneuptime.label.product"],
307
+ ).toBeUndefined();
308
+ });
309
+
310
+ test("still lets the monitor's real labels through", async () => {
311
+ await captureMetrics(
312
+ [{ name: CUSTOM_METRIC_NAME, value: 1, attributes: { q: "1" } }],
313
+ { monitorLabels: [makeLabel("product:checkout")] },
314
+ );
315
+
316
+ const attributes: JSONObject = customMetricAttributes();
317
+
318
+ expect(attributes["oneuptime.label.product"]).toBe("checkout");
319
+ expect(attributes["q"]).toBe("1");
320
+ });
321
+
322
+ test("names every dropped key in ONE log line for the whole check", async () => {
323
+ /*
324
+ * The diagnostic is the whole reason a user can tell a refused
325
+ * attribute from a bug in their script. One line per check, not one per
326
+ * datapoint, or a script emitting 100 metrics floods the log.
327
+ */
328
+ const warn: jest.SpyInstance<any, any> = getJestSpyOn(
329
+ logger,
330
+ "warn",
331
+ ).mockImplementation((): void => {
332
+ return undefined;
333
+ });
334
+
335
+ await captureMetrics([
336
+ {
337
+ name: CUSTOM_METRIC_NAME,
338
+ value: 1,
339
+ attributes: { "service.name": "Cursor", region: "us-east-1" },
340
+ },
341
+ {
342
+ name: CUSTOM_METRIC_NAME,
343
+ value: 2,
344
+ attributes: { "service.name": "Cursor", "host.name": "web-01" },
345
+ },
346
+ ]);
347
+
348
+ expect(warn).toHaveBeenCalledTimes(1);
349
+
350
+ const message: string = String(warn.mock.calls[0]?.[0]);
351
+
352
+ expect(message).toContain(MONITOR_ID.toString());
353
+ // Deduped across the two metrics, and sorted so the line is stable.
354
+ expect(message).toContain("host.name, service.name");
355
+ expect(message).not.toContain("region");
356
+ });
357
+
358
+ test("says nothing when the script writes only attributes it owns", async () => {
359
+ const warn: jest.SpyInstance<any, any> = getJestSpyOn(
360
+ logger,
361
+ "warn",
362
+ ).mockImplementation((): void => {
363
+ return undefined;
364
+ });
365
+
366
+ await captureMetrics([
367
+ {
368
+ name: CUSTOM_METRIC_NAME,
369
+ value: 1,
370
+ attributes: { region: "us-east-1", "ai.tool": "cursor" },
371
+ },
372
+ ]);
373
+
374
+ expect(warn).not.toHaveBeenCalled();
375
+ });
376
+
377
+ test("republishes attributeKeys so a dropped key is not left behind in the filter list", async () => {
378
+ await captureMetrics([
379
+ {
380
+ name: CUSTOM_METRIC_NAME,
381
+ value: 1,
382
+ attributes: { "service.name": "Cursor", region: "us-east-1" },
383
+ },
384
+ ]);
385
+
386
+ const row: JSONObject = customMetricRow();
387
+ const attributes: JSONObject = row["attributes"] as JSONObject;
388
+ const attributeKeys: Array<string> = row[
389
+ "attributeKeys"
390
+ ] as Array<string>;
391
+
392
+ expect(attributeKeys).toEqual(Object.keys(attributes).sort());
393
+ expect(attributeKeys).not.toContain("service.name");
394
+ expect(attributeKeys).toContain("region");
395
+ });
396
+ });
397
+
398
+ describe("values and limits", () => {
399
+ test("records numbers and booleans instead of silently dropping them", async () => {
400
+ await captureMetrics([
401
+ {
402
+ name: CUSTOM_METRIC_NAME,
403
+ value: 1,
404
+ attributes: {
405
+ seats: 42,
406
+ active: true,
407
+ suspended: false,
408
+ tool: "cursor",
409
+ },
410
+ },
411
+ ]);
412
+
413
+ const attributes: JSONObject = customMetricAttributes();
414
+
415
+ expect(attributes["seats"]).toBe("42");
416
+ expect(attributes["active"]).toBe("true");
417
+ expect(attributes["suspended"]).toBe("false");
418
+ expect(attributes["tool"]).toBe("cursor");
419
+ });
420
+
421
+ test("caps the number of script-supplied attributes on one metric", async () => {
422
+ const attributes: JSONObject = {};
423
+ for (let i: number = 0; i < MaxCapturedMetricAttributes + 30; i++) {
424
+ attributes[`dimension${i}`] = "value";
425
+ }
426
+
427
+ await captureMetrics([
428
+ { name: CUSTOM_METRIC_NAME, value: 1, attributes: attributes },
429
+ ]);
430
+
431
+ const recorded: JSONObject = customMetricAttributes();
432
+ const scriptKeys: Array<string> = Object.keys(recorded).filter(
433
+ (key: string) => {
434
+ return key.startsWith("dimension");
435
+ },
436
+ );
437
+
438
+ expect(scriptKeys).toHaveLength(MaxCapturedMetricAttributes);
439
+ });
440
+
441
+ test("does not pollute Object.prototype through a dotted __proto__ key", async () => {
442
+ await captureMetrics([
443
+ {
444
+ name: CUSTOM_METRIC_NAME,
445
+ value: 1,
446
+ attributes: {
447
+ "__proto__.polluted": "pwned",
448
+ region: "us-east-1",
449
+ },
450
+ },
451
+ ]);
452
+
453
+ expect(({} as JSONObject)["polluted"]).toBeUndefined();
454
+ expect(customMetricAttributes()["region"]).toBe("us-east-1");
455
+ });
456
+
457
+ test("the guard applies to synthetic monitor captured metrics too", async () => {
458
+ /*
459
+ * Probes are separately deployed processes. The synthetic runtime caps
460
+ * and coerces in-sandbox, but the server must not take a probe's word
461
+ * for what a script was allowed to write.
462
+ */
463
+ const response: ProbeMonitorResponse = {
464
+ projectId: PROJECT_ID,
465
+ monitorId: MONITOR_ID,
466
+ monitorStepId: ObjectID.generate(),
467
+ probeId: PROBE_ID,
468
+ failureCause: "",
469
+ monitoredAt: new Date("2026-08-10T12:00:00.000Z"),
470
+ syntheticMonitorResponse: [
471
+ {
472
+ logMessages: [],
473
+ scriptError: undefined,
474
+ result: undefined,
475
+ executionTimeInMS: 10,
476
+ browserType: "Chromium",
477
+ screenSizeType: "Desktop",
478
+ capturedMetrics: [
479
+ {
480
+ name: CUSTOM_METRIC_NAME,
481
+ value: 5,
482
+ attributes: { "host.name": "web-01", page: "checkout" },
483
+ },
484
+ ],
485
+ },
486
+ ],
487
+ } as unknown as ProbeMonitorResponse;
488
+
489
+ await MonitorMetricUtil.saveMonitorMetrics({
490
+ monitorId: MONITOR_ID,
491
+ projectId: PROJECT_ID,
492
+ dataToProcess: response,
493
+ monitorName: "Checkout journey",
494
+ probeName: "London Probe",
495
+ });
496
+
497
+ const attributes: JSONObject = customMetricAttributes();
498
+
499
+ expect(attributes["host.name"]).toBeUndefined();
500
+ expect(attributes["page"]).toBe("checkout");
501
+ });
502
+ });
503
+ });
@@ -0,0 +1,106 @@
1
+ import MonitorTemplateUtil from "../../../../Server/Utils/Monitor/MonitorTemplateUtil";
2
+ import { JSONObject } from "../../../../Types/JSON";
3
+ import MonitorType from "../../../../Types/Monitor/MonitorType";
4
+ import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
5
+ import ObjectID from "../../../../Types/ObjectID";
6
+ import { afterEach, describe, expect, test } from "@jest/globals";
7
+
8
+ /*
9
+ * A grouped metric monitor renders its incident/alert title per series, and
10
+ * the series' labels are folded onto the template storage map so
11
+ * `{{host.name}}` resolves as a nested path. The fold therefore walks
12
+ * attacker-adjacent input: series label keys are whatever attribute names the
13
+ * emitting telemetry chose, and for a custom code or synthetic monitor a
14
+ * script picks them outright via `oneuptime.captureMetric()`.
15
+ *
16
+ * A key of `__proto__.polluted` used to aim that walk at Object.prototype —
17
+ * `storageMap["__proto__"]` is truthy, an object and not an Array, so the
18
+ * "reset to a fresh object" branch was skipped and the final assignment landed
19
+ * on the prototype itself. This runs in the shared Workers process that
20
+ * renders every project's templates, so one series label polluted every object
21
+ * in it.
22
+ */
23
+ describe("MonitorTemplateUtil series label fold", () => {
24
+ const monitorId: ObjectID = new ObjectID(
25
+ "22222222-2222-4222-8222-222222222222",
26
+ );
27
+
28
+ function buildStorageMap(seriesLabels: JSONObject): JSONObject {
29
+ return MonitorTemplateUtil.buildTemplateStorageMap({
30
+ monitorType: MonitorType.Metrics,
31
+ dataToProcess: {
32
+ monitorId: monitorId,
33
+ projectId: new ObjectID("11111111-1111-4111-8111-111111111111"),
34
+ } as unknown as ProbeMonitorResponse,
35
+ seriesLabels: seriesLabels,
36
+ });
37
+ }
38
+
39
+ afterEach(() => {
40
+ // Never leave a polluted prototype behind for the rest of the suite.
41
+ delete (Object.prototype as unknown as JSONObject)["polluted"];
42
+ });
43
+
44
+ test("does not pollute Object.prototype through a __proto__ segment", () => {
45
+ buildStorageMap({ "__proto__.polluted": "pwned" });
46
+
47
+ expect(({} as JSONObject)["polluted"]).toBeUndefined();
48
+ expect(
49
+ (Object.prototype as unknown as JSONObject)["polluted"],
50
+ ).toBeUndefined();
51
+ });
52
+
53
+ test("does not pollute Object.prototype through a constructor.prototype segment", () => {
54
+ buildStorageMap({ "constructor.prototype.polluted": "pwned" });
55
+
56
+ expect(({} as JSONObject)["polluted"]).toBeUndefined();
57
+ });
58
+
59
+ test("does not pollute through a __proto__ segment buried mid-path", () => {
60
+ buildStorageMap({ "host.__proto__.polluted": "pwned" });
61
+
62
+ expect(({} as JSONObject)["polluted"]).toBeUndefined();
63
+ });
64
+
65
+ test("still exposes a refused label under seriesLabels, so nothing is lost", () => {
66
+ const storageMap: JSONObject = buildStorageMap({
67
+ "__proto__.polluted": "pwned",
68
+ "host.name": "web-01",
69
+ });
70
+
71
+ const seriesLabels: JSONObject = storageMap["seriesLabels"] as JSONObject;
72
+
73
+ expect(seriesLabels["__proto__.polluted"]).toBe("pwned");
74
+ expect(seriesLabels["host.name"]).toBe("web-01");
75
+ });
76
+
77
+ test("still folds ordinary dotted labels into nested paths", () => {
78
+ const storageMap: JSONObject = buildStorageMap({
79
+ "host.name": "web-01",
80
+ "k8s.pod.name": "checkout-abc",
81
+ region: "us-east-1",
82
+ });
83
+
84
+ expect((storageMap["host"] as JSONObject)["name"]).toBe("web-01");
85
+ expect(
86
+ ((storageMap["k8s"] as JSONObject)["pod"] as JSONObject)["name"],
87
+ ).toBe("checkout-abc");
88
+ expect(storageMap["region"]).toBe("us-east-1");
89
+ });
90
+
91
+ test("renders a template against a folded label, with the refused one inert", () => {
92
+ const storageMap: JSONObject = buildStorageMap({
93
+ "host.name": "web-01",
94
+ "__proto__.polluted": "pwned",
95
+ });
96
+
97
+ expect(
98
+ MonitorTemplateUtil.processTemplateString({
99
+ value: "Host {{host.name}} is down",
100
+ storageMap: storageMap,
101
+ }),
102
+ ).toBe("Host web-01 is down");
103
+
104
+ expect(({} as JSONObject)["polluted"]).toBeUndefined();
105
+ });
106
+ });
@@ -175,7 +175,7 @@ describe("NetworkDeviceWalkUtil — the lastWalkLog baseline write", () => {
175
175
  * ports), and a baseline that shrank with it would compute rates for the
176
176
  * pruned ports against nothing on the next poll.
177
177
  */
178
- test("persists a deep JSON snapshot of the walk, stamped with the server receipt time", async () => {
178
+ test("persists a deep JSON snapshot of the INTERFACES, stamped with the server receipt time", async () => {
179
179
  mockWalkPipeline();
180
180
  const snmpResponse: SnmpMonitorResponse = buildSnmpResponse();
181
181
 
@@ -184,14 +184,43 @@ describe("NetworkDeviceWalkUtil — the lastWalkLog baseline write", () => {
184
184
  const walkLog: JSONObject = (hookFreeCallArgs()["data"] as JSONObject)[
185
185
  "lastWalkLog"
186
186
  ] as JSONObject;
187
+ const storedResponse: JSONObject = walkLog["snmpResponse"] as JSONObject;
187
188
 
188
- expect(walkLog["snmpResponse"]).toEqual(
189
- JSON.parse(JSON.stringify(snmpResponse)),
189
+ expect(storedResponse["interfaces"]).toEqual(
190
+ JSON.parse(JSON.stringify(snmpResponse.interfaces)),
190
191
  );
191
- expect(walkLog["snmpResponse"]).not.toBe(snmpResponse);
192
+ expect(storedResponse["interfaces"]).not.toBe(snmpResponse.interfaces);
192
193
  expect(walkLog["monitoredAt"]).toEqual(NOW);
193
194
  });
194
195
 
196
+ /*
197
+ * The column stores ONLY what reads it back.
198
+ *
199
+ * SnmpInterfaceRateUtil is the single reader and it touches
200
+ * snmpResponse.interfaces and nothing else, so every other field was dead
201
+ * weight in a jsonb column rewritten on every poll of every device. That
202
+ * became worth fixing when OID Collection Templates made long health-OID
203
+ * lists normal: oidResponses is the field that grows, and storing it here
204
+ * would have added tens of KB per device per poll of TOAST churn on the
205
+ * product's hottest table, for data nothing ever reads.
206
+ *
207
+ * If a future reader needs another field, add it here deliberately — do
208
+ * not go back to storing the whole response.
209
+ */
210
+ test("stores only the interfaces, not the rest of the walk", async () => {
211
+ mockWalkPipeline();
212
+
213
+ await runWalk(buildSnmpResponse());
214
+
215
+ const walkLog: JSONObject = (hookFreeCallArgs()["data"] as JSONObject)[
216
+ "lastWalkLog"
217
+ ] as JSONObject;
218
+
219
+ expect(Object.keys(walkLog["snmpResponse"] as JSONObject)).toEqual([
220
+ "interfaces",
221
+ ]);
222
+ });
223
+
195
224
  /*
196
225
  * The guard rail for everything above. Moving a column into this payload
197
226
  * silently stops the hooks that own it: site-assignment rules
@@ -248,11 +248,21 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
248
248
  const lastWalkLog: JSONObject = (updateArgs["data"] as JSONObject)[
249
249
  "lastWalkLog"
250
250
  ] as JSONObject;
251
- // A plain-JSON snapshot of the walk, not the live object.
252
- expect(lastWalkLog["snmpResponse"]).toEqual(
253
- JSON.parse(JSON.stringify(snmpResponse)),
251
+ const storedResponse: JSONObject = lastWalkLog[
252
+ "snmpResponse"
253
+ ] as JSONObject;
254
+
255
+ /*
256
+ * A plain-JSON snapshot of the INTERFACES, not the live object and not
257
+ * the whole walk. SnmpInterfaceRateUtil is the only reader of this column
258
+ * and only ever looks at snmpResponse.interfaces; storing the rest was
259
+ * dead weight rewritten on every poll of every device.
260
+ */
261
+ expect(storedResponse["interfaces"]).toEqual(
262
+ JSON.parse(JSON.stringify(snmpResponse.interfaces)),
254
263
  );
255
- expect(lastWalkLog["snmpResponse"]).not.toBe(snmpResponse);
264
+ expect(storedResponse["interfaces"]).not.toBe(snmpResponse.interfaces);
265
+ expect(Object.keys(storedResponse)).toEqual(["interfaces"]);
256
266
  expect(lastWalkLog["monitoredAt"]).toEqual(NOW);
257
267
  });
258
268