@oneuptime/common 10.4.10 → 10.4.12

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 (174) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +47 -1
  2. package/Models/AnalyticsModels/Log.ts +47 -1
  3. package/Models/AnalyticsModels/Metric.ts +1 -7
  4. package/Models/AnalyticsModels/Profile.ts +47 -1
  5. package/Models/AnalyticsModels/ProfileSample.ts +47 -1
  6. package/Models/AnalyticsModels/Span.ts +47 -1
  7. package/Models/DatabaseModels/Alert.ts +332 -0
  8. package/Models/DatabaseModels/DockerHost.ts +83 -0
  9. package/Models/DatabaseModels/Host.ts +83 -0
  10. package/Models/DatabaseModels/Incident.ts +332 -0
  11. package/Models/DatabaseModels/Index.ts +0 -2
  12. package/Models/DatabaseModels/KubernetesCluster.ts +83 -0
  13. package/Models/DatabaseModels/RunbookAgent.ts +16 -2
  14. package/Server/EnvironmentConfig.ts +16 -0
  15. package/Server/Infrastructure/ClickhouseConfig.ts +14 -0
  16. package/Server/Infrastructure/ClickhouseDatabase.ts +20 -3
  17. package/Server/Infrastructure/InMemoryTTLCache.ts +61 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1779199346010-AddTelemetryRetentionConfig.ts +1 -1
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.ts +44 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.ts +50 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1779302536475-AttachKubernetesAndDockerToIncidentAndAlert.ts +253 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1779303924241-AttachServiceToIncidentAndAlert.ts +60 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  24. package/Server/Middleware/TelemetryIngest.ts +6 -38
  25. package/Server/Middleware/UserAuthorization.ts +1 -11
  26. package/Server/Services/AlertService.ts +2 -4
  27. package/Server/Services/AnalyticsDatabaseService.ts +33 -1
  28. package/Server/Services/IncidentService.ts +2 -4
  29. package/Server/Services/Index.ts +0 -2
  30. package/Server/Services/LogAggregationService.ts +54 -6
  31. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +6 -0
  32. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +1 -0
  33. package/Server/Services/OnCallDutyPolicyScheduleService.ts +17 -0
  34. package/Server/Services/OpenTelemetryIngestService.ts +132 -0
  35. package/Server/Services/TelemetryIngestionKeyService.ts +90 -1
  36. package/Server/Services/TraceAggregationService.ts +83 -8
  37. package/Server/Utils/Monitor/MonitorMetricUtil.ts +2 -4
  38. package/Server/Utils/Telemetry/Telemetry.ts +38 -0
  39. package/Tests/Server/Middleware/UserAuthorization.test.ts +5 -7
  40. package/Types/Dashboard/DashboardComponentType.ts +0 -1
  41. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
  42. package/Types/Dashboard/DashboardComponents/DashboardTableComponent.ts +74 -1
  43. package/Types/Dashboard/DashboardTemplates.ts +164 -51
  44. package/Types/Monitor/MonitorType.ts +1 -1
  45. package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +36 -9
  46. package/Types/Permission.ts +0 -46
  47. package/Types/Telemetry/ServiceType.ts +19 -0
  48. package/UI/Components/Forms/Validation.ts +2 -2
  49. package/UI/Components/LogsViewer/LogsViewer.tsx +135 -17
  50. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +84 -1
  51. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -1
  52. package/Utils/Dashboard/Components/DashboardTableComponent.ts +80 -17
  53. package/Utils/Dashboard/Components/Index.ts +0 -7
  54. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +41 -1
  55. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  56. package/build/dist/Models/AnalyticsModels/Log.js +41 -1
  57. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  58. package/build/dist/Models/AnalyticsModels/Metric.js +0 -7
  59. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  60. package/build/dist/Models/AnalyticsModels/Profile.js +41 -1
  61. package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
  62. package/build/dist/Models/AnalyticsModels/ProfileSample.js +41 -1
  63. package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
  64. package/build/dist/Models/AnalyticsModels/Span.js +41 -1
  65. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  66. package/build/dist/Models/DatabaseModels/Alert.js +324 -0
  67. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  68. package/build/dist/Models/DatabaseModels/DockerHost.js +84 -0
  69. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  70. package/build/dist/Models/DatabaseModels/Host.js +84 -0
  71. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  72. package/build/dist/Models/DatabaseModels/Incident.js +324 -0
  73. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  74. package/build/dist/Models/DatabaseModels/Index.js +0 -2
  75. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  76. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +84 -0
  77. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  78. package/build/dist/Models/DatabaseModels/RunbookAgent.js +16 -2
  79. package/build/dist/Models/DatabaseModels/RunbookAgent.js.map +1 -1
  80. package/build/dist/Server/EnvironmentConfig.js +8 -0
  81. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  82. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +9 -1
  83. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  84. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +12 -3
  85. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  86. package/build/dist/Server/Infrastructure/InMemoryTTLCache.js +49 -0
  87. package/build/dist/Server/Infrastructure/InMemoryTTLCache.js.map +1 -0
  88. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779199346010-AddTelemetryRetentionConfig.js.map +1 -1
  89. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.js +42 -0
  90. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.js.map +1 -0
  91. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.js +22 -0
  92. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.js.map +1 -0
  93. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779302536475-AttachKubernetesAndDockerToIncidentAndAlert.js +100 -0
  94. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779302536475-AttachKubernetesAndDockerToIncidentAndAlert.js.map +1 -0
  95. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779303924241-AttachServiceToIncidentAndAlert.js +28 -0
  96. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779303924241-AttachServiceToIncidentAndAlert.js.map +1 -0
  97. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  98. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  99. package/build/dist/Server/Middleware/TelemetryIngest.js +2 -26
  100. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  101. package/build/dist/Server/Middleware/UserAuthorization.js +1 -7
  102. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  103. package/build/dist/Server/Services/AlertService.js +2 -1
  104. package/build/dist/Server/Services/AlertService.js.map +1 -1
  105. package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -2
  106. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  107. package/build/dist/Server/Services/IncidentService.js +2 -1
  108. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  109. package/build/dist/Server/Services/Index.js +0 -2
  110. package/build/dist/Server/Services/Index.js.map +1 -1
  111. package/build/dist/Server/Services/LogAggregationService.js +46 -4
  112. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  113. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +28 -24
  114. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  115. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +1 -1
  116. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  117. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +18 -2
  118. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  119. package/build/dist/Server/Services/OpenTelemetryIngestService.js +103 -0
  120. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  121. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +83 -0
  122. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  123. package/build/dist/Server/Services/TraceAggregationService.js +66 -6
  124. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  125. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +2 -1
  126. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  127. package/build/dist/Server/Utils/Telemetry/Telemetry.js +26 -0
  128. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  129. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +3 -7
  130. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
  131. package/build/dist/Types/Dashboard/DashboardComponentType.js +0 -1
  132. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  133. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
  134. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  135. package/build/dist/Types/Dashboard/DashboardComponents/DashboardTableComponent.js +13 -1
  136. package/build/dist/Types/Dashboard/DashboardComponents/DashboardTableComponent.js.map +1 -1
  137. package/build/dist/Types/Dashboard/DashboardTemplates.js +142 -42
  138. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  139. package/build/dist/Types/Monitor/MonitorType.js +1 -1
  140. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  141. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +27 -7
  142. package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
  143. package/build/dist/Types/Permission.js +0 -40
  144. package/build/dist/Types/Permission.js.map +1 -1
  145. package/build/dist/Types/Telemetry/ServiceType.js +20 -0
  146. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -0
  147. package/build/dist/UI/Components/Forms/Validation.js +2 -2
  148. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  149. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +106 -16
  150. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  151. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +67 -1
  152. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  153. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
  154. package/build/dist/Utils/Dashboard/Components/DashboardTableComponent.js +68 -16
  155. package/build/dist/Utils/Dashboard/Components/DashboardTableComponent.js.map +1 -1
  156. package/build/dist/Utils/Dashboard/Components/Index.js +0 -4
  157. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  158. package/package.json +1 -2
  159. package/Models/DatabaseModels/ServiceDependency.ts +0 -529
  160. package/Server/Services/ServiceDependencyService.ts +0 -48
  161. package/Types/Dashboard/DashboardComponents/DashboardHostMetricChartComponent.ts +0 -27
  162. package/Typings/elkjs.d.ts +0 -30
  163. package/UI/Components/Graphs/ServiceDependencyGraph.tsx +0 -286
  164. package/Utils/Dashboard/Components/DashboardHostMetricChartComponent.ts +0 -132
  165. package/build/dist/Models/DatabaseModels/ServiceDependency.js +0 -545
  166. package/build/dist/Models/DatabaseModels/ServiceDependency.js.map +0 -1
  167. package/build/dist/Server/Services/ServiceDependencyService.js +0 -47
  168. package/build/dist/Server/Services/ServiceDependencyService.js.map +0 -1
  169. package/build/dist/Types/Dashboard/DashboardComponents/DashboardHostMetricChartComponent.js +0 -11
  170. package/build/dist/Types/Dashboard/DashboardComponents/DashboardHostMetricChartComponent.js.map +0 -1
  171. package/build/dist/UI/Components/Graphs/ServiceDependencyGraph.js +0 -206
  172. package/build/dist/UI/Components/Graphs/ServiceDependencyGraph.js.map +0 -1
  173. package/build/dist/Utils/Dashboard/Components/DashboardHostMetricChartComponent.js +0 -113
  174. package/build/dist/Utils/Dashboard/Components/DashboardHostMetricChartComponent.js.map +0 -1
