@oneuptime/common 11.6.1 → 11.6.2

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 (397) hide show
  1. package/Models/AnalyticsModels/Index.ts +4 -0
  2. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
  3. package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
  4. package/Models/AnalyticsModels/SloHistory.ts +240 -0
  5. package/Models/DatabaseModels/Index.ts +20 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +453 -6
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
  8. package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
  9. package/Models/DatabaseModels/NetworkSite.ts +1155 -0
  10. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
  11. package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
  12. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
  13. package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
  14. package/Models/DatabaseModels/ServiceLevelObjective.ts +1106 -0
  15. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
  16. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
  17. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  24. package/Server/Services/AnalyticsDatabaseService.ts +25 -9
  25. package/Server/Services/Index.ts +24 -0
  26. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  27. package/Server/Services/MetricService.ts +21 -2
  28. package/Server/Services/MonitorService.ts +22 -0
  29. package/Server/Services/NetworkDeviceService.ts +438 -2
  30. package/Server/Services/NetworkEndpointService.ts +414 -0
  31. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  32. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  33. package/Server/Services/NetworkSiteService.ts +1254 -0
  34. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  35. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  36. package/Server/Services/ProjectService.ts +122 -2
  37. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  38. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  39. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  40. package/Server/Services/ServiceLevelObjectiveService.ts +677 -0
  41. package/Server/Services/SloHistoryService.ts +101 -0
  42. package/Server/Services/UserNotificationSettingService.ts +37 -0
  43. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  44. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  45. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  46. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +87 -48
  47. package/Server/Utils/Memory.ts +9 -1
  48. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  49. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  50. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  51. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  52. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  53. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  54. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  55. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  56. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  57. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  58. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  59. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  60. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  61. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  62. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  63. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  64. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  65. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  66. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  67. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  68. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  69. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  70. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  71. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +404 -0
  72. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  73. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  74. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  75. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  76. package/Tests/Server/Utils/Memory.test.ts +213 -0
  77. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  78. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  79. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  80. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  81. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  82. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  83. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  84. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  85. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  86. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  87. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  88. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  89. package/Tests/Server/Utils/Stream.test.ts +87 -0
  90. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  91. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  92. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  93. package/Tests/Types/Email.test.ts +198 -0
  94. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  95. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  96. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  97. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  98. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  99. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  100. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  101. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  102. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  103. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  104. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  105. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  106. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  107. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  108. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  109. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  110. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  111. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  112. package/Tests/Utils/Base64.test.ts +51 -0
  113. package/Tests/Utils/Boolean.test.ts +76 -0
  114. package/Tests/Utils/Crypto.test.ts +48 -0
  115. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  116. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  117. package/Tests/Utils/Enum.test.ts +54 -0
  118. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  119. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  120. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  121. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  122. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  123. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  124. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  125. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  126. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  127. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  128. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  129. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  130. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  131. package/Tests/Utils/TechStack.test.ts +50 -0
  132. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  133. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  134. package/Types/BaseDatabase/EqualTo.ts +9 -1
  135. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  136. package/Types/BaseDatabase/NotEqual.ts +9 -1
  137. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  138. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  139. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  140. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  141. package/Types/Email/EmailTemplateType.ts +2 -0
  142. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  143. package/Types/Monitor/CriteriaFilter.ts +9 -0
  144. package/Types/Monitor/MonitorStep.ts +5 -8
  145. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  146. package/Types/Monitor/MonitorType.ts +15 -5
  147. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  148. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  149. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  150. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  151. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  152. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  153. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  154. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  155. package/Types/Permission.ts +449 -0
  156. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  157. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  158. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  159. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  160. package/Types/Telemetry/ServiceType.ts +1 -0
  161. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  162. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  163. package/UI/Components/List/List.tsx +8 -0
  164. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  165. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  166. package/UI/Components/Navbar/NavBar.tsx +16 -2
  167. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  168. package/UI/Utils/Navigation.ts +10 -0
  169. package/UI/Utils/TableFilterUrlState.ts +204 -17
  170. package/UI/Utils/TableViewUrlState.ts +165 -0
  171. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  172. package/Utils/Dashboard/Components/Index.ts +7 -0
  173. package/Utils/IpCanonicalUtil.ts +134 -0
  174. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  175. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  176. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  177. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  178. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  179. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  180. package/Utils/Slo/SloStatusColor.ts +54 -0
  181. package/Utils/Slo/SloUtil.ts +637 -0
  182. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  183. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  184. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  185. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  186. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  187. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  188. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  189. package/build/dist/Models/AnalyticsModels/SloHistory.js +215 -0
  190. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  191. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  192. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  193. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  194. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  195. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  196. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  197. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  198. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  199. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  200. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  201. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  202. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  203. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  204. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  205. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  206. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  207. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  208. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  209. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1124 -0
  210. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  211. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  212. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  213. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  214. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  215. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  216. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  229. package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -6
  230. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  231. package/build/dist/Server/Services/Index.js +24 -0
  232. package/build/dist/Server/Services/Index.js.map +1 -1
  233. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  234. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  235. package/build/dist/Server/Services/MetricService.js +21 -3
  236. package/build/dist/Server/Services/MetricService.js.map +1 -1
  237. package/build/dist/Server/Services/MonitorService.js +19 -0
  238. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  239. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  240. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  241. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  242. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  243. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  244. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  245. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  246. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  247. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  248. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  249. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  250. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  251. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  252. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  253. package/build/dist/Server/Services/ProjectService.js +98 -2
  254. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  255. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  256. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  257. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  258. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  259. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  260. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  261. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +582 -0
  262. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  263. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  264. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  265. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  266. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  267. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  268. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  269. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  270. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  271. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  272. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  273. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +76 -48
  274. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  275. package/build/dist/Server/Utils/Memory.js +9 -1
  276. package/build/dist/Server/Utils/Memory.js.map +1 -1
  277. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  278. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  279. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  280. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  281. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  282. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  283. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  284. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  285. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  286. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  287. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  288. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  289. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  290. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  291. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  292. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  293. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  294. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  295. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  296. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  297. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  298. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  299. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  300. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  301. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  302. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  303. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  304. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  305. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  306. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  307. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  308. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  309. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  310. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  311. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  312. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  313. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  314. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  315. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  316. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  317. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  318. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  319. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  320. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  321. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  322. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  323. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  324. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  325. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  326. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  327. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  328. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  329. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  330. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  331. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  332. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  333. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  334. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  335. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  336. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  337. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  338. package/build/dist/Types/Permission.js +409 -0
  339. package/build/dist/Types/Permission.js.map +1 -1
  340. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  341. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  342. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  343. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  344. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  345. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  346. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  347. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  348. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  349. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  350. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  351. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  352. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  353. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  354. package/build/dist/UI/Components/List/List.js +1 -1
  355. package/build/dist/UI/Components/List/List.js.map +1 -1
  356. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  357. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  358. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  359. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  360. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  361. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  362. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  363. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  364. package/build/dist/UI/Utils/Navigation.js +9 -0
  365. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  366. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  367. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  368. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  369. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  370. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  371. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  372. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  373. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  374. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  375. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  376. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  377. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  378. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  379. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  380. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  381. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  382. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  383. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  384. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  385. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  386. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  387. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  388. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  389. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  390. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  391. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  392. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  393. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  394. package/package.json +2 -2
  395. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  396. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  397. package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
