@oneuptime/common 10.4.17 → 10.5.1

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 (318) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +24 -0
  2. package/Models/AnalyticsModels/Log.ts +16 -0
  3. package/Models/AnalyticsModels/Metric.ts +31 -0
  4. package/Models/AnalyticsModels/MonitorLog.ts +5 -0
  5. package/Models/AnalyticsModels/Profile.ts +25 -0
  6. package/Models/AnalyticsModels/ProfileSample.ts +20 -0
  7. package/Models/AnalyticsModels/Span.ts +23 -0
  8. package/Models/DatabaseModels/AlertEpisodeMember.ts +2 -0
  9. package/Models/DatabaseModels/AlertGroupingRule.ts +0 -38
  10. package/Models/DatabaseModels/AlertLabelRule.ts +152 -0
  11. package/Models/DatabaseModels/AlertOwnerRule.ts +114 -0
  12. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +7 -0
  13. package/Models/DatabaseModels/IncidentEpisodeMember.ts +2 -0
  14. package/Models/DatabaseModels/IncidentGroupingRule.ts +0 -38
  15. package/Models/DatabaseModels/IncidentLabelRule.ts +114 -0
  16. package/Models/DatabaseModels/IncidentMember.ts +2 -0
  17. package/Models/DatabaseModels/IncidentOwnerRule.ts +114 -0
  18. package/Models/DatabaseModels/IncidentSla.ts +2 -0
  19. package/Models/DatabaseModels/IncidentTemplate.ts +224 -0
  20. package/Models/DatabaseModels/Index.ts +2 -2
  21. package/Models/DatabaseModels/MetricPipelineRule.ts +2 -0
  22. package/Models/DatabaseModels/MonitorProbe.ts +2 -0
  23. package/Models/DatabaseModels/MonitorTest.ts +2 -0
  24. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.ts +2 -0
  25. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.ts +2 -0
  26. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.ts +2 -0
  27. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.ts +2 -0
  28. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +2 -0
  29. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +2 -0
  30. package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +2 -0
  31. package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +2 -0
  32. package/Models/DatabaseModels/ProjectOidc.ts +4 -0
  33. package/Models/DatabaseModels/ProjectSCIM.ts +4 -0
  34. package/Models/DatabaseModels/ProjectSso.ts +4 -0
  35. package/Models/DatabaseModels/ScheduledMaintenance.ts +220 -0
  36. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +152 -0
  37. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +152 -0
  38. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +224 -0
  39. package/Models/DatabaseModels/StatusPageOidc.ts +6 -0
  40. package/Models/DatabaseModels/StatusPageSCIM.ts +4 -0
  41. package/Models/DatabaseModels/StatusPageSCIMLog.ts +2 -0
  42. package/Models/DatabaseModels/StatusPageSso.ts +6 -0
  43. package/Models/DatabaseModels/Team.ts +41 -0
  44. package/Models/DatabaseModels/TeamComplianceSetting.ts +4 -0
  45. package/Models/DatabaseModels/{ServiceMonitor.ts → TeamCustomField.ts} +95 -200
  46. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  47. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  48. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  49. package/Models/DatabaseModels/WorkflowLog.ts +2 -0
  50. package/Models/DatabaseModels/WorkflowVariable.ts +2 -0
  51. package/Server/EnvironmentConfig.ts +3 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.ts +1 -1
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.ts +160 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.ts +197 -0
  55. package/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.ts +36 -0
  56. package/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.ts +128 -0
  57. package/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.ts +53 -0
  58. package/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.ts +73 -0
  59. package/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.ts +62 -0
  60. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  61. package/Server/Middleware/TelemetryIngestionDisabled.ts +32 -0
  62. package/Server/Services/AlertGroupingEngineService.ts +0 -29
  63. package/Server/Services/AlertLabelRuleEngineService.ts +129 -0
  64. package/Server/Services/AlertOwnerRuleEngineService.ts +205 -1
  65. package/Server/Services/IncidentGroupingEngineService.ts +0 -37
  66. package/Server/Services/IncidentLabelRuleEngineService.ts +83 -0
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +208 -10
  68. package/Server/Services/IncidentService.ts +139 -1
  69. package/Server/Services/Index.ts +0 -2
  70. package/Server/Services/MonitorProbeService.ts +56 -0
  71. package/Server/Services/MonitorService.ts +55 -0
  72. package/Server/Services/ProjectService.ts +17 -8
  73. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +129 -0
  74. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +289 -7
  75. package/Server/Services/StatusPageService.ts +30 -0
  76. package/Server/Services/TeamCustomFieldService.ts +9 -0
  77. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +226 -28
  78. package/Server/Types/Database/Permissions/EditionPermission.ts +46 -0
  79. package/Server/Types/Database/Permissions/TablePermission.ts +8 -1
  80. package/Server/Utils/Monitor/MonitorAlert.ts +35 -0
  81. package/Server/Utils/Monitor/MonitorIncident.ts +244 -34
  82. package/Tests/Server/Middleware/UserAuthorization.test.ts +11 -19
  83. package/Tests/Types/Permission.test.ts +129 -1
  84. package/Types/Accounts/AccountsLanguage.ts +10 -1
  85. package/Types/AdminDashboard/AdminDashboardLanguage.ts +10 -1
  86. package/Types/BaseDatabase/TableEditionAccessControl.ts +3 -0
  87. package/Types/Dashboard/DashboardLanguage.ts +10 -1
  88. package/Types/Database/AccessControl/TableEditionAccessControl.ts +8 -0
  89. package/Types/Date.ts +1 -1
  90. package/Types/Docs/DocsLanguage.ts +10 -1
  91. package/Types/Permission.ts +87 -54
  92. package/Types/StatusPage/StatusPageLanguage.ts +10 -1
  93. package/UI/Components/Charts/Area/AreaChart.tsx +1 -1
  94. package/UI/Components/Charts/Bar/BarChart.tsx +1 -1
  95. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +5 -1
  96. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +1 -1
  97. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +11 -1
  98. package/UI/Components/Charts/Line/LineChart.tsx +1 -1
  99. package/UI/Components/Charts/Utils/XAxis.ts +21 -48
  100. package/UI/Components/EntityDropdown/EntityDropdown.tsx +1808 -0
  101. package/UI/Components/Forms/Fields/FormField.tsx +69 -29
  102. package/UI/Components/Link/Link.tsx +13 -1
  103. package/UI/Components/ModelDetail/ModelDetail.tsx +20 -19
  104. package/UI/Components/ModelTable/BaseModelTable.tsx +5 -0
  105. package/UI/Utils/User.ts +16 -0
  106. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +39 -2
  107. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  108. package/build/dist/Models/AnalyticsModels/Log.js +16 -0
  109. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  110. package/build/dist/Models/AnalyticsModels/Metric.js +31 -0
  111. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  112. package/build/dist/Models/AnalyticsModels/MonitorLog.js +5 -0
  113. package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
  114. package/build/dist/Models/AnalyticsModels/Profile.js +40 -2
  115. package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
  116. package/build/dist/Models/AnalyticsModels/ProfileSample.js +35 -2
  117. package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
  118. package/build/dist/Models/AnalyticsModels/Span.js +23 -0
  119. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  120. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +2 -0
  121. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  122. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +0 -39
  123. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  124. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +156 -0
  125. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  126. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +117 -0
  127. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  128. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  129. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +2 -0
  130. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  131. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +0 -39
  132. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  133. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +117 -0
  134. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  135. package/build/dist/Models/DatabaseModels/IncidentMember.js +2 -0
  136. package/build/dist/Models/DatabaseModels/IncidentMember.js.map +1 -1
  137. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +117 -0
  138. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  139. package/build/dist/Models/DatabaseModels/IncidentSla.js +2 -0
  140. package/build/dist/Models/DatabaseModels/IncidentSla.js.map +1 -1
  141. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +216 -0
  142. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  143. package/build/dist/Models/DatabaseModels/Index.js +2 -2
  144. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  145. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +2 -0
  146. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -1
  147. package/build/dist/Models/DatabaseModels/MonitorProbe.js +2 -0
  148. package/build/dist/Models/DatabaseModels/MonitorProbe.js.map +1 -1
  149. package/build/dist/Models/DatabaseModels/MonitorTest.js +2 -0
  150. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js +2 -0
  152. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js.map +1 -1
  153. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js +2 -0
  154. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js.map +1 -1
  155. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js +2 -0
  156. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js.map +1 -1
  157. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js +2 -0
  158. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js.map +1 -1
  159. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +2 -0
  160. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  161. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -0
  162. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
  163. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +2 -0
  164. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
  165. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +2 -0
  166. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
  167. package/build/dist/Models/DatabaseModels/ProjectOidc.js +4 -0
  168. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  169. package/build/dist/Models/DatabaseModels/ProjectSCIM.js +4 -0
  170. package/build/dist/Models/DatabaseModels/ProjectSCIM.js.map +1 -1
  171. package/build/dist/Models/DatabaseModels/ProjectSso.js +4 -0
  172. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  173. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +216 -0
  174. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +156 -0
  176. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +156 -0
  178. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  179. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +216 -0
  180. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +6 -0
  182. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/StatusPageSCIM.js +4 -0
  184. package/build/dist/Models/DatabaseModels/StatusPageSCIM.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js +2 -0
  186. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js.map +1 -1
  187. package/build/dist/Models/DatabaseModels/StatusPageSso.js +6 -0
  188. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  189. package/build/dist/Models/DatabaseModels/Team.js +42 -0
  190. package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
  191. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +4 -0
  192. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  193. package/build/dist/Models/DatabaseModels/{ServiceMonitor.js → TeamCustomField.js} +108 -209
  194. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -0
  195. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  196. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  197. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  198. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  199. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  200. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/WorkflowLog.js +2 -0
  202. package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +2 -0
  204. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  205. package/build/dist/Server/EnvironmentConfig.js +1 -0
  206. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  207. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.js.map +1 -1
  208. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js +60 -0
  209. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js.map +1 -0
  210. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js +74 -0
  211. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js.map +1 -0
  212. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js +19 -0
  213. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js.map +1 -0
  214. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js +50 -0
  215. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js.map +1 -0
  216. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js +26 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js.map +1 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js +30 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js +50 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  224. package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js +22 -0
  225. package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js.map +1 -0
  226. package/build/dist/Server/Services/AlertGroupingEngineService.js +0 -25
  227. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  228. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +117 -3
  229. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  230. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +175 -5
  231. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  232. package/build/dist/Server/Services/IncidentGroupingEngineService.js +0 -31
  233. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  234. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +76 -3
  235. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  236. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +176 -14
  237. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  238. package/build/dist/Server/Services/IncidentService.js +104 -1
  239. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  240. package/build/dist/Server/Services/Index.js +0 -2
  241. package/build/dist/Server/Services/Index.js.map +1 -1
  242. package/build/dist/Server/Services/MonitorProbeService.js +46 -0
  243. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  244. package/build/dist/Server/Services/MonitorService.js +40 -0
  245. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  246. package/build/dist/Server/Services/ProjectService.js +17 -8
  247. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  248. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +117 -3
  249. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  250. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +245 -10
  251. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  252. package/build/dist/Server/Services/StatusPageService.js +24 -0
  253. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  254. package/build/dist/Server/Services/TeamCustomFieldService.js +9 -0
  255. package/build/dist/Server/Services/TeamCustomFieldService.js.map +1 -0
  256. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +166 -26
  257. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  258. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +45 -0
  259. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -0
  260. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +7 -1
  261. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  262. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -0
  263. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  264. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +200 -31
  265. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  266. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +8 -15
  267. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
  268. package/build/dist/Tests/Types/Permission.test.js +90 -1
  269. package/build/dist/Tests/Types/Permission.test.js.map +1 -1
  270. package/build/dist/Types/Accounts/AccountsLanguage.js +10 -1
  271. package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
  272. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +10 -1
  273. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
  274. package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js +2 -0
  275. package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js.map +1 -0
  276. package/build/dist/Types/Dashboard/DashboardLanguage.js +10 -1
  277. package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
  278. package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js +6 -0
  279. package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js.map +1 -0
  280. package/build/dist/Types/Date.js +1 -1
  281. package/build/dist/Types/Date.js.map +1 -1
  282. package/build/dist/Types/Docs/DocsLanguage.js +10 -1
  283. package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
  284. package/build/dist/Types/Permission.js +80 -44
  285. package/build/dist/Types/Permission.js.map +1 -1
  286. package/build/dist/Types/StatusPage/StatusPageLanguage.js +10 -1
  287. package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
  288. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  289. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  290. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  291. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  292. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +5 -1
  293. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  294. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +1 -1
  295. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  296. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +11 -1
  297. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  298. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  299. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  300. package/build/dist/UI/Components/Charts/Utils/XAxis.js +21 -47
  301. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  302. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +1125 -0
  303. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -0
  304. package/build/dist/UI/Components/Forms/Fields/FormField.js +28 -10
  305. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  306. package/build/dist/UI/Components/Link/Link.js +11 -2
  307. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  308. package/build/dist/UI/Components/ModelDetail/ModelDetail.js +20 -18
  309. package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
  310. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -0
  311. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  312. package/build/dist/UI/Utils/User.js +13 -0
  313. package/build/dist/UI/Utils/User.js.map +1 -1
  314. package/package.json +1 -1
  315. package/Server/Services/ServiceMonitorService.ts +0 -57
  316. package/build/dist/Models/DatabaseModels/ServiceMonitor.js.map +0 -1
  317. package/build/dist/Server/Services/ServiceMonitorService.js +0 -56
  318. package/build/dist/Server/Services/ServiceMonitorService.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * Data-only migration: the language code "zh" was renamed to "zh-CN" when