@@ -1,13 +1,19 @@
1
+ import DockerHost from "./DockerHost";
2
+ import DockerResource from "./DockerResource";
1
3
  import Host from "./Host";
2
4
  import IncidentEpisode from "./IncidentEpisode";
3
5
  import IncidentSeverity from "./IncidentSeverity";
4
6
  import IncidentState from "./IncidentState";
7
+ import KubernetesCluster from "./KubernetesCluster";
8
+ import KubernetesContainer from "./KubernetesContainer";
9
+ import KubernetesResource from "./KubernetesResource";
5
10
  import Label from "./Label";
6
11
  import Monitor from "./Monitor";
7
12
  import MonitorStatus from "./MonitorStatus";
8
13
  import OnCallDutyPolicy from "./OnCallDutyPolicy";
9
14
  import Probe from "./Probe";
10
15
  import Project from "./Project";
16
+ import Service from "./Service";
11
17
  import User from "./User";
12
18
  import File from "./File";
13
19
  import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
@@ -588,6 +594,332 @@ export default class Incident extends BaseModel {
588
594
  })
589
595
  public hosts?: Array<Host> = undefined; // hosts affected by this incident.
590
596
 
597
+ @ColumnAccessControl({
598
+ create: [
599
+ Permission.ProjectOwner,
600
+ Permission.ProjectAdmin,
601
+ Permission.ProjectMember,
602
+ Permission.IncidentAdmin,
603
+ Permission.IncidentMember,
604
+ Permission.CreateProjectIncident,
605
+ ],
606
+ read: [
607
+ Permission.ProjectOwner,
608
+ Permission.ProjectAdmin,
609
+ Permission.ProjectMember,
610
+ Permission.Viewer,
611
+ Permission.IncidentAdmin,
612
+ Permission.IncidentMember,
613
+ Permission.IncidentViewer,
614
+ Permission.ReadProjectIncident,
615
+ ],
616
+ update: [
617
+ Permission.ProjectOwner,
618
+ Permission.ProjectAdmin,
619
+ Permission.ProjectMember,
620
+ Permission.IncidentAdmin,
621
+ Permission.IncidentMember,
622
+ Permission.EditProjectIncident,
623
+ ],
624
+ })
625
+ @TableColumn({
626
+ required: false,
627
+ type: TableColumnType.EntityArray,
628
+ modelType: KubernetesCluster,
629
+ title: "Kubernetes Clusters",
630
+ description: "List of Kubernetes clusters affected by this incident.",
631
+ })
632
+ @ManyToMany(
633
+ () => {
634
+ return KubernetesCluster;
635
+ },
636
+ { eager: false },
637
+ )
638
+ @JoinTable({
639
+ name: "IncidentKubernetesCluster",
640
+ inverseJoinColumn: {
641
+ name: "kubernetesClusterId",
642
+ referencedColumnName: "_id",
643
+ },
644
+ joinColumn: {
645
+ name: "incidentId",
646
+ referencedColumnName: "_id",
647
+ },
648
+ })
649
+ public kubernetesClusters?: Array<KubernetesCluster> = undefined;
650
+
651
+ @ColumnAccessControl({
652
+ create: [
653
+ Permission.ProjectOwner,
654
+ Permission.ProjectAdmin,
655
+ Permission.ProjectMember,
656
+ Permission.IncidentAdmin,
657
+ Permission.IncidentMember,
658
+ Permission.CreateProjectIncident,
659
+ ],
660
+ read: [
661
+ Permission.ProjectOwner,
662
+ Permission.ProjectAdmin,
663
+ Permission.ProjectMember,
664
+ Permission.Viewer,
665
+ Permission.IncidentAdmin,
666
+ Permission.IncidentMember,
667
+ Permission.IncidentViewer,
668
+ Permission.ReadProjectIncident,
669
+ ],
670
+ update: [
671
+ Permission.ProjectOwner,
672
+ Permission.ProjectAdmin,
673
+ Permission.ProjectMember,
674
+ Permission.IncidentAdmin,
675
+ Permission.IncidentMember,
676
+ Permission.EditProjectIncident,
677
+ ],
678
+ })
679
+ @TableColumn({
680
+ required: false,
681
+ type: TableColumnType.EntityArray,
682
+ modelType: KubernetesResource,
683
+ title: "Kubernetes Resources",
684
+ description:
685
+ "List of Kubernetes resources (pods, deployments, nodes, etc.) affected by this incident.",
686
+ })
687
+ @ManyToMany(
688
+ () => {
689
+ return KubernetesResource;
690
+ },
691
+ { eager: false },
692
+ )
693
+ @JoinTable({
694
+ name: "IncidentKubernetesResource",
695
+ inverseJoinColumn: {
696
+ name: "kubernetesResourceId",
697
+ referencedColumnName: "_id",
698
+ },
699
+ joinColumn: {
700
+ name: "incidentId",
701
+ referencedColumnName: "_id",
702
+ },
703
+ })
704
+ public kubernetesResources?: Array<KubernetesResource> = undefined;
705
+
706
+ @ColumnAccessControl({
707
+ create: [
708
+ Permission.ProjectOwner,
709
+ Permission.ProjectAdmin,
710
+ Permission.ProjectMember,
711
+ Permission.IncidentAdmin,
712
+ Permission.IncidentMember,
713
+ Permission.CreateProjectIncident,
714
+ ],
715
+ read: [
716
+ Permission.ProjectOwner,
717
+ Permission.ProjectAdmin,
718
+ Permission.ProjectMember,
719
+ Permission.Viewer,
720
+ Permission.IncidentAdmin,
721
+ Permission.IncidentMember,
722
+ Permission.IncidentViewer,
723
+ Permission.ReadProjectIncident,
724
+ ],
725
+ update: [
726
+ Permission.ProjectOwner,
727
+ Permission.ProjectAdmin,
728
+ Permission.ProjectMember,
729
+ Permission.IncidentAdmin,
730
+ Permission.IncidentMember,
731
+ Permission.EditProjectIncident,
732
+ ],
733
+ })
734
+ @TableColumn({
735
+ required: false,
736
+ type: TableColumnType.EntityArray,
737
+ modelType: KubernetesContainer,
738
+ title: "Kubernetes Containers",
739
+ description: "List of Kubernetes containers affected by this incident.",
740
+ })
741
+ @ManyToMany(
742
+ () => {
743
+ return KubernetesContainer;
744
+ },
745
+ { eager: false },
746
+ )
747
+ @JoinTable({
748
+ name: "IncidentKubernetesContainer",
749
+ inverseJoinColumn: {
750
+ name: "kubernetesContainerId",
751
+ referencedColumnName: "_id",
752
+ },
753
+ joinColumn: {
754
+ name: "incidentId",
755
+ referencedColumnName: "_id",
756
+ },
757
+ })
758
+ public kubernetesContainers?: Array<KubernetesContainer> = undefined;
759
+
760
+ @ColumnAccessControl({
761
+ create: [
762
+ Permission.ProjectOwner,
763
+ Permission.ProjectAdmin,
764
+ Permission.ProjectMember,
765
+ Permission.IncidentAdmin,
766
+ Permission.IncidentMember,
767
+ Permission.CreateProjectIncident,
768
+ ],
769
+ read: [
770
+ Permission.ProjectOwner,
771
+ Permission.ProjectAdmin,
772
+ Permission.ProjectMember,
773
+ Permission.Viewer,
774
+ Permission.IncidentAdmin,
775
+ Permission.IncidentMember,
776
+ Permission.IncidentViewer,
777
+ Permission.ReadProjectIncident,
778
+ ],
779
+ update: [
780
+ Permission.ProjectOwner,
781
+ Permission.ProjectAdmin,
782
+ Permission.ProjectMember,
783
+ Permission.IncidentAdmin,
784
+ Permission.IncidentMember,
785
+ Permission.EditProjectIncident,
786
+ ],
787
+ })
788
+ @TableColumn({
789
+ required: false,
790
+ type: TableColumnType.EntityArray,
791
+ modelType: DockerHost,
792
+ title: "Docker Hosts",
793
+ description: "List of Docker hosts affected by this incident.",
794
+ })
795
+ @ManyToMany(
796
+ () => {
797
+ return DockerHost;
798
+ },
799
+ { eager: false },
800
+ )
801
+ @JoinTable({
802
+ name: "IncidentDockerHost",
803
+ inverseJoinColumn: {
804
+ name: "dockerHostId",
805
+ referencedColumnName: "_id",
806
+ },
807
+ joinColumn: {
808
+ name: "incidentId",
809
+ referencedColumnName: "_id",
810
+ },
811
+ })
812
+ public dockerHosts?: Array<DockerHost> = undefined;
813
+
814
+ @ColumnAccessControl({
815
+ create: [
816
+ Permission.ProjectOwner,
817
+ Permission.ProjectAdmin,
818
+ Permission.ProjectMember,
819
+ Permission.IncidentAdmin,
820
+ Permission.IncidentMember,
821
+ Permission.CreateProjectIncident,
822
+ ],
823
+ read: [
824
+ Permission.ProjectOwner,
825
+ Permission.ProjectAdmin,
826
+ Permission.ProjectMember,
827
+ Permission.Viewer,
828
+ Permission.IncidentAdmin,
829
+ Permission.IncidentMember,
830
+ Permission.IncidentViewer,
831
+ Permission.ReadProjectIncident,
832
+ ],
833
+ update: [
834
+ Permission.ProjectOwner,
835
+ Permission.ProjectAdmin,
836
+ Permission.ProjectMember,
837
+ Permission.IncidentAdmin,
838
+ Permission.IncidentMember,
839
+ Permission.EditProjectIncident,
840
+ ],
841
+ })
842
+ @TableColumn({
843
+ required: false,
844
+ type: TableColumnType.EntityArray,
845
+ modelType: DockerResource,
846
+ title: "Docker Resources",
847
+ description:
848
+ "List of Docker resources (containers, images, networks, volumes) affected by this incident.",
849
+ })
850
+ @ManyToMany(
851
+ () => {
852
+ return DockerResource;
853
+ },
854
+ { eager: false },
855
+ )
856
+ @JoinTable({
857
+ name: "IncidentDockerResource",
858
+ inverseJoinColumn: {
859
+ name: "dockerResourceId",
860
+ referencedColumnName: "_id",
861
+ },
862
+ joinColumn: {
863
+ name: "incidentId",
864
+ referencedColumnName: "_id",
865
+ },
866
+ })
867
+ public dockerResources?: Array<DockerResource> = undefined;
868
+
869
+ @ColumnAccessControl({
870
+ create: [
871
+ Permission.ProjectOwner,
872
+ Permission.ProjectAdmin,
873
+ Permission.ProjectMember,
874
+ Permission.IncidentAdmin,
875
+ Permission.IncidentMember,
876
+ Permission.CreateProjectIncident,
877
+ ],
878
+ read: [
879
+ Permission.ProjectOwner,
880
+ Permission.ProjectAdmin,
881
+ Permission.ProjectMember,
882
+ Permission.Viewer,
883
+ Permission.IncidentAdmin,
884
+ Permission.IncidentMember,
885
+ Permission.IncidentViewer,
886
+ Permission.ReadProjectIncident,
887
+ ],
888
+ update: [
889
+ Permission.ProjectOwner,
890
+ Permission.ProjectAdmin,
891
+ Permission.ProjectMember,
892
+ Permission.IncidentAdmin,
893
+ Permission.IncidentMember,
894
+ Permission.EditProjectIncident,
895
+ ],
896
+ })
897
+ @TableColumn({
898
+ required: false,
899
+ type: TableColumnType.EntityArray,
900
+ modelType: Service,
901
+ title: "Services",
902
+ description: "List of services affected by this incident.",
903
+ })
904
+ @ManyToMany(
905
+ () => {
906
+ return Service;
907
+ },
908
+ { eager: false },
909
+ )
910
+ @JoinTable({
911
+ name: "IncidentService",
912
+ inverseJoinColumn: {
913
+ name: "serviceId",
914
+ referencedColumnName: "_id",
915
+ },
916
+ joinColumn: {
917
+ name: "incidentId",
918
+ referencedColumnName: "_id",
919
+ },
920
+ })
921
+ public services?: Array<Service> = undefined;
922
+
591
923
  @ColumnAccessControl({
592
924
  create: [
593
925
  Permission.ProjectOwner,
@@ -226,7 +226,6 @@ import RunbookExecution from "./RunbookExecution";
226
226
  import RunbookOwnerTeam from "./RunbookOwnerTeam";
227
227
  import RunbookOwnerUser from "./RunbookOwnerUser";
228
228
  import RunbookRule from "./RunbookRule";
229
- import ServiceDependency from "./ServiceDependency";
230
229
  import ServiceMonitor from "./ServiceMonitor";
231
230
 
232
231
  import UserTotpAuth from "./UserTotpAuth";
@@ -618,7 +617,6 @@ const AllModelTypes: Array<{
618
617
  Service,
619
618
  ServiceOwnerTeam,
620
619
  ServiceOwnerUser,
621
- ServiceDependency,
622
620
  ServiceMonitor,
623
621
  ServiceCodeRepository,
624
622
 
@@ -19,6 +19,7 @@ import UniqueColumnBy from "../../Types/Database/UniqueColumnBy";
19
19
  import IconProp from "../../Types/Icon/IconProp";
20
20
  import ObjectID from "../../Types/ObjectID";
21
21
  import Permission from "../../Types/Permission";
22
+ import TelemetryRetentionConfig from "../../Types/Telemetry/TelemetryRetentionConfig";
22
23
  import {
23
24
  Column,
24
25
  Entity,
@@ -725,4 +726,86 @@ export default class KubernetesCluster extends BaseModel {
725
726
  },
726
727
  })
727
728
  public labels?: Array<Label> = undefined;
729
+
730
+ @ColumnAccessControl({
731
+ create: [
732
+ Permission.ProjectOwner,
733
+ Permission.ProjectAdmin,
734
+ Permission.ProjectMember,
735
+ Permission.SettingsAdmin,
736
+ Permission.SettingsMember,
737
+ Permission.CreateKubernetesCluster,
738
+ ],
739
+ read: [
740
+ Permission.ProjectOwner,
741
+ Permission.ProjectAdmin,
742
+ Permission.ProjectMember,
743
+ Permission.Viewer,
744
+ Permission.SettingsAdmin,
745
+ Permission.SettingsMember,
746
+ Permission.SettingsViewer,
747
+ Permission.ReadKubernetesCluster,
748
+ ],
749
+ update: [
750
+ Permission.ProjectOwner,
751
+ Permission.ProjectAdmin,
752
+ Permission.ProjectMember,
753
+ Permission.SettingsAdmin,
754
+ Permission.SettingsMember,
755
+ Permission.EditKubernetesCluster,
756
+ ],
757
+ })
758
+ @TableColumn({
759
+ type: TableColumnType.Number,
760
+ title: "Retain Telemetry Data For Days",
761
+ description:
762
+ "Number of days to retain telemetry data for this Kubernetes cluster. Leave blank to use the project-wide default.",
763
+ })
764
+ @Column({
765
+ type: ColumnType.Number,
766
+ nullable: true,
767
+ unique: false,
768
+ })
769
+ public retainTelemetryDataForDays?: number = undefined;
770
+
771
+ @ColumnAccessControl({
772
+ create: [
773
+ Permission.ProjectOwner,
774
+ Permission.ProjectAdmin,
775
+ Permission.ProjectMember,
776
+ Permission.SettingsAdmin,
777
+ Permission.SettingsMember,
778
+ Permission.CreateKubernetesCluster,
779
+ ],
780
+ read: [
781
+ Permission.ProjectOwner,
782
+ Permission.ProjectAdmin,
783
+ Permission.ProjectMember,
784
+ Permission.Viewer,
785
+ Permission.SettingsAdmin,
786
+ Permission.SettingsMember,
787
+ Permission.SettingsViewer,
788
+ Permission.ReadKubernetesCluster,
789
+ ],
790
+ update: [
791
+ Permission.ProjectOwner,
792
+ Permission.ProjectAdmin,
793
+ Permission.ProjectMember,
794
+ Permission.SettingsAdmin,
795
+ Permission.SettingsMember,
796
+ Permission.EditKubernetesCluster,
797
+ ],
798
+ })
799
+ @TableColumn({
800
+ type: TableColumnType.JSON,
801
+ required: false,
802
+ title: "Telemetry Data Retention Overrides",
803
+ description:
804
+ "Per-pillar retention overrides for this Kubernetes cluster (logs by severity, traces by status, metrics, profiles). Unset fields fall back to the cluster default, then the project's retention settings.",
805
+ })
806
+ @Column({
807
+ type: ColumnType.JSON,
808
+ nullable: true,
809
+ })
810
+ public telemetryRetentionConfig?: TelemetryRetentionConfig = undefined;
728
811
  }
@@ -313,7 +313,14 @@ export default class RunbookAgent extends BaseModel {
313
313
  public key?: string = undefined;
314
314
 
315
315
  @ColumnAccessControl({
316
- create: [],
316
+ create: [
317
+ Permission.ProjectOwner,
318
+ Permission.ProjectAdmin,
319
+ Permission.ProjectMember,
320
+ Permission.RunbookAdmin,
321
+ Permission.RunbookMember,
322
+ Permission.CreateRunbookAgent,
323
+ ],
317
324
  read: [
318
325
  Permission.ProjectOwner,
319
326
  Permission.ProjectAdmin,
@@ -369,7 +376,14 @@ export default class RunbookAgent extends BaseModel {
369
376
  public lastAlive?: Date = undefined;
370
377
 
371
378
  @ColumnAccessControl({
372
- create: [],
379
+ create: [
380
+ Permission.ProjectOwner,
381
+ Permission.ProjectAdmin,
382
+ Permission.ProjectMember,
383
+ Permission.RunbookAdmin,
384
+ Permission.RunbookMember,
385
+ Permission.CreateRunbookAgent,
386
+ ],
373
387
  read: [
374
388
  Permission.ProjectOwner,
375
389
  Permission.ProjectAdmin,
@@ -285,6 +285,22 @@ export const ShouldClickhouseSslEnable: boolean = Boolean(
285
285
  ClickhouseTlsCa || (ClickhouseTlsCert && ClickhouseTlsKey),
286
286
  );
287
287
 
288
+ export const MaxClickhouseConnections: number = parseInt(
289
+ process.env["CLICKHOUSE_MAX_OPEN_CONNECTIONS"] || "100",
290
+ 10,
291
+ );
292
+
293
+ /*
294
+ * Ingest pool size. Falls back to MaxClickhouseConnections so single-knob
295
+ * setups still work; override only when the ingest pool needs to be sized
296
+ * independently from the query pool.
297
+ */
298
+ export const MaxClickhouseIngestConnections: number = parseInt(
299
+ process.env["CLICKHOUSE_INGEST_MAX_OPEN_CONNECTIONS"] ||
300
+ String(MaxClickhouseConnections),
301
+ 10,
302
+ );
303
+
288
304
  export const GitSha: string = process.env["GIT_SHA"] || "unknown";
289
305
 
290
306
  export const AppVersion: string = process.env["APP_VERSION"] || "unknown";
@@ -9,6 +9,8 @@ import {
9
9
  ClickhouseTlsCert,
10
10
  ClickhouseTlsKey,
11
11
  ClickhouseUsername,
12
+ MaxClickhouseConnections,
13
+ MaxClickhouseIngestConnections,
12
14
  ShouldClickhouseSslEnable,
13
15
  } from "../EnvironmentConfig";
14
16
  import Hostname from "../../Types/API/Hostname";
@@ -35,6 +37,13 @@ const options: ClickHouseClientConfigOptions = {
35
37
  * aggregation statements provides the hard server-side cap.
36
38
  */
37
39
  request_timeout: 58_000,
40
+ /*
41
+ * @clickhouse/client defaults max_open_connections to 10. Sized for the
42
+ * query pool (dashboard reads, DDL); ingest writes use a separate pool
43
+ * (see ingestDataSourceOptions) so a burst of inserts cannot starve
44
+ * user-facing queries of HTTP sockets.
45
+ */
46
+ max_open_connections: MaxClickhouseConnections,
38
47
  };
39
48
 
40
49
  if (ShouldClickhouseSslEnable && ClickhouseTlsCa) {
@@ -58,5 +67,10 @@ if (
58
67
 
59
68
  export const dataSourceOptions: ClickHouseClientConfigOptions = options;
60
69
 
70
+ export const ingestDataSourceOptions: ClickHouseClientConfigOptions = {
71
+ ...options,
72
+ max_open_connections: MaxClickhouseIngestConnections,
73
+ };
74
+
61
75
  export const testDataSourceOptions: ClickHouseClientConfigOptions =
62
76
  dataSourceOptions;
@@ -2,6 +2,7 @@ import logger from "../Utils/Logger";
2
2
  import {
3
3
  ClickHouseClientConfigOptions,
4
4
  dataSourceOptions,
5
+ ingestDataSourceOptions,
5
6
  testDataSourceOptions,
6
7
  } from "./ClickhouseConfig";
7
8
  import { PingResult, createClient, ClickHouseClient } from "@clickhouse/client";
@@ -18,9 +19,16 @@ export type ClickhouseClient = ClickHouseClient;
18
19
 
19
20
  export default class ClickhouseDatabase {
20
21
  private dataSource!: ClickhouseClient | null;
22
+ private options: ClickHouseClientConfigOptions;
23
+
24
+ public constructor(
25
+ options: ClickHouseClientConfigOptions = dataSourceOptions,
26
+ ) {
27
+ this.options = options;
28
+ }
21
29
 
22
30
  public getDatasourceOptions(): ClickHouseClientConfigOptions {
23
- return dataSourceOptions;
31
+ return this.options;
24
32
  }
25
33
 
26
34
  public getTestDatasourceOptions(): ClickHouseClientConfigOptions {
@@ -161,5 +169,14 @@ export default class ClickhouseDatabase {
161
169
  }
162
170
  }
163
171
 
164
- export const ClickhouseAppInstance: ClickhouseDatabase =
165
- new ClickhouseDatabase();
172
+ export const ClickhouseAppInstance: ClickhouseDatabase = new ClickhouseDatabase(
173
+ dataSourceOptions,
174
+ );
175
+
176
+ /*
177
+ * Separate pool for high-volume telemetry inserts. Reads/DDL keep using
178
+ * ClickhouseAppInstance so dashboard queries are not starved of HTTP
179
+ * sockets when ingest is bursting.
180
+ */
181
+ export const ClickhouseIngestInstance: ClickhouseDatabase =
182
+ new ClickhouseDatabase(ingestDataSourceOptions);
@@ -0,0 +1,61 @@
1
+ interface CacheEntry<T> {
2
+ value: T;
3
+ expiresAt: number;
4
+ }
5
+
6
+ /**
7
+ * Bounded, in-process TTL cache. Entries expire on read after their TTL and the
8
+ * oldest entry is evicted when capacity is reached (Map preserves insertion
9
+ * order, which we use as a coarse LRU on writes).
10
+ *
11
+ * Each process holds its own copy — there is no cross-process invalidation.
12
+ * Callers that need stronger consistency should pair the TTL with an explicit
13
+ * `delete()` on writes to the underlying data.
14
+ */
15
+ export default class InMemoryTTLCache<T> {
16
+ private store: Map<string, CacheEntry<T>> = new Map();
17
+ private maxEntries: number;
18
+
19
+ public constructor(maxEntries: number = 10_000) {
20
+ this.maxEntries = maxEntries;
21
+ }
22
+
23
+ public set(key: string, value: T, ttlMs: number): void {
24
+ if (this.store.size >= this.maxEntries && !this.store.has(key)) {
25
+ const oldest: string | undefined = this.store.keys().next().value;
26
+ if (oldest !== undefined) {
27
+ this.store.delete(oldest);
28
+ }
29
+ }
30
+ this.store.delete(key);
31
+ this.store.set(key, { value, expiresAt: Date.now() + ttlMs });
32
+ }
33
+
34
+ public get(key: string): T | undefined {
35
+ const entry: CacheEntry<T> | undefined = this.store.get(key);
36
+ if (!entry) {
37
+ return undefined;
38
+ }
39
+ if (Date.now() > entry.expiresAt) {
40
+ this.store.delete(key);
41
+ return undefined;
42
+ }
43
+ return entry.value;
44
+ }
45
+
46
+ public has(key: string): boolean {
47
+ return this.get(key) !== undefined;
48
+ }
49
+
50
+ public delete(key: string): void {
51
+ this.store.delete(key);
52
+ }
53
+
54
+ public clear(): void {
55
+ this.store.clear();
56
+ }
57
+
58
+ public size(): number {
59
+ return this.store.size;
60
+ }
61
+ }
@@ -3,7 +3,7 @@ import { MigrationInterface, QueryRunner } from "typeorm";
3
3
  export class AddTelemetryRetentionConfig1779199346010
4
4
  implements MigrationInterface
5
5
  {
6
- name = "AddTelemetryRetentionConfig1779199346010";
6
+ public name: string = "AddTelemetryRetentionConfig1779199346010";
7
7
 
8
8
  public async up(queryRunner: QueryRunner): Promise<void> {
9
9
  await queryRunner.query(