@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,393 @@
1
+ import OneUptimeDate, { Moment } from "../../Types/Date";
2
+ import BadDataException from "../../Types/Exception/BadDataException";
3
+ import SloMultiMonitorMode from "../../Types/ServiceLevelObjective/SloMultiMonitorMode";
4
+ import SloStatus from "../../Types/ServiceLevelObjective/SloStatus";
5
+ import UptimeUtil from "../Uptime/UptimeUtil";
6
+ /**
7
+ * SLO / error budget math. Isomorphic (no server imports) so it is shared by the
8
+ * worker, the dashboard, and later the status page - exactly like UptimeUtil.
9
+ *
10
+ * Design notes (see SLO design doc paragraph 3.1 / 5):
11
+ *
12
+ * - Multi-monitor downtime must NOT be computed by feeding several monitors into
13
+ * UptimeUtil.getNonOverlappingMonitorEvents: its priority flatten lets a
14
+ * better-status event that merely ends later truncate a concurrent worse-status
15
+ * event (Monitor A Offline 10:00-11:00 + Monitor B Operational 10:30-12:00
16
+ * silently loses 30 minutes of downtime). That flatten was built for rendering
17
+ * one status-page bar, not cross-monitor budget math. This util therefore works
18
+ * per monitor (getMonitorEventsForId is per-monitor and correct) and combines
19
+ * monitors with explicit semantics (SloMultiMonitorMode).
20
+ *
21
+ * - Every comparison against a threshold uses UNROUNDED values. Round only at
22
+ * render time (roundForDisplay floors - fine for display, wrong for
23
+ * classification).
24
+ */
25
+ export default class SloUtil {
26
+ /**
27
+ * Extracts the downtime intervals of a SINGLE monitor inside the window.
28
+ * Uses UptimeUtil.getMonitorEventsForId, which is per-monitor: it clips events
29
+ * to the window, caps them at "now" and imputes an end for open
30
+ * (endsAt = null) rows. Events whose status is not in `downtimeStatuses` are
31
+ * dropped.
32
+ */
33
+ static getDowntimeIntervalsForMonitor(monitorId, timelines, downtimeStatuses, window) {
34
+ const events = UptimeUtil.getMonitorEventsForId(monitorId, timelines, window);
35
+ const intervals = [];
36
+ for (const event of events) {
37
+ const isDowntimeEvent = Boolean(downtimeStatuses.find((status) => {
38
+ var _a;
39
+ return ((_a = status.id) === null || _a === void 0 ? void 0 : _a.toString()) === event.eventStatusId.toString();
40
+ }));
41
+ if (isDowntimeEvent) {
42
+ intervals.push({
43
+ startDate: event.startDate,
44
+ endDate: event.endDate,
45
+ });
46
+ }
47
+ }
48
+ return intervals;
49
+ }
50
+ /**
51
+ * The EARLIEST event start across the attached monitors inside `window`, or
52
+ * null when no monitor has an event that overlaps the window at all.
53
+ *
54
+ * Uses the SAME UptimeUtil.getMonitorEventsForId clipping path the SLI
55
+ * denominator uses, so the answer has identical semantics to the clamp inside
56
+ * computeTimeSli: because events are clipped to the window, the returned date
57
+ * is always >= window.startDate, i.e. it is "how far back this window can
58
+ * actually see data".
59
+ *
60
+ * This exists for callers that must distinguish "the metric is fine" from
61
+ * "we have not observed enough history to judge it yet" - most importantly the
62
+ * burn-rate evaluator, whose FIXED-LENGTH long window would otherwise silently
63
+ * collapse to the data age (see EvaluateSlos.evaluateBurnRateRule).
64
+ */
65
+ static getEarliestEventStartDate(perMonitorTimelines, window) {
66
+ let earliestEventStart = null;
67
+ for (const monitor of perMonitorTimelines) {
68
+ const events = UptimeUtil.getMonitorEventsForId(monitor.monitorId, monitor.timelines, window);
69
+ for (const event of events) {
70
+ if (!earliestEventStart ||
71
+ event.startDate.getTime() < earliestEventStart.getTime()) {
72
+ earliestEventStart = event.startDate;
73
+ }
74
+ }
75
+ }
76
+ return earliestEventStart;
77
+ }
78
+ /**
79
+ * Merges overlapping and adjacent intervals into a disjoint, sorted set.
80
+ * Millisecond-precise (raw timestamps, not second-granularity moment
81
+ * comparisons) so the merged length agrees with
82
+ * OneUptimeDate.getSecondsBetweenDates.
83
+ */
84
+ static mergeIntervals(intervals) {
85
+ const sorted = [...intervals].sort((a, b) => {
86
+ return a.startDate.getTime() - b.startDate.getTime();
87
+ });
88
+ const merged = [];
89
+ for (const interval of sorted) {
90
+ // skip empty / inverted intervals.
91
+ if (interval.endDate.getTime() <= interval.startDate.getTime()) {
92
+ continue;
93
+ }
94
+ const last = merged[merged.length - 1];
95
+ // overlapping OR adjacent (start === last end) -> extend the last interval.
96
+ if (last && interval.startDate.getTime() <= last.endDate.getTime()) {
97
+ if (interval.endDate.getTime() > last.endDate.getTime()) {
98
+ last.endDate = interval.endDate;
99
+ }
100
+ continue;
101
+ }
102
+ merged.push({
103
+ startDate: interval.startDate,
104
+ endDate: interval.endDate,
105
+ });
106
+ }
107
+ return merged;
108
+ }
109
+ /**
110
+ * Union downtime across monitors: per monitor, extract its down intervals from
111
+ * its OWN event list, then take the interval union across monitors and sum the
112
+ * seconds. This is the AnyDown numerator.
113
+ *
114
+ * The correctness case this exists for: Monitor A Offline 10:00-11:00 while
115
+ * Monitor B is Operational 10:30-12:00 must yield 3600 seconds of downtime,
116
+ * NOT 1800 - which is what the cross-monitor priority flatten in
117
+ * UptimeUtil.getNonOverlappingMonitorEvents produces.
118
+ */
119
+ static getUnionDowntimeSeconds(perMonitor, downtimeStatuses, window) {
120
+ const allIntervals = [];
121
+ for (const monitor of perMonitor) {
122
+ allIntervals.push(...this.getDowntimeIntervalsForMonitor(monitor.monitorId, monitor.timelines, downtimeStatuses, window));
123
+ }
124
+ const merged = this.mergeIntervals(allIntervals);
125
+ let totalSeconds = 0;
126
+ for (const interval of merged) {
127
+ totalSeconds += OneUptimeDate.getSecondsBetweenDates(interval.startDate, interval.endDate);
128
+ }
129
+ return totalSeconds;
130
+ }
131
+ /**
132
+ * Time-based SLI over MonitorStatusTimeline data.
133
+ *
134
+ * Denominator rules:
135
+ * - The window end is always clipped to "now" (a window reaching into the
136
+ * future must not inflate the denominator).
137
+ * - AnyDown: the window start is clamped forward to the EARLIEST first event
138
+ * across the attached monitors, so a young SLO is measured from its first
139
+ * data point, not diluted by time before any monitor existed. The clamp uses
140
+ * the merged set's earliest event so that one old monitor anchors the window
141
+ * for the whole SLO.
142
+ * - MonitorSecondsAverage: the clamp happens PER MONITOR (each monitor's own
143
+ * first event), mirroring UptimeUtil.getTotalDowntimeInSeconds - otherwise
144
+ * adding a young monitor dilutes the SLI.
145
+ *
146
+ * No data at all (no timeline rows for any monitor) => totalSeconds 0,
147
+ * sliPercentage 100 - callers decide what "no data" means (the evaluator marks
148
+ * such SLOs Misconfigured/Paused; it never treats them as healthy 100%).
149
+ *
150
+ * Rows exist but none overlap the window => the monitor was up for the whole
151
+ * window as far as the window can tell: full-window denominator, 0 bad seconds
152
+ * (same answer UptimeUtil gives - see the "orphaned row" production incident
153
+ * test in UptimeUtil.test.ts).
154
+ *
155
+ * All values are UNROUNDED.
156
+ */
157
+ static computeTimeSli(data) {
158
+ const { perMonitorTimelines, downtimeStatuses, window, mode } = data;
159
+ const hasAnyTimelineRows = perMonitorTimelines.some((monitor) => {
160
+ return monitor.timelines.length > 0;
161
+ });
162
+ if (!hasAnyTimelineRows) {
163
+ return {
164
+ badSeconds: 0,
165
+ totalSeconds: 0,
166
+ sliPercentage: 100,
167
+ };
168
+ }
169
+ if (mode === SloMultiMonitorMode.MonitorSecondsAverage) {
170
+ return this.computeMonitorSecondsAverageSli({
171
+ perMonitorTimelines,
172
+ downtimeStatuses,
173
+ window,
174
+ });
175
+ }
176
+ return this.computeAnyDownSli({
177
+ perMonitorTimelines,
178
+ downtimeStatuses,
179
+ window,
180
+ });
181
+ }
182
+ static computeAnyDownSli(data) {
183
+ const { perMonitorTimelines, downtimeStatuses, window } = data;
184
+ const windowEndDate = OneUptimeDate.getLesserDate(window.endDate, OneUptimeDate.getCurrentDate());
185
+ /*
186
+ * Earliest first event across monitors. Events from getMonitorEventsForId are
187
+ * already clipped to the window, so every start is >= window.startDate: the
188
+ * clamp can only move the window start FORWARD (young SLO), never backward.
189
+ */
190
+ const earliestEventStart = this.getEarliestEventStartDate(perMonitorTimelines, window);
191
+ /*
192
+ * Rows exist but none clip into the window: as far as the window can tell the
193
+ * monitors were up throughout - full-window denominator, zero bad seconds
194
+ * (matches UptimeUtil's behaviour for the same input).
195
+ */
196
+ const windowStartDate = earliestEventStart
197
+ ? OneUptimeDate.getGreaterDate(window.startDate, earliestEventStart)
198
+ : window.startDate;
199
+ const totalSeconds = OneUptimeDate.getSecondsBetweenDates(windowStartDate, windowEndDate);
200
+ if (totalSeconds <= 0) {
201
+ return {
202
+ badSeconds: 0,
203
+ totalSeconds: 0,
204
+ sliPercentage: 100,
205
+ };
206
+ }
207
+ const badSeconds = this.getUnionDowntimeSeconds(perMonitorTimelines, downtimeStatuses, window);
208
+ return {
209
+ badSeconds,
210
+ totalSeconds,
211
+ sliPercentage: ((totalSeconds - badSeconds) / totalSeconds) * 100,
212
+ };
213
+ }
214
+ static computeMonitorSecondsAverageSli(data) {
215
+ const { perMonitorTimelines, downtimeStatuses, window } = data;
216
+ let badSeconds = 0;
217
+ let totalSeconds = 0;
218
+ for (const monitor of perMonitorTimelines) {
219
+ /*
220
+ * Guard against rows of other monitors leaking into this monitor's array -
221
+ * getTotalDowntimeInSeconds does not filter by monitor id, and feeding it a
222
+ * multi-monitor array would reintroduce the priority-flatten bug.
223
+ */
224
+ const ownTimelines = monitor.timelines.filter((timeline) => {
225
+ var _a;
226
+ return (((_a = timeline.monitorId) === null || _a === void 0 ? void 0 : _a.toString()) === monitor.monitorId.toString());
227
+ });
228
+ /*
229
+ * A monitor with no timeline rows at all has no data - skip it instead of
230
+ * letting it contribute a full window of implied uptime.
231
+ */
232
+ if (ownTimelines.length === 0) {
233
+ continue;
234
+ }
235
+ const { totalDowntimeInSeconds, totalSecondsInTimePeriod, } = UptimeUtil.getTotalDowntimeInSeconds(ownTimelines, downtimeStatuses, window);
236
+ badSeconds += totalDowntimeInSeconds;
237
+ totalSeconds += totalSecondsInTimePeriod;
238
+ }
239
+ if (totalSeconds <= 0) {
240
+ return {
241
+ badSeconds: 0,
242
+ totalSeconds: 0,
243
+ sliPercentage: 100,
244
+ };
245
+ }
246
+ return {
247
+ badSeconds,
248
+ totalSeconds,
249
+ sliPercentage: (1 - badSeconds / totalSeconds) * 100,
250
+ };
251
+ }
252
+ /**
253
+ * Error budget from an SLI measurement.
254
+ *
255
+ * Provide either `sliPercentage` or `badSeconds` (badSeconds wins when both are
256
+ * given, since it is the exact number the SLI was derived from).
257
+ *
258
+ * budgetRemainingSeconds is SIGNED - negative when over budget. Never clamp it
259
+ * here; clamp in the UI only. budgetRemainingPercentage is capped at 100 but
260
+ * NOT floored at 0.
261
+ */
262
+ static getErrorBudget(data) {
263
+ const { sliPercentage, badSeconds, totalSeconds, targetPercentage } = data;
264
+ this.validateTargetPercentage(targetPercentage);
265
+ if (badSeconds === undefined && sliPercentage === undefined) {
266
+ throw new BadDataException("Either sliPercentage or badSeconds must be provided to compute the error budget.");
267
+ }
268
+ // no elapsed window yet => nothing consumed, full budget remaining.
269
+ if (totalSeconds === 0) {
270
+ return {
271
+ budgetTotalSeconds: 0,
272
+ budgetConsumedSeconds: 0,
273
+ budgetRemainingSeconds: 0,
274
+ budgetRemainingPercentage: 100,
275
+ };
276
+ }
277
+ const allowedBadFraction = 1 - targetPercentage / 100;
278
+ const budgetTotalSeconds = allowedBadFraction * totalSeconds;
279
+ const budgetConsumedSeconds = badSeconds !== undefined
280
+ ? badSeconds
281
+ : (1 - sliPercentage / 100) * totalSeconds;
282
+ const budgetRemainingSeconds = budgetTotalSeconds - budgetConsumedSeconds;
283
+ const budgetRemainingPercentage = Math.min(100, (budgetRemainingSeconds / budgetTotalSeconds) * 100);
284
+ return {
285
+ budgetTotalSeconds,
286
+ budgetConsumedSeconds,
287
+ budgetRemainingSeconds,
288
+ budgetRemainingPercentage,
289
+ };
290
+ }
291
+ /**
292
+ * Burn rate: how many times faster than "exactly on target" the budget is being
293
+ * consumed over the measured period. 1 = burning exactly the sustainable rate,
294
+ * 14.4 = the canonical fast-burn page threshold for a 30-day window.
295
+ *
296
+ * Works identically for seconds (time-based SLIs) and event counts (event-based
297
+ * SLIs) - pass bad/total counts in badSeconds/totalSeconds.
298
+ *
299
+ * totalSeconds === 0 (no data in the lookback) => 0: no evidence of burn -
300
+ * callers skip burn rules on no-data windows.
301
+ */
302
+ static computeBurnRate(data) {
303
+ const { badSeconds, totalSeconds, targetPercentage } = data;
304
+ this.validateTargetPercentage(targetPercentage);
305
+ if (totalSeconds === 0) {
306
+ return 0;
307
+ }
308
+ const allowedBadFraction = 1 - targetPercentage / 100;
309
+ return badSeconds / totalSeconds / allowedBadFraction;
310
+ }
311
+ /**
312
+ * Status from remaining budget, with hysteresis so rolling windows that
313
+ * re-cross a boundary as bad seconds age out do not flap:
314
+ *
315
+ * - enter BudgetExhausted when remaining <= 0; exit only when remaining >= 2
316
+ * - enter AtRisk when remaining <= atRiskThreshold; exit back to Healthy only
317
+ * when remaining >= atRiskThreshold + 5
318
+ *
319
+ * All comparisons use UNROUNDED percentages. This function never emits
320
+ * Misconfigured or Paused - those are set by the caller (zero monitors /
321
+ * all monitors paused) before any math runs.
322
+ */
323
+ static computeSloStatus(data) {
324
+ const { budgetRemainingPercentage, currentStatus } = data;
325
+ const threshold = data.atRiskThresholdPercentage;
326
+ // enter exhausted.
327
+ if (budgetRemainingPercentage <= 0) {
328
+ return SloStatus.BudgetExhausted;
329
+ }
330
+ // hysteresis: stay exhausted until the budget has meaningfully recovered.
331
+ if (currentStatus === SloStatus.BudgetExhausted &&
332
+ budgetRemainingPercentage < 2) {
333
+ return SloStatus.BudgetExhausted;
334
+ }
335
+ // enter at risk.
336
+ if (budgetRemainingPercentage <= threshold) {
337
+ return SloStatus.AtRisk;
338
+ }
339
+ // hysteresis: stay at risk until comfortably above the threshold.
340
+ if (currentStatus === SloStatus.AtRisk &&
341
+ budgetRemainingPercentage < threshold + 5) {
342
+ return SloStatus.AtRisk;
343
+ }
344
+ return SloStatus.Healthy;
345
+ }
346
+ /**
347
+ * The full calendar month containing `at`, resolved in the given IANA timezone
348
+ * (default UTC - calendar boundaries are undefined without a zone). Timezone
349
+ * support comes from moment-timezone, which OneUptimeDate already wraps.
350
+ *
351
+ * `endDate` is EXCLUSIVE (the first instant of the next month).
352
+ * `totalSecondsInFullPeriod` is the real elapsed seconds of the whole month and
353
+ * is the budget denominator for calendar windows - fixed at period start, NOT
354
+ * elapsed time. Note the rollover consequence: on the 1st the budget silently
355
+ * resets to full.
356
+ */
357
+ static getCalendarMonthWindow(data) {
358
+ const timezone = data.timezone || "UTC";
359
+ if (!Moment.tz.zone(timezone)) {
360
+ throw new BadDataException(`Unknown timezone: ${timezone}`);
361
+ }
362
+ const startOfMonth = Moment.tz(data.at, timezone).startOf("month");
363
+ const startDate = startOfMonth.toDate();
364
+ const endDate = startOfMonth.clone().add(1, "month").toDate();
365
+ return {
366
+ startDate,
367
+ endDate,
368
+ totalSecondsInFullPeriod: OneUptimeDate.getSecondsBetweenDates(startDate, endDate),
369
+ };
370
+ }
371
+ /**
372
+ * Display-only rounding (delegates to UptimeUtil.roundToPrecision, which
373
+ * FLOORS). All status/threshold comparisons in this util use unrounded values;
374
+ * use this at render time only - never before classification.
375
+ */
376
+ static roundForDisplay(value, precision) {
377
+ return UptimeUtil.roundToPrecision({
378
+ number: value,
379
+ precision,
380
+ });
381
+ }
382
+ static validateTargetPercentage(targetPercentage) {
383
+ /*
384
+ * target >= 100 makes allowedBadFraction 0 (or negative): every budget
385
+ * formula divides by zero and NaN propagates everywhere. target <= 0 is
386
+ * meaningless.
387
+ */
388
+ if (targetPercentage >= 100 || targetPercentage <= 0) {
389
+ throw new BadDataException("SLO target percentage must be greater than 0 and less than 100.");
390
+ }
391
+ }
392
+ }
393
+ //# sourceMappingURL=SloUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SloUtil.js","sourceRoot":"","sources":["../../../../Utils/Slo/SloUtil.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ import AggregationInterval from "../../Types/BaseDatabase/AggregationInterval";
2
+ import { SloWidgetMetric } from "../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
3
+ /**
4
+ * Pure value/label derivation for the dashboard SLO widget.
5
+ *
6
+ * Everything the widget needs to turn a ServiceLevelObjective row into
7
+ * display strings lives here rather than in the React renderer, so the
8
+ * formatting rules (and every null / negative / rounding edge) are
9
+ * unit-testable without a DOM.
10
+ *
11
+ * The worker-maintained state columns on ServiceLevelObjective are NULL
12
+ * until the SLO is first evaluated, so every entry point must be able to
13
+ * answer "not evaluated yet" instead of rendering "null%" or "NaN%".
14
+ */
15
+ /** Shown in place of a number whenever the SLO has no evaluated state. */
16
+ export const SLO_NOT_EVALUATED_TEXT = "Not evaluated yet";
17
+ /** U+2212 MINUS SIGN — reads as a minus rather than a hyphen at tile sizes. */
18
+ const MINUS_SIGN = "−";
19
+ /** U+00D7 MULTIPLICATION SIGN — burn rate is a multiplier ("3.2×"). */
20
+ const MULTIPLICATION_SIGN = "×";
21
+ const toFiniteNumber = (value) => {
22
+ if (typeof value !== "number" || !isFinite(value)) {
23
+ return null;
24
+ }
25
+ return value;
26
+ };
27
+ const roundToDecimals = (value, maxDecimals) => {
28
+ const factor = Math.pow(10, maxDecimals);
29
+ /*
30
+ * `+ 0` normalises -0 (which Math.round can produce from a tiny
31
+ * negative) so it never renders as "-0".
32
+ */
33
+ return Math.round(value * factor) / factor + 0;
34
+ };
35
+ /**
36
+ * SLI is quoted to three decimals to match the SLO pages — the digits
37
+ * past the second matter at 99.99x targets. Error budget remaining is a
38
+ * coarse gauge, so one decimal is enough; the precise number lives in the
39
+ * seconds subline.
40
+ */
41
+ const SLI_DECIMALS = 3;
42
+ const BUDGET_PERCENT_DECIMALS = 1;
43
+ const BURN_RATE_DECIMALS = 2;
44
+ export const formatSloPercent = (value, maxDecimals) => {
45
+ const numericValue = toFiniteNumber(value);
46
+ if (numericValue === null) {
47
+ return null;
48
+ }
49
+ return `${roundToDecimals(numericValue, maxDecimals !== null && maxDecimals !== void 0 ? maxDecimals : SLI_DECIMALS)}%`;
50
+ };
51
+ export const formatSloBurnRate = (value) => {
52
+ const numericValue = toFiniteNumber(value);
53
+ if (numericValue === null) {
54
+ return null;
55
+ }
56
+ return `${roundToDecimals(numericValue, BURN_RATE_DECIMALS)}${MULTIPLICATION_SIGN}`;
57
+ };
58
+ export const formatErrorBudgetRemainingSeconds = (seconds) => {
59
+ const numericSeconds = toFiniteNumber(seconds);
60
+ if (numericSeconds === null) {
61
+ return null;
62
+ }
63
+ const isOverBudget = numericSeconds < 0;
64
+ const suffix = isOverBudget ? "over budget" : "remaining";
65
+ const minutes = Math.round(Math.abs(numericSeconds) / 60);
66
+ if (minutes === 0) {
67
+ /*
68
+ * Exactly zero is a real state worth stating; a sub-30-second
69
+ * remainder would otherwise round to a misleading "0 min".
70
+ */
71
+ if (numericSeconds === 0) {
72
+ return `0 min ${suffix}`;
73
+ }
74
+ return `under 1 min ${suffix}`;
75
+ }
76
+ return `${isOverBudget ? MINUS_SIGN : ""}${minutes} min ${suffix}`;
77
+ };
78
+ export const getSloMetricLabel = (sloMetric) => {
79
+ if (sloMetric === SloWidgetMetric.ErrorBudgetRemaining) {
80
+ return "Error Budget Remaining";
81
+ }
82
+ if (sloMetric === SloWidgetMetric.BurnRate) {
83
+ return "Burn Rate";
84
+ }
85
+ // Sli is the default metric, so it is also the fallback label.
86
+ return "SLI";
87
+ };
88
+ export const getSloHistoryMetricName = (sloMetric) => {
89
+ if (sloMetric === SloWidgetMetric.ErrorBudgetRemaining) {
90
+ return "error.budget.remaining.percent";
91
+ }
92
+ if (sloMetric === SloWidgetMetric.BurnRate) {
93
+ return "burn.rate";
94
+ }
95
+ return "sli.percent";
96
+ };
97
+ export const getSloWidgetTitle = (data) => {
98
+ const trimmedTitle = (data.widgetTitle || "").trim();
99
+ if (trimmedTitle) {
100
+ return trimmedTitle;
101
+ }
102
+ const metricLabel = getSloMetricLabel(data.sloMetric);
103
+ const trimmedName = (data.sloName || "").trim();
104
+ if (!trimmedName) {
105
+ return metricLabel;
106
+ }
107
+ return `${trimmedName} · ${metricLabel}`;
108
+ };
109
+ export const getSloWidgetTileDisplay = (data) => {
110
+ const notEvaluated = {
111
+ isEvaluated: false,
112
+ value: SLO_NOT_EVALUATED_TEXT,
113
+ subline: null,
114
+ };
115
+ const slo = data.slo;
116
+ if (!slo) {
117
+ return notEvaluated;
118
+ }
119
+ if (data.sloMetric === SloWidgetMetric.ErrorBudgetRemaining) {
120
+ const value = formatSloPercent(slo.errorBudgetRemainingPercentage, BUDGET_PERCENT_DECIMALS);
121
+ if (value === null) {
122
+ return notEvaluated;
123
+ }
124
+ return {
125
+ isEvaluated: true,
126
+ value: value,
127
+ subline: formatErrorBudgetRemainingSeconds(slo.errorBudgetRemainingSeconds),
128
+ };
129
+ }
130
+ if (data.sloMetric === SloWidgetMetric.BurnRate) {
131
+ const value = formatSloBurnRate(slo.currentBurnRate);
132
+ if (value === null) {
133
+ return notEvaluated;
134
+ }
135
+ return {
136
+ isEvaluated: true,
137
+ value: value,
138
+ subline: null,
139
+ };
140
+ }
141
+ // Sli (also the default when the argument was never set).
142
+ const value = formatSloPercent(slo.currentSliPercentage, SLI_DECIMALS);
143
+ if (value === null) {
144
+ return notEvaluated;
145
+ }
146
+ const target = formatSloPercent(slo.targetPercentage, SLI_DECIMALS);
147
+ return {
148
+ isEvaluated: true,
149
+ value: value,
150
+ subline: target === null ? null : `target ${target}`,
151
+ };
152
+ };
153
+ export const getSloChartAggregationInterval = (rangeInMinutes) => {
154
+ if (!isFinite(rangeInMinutes) || rangeInMinutes <= 12 * 60) {
155
+ return AggregationInterval.FiveMinutes;
156
+ }
157
+ if (rangeInMinutes <= 3 * 24 * 60) {
158
+ return AggregationInterval.ThirtyMinutes;
159
+ }
160
+ if (rangeInMinutes <= 45 * 24 * 60) {
161
+ return AggregationInterval.Hour;
162
+ }
163
+ return AggregationInterval.Day;
164
+ };
165
+ export const formatSloChartValue = (sloMetric, value) => {
166
+ if (sloMetric === SloWidgetMetric.BurnRate) {
167
+ return formatSloBurnRate(value) || "";
168
+ }
169
+ if (sloMetric === SloWidgetMetric.ErrorBudgetRemaining) {
170
+ return formatSloPercent(value, BUDGET_PERCENT_DECIMALS) || "";
171
+ }
172
+ return formatSloPercent(value, SLI_DECIMALS) || "";
173
+ };
174
+ //# sourceMappingURL=SloWidgetFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SloWidgetFormat.js","sourceRoot":"","sources":["../../../../Utils/Slo/SloWidgetFormat.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneuptime/common",
3
- "version": "11.6.1",
3
+ "version": "11.6.2",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "main": "index.js",
10
10
  "scripts": {
11
- "test": "cd .. && export $(grep -v '^#' config.env | xargs) && cd Common && node node_modules/.bin/jest --runInBand ./Tests --detectOpenHandles",
11
+ "test": "cd .. && export $(grep -v '^#' config.env | xargs) && cd Common && node --max-old-space-size=6144 node_modules/.bin/jest --runInBand ./Tests --detectOpenHandles",
12
12
  "test-file": "cd .. && export $(grep -v '^#' config.env | xargs) && cd Common && node node_modules/.bin/jest --runInBand $1 --detectOpenHandles",
13
13
  "coverage": "jest --detectOpenHandles --coverage",
14
14
  "compile": "tsc",
@@ -1,7 +0,0 @@
1
- enum DashboardComponentType {
2
- Chart = "Chart",
3
- Value = "Value",
4
- Text = "Text",
5
- }
6
-
7
- export default DashboardComponentType;
@@ -1,8 +0,0 @@
1
- var DashboardComponentType;
2
- (function (DashboardComponentType) {
3
- DashboardComponentType["Chart"] = "Chart";
4
- DashboardComponentType["Value"] = "Value";
5
- DashboardComponentType["Text"] = "Text";
6
- })(DashboardComponentType || (DashboardComponentType = {}));
7
- export default DashboardComponentType;
8
- //# sourceMappingURL=Index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Index.js","sourceRoot":"","sources":["../../../../../Types/Dashboard/DashboardComponents/Index.ts"],"names":[],"mappings":"AAAA,IAAK,sBAIJ;AAJD,WAAK,sBAAsB;IACzB,yCAAe,CAAA;IACf,yCAAe,CAAA;IACf,uCAAa,CAAA;AACf,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B;AAED,eAAe,sBAAsB,CAAC"}