@@ -0,0 +1,582 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import Model from "../../Models/DatabaseModels/ServiceLevelObjective";
11
+ import ServiceLevelObjectiveBurnRateRule from "../../Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule";
12
+ import URL from "../../Types/API/URL";
13
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
14
+ import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
15
+ import OneUptimeDate from "../../Types/Date";
16
+ import BadDataException from "../../Types/Exception/BadDataException";
17
+ import ObjectID from "../../Types/ObjectID";
18
+ import SloWindowType from "../../Types/ServiceLevelObjective/SloWindowType";
19
+ import DatabaseConfig from "../DatabaseConfig";
20
+ import QueryHelper from "../Types/Database/QueryHelper";
21
+ import logger from "../Utils/Logger";
22
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
23
+ import AlertSeverityService from "./AlertSeverityService";
24
+ import DatabaseService from "./DatabaseService";
25
+ import MonitorStatusService from "./MonitorStatusService";
26
+ import ProjectService from "./ProjectService";
27
+ import ServiceLevelObjectiveBurnRateRuleService from "./ServiceLevelObjectiveBurnRateRuleService";
28
+ import ServiceLevelObjectiveOwnerTeamService from "./ServiceLevelObjectiveOwnerTeamService";
29
+ import ServiceLevelObjectiveOwnerUserService from "./ServiceLevelObjectiveOwnerUserService";
30
+ import TeamMemberService from "./TeamMemberService";
31
+ export class Service extends DatabaseService {
32
+ constructor() {
33
+ super(Model);
34
+ }
35
+ async onBeforeCreate(createBy) {
36
+ if (!createBy.data.projectId) {
37
+ throw new BadDataException("projectId is required");
38
+ }
39
+ /*
40
+ * Numeric columns arrive as strings from the dashboard: the "Target (%)"
41
+ * form field is a `<input type="number">`, whose onChange hands Formik
42
+ * `e.target.value` (a string), ModelForm copies it verbatim and
43
+ * BaseModel.fromJSON does not coerce Number/Decimal columns. So every
44
+ * validator here coerces first and writes the coerced number back onto the
45
+ * payload, which also keeps Postgres from ever receiving a string.
46
+ */
47
+ createBy.data.targetPercentage = this.validateTargetPercentage(createBy.data.targetPercentage);
48
+ /*
49
+ * Validate windowDays whenever it is supplied, regardless of windowType.
50
+ * A CalendarMonth SLO ignores the column today, but it is persisted, and
51
+ * switching that SLO to Rolling later (in an update that does not carry
52
+ * windowDays) would otherwise start evaluating against an out-of-range
53
+ * window. Validating on the way in also keeps create and update symmetric
54
+ * — onBeforeUpdate validates unconditionally, so a value accepted here
55
+ * but rejected there would make the column permanently un-updatable.
56
+ */
57
+ if (createBy.data.windowDays !== undefined &&
58
+ createBy.data.windowDays !== null) {
59
+ createBy.data.windowDays = this.validateWindowDays(createBy.data.windowDays);
60
+ }
61
+ if (createBy.data.atRiskThresholdPercentage !== undefined &&
62
+ createBy.data.atRiskThresholdPercentage !== null) {
63
+ createBy.data.atRiskThresholdPercentage =
64
+ this.validateAtRiskThresholdPercentage(createBy.data.atRiskThresholdPercentage);
65
+ }
66
+ /*
67
+ * Default the downtime statuses to all non-operational monitor statuses
68
+ * of the project (StatusPageService pattern).
69
+ */
70
+ if (!createBy.data.downtimeMonitorStatuses) {
71
+ const monitorStatuses = await MonitorStatusService.findBy({
72
+ query: {
73
+ projectId: createBy.data.projectId,
74
+ },
75
+ select: {
76
+ _id: true,
77
+ isOperationalState: true,
78
+ },
79
+ props: {
80
+ isRoot: true,
81
+ },
82
+ skip: 0,
83
+ limit: LIMIT_PER_PROJECT,
84
+ });
85
+ const nonOperationalStatuses = monitorStatuses.filter((monitorStatus) => {
86
+ return !monitorStatus.isOperationalState;
87
+ });
88
+ createBy.data.downtimeMonitorStatuses = nonOperationalStatuses;
89
+ }
90
+ return {
91
+ createBy,
92
+ carryForward: null,
93
+ };
94
+ }
95
+ async onCreateSuccess(_onCreate, createdItem) {
96
+ var _a, _b, _c, _d;
97
+ /*
98
+ * Stamp nextEvaluationAt = now so the evaluation worker picks this SLO up
99
+ * on its next tick. Done here (isRoot update) instead of onBeforeCreate
100
+ * because the column is worker-owned (`create: []` access control) — a
101
+ * non-root dashboard create would fail the column permission check if the
102
+ * hook injected it into the create payload.
103
+ */
104
+ try {
105
+ await this.updateOneById({
106
+ id: createdItem.id,
107
+ data: {
108
+ nextEvaluationAt: OneUptimeDate.getCurrentDate(),
109
+ },
110
+ props: {
111
+ isRoot: true,
112
+ },
113
+ });
114
+ }
115
+ catch (err) {
116
+ logger.error(`Error setting nextEvaluationAt for SLO ${(_a = createdItem.id) === null || _a === void 0 ? void 0 : _a.toString()}: ${err}`, { projectId: (_b = createdItem.projectId) === null || _b === void 0 ? void 0 : _b.toString() });
117
+ }
118
+ // Seed the two canonical multi-window burn rate rules. Non-fatal.
119
+ try {
120
+ await this.seedDefaultBurnRateRules(createdItem);
121
+ }
122
+ catch (err) {
123
+ logger.error(`Error seeding default burn rate rules for SLO ${(_c = createdItem.id) === null || _c === void 0 ? void 0 : _c.toString()}: ${err}`, { projectId: (_d = createdItem.projectId) === null || _d === void 0 ? void 0 : _d.toString() });
124
+ }
125
+ return createdItem;
126
+ }
127
+ async onBeforeUpdate(updateBy) {
128
+ /*
129
+ * Same string-arrival path as onBeforeCreate — coerce, validate, and write
130
+ * the number back onto the update payload.
131
+ */
132
+ const newTargetPercentage = updateBy.data
133
+ .targetPercentage;
134
+ if (newTargetPercentage !== undefined && newTargetPercentage !== null) {
135
+ updateBy.data.targetPercentage =
136
+ this.validateTargetPercentage(newTargetPercentage);
137
+ }
138
+ const newWindowDays = updateBy.data.windowDays;
139
+ if (newWindowDays !== undefined && newWindowDays !== null) {
140
+ updateBy.data.windowDays = this.validateWindowDays(newWindowDays);
141
+ }
142
+ const newAtRiskThresholdPercentage = updateBy.data
143
+ .atRiskThresholdPercentage;
144
+ if (newAtRiskThresholdPercentage !== undefined &&
145
+ newAtRiskThresholdPercentage !== null) {
146
+ updateBy.data.atRiskThresholdPercentage =
147
+ this.validateAtRiskThresholdPercentage(newAtRiskThresholdPercentage);
148
+ }
149
+ return {
150
+ updateBy,
151
+ carryForward: null,
152
+ };
153
+ }
154
+ async onUpdateSuccess(onUpdate, updatedItemIds) {
155
+ /*
156
+ * When an SLO is disabled, resolve its open burn-rate alerts — the
157
+ * evaluation worker skips disabled SLOs, so nothing else would ever
158
+ * resolve them (and their on-call escalations would stay open forever).
159
+ */
160
+ if (onUpdate.updateBy.data.isEnabled === false) {
161
+ for (const updatedItemId of updatedItemIds) {
162
+ try {
163
+ const slo = await this.findOneById({
164
+ id: updatedItemId,
165
+ select: {
166
+ projectId: true,
167
+ },
168
+ props: {
169
+ isRoot: true,
170
+ },
171
+ });
172
+ if (!slo || !slo.projectId) {
173
+ continue;
174
+ }
175
+ await this.resolveOpenBurnRateAlertsForSlo({
176
+ sloId: updatedItemId,
177
+ projectId: slo.projectId,
178
+ });
179
+ }
180
+ catch (err) {
181
+ logger.error(`Error resolving open burn rate alerts for disabled SLO ${updatedItemId.toString()}: ${err}`);
182
+ }
183
+ }
184
+ }
185
+ /*
186
+ * If the objective's math inputs changed, force a re-evaluation on the
187
+ * worker's next tick.
188
+ */
189
+ const isEvaluationConfigUpdated = onUpdate.updateBy.data.targetPercentage !== undefined ||
190
+ onUpdate.updateBy.data.windowDays !== undefined ||
191
+ onUpdate.updateBy.data.windowType !== undefined ||
192
+ onUpdate.updateBy.data.monitors !== undefined;
193
+ if (isEvaluationConfigUpdated) {
194
+ for (const updatedItemId of updatedItemIds) {
195
+ try {
196
+ await this.updateOneById({
197
+ id: updatedItemId,
198
+ data: {
199
+ nextEvaluationAt: OneUptimeDate.getCurrentDate(),
200
+ },
201
+ props: {
202
+ isRoot: true,
203
+ },
204
+ });
205
+ }
206
+ catch (err) {
207
+ logger.error(`Error forcing re-evaluation of SLO ${updatedItemId.toString()}: ${err}`);
208
+ }
209
+ }
210
+ }
211
+ return onUpdate;
212
+ }
213
+ async onBeforeDelete(deleteBy) {
214
+ var _a, _b;
215
+ const itemsToDelete = await this.findBy({
216
+ query: deleteBy.query,
217
+ limit: LIMIT_MAX,
218
+ skip: 0,
219
+ select: {
220
+ _id: true,
221
+ projectId: true,
222
+ },
223
+ props: {
224
+ isRoot: true,
225
+ },
226
+ });
227
+ for (const item of itemsToDelete) {
228
+ if (!item.id || !item.projectId) {
229
+ continue;
230
+ }
231
+ try {
232
+ await this.resolveOpenBurnRateAlertsForSlo({
233
+ sloId: item.id,
234
+ projectId: item.projectId,
235
+ });
236
+ }
237
+ catch (err) {
238
+ logger.error(`Error resolving open burn rate alerts for SLO ${(_a = item.id) === null || _a === void 0 ? void 0 : _a.toString()} before delete: ${err}`, { projectId: (_b = item.projectId) === null || _b === void 0 ? void 0 : _b.toString() });
239
+ }
240
+ }
241
+ return {
242
+ deleteBy,
243
+ carryForward: {
244
+ itemsToDelete: itemsToDelete,
245
+ },
246
+ };
247
+ }
248
+ /*
249
+ * Resolve every open Alert fired by any of this SLO's burn rate rules.
250
+ * Called when the SLO is disabled or deleted.
251
+ */
252
+ async resolveOpenBurnRateAlertsForSlo(data) {
253
+ var _a, _b, _c;
254
+ const burnRateRules = await ServiceLevelObjectiveBurnRateRuleService.findBy({
255
+ query: {
256
+ serviceLevelObjectiveId: data.sloId,
257
+ projectId: data.projectId,
258
+ },
259
+ select: {
260
+ _id: true,
261
+ },
262
+ skip: 0,
263
+ limit: LIMIT_PER_PROJECT,
264
+ props: {
265
+ isRoot: true,
266
+ },
267
+ });
268
+ for (const rule of burnRateRules) {
269
+ if (!rule.id) {
270
+ continue;
271
+ }
272
+ try {
273
+ await ServiceLevelObjectiveBurnRateRuleService.resolveOpenAlertsForRule({
274
+ serviceLevelObjectiveId: data.sloId,
275
+ burnRateRuleId: rule.id,
276
+ projectId: data.projectId,
277
+ rootCause: "Alert auto-resolved because the Service Level Objective was disabled or deleted.",
278
+ });
279
+ }
280
+ catch (err) {
281
+ logger.error(`Error resolving open alerts for burn rate rule ${(_a = rule.id) === null || _a === void 0 ? void 0 : _a.toString()} of SLO ${(_b = data.sloId) === null || _b === void 0 ? void 0 : _b.toString()}: ${err}`, { projectId: (_c = data.projectId) === null || _c === void 0 ? void 0 : _c.toString() });
282
+ }
283
+ }
284
+ }
285
+ /*
286
+ * All enabled SLOs in active projects that are due for evaluation
287
+ * (nextEvaluationAt in the past, or never evaluated). Selects every config
288
+ * and state column the evaluation worker needs.
289
+ */
290
+ async getDueSlos() {
291
+ return await this.findAllBy({
292
+ query: {
293
+ isEnabled: true,
294
+ nextEvaluationAt: QueryHelper.lessThanEqualToOrNull(OneUptimeDate.getCurrentDate()),
295
+ project: Object.assign({}, ProjectService.getActiveProjectStatusQuery()),
296
+ },
297
+ select: {
298
+ _id: true,
299
+ projectId: true,
300
+ name: true,
301
+ isEnabled: true,
302
+ sliType: true,
303
+ multiMonitorMode: true,
304
+ monitors: {
305
+ _id: true,
306
+ },
307
+ downtimeMonitorStatuses: {
308
+ _id: true,
309
+ },
310
+ metricQueryConfig: true,
311
+ targetPercentage: true,
312
+ windowType: true,
313
+ windowDays: true,
314
+ timezone: true,
315
+ atRiskThresholdPercentage: true,
316
+ currentSliPercentage: true,
317
+ errorBudgetRemainingPercentage: true,
318
+ errorBudgetRemainingSeconds: true,
319
+ errorBudgetTotalSeconds: true,
320
+ currentBurnRate: true,
321
+ sloStatus: true,
322
+ statusChangeNotificationSentAt: true,
323
+ lastEvaluatedAt: true,
324
+ nextEvaluationAt: true,
325
+ lastAccumulatedBucketEndAt: true,
326
+ },
327
+ sort: {
328
+ nextEvaluationAt: SortOrder.Ascending,
329
+ },
330
+ props: {
331
+ isRoot: true,
332
+ },
333
+ });
334
+ }
335
+ async findOwners(serviceLevelObjectiveId) {
336
+ if (!serviceLevelObjectiveId) {
337
+ throw new BadDataException("serviceLevelObjectiveId is required");
338
+ }
339
+ const ownerUsers = await ServiceLevelObjectiveOwnerUserService.findBy({
340
+ query: {
341
+ serviceLevelObjectiveId: serviceLevelObjectiveId,
342
+ },
343
+ select: {
344
+ _id: true,
345
+ user: {
346
+ _id: true,
347
+ email: true,
348
+ name: true,
349
+ timezone: true,
350
+ },
351
+ },
352
+ props: {
353
+ isRoot: true,
354
+ },
355
+ limit: LIMIT_PER_PROJECT,
356
+ skip: 0,
357
+ });
358
+ const ownerTeams = await ServiceLevelObjectiveOwnerTeamService.findBy({
359
+ query: {
360
+ serviceLevelObjectiveId: serviceLevelObjectiveId,
361
+ },
362
+ select: {
363
+ _id: true,
364
+ teamId: true,
365
+ },
366
+ skip: 0,
367
+ limit: LIMIT_PER_PROJECT,
368
+ props: {
369
+ isRoot: true,
370
+ },
371
+ });
372
+ const users = ownerUsers.map((ownerUser) => {
373
+ return ownerUser.user;
374
+ }) || [];
375
+ if (ownerTeams.length > 0) {
376
+ const teamIds = ownerTeams.map((ownerTeam) => {
377
+ return ownerTeam.teamId;
378
+ }) || [];
379
+ const teamUsers = await TeamMemberService.getUsersInTeams(teamIds);
380
+ for (const teamUser of teamUsers) {
381
+ // check if the user is already added.
382
+ const isUserAlreadyAdded = users.find((user) => {
383
+ return user.id.toString() === teamUser.id.toString();
384
+ });
385
+ if (!isUserAlreadyAdded) {
386
+ users.push(teamUser);
387
+ }
388
+ }
389
+ }
390
+ return users;
391
+ }
392
+ async getSloLinkInDashboard(projectId, serviceLevelObjectiveId) {
393
+ const dashboardUrl = await DatabaseConfig.getDashboardUrl();
394
+ return URL.fromString(dashboardUrl.toString()).addRoute(`/${projectId.toString()}/slos/${serviceLevelObjectiveId.toString()}`);
395
+ }
396
+ /*
397
+ * Seed the two canonical Google-SRE multi-window burn rate rules, with
398
+ * thresholds scaled to the SLO's compliance window. The textbook constants
399
+ * (14.4x over 1h/5m, 6x over 6h/30m) are derived from spending 2% / 5% of a
400
+ * 30-day budget: threshold = budgetFraction * windowHours / longWindowHours.
401
+ * A 30-day window reproduces exactly 14.4 and 6; shorter or longer windows
402
+ * stay correctly calibrated.
403
+ */
404
+ async seedDefaultBurnRateRules(createdItem) {
405
+ var _a, _b;
406
+ if (!createdItem.id || !createdItem.projectId) {
407
+ return;
408
+ }
409
+ const windowHours = createdItem.windowType === SloWindowType.CalendarMonth
410
+ ? 720
411
+ : (createdItem.windowDays || 30) * 24;
412
+ /*
413
+ * Default severity: the project's lowest-order (most severe) severity.
414
+ * A failure here must not cost the SLO its burn-rate rules — the rules are
415
+ * still useful without a severity (the worker falls back to the lowest
416
+ * order severity when it creates the alert), so a transient lookup error
417
+ * degrades to "no default severity" rather than "no rules at all".
418
+ */
419
+ let severity = null;
420
+ try {
421
+ severity = await AlertSeverityService.findOneBy({
422
+ query: {
423
+ projectId: createdItem.projectId,
424
+ },
425
+ sort: {
426
+ order: SortOrder.Ascending,
427
+ },
428
+ select: {
429
+ _id: true,
430
+ },
431
+ props: {
432
+ isRoot: true,
433
+ },
434
+ });
435
+ }
436
+ catch (error) {
437
+ logger.error(`Could not look up the default alert severity for SLO ${createdItem.id.toString()}. Seeding burn rate rules without one.`);
438
+ logger.error(error);
439
+ }
440
+ const defaultRules = [
441
+ {
442
+ name: "Fast burn",
443
+ burnRateThreshold: this.roundToTwoDecimals((0.02 * windowHours) / 1),
444
+ longWindowInMinutes: 60,
445
+ shortWindowInMinutes: 5,
446
+ },
447
+ {
448
+ name: "Slow burn",
449
+ burnRateThreshold: this.roundToTwoDecimals((0.05 * windowHours) / 6),
450
+ longWindowInMinutes: 360,
451
+ shortWindowInMinutes: 30,
452
+ },
453
+ ];
454
+ for (const defaultRule of defaultRules) {
455
+ try {
456
+ const rule = new ServiceLevelObjectiveBurnRateRule();
457
+ rule.projectId = createdItem.projectId;
458
+ rule.serviceLevelObjectiveId = createdItem.id;
459
+ rule.name = defaultRule.name;
460
+ rule.isEnabled = true;
461
+ rule.burnRateThreshold = defaultRule.burnRateThreshold;
462
+ rule.longWindowInMinutes = defaultRule.longWindowInMinutes;
463
+ rule.shortWindowInMinutes = defaultRule.shortWindowInMinutes;
464
+ if (severity && severity.id) {
465
+ rule.alertSeverityId = severity.id;
466
+ }
467
+ await ServiceLevelObjectiveBurnRateRuleService.create({
468
+ data: rule,
469
+ props: {
470
+ isRoot: true,
471
+ },
472
+ });
473
+ }
474
+ catch (err) {
475
+ logger.error(`Error seeding default burn rate rule "${defaultRule.name}" for SLO ${(_a = createdItem.id) === null || _a === void 0 ? void 0 : _a.toString()}: ${err}`, { projectId: (_b = createdItem.projectId) === null || _b === void 0 ? void 0 : _b.toString() });
476
+ }
477
+ }
478
+ }
479
+ roundToTwoDecimals(value) {
480
+ return Math.round(value * 100) / 100;
481
+ }
482
+ /*
483
+ * Coerce an API-supplied numeric column to a number. HTML number inputs hand
484
+ * Formik strings, and neither ModelForm nor BaseModel.fromJSON coerces
485
+ * Number/Decimal columns, so a perfectly valid "99.9" reaches these hooks as
486
+ * a string. Anything that is not a finite numeric string or number becomes
487
+ * NaN, which every caller below rejects. Mirrors
488
+ * GlobalConfigService.normalizePercent.
489
+ */
490
+ normalizeNumericInput(value) {
491
+ if (typeof value === "string") {
492
+ const trimmed = value.trim();
493
+ return trimmed === "" ? Number.NaN : Number(trimmed);
494
+ }
495
+ if (typeof value === "number") {
496
+ return value;
497
+ }
498
+ return Number.NaN;
499
+ }
500
+ validateTargetPercentage(value) {
501
+ const targetPercentage = this.normalizeNumericInput(value);
502
+ if (!Number.isFinite(targetPercentage) ||
503
+ targetPercentage <= 0 ||
504
+ targetPercentage > 99.999) {
505
+ throw new BadDataException("SLO target must be greater than 0 and at most 99.999. A 100% target leaves no error budget.");
506
+ }
507
+ return targetPercentage;
508
+ }
509
+ validateWindowDays(value) {
510
+ const windowDays = this.normalizeNumericInput(value);
511
+ if (!Number.isFinite(windowDays) || windowDays < 1 || windowDays > 366) {
512
+ throw new BadDataException("SLO window must be between 1 and 366 days.");
513
+ }
514
+ return windowDays;
515
+ }
516
+ validateAtRiskThresholdPercentage(value) {
517
+ const atRiskThresholdPercentage = this.normalizeNumericInput(value);
518
+ if (!Number.isFinite(atRiskThresholdPercentage) ||
519
+ atRiskThresholdPercentage < 0 ||
520
+ atRiskThresholdPercentage > 100) {
521
+ throw new BadDataException("SLO at-risk threshold must be a percentage between 0 and 100.");
522
+ }
523
+ return atRiskThresholdPercentage;
524
+ }
525
+ }
526
+ __decorate([
527
+ CaptureSpan(),
528
+ __metadata("design:type", Function),
529
+ __metadata("design:paramtypes", [Object]),
530
+ __metadata("design:returntype", Promise)
531
+ ], Service.prototype, "onBeforeCreate", null);
532
+ __decorate([
533
+ CaptureSpan(),
534
+ __metadata("design:type", Function),
535
+ __metadata("design:paramtypes", [Object, Model]),
536
+ __metadata("design:returntype", Promise)
537
+ ], Service.prototype, "onCreateSuccess", null);
538
+ __decorate([
539
+ CaptureSpan(),
540
+ __metadata("design:type", Function),
541
+ __metadata("design:paramtypes", [Object]),
542
+ __metadata("design:returntype", Promise)
543
+ ], Service.prototype, "onBeforeUpdate", null);
544
+ __decorate([
545
+ CaptureSpan(),
546
+ __metadata("design:type", Function),
547
+ __metadata("design:paramtypes", [Object, Array]),
548
+ __metadata("design:returntype", Promise)
549
+ ], Service.prototype, "onUpdateSuccess", null);
550
+ __decorate([
551
+ CaptureSpan(),
552
+ __metadata("design:type", Function),
553
+ __metadata("design:paramtypes", [Object]),
554
+ __metadata("design:returntype", Promise)
555
+ ], Service.prototype, "onBeforeDelete", null);
556
+ __decorate([
557
+ CaptureSpan(),
558
+ __metadata("design:type", Function),
559
+ __metadata("design:paramtypes", [Object]),
560
+ __metadata("design:returntype", Promise)
561
+ ], Service.prototype, "resolveOpenBurnRateAlertsForSlo", null);
562
+ __decorate([
563
+ CaptureSpan(),
564
+ __metadata("design:type", Function),
565
+ __metadata("design:paramtypes", []),
566
+ __metadata("design:returntype", Promise)
567
+ ], Service.prototype, "getDueSlos", null);
568
+ __decorate([
569
+ CaptureSpan(),
570
+ __metadata("design:type", Function),
571
+ __metadata("design:paramtypes", [ObjectID]),
572
+ __metadata("design:returntype", Promise)
573
+ ], Service.prototype, "findOwners", null);
574
+ __decorate([
575
+ CaptureSpan(),
576
+ __metadata("design:type", Function),
577
+ __metadata("design:paramtypes", [ObjectID,
578
+ ObjectID]),
579
+ __metadata("design:returntype", Promise)
580
+ ], Service.prototype, "getSloLinkInDashboard", null);
581
+ export default new Service();
582
+ //# sourceMappingURL=ServiceLevelObjectiveService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceLevelObjectiveService.js","sourceRoot":"","sources":["../../../../Server/Services/ServiceLevelObjectiveService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import AnalyticsDatabaseService from "./AnalyticsDatabaseService";
2
+ import SloHistory from "../../Models/AnalyticsModels/SloHistory";
3
+ import OneUptimeDate from "../../Types/Date";
4
+ import ObjectID from "../../Types/ObjectID";
5
+ /**
6
+ * Service for the `SloHistory` ReplacingMergeTree table.
7
+ *
8
+ * Writes come from the SLO evaluation worker via
9
+ * {@link insertHistoryRows}. History is POINT-IN-TIME: each evaluation
10
+ * writes exactly one minute-floored bucket per series, once, with the
11
+ * numbers as computed at that moment. Retroactive edits to the
12
+ * underlying MonitorStatusTimeline are NOT restated into already-written
13
+ * buckets — the SLO overview page always recomputes its current numbers
14
+ * from Postgres and therefore self-heals, while the charts stay a
15
+ * historical record of what was reported at the time.
16
+ *
17
+ * ReplacingMergeTree + the per-batch `version` stamp (unix millis)
18
+ * therefore guard exactly one thing: a rare double write of the same
19
+ * (projectId, sloId, metricName, bucketStart) identity — a retried job,
20
+ * or two runs landing in the same minute — collapses to the highest
21
+ * version at merge time instead of double-counting. Merges are
22
+ * asynchronous, so a naive reader can transiently see both rows; that is
23
+ * why the chart layer reads through `/aggregate` (its GROUP BY on the
24
+ * bucketed timestamp collapses duplicates) and why a raw reader would
25
+ * need `argMax(value, version) ... GROUP BY <identity>` (MutableMetric
26
+ * precedent).
27
+ *
28
+ * Possible future work: restating a trailing window of buckets on every
29
+ * run so retroactive timeline edits propagate into history. The version
30
+ * machinery already supports it (a later run's rewrite carries a
31
+ * strictly larger version and wins), but nothing writes those rewrites
32
+ * today.
33
+ */
34
+ export class SloHistoryService extends AnalyticsDatabaseService {
35
+ constructor(clickhouseDatabase) {
36
+ super({ modelType: SloHistory, database: clickhouseDatabase });
37
+ }
38
+ /*
39
+ * Insert history rows. All rows in one call share a single `version`
40
+ * stamp (unix millis at write time), so if the same bucket is ever
41
+ * written twice — a retried job, or a re-run landing in the same
42
+ * minute — the later write carries a strictly larger version and wins
43
+ * the ReplacingMergeTree dedupe instead of double-counting. Rows with
44
+ * a missing/non-finite value are skipped (same discipline as
45
+ * MonitorMetricUtil's metric-row builder).
46
+ */
47
+ async insertHistoryRows(rows) {
48
+ if (!rows || rows.length === 0) {
49
+ return;
50
+ }
51
+ const now = OneUptimeDate.getCurrentDate();
52
+ const createdAt = OneUptimeDate.toClickhouseDateTime(now);
53
+ const version = now.getTime();
54
+ const jsonRows = [];
55
+ for (const row of rows) {
56
+ if (typeof row.value !== "number" || !isFinite(row.value)) {
57
+ continue;
58
+ }
59
+ jsonRows.push({
60
+ _id: ObjectID.generateTimeOrdered().toString(),
61
+ createdAt: createdAt,
62
+ projectId: row.projectId.toString(),
63
+ sloId: row.sloId.toString(),
64
+ metricName: row.metricName,
65
+ bucketStart: OneUptimeDate.toClickhouseDateTime(row.bucketStart),
66
+ value: row.value,
67
+ version: version,
68
+ });
69
+ }
70
+ if (jsonRows.length === 0) {
71
+ return;
72
+ }
73
+ await this.insertJsonRows(jsonRows);
74
+ }
75
+ }
76
+ export default new SloHistoryService();
77
+ //# sourceMappingURL=SloHistoryService.js.map