5
+ * Traditional Chinese ("zh-TW") was added as a separate supported language.
6
+ * Rewrite any persisted "zh" values on the StatusPage table so existing
7
+ * tenants keep their Simplified Chinese setting.
8
+ *
9
+ * Written manually because typeorm's migration:generate only emits schema
10
+ * diffs — it cannot detect that stored data needs rewriting.
11
+ */
12
+ export class RenameStatusPageZhToZhCN1779827700000
13
+ implements MigrationInterface
14
+ {
15
+ public name: string = "RenameStatusPageZhToZhCN1779827700000";
16
+
17
+ public async up(queryRunner: QueryRunner): Promise<void> {
18
+ // defaultLanguage is a varchar — straight UPDATE.
19
+ await queryRunner.query(
20
+ `UPDATE "StatusPage" SET "defaultLanguage" = 'zh-CN' WHERE "defaultLanguage" = 'zh'`,
21
+ );
22
+
23
+ /*
24
+ * enabledLanguages is a jsonb array of strings. Replace every "zh"
25
+ * element with "zh-CN" while leaving the rest of the array intact.
26
+ * The WHERE clause uses jsonb containment so we only touch rows that
27
+ * actually need rewriting.
28
+ */
29
+ await queryRunner.query(
30
+ `UPDATE "StatusPage"
31
+ SET "enabledLanguages" = (
32
+ SELECT jsonb_agg(
33
+ CASE WHEN elem = '"zh"'::jsonb THEN '"zh-CN"'::jsonb ELSE elem END
34
+ )
35
+ FROM jsonb_array_elements("enabledLanguages") AS elem
36
+ )
37
+ WHERE "enabledLanguages" @> '["zh"]'::jsonb`,
38
+ );
39
+ }
40
+
41
+ public async down(queryRunner: QueryRunner): Promise<void> {
42
+ /*
43
+ * Best-effort reversal. "zh-CN" did not exist before this migration, so
44
+ * any row containing it was originally "zh"; rows added after the
45
+ * migration that legitimately use "zh-CN" will be reverted too, which is
46
+ * the inherent limitation of rolling back data migrations.
47
+ */
48
+ await queryRunner.query(
49
+ `UPDATE "StatusPage" SET "defaultLanguage" = 'zh' WHERE "defaultLanguage" = 'zh-CN'`,
50
+ );
51
+ await queryRunner.query(
52
+ `UPDATE "StatusPage"
53
+ SET "enabledLanguages" = (
54
+ SELECT jsonb_agg(
55
+ CASE WHEN elem = '"zh-CN"'::jsonb THEN '"zh"'::jsonb ELSE elem END
56
+ )
57
+ FROM jsonb_array_elements("enabledLanguages") AS elem
58
+ )
59
+ WHERE "enabledLanguages" @> '["zh-CN"]'::jsonb`,
60
+ );
61
+ }
62
+ }
@@ -347,6 +347,13 @@ import { AddPerformanceIndexes1779392970424 } from "./1779392970424-AddPerforman
347
347
  import { AddFacetsToTableView1779536271671 } from "./1779536271671-AddFacetsToTableView";
