@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.
- package/Models/AnalyticsModels/ExceptionInstance.ts +47 -1
- package/Models/AnalyticsModels/Log.ts +47 -1
- package/Models/AnalyticsModels/Metric.ts +1 -7
- package/Models/AnalyticsModels/Profile.ts +47 -1
- package/Models/AnalyticsModels/ProfileSample.ts +47 -1
- package/Models/AnalyticsModels/Span.ts +47 -1
- package/Models/DatabaseModels/Alert.ts +332 -0
- package/Models/DatabaseModels/DockerHost.ts +83 -0
- package/Models/DatabaseModels/Host.ts +83 -0
- package/Models/DatabaseModels/Incident.ts +332 -0
- package/Models/DatabaseModels/Index.ts +0 -2
- package/Models/DatabaseModels/KubernetesCluster.ts +83 -0
- package/Models/DatabaseModels/RunbookAgent.ts +16 -2
- package/Server/EnvironmentConfig.ts +16 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +14 -0
- package/Server/Infrastructure/ClickhouseDatabase.ts +20 -3
- package/Server/Infrastructure/InMemoryTTLCache.ts +61 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779199346010-AddTelemetryRetentionConfig.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.ts +50 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779302536475-AttachKubernetesAndDockerToIncidentAndAlert.ts +253 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779303924241-AttachServiceToIncidentAndAlert.ts +60 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Middleware/TelemetryIngest.ts +6 -38
- package/Server/Middleware/UserAuthorization.ts +1 -11
- package/Server/Services/AlertService.ts +2 -4
- package/Server/Services/AnalyticsDatabaseService.ts +33 -1
- package/Server/Services/IncidentService.ts +2 -4
- package/Server/Services/Index.ts +0 -2
- package/Server/Services/LogAggregationService.ts +54 -6
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +6 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +1 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +17 -0
- package/Server/Services/OpenTelemetryIngestService.ts +132 -0
- package/Server/Services/TelemetryIngestionKeyService.ts +90 -1
- package/Server/Services/TraceAggregationService.ts +83 -8
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +2 -4
- package/Server/Utils/Telemetry/Telemetry.ts +38 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +5 -7
- package/Types/Dashboard/DashboardComponentType.ts +0 -1
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardTableComponent.ts +74 -1
- package/Types/Dashboard/DashboardTemplates.ts +164 -51
- package/Types/Monitor/MonitorType.ts +1 -1
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +36 -9
- package/Types/Permission.ts +0 -46
- package/Types/Telemetry/ServiceType.ts +19 -0
- package/UI/Components/Forms/Validation.ts +2 -2
- package/UI/Components/LogsViewer/LogsViewer.tsx +135 -17
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +84 -1
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -1
- package/Utils/Dashboard/Components/DashboardTableComponent.ts +80 -17
- package/Utils/Dashboard/Components/Index.ts +0 -7
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +41 -1
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js +41 -1
- package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Metric.js +0 -7
- package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Profile.js +41 -1
- package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js +41 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +41 -1
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Alert.js +324 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +84 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +84 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +324 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +0 -2
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +84 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookAgent.js +16 -2
- package/build/dist/Models/DatabaseModels/RunbookAgent.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +8 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +9 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +12 -3
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
- package/build/dist/Server/Infrastructure/InMemoryTTLCache.js +49 -0
- package/build/dist/Server/Infrastructure/InMemoryTTLCache.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779199346010-AddTelemetryRetentionConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.js +42 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779277271302-DropServiceDependencyTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779282769946-AddTelemetryRetentionToHostDockerKubernetes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779302536475-AttachKubernetesAndDockerToIncidentAndAlert.js +100 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779302536475-AttachKubernetesAndDockerToIncidentAndAlert.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779303924241-AttachServiceToIncidentAndAlert.js +28 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779303924241-AttachServiceToIncidentAndAlert.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +2 -26
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +1 -7
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +2 -1
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -2
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +2 -1
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +0 -2
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +46 -4
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +28 -24
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +18 -2
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +103 -0
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +83 -0
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +66 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +2 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +26 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +3 -7
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +0 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardTableComponent.js +13 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardTableComponent.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +142 -42
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +1 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +27 -7
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/Types/Permission.js +0 -40
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +20 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -0
- package/build/dist/UI/Components/Forms/Validation.js +2 -2
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +106 -16
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +67 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardTableComponent.js +68 -16
- package/build/dist/Utils/Dashboard/Components/DashboardTableComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/Index.js +0 -4
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/package.json +1 -2
- package/Models/DatabaseModels/ServiceDependency.ts +0 -529
- package/Server/Services/ServiceDependencyService.ts +0 -48
- package/Types/Dashboard/DashboardComponents/DashboardHostMetricChartComponent.ts +0 -27
- package/Typings/elkjs.d.ts +0 -30
- package/UI/Components/Graphs/ServiceDependencyGraph.tsx +0 -286
- package/Utils/Dashboard/Components/DashboardHostMetricChartComponent.ts +0 -132
- package/build/dist/Models/DatabaseModels/ServiceDependency.js +0 -545
- package/build/dist/Models/DatabaseModels/ServiceDependency.js.map +0 -1
- package/build/dist/Server/Services/ServiceDependencyService.js +0 -47
- package/build/dist/Server/Services/ServiceDependencyService.js.map +0 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardHostMetricChartComponent.js +0 -11
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardHostMetricChartComponent.js.map +0 -1
- package/build/dist/UI/Components/Graphs/ServiceDependencyGraph.js +0 -206
- package/build/dist/UI/Components/Graphs/ServiceDependencyGraph.js.map +0 -1
- package/build/dist/Utils/Dashboard/Components/DashboardHostMetricChartComponent.js +0 -113
- 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
|
|
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
|
-
|
|
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
|
+
}
|
package/Server/Infrastructure/Postgres/SchemaMigrations/1779199346010-AddTelemetryRetentionConfig.ts
CHANGED
|
@@ -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(
|