348
348
  import { AddIsMemberNotifiedIndex1779540427366 } from "./1779540427366-AddIsMemberNotifiedIndex";
349
349
  import { AddDropdownOptionsToCustomFields1779619108628 } from "./1779619108628-AddDropdownOptionsToCustomFields";
350
+ import { AddLabelInheritanceAndScheduledMaintenanceResources1779653508434 } from "./1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources";
351
+ import { AddAffectedResourcesToTemplates1779708719656 } from "./1779708719656-AddAffectedResourcesToTemplates";
352
+ import { MigrationName1779739410559 } from "./1779739410559-MigrationName";
353
+ import { AttachServiceToScheduledMaintenanceTemplatesAndLabelRules1779742211961 } from "./1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules";
354
+ import { MigrationName1779790539196 } from "./1779790539196-MigrationName";
355
+ import { ExpandOwnerRuleInheritFlags1779823516881 } from "./1779823516881-ExpandOwnerRuleInheritFlags";
356
+ import { RenameStatusPageZhToZhCN1779827700000 } from "./1779827700000-RenameStatusPageZhToZhCN";
350
357
  export default [
351
358
  InitialMigration,
352
359
  MigrationName1717678334852,
@@ -697,4 +704,11 @@ export default [
697
704
  AddFacetsToTableView1779536271671,
698
705
  AddIsMemberNotifiedIndex1779540427366,
699
706
  AddDropdownOptionsToCustomFields1779619108628,
707
+ AddLabelInheritanceAndScheduledMaintenanceResources1779653508434,
708
+ AddAffectedResourcesToTemplates1779708719656,
709
+ MigrationName1779739410559,
710
+ AttachServiceToScheduledMaintenanceTemplatesAndLabelRules1779742211961,
711
+ MigrationName1779790539196,
712
+ ExpandOwnerRuleInheritFlags1779823516881,
713
+ RenameStatusPageZhToZhCN1779827700000,
700
714
  ];
@@ -0,0 +1,32 @@
1
+ import { DisableTelemetryIngestion } from "../EnvironmentConfig";
2
+ import {
3
+ ExpressRequest,
4
+ ExpressResponse,
5
+ NextFunction,
6
+ } from "../Utils/Express";
7
+ import Response from "../Utils/Response";
8
+
9
+ /*
10
+ * Short-circuit middleware for telemetry ingestion routes.
11
+ *
12
+ * When DISABLE_TELEMETRY_INGESTION=true, return a 200 success immediately
13
+ * so OTel / Fluent / Syslog / Pyroscope clients accept the response and do
14
+ * not retry. No body parsing, queueing, or persistence happens — the data
15
+ * is dropped on the floor.
16
+ */
17
+ export default class TelemetryIngestionDisabled {
18
+ public static middleware(
19
+ req: ExpressRequest,
20
+ res: ExpressResponse,
21
+ next: NextFunction,
22
+ ): void {
23
+ if (DisableTelemetryIngestion) {
24
+ return Response.sendEmptySuccessResponse(req, res);
25
+ }
26
+ return next();
27
+ }
28
+
29
+ public static isDisabled(): boolean {
30
+ return DisableTelemetryIngestion;
31
+ }
32
+ }
@@ -10,7 +10,6 @@ import AlertEpisodeOwnerTeam from "../../Models/DatabaseModels/AlertEpisodeOwner
10
10
  import Label from "../../Models/DatabaseModels/Label";
11
11
  import Monitor from "../../Models/DatabaseModels/Monitor";
12
12
  import AlertSeverity from "../../Models/DatabaseModels/AlertSeverity";
13
- import ServiceMonitor from "../../Models/DatabaseModels/ServiceMonitor";
14
13
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
15
14
  import logger, { LogAttributes } from "../Utils/Logger";
16
15
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
@@ -22,7 +21,6 @@ import AlertEpisodeMemberService from "./AlertEpisodeMemberService";
22
21
  import AlertEpisodeOwnerUserService from "./AlertEpisodeOwnerUserService";
23
22
  import AlertEpisodeOwnerTeamService from "./AlertEpisodeOwnerTeamService";
24
23
  import MonitorService from "./MonitorService";
25
- import ServiceMonitorService from "./ServiceMonitorService";
26
24
  import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
27
25
  import AlertEpisodeFeedService from "./AlertEpisodeFeedService";
28
26
  import { AlertEpisodeFeedEventType } from "../../Models/DatabaseModels/AlertEpisodeFeed";
@@ -93,7 +91,6 @@ class AlertGroupingEngineServiceClass {
93
91
  groupByMonitor: true,
94
92
  groupBySeverity: true,
95
93
  groupByAlertTitle: true,
96
- groupByService: true,
97
94
  // Time settings
98
95
  enableTimeWindow: true,
99
96
  timeWindowMinutes: true,
@@ -539,29 +536,6 @@ class AlertGroupingEngineServiceClass {
539
536
  ): Promise<string> {
540
537
  const parts: Array<string> = [];
541
538
 
542
- /*
543
- * Group by service - only if explicitly enabled
544
- * Must be checked before monitor since service contains multiple monitors
545
- */
546
- if (rule.groupByService && alert.monitorId) {
547
- const serviceMonitor: ServiceMonitor | null =
548
- await ServiceMonitorService.findOneBy({
549
- query: {
550
- monitorId: alert.monitorId,
551
- },
552
- select: {
553
- serviceId: true,
554
- },
555
- props: {
556
- isRoot: true,
557
- },
558
- });
559
-
560
- if (serviceMonitor?.serviceId) {
561
- parts.push(`service:${serviceMonitor.serviceId.toString()}`);
562
- }
563
- }
564
-
565
539
  // Group by monitor - only if explicitly enabled
566
540
  if (rule.groupByMonitor && alert.monitorId) {
567
541
  parts.push(`monitor:${alert.monitorId.toString()}`);
@@ -819,9 +793,6 @@ class AlertGroupingEngineServiceClass {
819
793
  if (rule.groupByAlertTitle) {
820
794
  groupByParts.push("Alert Title");
821
795
  }
822
- if (rule.groupByService) {
823
- groupByParts.push("Service");
824
- }
825
796
 
826
797
  const groupByDescription: string =
827
798
  groupByParts.length > 0
@@ -1,13 +1,21 @@
1
1
  import Alert from "../../Models/DatabaseModels/Alert";
2
2
  import AlertLabelRule from "../../Models/DatabaseModels/AlertLabelRule";
3
3
  import AlertSeverity from "../../Models/DatabaseModels/AlertSeverity";
4
+ import DockerHost from "../../Models/DatabaseModels/DockerHost";
5
+ import Host from "../../Models/DatabaseModels/Host";
6
+ import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
4
7
  import Label from "../../Models/DatabaseModels/Label";
5
8
  import Monitor from "../../Models/DatabaseModels/Monitor";
9
+ import Service from "../../Models/DatabaseModels/Service";
6
10
  import AlertFeedService from "./AlertFeedService";
7
11
  import AlertLabelRuleService from "./AlertLabelRuleService";
8
12
  import AlertService from "./AlertService";
13
+ import DockerHostService from "./DockerHostService";
14
+ import HostService from "./HostService";
15
+ import KubernetesClusterService from "./KubernetesClusterService";
9
16
  import LabelService from "./LabelService";
10
17
  import MonitorService from "./MonitorService";
18
+ import ServiceService from "./ServiceService";
11
19
  import { AlertFeedEventType } from "../../Models/DatabaseModels/AlertFeed";
12
20
  import { Indigo500 } from "../../Types/BrandColors";
13
21
  import ObjectID from "../../Types/ObjectID";
@@ -22,6 +30,10 @@ class AlertLabelRuleEngineServiceClass {
22
30
  * labels to the alert. Each matched rule contributes:
23
31
  * - labels listed on `labelsToAdd`
24
32
  * - all labels of the alert's monitor when `inheritLabelsFromMonitors`
33
+ * - all labels of the alert's hosts when `inheritLabelsFromHosts`
34
+ * - all labels of the alert's Kubernetes clusters when `inheritLabelsFromKubernetesClusters`
35
+ * - all labels of the alert's Docker hosts when `inheritLabelsFromDockerHosts`
36
+ * - all labels of the alert's services when `inheritLabelsFromServices`
25
37
  * The union is deduped against labels already on the alert before insert
26
38
  * to avoid PK conflicts on the AlertLabel join table.
27
39
  */
@@ -51,6 +63,10 @@ class AlertLabelRuleEngineServiceClass {
51
63
  monitorDescriptionPattern: true,
52
64
  labelsToAdd: { _id: true },
53
65
  inheritLabelsFromMonitors: true,
66
+ inheritLabelsFromHosts: true,
67
+ inheritLabelsFromKubernetesClusters: true,
68
+ inheritLabelsFromDockerHosts: true,
69
+ inheritLabelsFromServices: true,
54
70
  },
55
71
  limit: 100,
56
72
  skip: 0,
@@ -62,6 +78,10 @@ class AlertLabelRuleEngineServiceClass {
62
78
 
63
79
  const labelIdsToAdd: Set<string> = new Set();
64
80
  let inheritFromMonitors: boolean = false;
81
+ let inheritFromHosts: boolean = false;
82
+ let inheritFromKubernetesClusters: boolean = false;
83
+ let inheritFromDockerHosts: boolean = false;
84
+ let inheritFromServices: boolean = false;
65
85
  const matchedRules: Array<AlertLabelRule> = [];
66
86
 
67
87
  for (const rule of rules) {
@@ -78,6 +98,38 @@ class AlertLabelRuleEngineServiceClass {
78
98
  if (rule.inheritLabelsFromMonitors) {
79
99
  inheritFromMonitors = true;
80
100
  }
101
+ if (rule.inheritLabelsFromHosts) {
102
+ inheritFromHosts = true;
103
+ }
104
+ if (rule.inheritLabelsFromKubernetesClusters) {
105
+ inheritFromKubernetesClusters = true;
106
+ }
107
+ if (rule.inheritLabelsFromDockerHosts) {
108
+ inheritFromDockerHosts = true;
109
+ }
110
+ if (rule.inheritLabelsFromServices) {
111
+ inheritFromServices = true;
112
+ }
113
+ }
114
+
115
+ const needsRelatedResources: boolean =
116
+ inheritFromHosts ||
117
+ inheritFromKubernetesClusters ||
118
+ inheritFromDockerHosts ||
119
+ inheritFromServices;
120
+
121
+ let alertWithResources: Alert | null = null;
122
+ if (needsRelatedResources) {
123
+ alertWithResources = await AlertService.findOneById({
124
+ id: alert.id,
125
+ select: {
126
+ hosts: { _id: true },
127
+ kubernetesClusters: { _id: true },
128
+ dockerHosts: { _id: true },
129
+ services: { _id: true },
130
+ },
131
+ props: { isRoot: true },
132
+ });
81
133
  }
82
134
 
83
135
  if (inheritFromMonitors && alert.monitorId) {
@@ -93,6 +145,83 @@ class AlertLabelRuleEngineServiceClass {
93
145
  }
94
146
  }
95
147
 
148
+ if (inheritFromHosts && alertWithResources?.hosts?.length) {
149
+ for (const alertHost of alertWithResources.hosts) {
150
+ if (!alertHost.id) {
151
+ continue;
152
+ }
153
+ const host: Host | null = await HostService.findOneById({
154
+ id: alertHost.id,
155
+ select: { labels: { _id: true } },
156
+ props: { isRoot: true },
157
+ });
158
+ for (const label of host?.labels || []) {
159
+ if (label.id) {
160
+ labelIdsToAdd.add(label.id.toString());
161
+ }
162
+ }
163
+ }
164
+ }
165
+
166
+ if (
167
+ inheritFromKubernetesClusters &&
168
+ alertWithResources?.kubernetesClusters?.length
169
+ ) {
170
+ for (const alertCluster of alertWithResources.kubernetesClusters) {
171
+ if (!alertCluster.id) {
172
+ continue;
173
+ }
174
+ const cluster: KubernetesCluster | null =
175
+ await KubernetesClusterService.findOneById({
176
+ id: alertCluster.id,
177
+ select: { labels: { _id: true } },
178
+ props: { isRoot: true },
179
+ });
180
+ for (const label of cluster?.labels || []) {
181
+ if (label.id) {
182
+ labelIdsToAdd.add(label.id.toString());
183
+ }
184
+ }
185
+ }
186
+ }
187
+
188
+ if (inheritFromDockerHosts && alertWithResources?.dockerHosts?.length) {
189
+ for (const alertDockerHost of alertWithResources.dockerHosts) {
190
+ if (!alertDockerHost.id) {
191
+ continue;
192
+ }
193
+ const dockerHost: DockerHost | null =
194
+ await DockerHostService.findOneById({
195
+ id: alertDockerHost.id,
196
+ select: { labels: { _id: true } },
197
+ props: { isRoot: true },
198
+ });
199
+ for (const label of dockerHost?.labels || []) {
200
+ if (label.id) {
201
+ labelIdsToAdd.add(label.id.toString());
202
+ }
203
+ }
204
+ }
205
+ }
206
+
207
+ if (inheritFromServices && alertWithResources?.services?.length) {
208
+ for (const alertService of alertWithResources.services) {
209
+ if (!alertService.id) {
210
+ continue;
211
+ }
212
+ const service: Service | null = await ServiceService.findOneById({
213
+ id: alertService.id,
214
+ select: { labels: { _id: true } },
215
+ props: { isRoot: true },
216
+ });
217
+ for (const label of service?.labels || []) {
218
+ if (label.id) {
219
+ labelIdsToAdd.add(label.id.toString());
220
+ }
221
+ }
222
+ }
223
+ }
224
+
96
225
  if (labelIdsToAdd.size === 0) {
97
226
  return;
98
227
  }
@@ -1,23 +1,38 @@
1
1
  import Alert from "../../Models/DatabaseModels/Alert";
2
2
  import AlertOwnerRule from "../../Models/DatabaseModels/AlertOwnerRule";
3
3
  import AlertSeverity from "../../Models/DatabaseModels/AlertSeverity";
4
+ import DockerHost from "../../Models/DatabaseModels/DockerHost";
5
+ import DockerHostOwnerTeam from "../../Models/DatabaseModels/DockerHostOwnerTeam";
6
+ import DockerHostOwnerUser from "../../Models/DatabaseModels/DockerHostOwnerUser";
4
7
  import Host from "../../Models/DatabaseModels/Host";
5
8
  import HostOwnerTeam from "../../Models/DatabaseModels/HostOwnerTeam";
6
9
  import HostOwnerUser from "../../Models/DatabaseModels/HostOwnerUser";
10
+ import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
11
+ import KubernetesClusterOwnerTeam from "../../Models/DatabaseModels/KubernetesClusterOwnerTeam";
12
+ import KubernetesClusterOwnerUser from "../../Models/DatabaseModels/KubernetesClusterOwnerUser";
7
13
  import Label from "../../Models/DatabaseModels/Label";
8
14
  import Monitor from "../../Models/DatabaseModels/Monitor";
9
15
  import MonitorOwnerTeam from "../../Models/DatabaseModels/MonitorOwnerTeam";
10
16
  import MonitorOwnerUser from "../../Models/DatabaseModels/MonitorOwnerUser";
17
+ import Service from "../../Models/DatabaseModels/Service";
18
+ import ServiceOwnerTeam from "../../Models/DatabaseModels/ServiceOwnerTeam";
19
+ import ServiceOwnerUser from "../../Models/DatabaseModels/ServiceOwnerUser";
11
20
  import Team from "../../Models/DatabaseModels/Team";
12
21
  import User from "../../Models/DatabaseModels/User";
13
22
  import AlertFeedService from "./AlertFeedService";
14
23
  import AlertOwnerRuleService from "./AlertOwnerRuleService";
15
24
  import AlertService from "./AlertService";
25
+ import DockerHostOwnerTeamService from "./DockerHostOwnerTeamService";
26
+ import DockerHostOwnerUserService from "./DockerHostOwnerUserService";
16
27
  import HostOwnerTeamService from "./HostOwnerTeamService";
17
28
  import HostOwnerUserService from "./HostOwnerUserService";
29
+ import KubernetesClusterOwnerTeamService from "./KubernetesClusterOwnerTeamService";
30
+ import KubernetesClusterOwnerUserService from "./KubernetesClusterOwnerUserService";
18
31
  import MonitorOwnerTeamService from "./MonitorOwnerTeamService";
19
32
  import MonitorOwnerUserService from "./MonitorOwnerUserService";
20
33
  import MonitorService from "./MonitorService";
34
+ import ServiceOwnerTeamService from "./ServiceOwnerTeamService";
35
+ import ServiceOwnerUserService from "./ServiceOwnerUserService";
21
36
  import TeamService from "./TeamService";
22
37
  import UserService from "./UserService";
23
38
  import { AlertFeedEventType } from "../../Models/DatabaseModels/AlertFeed";
@@ -62,6 +77,9 @@ class AlertOwnerRuleEngineServiceClass {
62
77
  ownerTeams: { _id: true },
63
78
  inheritOwnersFromMonitors: true,
64
79
  inheritOwnersFromHosts: true,
80
+ inheritOwnersFromKubernetesClusters: true,
81
+ inheritOwnersFromDockerHosts: true,
82
+ inheritOwnersFromServices: true,
65
83
  },
66
84
  limit: 100,
67
85
  skip: 0,
@@ -85,6 +103,9 @@ class AlertOwnerRuleEngineServiceClass {
85
103
  const allTeamIds: Set<string> = new Set();
86
104
  let inheritFromMonitors: boolean = false;
87
105
  let inheritFromHosts: boolean = false;
106
+ let inheritFromKubernetesClusters: boolean = false;
107
+ let inheritFromDockerHosts: boolean = false;
108
+ let inheritFromServices: boolean = false;
88
109
  const inheritNotifyMode: { value: boolean | null } = { value: null };
89
110
 
90
111
  for (const rule of rules) {
@@ -120,6 +141,24 @@ class AlertOwnerRuleEngineServiceClass {
120
141
  inheritNotifyMode.value =
121
142
  inheritNotifyMode.value === true ? true : notify;
122
143
  }
144
+ if (rule.inheritOwnersFromKubernetesClusters) {
145
+ inheritFromKubernetesClusters = true;
146
+ ruleAddedAny = true;
147
+ inheritNotifyMode.value =
148
+ inheritNotifyMode.value === true ? true : notify;
149
+ }
150
+ if (rule.inheritOwnersFromDockerHosts) {
151
+ inheritFromDockerHosts = true;
152
+ ruleAddedAny = true;
153
+ inheritNotifyMode.value =
154
+ inheritNotifyMode.value === true ? true : notify;
155
+ }
156
+ if (rule.inheritOwnersFromServices) {
157
+ inheritFromServices = true;
158
+ ruleAddedAny = true;
159
+ inheritNotifyMode.value =
160
+ inheritNotifyMode.value === true ? true : notify;
161
+ }
123
162
  if (ruleAddedAny) {
124
163
  matchedRules.push(rule);
125
164
  }
@@ -129,6 +168,12 @@ class AlertOwnerRuleEngineServiceClass {
129
168
  const inheritedFromMonitorTeamIds: Set<string> = new Set();
130
169
  const inheritedFromHostUserIds: Set<string> = new Set();
131
170
  const inheritedFromHostTeamIds: Set<string> = new Set();
171
+ const inheritedFromKubernetesClusterUserIds: Set<string> = new Set();
172
+ const inheritedFromKubernetesClusterTeamIds: Set<string> = new Set();
173
+ const inheritedFromDockerHostUserIds: Set<string> = new Set();
174
+ const inheritedFromDockerHostTeamIds: Set<string> = new Set();
175
+ const inheritedFromServiceUserIds: Set<string> = new Set();
176
+ const inheritedFromServiceTeamIds: Set<string> = new Set();
132
177
 
133
178
  if (inheritFromMonitors && alert.monitorId) {
134
179
  const [monitorOwnerUsers, monitorOwnerTeams]: [
@@ -203,13 +248,146 @@ class AlertOwnerRuleEngineServiceClass {
203
248
  }
204
249
  }
205
250
 
251
+ if (inheritFromKubernetesClusters && alert.kubernetesClusters?.length) {
252
+ const clusterIds: Array<ObjectID> = alert.kubernetesClusters
253
+ .map((c: KubernetesCluster) => {
254
+ return c.id;
255
+ })
256
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
257
+ return Boolean(id);
258
+ });
259
+ if (clusterIds.length > 0) {
260
+ const [clusterOwnerUsers, clusterOwnerTeams]: [
261
+ Array<KubernetesClusterOwnerUser>,
262
+ Array<KubernetesClusterOwnerTeam>,
263
+ ] = await Promise.all([
264
+ KubernetesClusterOwnerUserService.findBy({
265
+ query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
266
+ select: { userId: true },
267
+ props: { isRoot: true },
268
+ limit: LIMIT_MAX,
269
+ skip: 0,
270
+ }),
271
+ KubernetesClusterOwnerTeamService.findBy({
272
+ query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
273
+ select: { teamId: true },
274
+ props: { isRoot: true },
275
+ limit: LIMIT_MAX,
276
+ skip: 0,
277
+ }),
278
+ ]);
279
+ for (const ownerUser of clusterOwnerUsers) {
280
+ if (ownerUser.userId) {
281
+ inheritedFromKubernetesClusterUserIds.add(
282
+ ownerUser.userId.toString(),
283
+ );
284
+ }
285
+ }
286
+ for (const ownerTeam of clusterOwnerTeams) {
287
+ if (ownerTeam.teamId) {
288
+ inheritedFromKubernetesClusterTeamIds.add(
289
+ ownerTeam.teamId.toString(),
290
+ );
291
+ }
292
+ }
293
+ }
294
+ }
295
+
296
+ if (inheritFromDockerHosts && alert.dockerHosts?.length) {
297
+ const dockerHostIds: Array<ObjectID> = alert.dockerHosts
298
+ .map((d: DockerHost) => {
299
+ return d.id;
300
+ })
301
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
302
+ return Boolean(id);
303
+ });
304
+ if (dockerHostIds.length > 0) {
305
+ const [dockerHostOwnerUsers, dockerHostOwnerTeams]: [
306
+ Array<DockerHostOwnerUser>,
307
+ Array<DockerHostOwnerTeam>,
308
+ ] = await Promise.all([
309
+ DockerHostOwnerUserService.findBy({
310
+ query: { dockerHostId: QueryHelper.any(dockerHostIds) },
311
+ select: { userId: true },
312
+ props: { isRoot: true },
313
+ limit: LIMIT_MAX,
314
+ skip: 0,
315
+ }),
316
+ DockerHostOwnerTeamService.findBy({
317
+ query: { dockerHostId: QueryHelper.any(dockerHostIds) },
318
+ select: { teamId: true },
319
+ props: { isRoot: true },
320
+ limit: LIMIT_MAX,
321
+ skip: 0,
322
+ }),
323
+ ]);
324
+ for (const ownerUser of dockerHostOwnerUsers) {
325
+ if (ownerUser.userId) {
326
+ inheritedFromDockerHostUserIds.add(ownerUser.userId.toString());
327
+ }
328
+ }
329
+ for (const ownerTeam of dockerHostOwnerTeams) {
330
+ if (ownerTeam.teamId) {
331
+ inheritedFromDockerHostTeamIds.add(ownerTeam.teamId.toString());
332
+ }
333
+ }
334
+ }
335
+ }
336
+
337
+ if (inheritFromServices && alert.services?.length) {
338
+ const serviceIds: Array<ObjectID> = alert.services
339
+ .map((s: Service) => {
340
+ return s.id;
341
+ })
342
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
343
+ return Boolean(id);
344
+ });
345
+ if (serviceIds.length > 0) {
346
+ const [serviceOwnerUsers, serviceOwnerTeams]: [
347
+ Array<ServiceOwnerUser>,
348
+ Array<ServiceOwnerTeam>,
349
+ ] = await Promise.all([
350
+ ServiceOwnerUserService.findBy({
351
+ query: { serviceId: QueryHelper.any(serviceIds) },
352
+ select: { userId: true },
353
+ props: { isRoot: true },
354
+ limit: LIMIT_MAX,
355
+ skip: 0,
356
+ }),
357
+ ServiceOwnerTeamService.findBy({
358
+ query: { serviceId: QueryHelper.any(serviceIds) },
359
+ select: { teamId: true },
360
+ props: { isRoot: true },
361
+ limit: LIMIT_MAX,
362
+ skip: 0,
363
+ }),
364
+ ]);
365
+ for (const ownerUser of serviceOwnerUsers) {
366
+ if (ownerUser.userId) {
367
+ inheritedFromServiceUserIds.add(ownerUser.userId.toString());
368
+ }
369
+ }
370
+ for (const ownerTeam of serviceOwnerTeams) {
371
+ if (ownerTeam.teamId) {
372
+ inheritedFromServiceTeamIds.add(ownerTeam.teamId.toString());
373
+ }
374
+ }
375
+ }
376
+ }
377
+
206
378
  const inheritedUserIds: Set<string> = new Set([
207
379
  ...inheritedFromMonitorUserIds,
208
380
  ...inheritedFromHostUserIds,
381
+ ...inheritedFromKubernetesClusterUserIds,
382
+ ...inheritedFromDockerHostUserIds,
383
+ ...inheritedFromServiceUserIds,
209
384
  ]);
210
385
  const inheritedTeamIds: Set<string> = new Set([
211
386
  ...inheritedFromMonitorTeamIds,
212
387
  ...inheritedFromHostTeamIds,
388
+ ...inheritedFromKubernetesClusterTeamIds,
389
+ ...inheritedFromDockerHostTeamIds,
390
+ ...inheritedFromServiceTeamIds,
213
391
  ]);
214
392
 
215
393
  if (inheritedUserIds.size > 0 || inheritedTeamIds.size > 0) {
@@ -272,6 +450,17 @@ class AlertOwnerRuleEngineServiceClass {
272
450
  0,
273
451
  inheritedFromHosts:
274
452
  inheritedFromHostUserIds.size + inheritedFromHostTeamIds.size > 0,
453
+ inheritedFromKubernetesClusters:
454
+ inheritedFromKubernetesClusterUserIds.size +
455
+ inheritedFromKubernetesClusterTeamIds.size >
456
+ 0,
457
+ inheritedFromDockerHosts:
458
+ inheritedFromDockerHostUserIds.size +
459
+ inheritedFromDockerHostTeamIds.size >
460
+ 0,
461
+ inheritedFromServices:
462
+ inheritedFromServiceUserIds.size + inheritedFromServiceTeamIds.size >
463
+ 0,
275
464
  });
276
465
  } catch (error) {
277
466
  logger.error(`Error applying alert owner rules: ${error}`, {
@@ -289,6 +478,9 @@ class AlertOwnerRuleEngineServiceClass {
289
478
  teamIds: Array<string>;
290
479
  inheritedFromMonitors: boolean;
291
480
  inheritedFromHosts: boolean;
481
+ inheritedFromKubernetesClusters: boolean;
482
+ inheritedFromDockerHosts: boolean;
483
+ inheritedFromServices: boolean;
292
484
  }): Promise<void> {
293
485
  const {
294
486
  alert,
@@ -297,6 +489,9 @@ class AlertOwnerRuleEngineServiceClass {
297
489
  teamIds,
298
490
  inheritedFromMonitors,
299
491
  inheritedFromHosts,
492
+ inheritedFromKubernetesClusters,
493
+ inheritedFromDockerHosts,
494
+ inheritedFromServices,
300
495
  } = data;
301
496
  if (
302
497
  !alert.id ||
@@ -374,9 +569,18 @@ class AlertOwnerRuleEngineServiceClass {
374
569
  if (inheritedFromHosts) {
375
570
  inheritedSources.push("hosts");
376
571
  }
572
+ if (inheritedFromKubernetesClusters) {
573
+ inheritedSources.push("Kubernetes clusters");
574
+ }
575
+ if (inheritedFromDockerHosts) {
576
+ inheritedSources.push("Docker hosts");
577
+ }
578
+ if (inheritedFromServices) {
579
+ inheritedSources.push("services");
580
+ }
377
581
  const inheritedNote: string =
378
582
  inheritedSources.length > 0
379
- ? `\n\n_Some owners were inherited from the alert's ${inheritedSources.join(" and ")}._`
583
+ ? `\n\n_Some owners were inherited from the alert's ${inheritedSources.join(", ")}._`
380
584
  : "";
381
585
 
382
586
  const feedInfoInMarkdown: string = `🛡️ **Alert Owner Rule${