@oneuptime/common 10.0.71 → 10.0.73
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/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Project.ts +26 -0
- package/Models/DatabaseModels/Service.ts +2 -2
- package/Models/DatabaseModels/StatusPage.ts +80 -0
- package/Server/API/StatusPageAPI.ts +4 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776940714709-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776971364783-AddStatusPageLanguageSettings.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1777018175127-AddTelemetryRetentionSettings.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Services/AnalyticsDatabaseService.ts +17 -7
- package/Server/Services/OpenTelemetryIngestService.ts +36 -5
- package/Server/Services/ServiceService.ts +27 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +175 -29
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +71 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +91 -7
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +171 -2
- package/Server/Utils/Monitor/MonitorIncident.ts +133 -8
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +423 -1
- package/Server/Utils/Monitor/MonitorResource.ts +2 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +99 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +268 -0
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +33 -0
- package/Types/Infrastructure/BasicMetrics.ts +75 -0
- package/Types/Metrics/MetricQueryData.ts +11 -0
- package/Types/Monitor/CriteriaFilter.ts +10 -0
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +11 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +10 -0
- package/Types/Monitor/MetricMonitor/MetricSeriesResult.ts +20 -0
- package/Types/Monitor/MonitorMetricType.ts +34 -0
- package/Types/Monitor/ServerMonitor/ServerMonitorResponse.ts +8 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +25 -0
- package/Types/StatusPage/StatusPageLanguage.ts +30 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +17 -12
- package/UI/Components/Charts/Bar/BarChart.tsx +16 -11
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -0
- package/UI/Components/Charts/Line/LineChart.tsx +16 -11
- package/UI/Components/Filters/FiltersForm.tsx +26 -2
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +453 -0
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +229 -0
- package/Utils/Metrics/MetricSeriesFingerprint.ts +97 -0
- package/Utils/Monitor/MonitorMetricType.ts +309 -19
- package/build/dist/Models/DatabaseModels/Alert.js +57 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +57 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +27 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +1 -2
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +82 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +4 -0
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776940714709-MigrationName.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776940714709-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776971364783-AddStatusPageLanguageSettings.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776971364783-AddStatusPageLanguageSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1777018175127-AddTelemetryRetentionSettings.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1777018175127-AddTelemetryRetentionSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +14 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +30 -4
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +22 -1
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +132 -30
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +58 -7
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +66 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +112 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +91 -15
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +373 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +2 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +65 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js +199 -0
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +22 -0
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js +10 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MetricMonitor/MetricSeriesResult.js +2 -0
- package/build/dist/Types/Monitor/MetricMonitor/MetricSeriesResult.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js +28 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +22 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -12
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +12 -11
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +11 -3
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +12 -11
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Filters/FiltersForm.js +6 -2
- package/build/dist/UI/Components/Filters/FiltersForm.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +383 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +109 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricSeriesFingerprint.js +81 -0
- package/build/dist/Utils/Metrics/MetricSeriesFingerprint.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js +287 -19
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/package.json +1 -1
|
@@ -975,6 +975,61 @@ export default class Alert extends BaseModel {
|
|
|
975
975
|
})
|
|
976
976
|
public createdCriteriaId?: string = undefined;
|
|
977
977
|
|
|
978
|
+
@ColumnAccessControl({
|
|
979
|
+
create: [],
|
|
980
|
+
read: [
|
|
981
|
+
Permission.ProjectOwner,
|
|
982
|
+
Permission.ProjectAdmin,
|
|
983
|
+
Permission.ProjectMember,
|
|
984
|
+
Permission.Viewer,
|
|
985
|
+
Permission.AlertManager,
|
|
986
|
+
Permission.ReadAlert,
|
|
987
|
+
Permission.ReadAllProjectResources,
|
|
988
|
+
],
|
|
989
|
+
update: [],
|
|
990
|
+
})
|
|
991
|
+
@Index()
|
|
992
|
+
@TableColumn({
|
|
993
|
+
type: TableColumnType.LongText,
|
|
994
|
+
required: false,
|
|
995
|
+
isDefaultValueColumn: false,
|
|
996
|
+
title: "Series Fingerprint",
|
|
997
|
+
description:
|
|
998
|
+
"For metric monitors with per-series alerting (e.g. grouped by host.name), this is a stable hash of the series label values so one alert is created per affected series.",
|
|
999
|
+
})
|
|
1000
|
+
@Column({
|
|
1001
|
+
type: ColumnType.LongText,
|
|
1002
|
+
nullable: true,
|
|
1003
|
+
})
|
|
1004
|
+
public seriesFingerprint?: string = undefined;
|
|
1005
|
+
|
|
1006
|
+
@ColumnAccessControl({
|
|
1007
|
+
create: [],
|
|
1008
|
+
read: [
|
|
1009
|
+
Permission.ProjectOwner,
|
|
1010
|
+
Permission.ProjectAdmin,
|
|
1011
|
+
Permission.ProjectMember,
|
|
1012
|
+
Permission.Viewer,
|
|
1013
|
+
Permission.AlertManager,
|
|
1014
|
+
Permission.ReadAlert,
|
|
1015
|
+
Permission.ReadAllProjectResources,
|
|
1016
|
+
],
|
|
1017
|
+
update: [],
|
|
1018
|
+
})
|
|
1019
|
+
@TableColumn({
|
|
1020
|
+
type: TableColumnType.JSON,
|
|
1021
|
+
required: false,
|
|
1022
|
+
isDefaultValueColumn: false,
|
|
1023
|
+
title: "Series Labels",
|
|
1024
|
+
description:
|
|
1025
|
+
"Attribute key/value pairs that identify the affected series (e.g. {host.name: prod-db-01}) when this alert was created from a per-series metric breach.",
|
|
1026
|
+
})
|
|
1027
|
+
@Column({
|
|
1028
|
+
type: ColumnType.JSON,
|
|
1029
|
+
nullable: true,
|
|
1030
|
+
})
|
|
1031
|
+
public seriesLabels?: JSONObject = undefined;
|
|
1032
|
+
|
|
978
1033
|
@ColumnAccessControl({
|
|
979
1034
|
create: [],
|
|
980
1035
|
read: [
|
|
@@ -1456,6 +1456,61 @@ export default class Incident extends BaseModel {
|
|
|
1456
1456
|
})
|
|
1457
1457
|
public createdIncidentTemplateId?: string = undefined;
|
|
1458
1458
|
|
|
1459
|
+
@ColumnAccessControl({
|
|
1460
|
+
create: [],
|
|
1461
|
+
read: [
|
|
1462
|
+
Permission.ProjectOwner,
|
|
1463
|
+
Permission.ProjectAdmin,
|
|
1464
|
+
Permission.ProjectMember,
|
|
1465
|
+
Permission.Viewer,
|
|
1466
|
+
Permission.IncidentManager,
|
|
1467
|
+
Permission.ReadProjectIncident,
|
|
1468
|
+
Permission.ReadAllProjectResources,
|
|
1469
|
+
],
|
|
1470
|
+
update: [],
|
|
1471
|
+
})
|
|
1472
|
+
@Index()
|
|
1473
|
+
@TableColumn({
|
|
1474
|
+
type: TableColumnType.LongText,
|
|
1475
|
+
required: false,
|
|
1476
|
+
isDefaultValueColumn: false,
|
|
1477
|
+
title: "Series Fingerprint",
|
|
1478
|
+
description:
|
|
1479
|
+
"For metric monitors with per-series alerting (e.g. grouped by host.name), this is a stable hash of the series label values so one incident is created per affected series.",
|
|
1480
|
+
})
|
|
1481
|
+
@Column({
|
|
1482
|
+
type: ColumnType.LongText,
|
|
1483
|
+
nullable: true,
|
|
1484
|
+
})
|
|
1485
|
+
public seriesFingerprint?: string = undefined;
|
|
1486
|
+
|
|
1487
|
+
@ColumnAccessControl({
|
|
1488
|
+
create: [],
|
|
1489
|
+
read: [
|
|
1490
|
+
Permission.ProjectOwner,
|
|
1491
|
+
Permission.ProjectAdmin,
|
|
1492
|
+
Permission.ProjectMember,
|
|
1493
|
+
Permission.Viewer,
|
|
1494
|
+
Permission.IncidentManager,
|
|
1495
|
+
Permission.ReadProjectIncident,
|
|
1496
|
+
Permission.ReadAllProjectResources,
|
|
1497
|
+
],
|
|
1498
|
+
update: [],
|
|
1499
|
+
})
|
|
1500
|
+
@TableColumn({
|
|
1501
|
+
type: TableColumnType.JSON,
|
|
1502
|
+
required: false,
|
|
1503
|
+
isDefaultValueColumn: false,
|
|
1504
|
+
title: "Series Labels",
|
|
1505
|
+
description:
|
|
1506
|
+
"Attribute key/value pairs that identify the affected series (e.g. {host.name: prod-db-01}) when this incident was created from a per-series metric breach.",
|
|
1507
|
+
})
|
|
1508
|
+
@Column({
|
|
1509
|
+
type: ColumnType.JSON,
|
|
1510
|
+
nullable: true,
|
|
1511
|
+
})
|
|
1512
|
+
public seriesLabels?: JSONObject = undefined;
|
|
1513
|
+
|
|
1459
1514
|
@ColumnAccessControl({
|
|
1460
1515
|
create: [],
|
|
1461
1516
|
read: [
|
|
@@ -2049,6 +2049,32 @@ export default class Project extends TenantModel {
|
|
|
2049
2049
|
})
|
|
2050
2050
|
public defaultMetricCardinalityBudget?: number = undefined;
|
|
2051
2051
|
|
|
2052
|
+
@ColumnAccessControl({
|
|
2053
|
+
create: [],
|
|
2054
|
+
read: [
|
|
2055
|
+
Permission.ProjectOwner,
|
|
2056
|
+
Permission.ProjectAdmin,
|
|
2057
|
+
Permission.ProjectMember,
|
|
2058
|
+
Permission.Viewer,
|
|
2059
|
+
Permission.ReadProject,
|
|
2060
|
+
Permission.ReadAllProjectResources,
|
|
2061
|
+
],
|
|
2062
|
+
update: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
|
2063
|
+
})
|
|
2064
|
+
@TableColumn({
|
|
2065
|
+
type: TableColumnType.Number,
|
|
2066
|
+
required: false,
|
|
2067
|
+
title: "Default Telemetry Data Retention (Days)",
|
|
2068
|
+
description:
|
|
2069
|
+
"Project-wide default number of days to retain telemetry data (logs, traces, metrics). Services without a per-service override use this value.",
|
|
2070
|
+
})
|
|
2071
|
+
@Column({
|
|
2072
|
+
type: ColumnType.Number,
|
|
2073
|
+
nullable: false,
|
|
2074
|
+
default: 15,
|
|
2075
|
+
})
|
|
2076
|
+
public defaultTelemetryRetentionInDays?: number = undefined;
|
|
2077
|
+
|
|
2052
2078
|
@ColumnAccessControl({
|
|
2053
2079
|
create: [],
|
|
2054
2080
|
read: [
|
|
@@ -627,13 +627,13 @@ export default class Service extends BaseModel {
|
|
|
627
627
|
@TableColumn({
|
|
628
628
|
type: TableColumnType.Number,
|
|
629
629
|
title: "Retain Telemetry Data For Days",
|
|
630
|
-
description:
|
|
630
|
+
description:
|
|
631
|
+
"Number of days to retain telemetry data for this service. Leave blank to use the project-wide default.",
|
|
631
632
|
})
|
|
632
633
|
@Column({
|
|
633
634
|
type: ColumnType.Number,
|
|
634
635
|
nullable: true,
|
|
635
636
|
unique: false,
|
|
636
|
-
default: 15,
|
|
637
637
|
})
|
|
638
638
|
public retainTelemetryDataForDays?: number = undefined;
|
|
639
639
|
|
|
@@ -43,6 +43,7 @@ import {
|
|
|
43
43
|
ManyToOne,
|
|
44
44
|
} from "typeorm";
|
|
45
45
|
import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
|
|
46
|
+
import { DEFAULT_STATUS_PAGE_LANGUAGE } from "../../Types/StatusPage/StatusPageLanguage";
|
|
46
47
|
|
|
47
48
|
@EnableDocumentation()
|
|
48
49
|
@EnableMCP()
|
|
@@ -2991,4 +2992,83 @@ export default class StatusPage extends BaseModel {
|
|
|
2991
2992
|
create: PlanType.Free,
|
|
2992
2993
|
})
|
|
2993
2994
|
public embeddedOverallStatusToken?: string = undefined;
|
|
2995
|
+
|
|
2996
|
+
@ColumnAccessControl({
|
|
2997
|
+
create: [
|
|
2998
|
+
Permission.ProjectOwner,
|
|
2999
|
+
Permission.ProjectAdmin,
|
|
3000
|
+
Permission.ProjectMember,
|
|
3001
|
+
Permission.StatusPageManager,
|
|
3002
|
+
Permission.CreateProjectStatusPage,
|
|
3003
|
+
],
|
|
3004
|
+
read: [
|
|
3005
|
+
Permission.ProjectOwner,
|
|
3006
|
+
Permission.ProjectAdmin,
|
|
3007
|
+
Permission.ProjectMember,
|
|
3008
|
+
Permission.Viewer,
|
|
3009
|
+
Permission.StatusPageManager,
|
|
3010
|
+
Permission.ReadProjectStatusPage,
|
|
3011
|
+
Permission.ReadAllProjectResources,
|
|
3012
|
+
],
|
|
3013
|
+
update: [
|
|
3014
|
+
Permission.ProjectOwner,
|
|
3015
|
+
Permission.ProjectAdmin,
|
|
3016
|
+
Permission.ProjectMember,
|
|
3017
|
+
Permission.StatusPageManager,
|
|
3018
|
+
Permission.EditProjectStatusPage,
|
|
3019
|
+
],
|
|
3020
|
+
})
|
|
3021
|
+
@TableColumn({
|
|
3022
|
+
type: TableColumnType.ShortText,
|
|
3023
|
+
title: "Default Language",
|
|
3024
|
+
required: false,
|
|
3025
|
+
defaultValue: DEFAULT_STATUS_PAGE_LANGUAGE,
|
|
3026
|
+
description:
|
|
3027
|
+
"Default language that the status page is shown in when a visitor arrives for the first time.",
|
|
3028
|
+
})
|
|
3029
|
+
@Column({
|
|
3030
|
+
type: ColumnType.ShortText,
|
|
3031
|
+
nullable: true,
|
|
3032
|
+
default: DEFAULT_STATUS_PAGE_LANGUAGE,
|
|
3033
|
+
})
|
|
3034
|
+
public defaultLanguage?: string = undefined;
|
|
3035
|
+
|
|
3036
|
+
@ColumnAccessControl({
|
|
3037
|
+
create: [
|
|
3038
|
+
Permission.ProjectOwner,
|
|
3039
|
+
Permission.ProjectAdmin,
|
|
3040
|
+
Permission.ProjectMember,
|
|
3041
|
+
Permission.StatusPageManager,
|
|
3042
|
+
Permission.CreateProjectStatusPage,
|
|
3043
|
+
],
|
|
3044
|
+
read: [
|
|
3045
|
+
Permission.ProjectOwner,
|
|
3046
|
+
Permission.ProjectAdmin,
|
|
3047
|
+
Permission.ProjectMember,
|
|
3048
|
+
Permission.Viewer,
|
|
3049
|
+
Permission.StatusPageManager,
|
|
3050
|
+
Permission.ReadProjectStatusPage,
|
|
3051
|
+
Permission.ReadAllProjectResources,
|
|
3052
|
+
],
|
|
3053
|
+
update: [
|
|
3054
|
+
Permission.ProjectOwner,
|
|
3055
|
+
Permission.ProjectAdmin,
|
|
3056
|
+
Permission.ProjectMember,
|
|
3057
|
+
Permission.StatusPageManager,
|
|
3058
|
+
Permission.EditProjectStatusPage,
|
|
3059
|
+
],
|
|
3060
|
+
})
|
|
3061
|
+
@TableColumn({
|
|
3062
|
+
isDefaultValueColumn: false,
|
|
3063
|
+
required: false,
|
|
3064
|
+
type: TableColumnType.JSON,
|
|
3065
|
+
title: "Enabled Languages",
|
|
3066
|
+
description:
|
|
3067
|
+
"Languages offered in the footer language switcher. Leave empty to offer all supported languages.",
|
|
3068
|
+
})
|
|
3069
|
+
@Column({
|
|
3070
|
+
type: ColumnType.JSON,
|
|
3071
|
+
nullable: true,
|
|
3072
|
+
})
|
|
3073
|
+
public enabledLanguages?: Array<string> = undefined;
|
|
2994
3074
|
}
|
|
@@ -225,6 +225,7 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
225
225
|
pageTitle: true,
|
|
226
226
|
pageDescription: true,
|
|
227
227
|
name: true,
|
|
228
|
+
defaultLanguage: true,
|
|
228
229
|
},
|
|
229
230
|
props: {
|
|
230
231
|
isRoot: true,
|
|
@@ -244,6 +245,7 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
244
245
|
title: statusPage.pageTitle || statusPage.name,
|
|
245
246
|
description: statusPage.pageDescription,
|
|
246
247
|
_id: statusPage._id?.toString(),
|
|
248
|
+
defaultLanguage: statusPage.defaultLanguage || null,
|
|
247
249
|
});
|
|
248
250
|
},
|
|
249
251
|
);
|
|
@@ -883,6 +885,8 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
883
885
|
showAnnouncementsOnStatusPage: true,
|
|
884
886
|
showScheduledMaintenanceEventsOnStatusPage: true,
|
|
885
887
|
showSubscriberPageOnStatusPage: true,
|
|
888
|
+
defaultLanguage: true,
|
|
889
|
+
enabledLanguages: true,
|
|
886
890
|
};
|
|
887
891
|
|
|
888
892
|
const hasEnabledSSO: PositiveNumber =
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
export class MigrationName1776940714709 implements MigrationInterface {
|
|
4
|
+
public name = "MigrationName1776940714709";
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(
|
|
8
|
+
`ALTER TABLE "Incident" ADD "seriesFingerprint" character varying`,
|
|
9
|
+
);
|
|
10
|
+
await queryRunner.query(`ALTER TABLE "Incident" ADD "seriesLabels" jsonb`);
|
|
11
|
+
await queryRunner.query(
|
|
12
|
+
`ALTER TABLE "Alert" ADD "seriesFingerprint" character varying`,
|
|
13
|
+
);
|
|
14
|
+
await queryRunner.query(`ALTER TABLE "Alert" ADD "seriesLabels" jsonb`);
|
|
15
|
+
await queryRunner.query(
|
|
16
|
+
`CREATE INDEX "IDX_865fc7905f35947b294ca36b83" ON "Incident" ("seriesFingerprint") `,
|
|
17
|
+
);
|
|
18
|
+
await queryRunner.query(
|
|
19
|
+
`CREATE INDEX "IDX_5705362784705d225735b1a844" ON "Alert" ("seriesFingerprint") `,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
24
|
+
await queryRunner.query(
|
|
25
|
+
`DROP INDEX "public"."IDX_5705362784705d225735b1a844"`,
|
|
26
|
+
);
|
|
27
|
+
await queryRunner.query(
|
|
28
|
+
`DROP INDEX "public"."IDX_865fc7905f35947b294ca36b83"`,
|
|
29
|
+
);
|
|
30
|
+
await queryRunner.query(`ALTER TABLE "Alert" DROP COLUMN "seriesLabels"`);
|
|
31
|
+
await queryRunner.query(
|
|
32
|
+
`ALTER TABLE "Alert" DROP COLUMN "seriesFingerprint"`,
|
|
33
|
+
);
|
|
34
|
+
await queryRunner.query(
|
|
35
|
+
`ALTER TABLE "Incident" DROP COLUMN "seriesLabels"`,
|
|
36
|
+
);
|
|
37
|
+
await queryRunner.query(
|
|
38
|
+
`ALTER TABLE "Incident" DROP COLUMN "seriesFingerprint"`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
export class AddStatusPageLanguageSettings1776971364783
|
|
4
|
+
implements MigrationInterface
|
|
5
|
+
{
|
|
6
|
+
public name: string = "AddStatusPageLanguageSettings1776971364783";
|
|
7
|
+
|
|
8
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
9
|
+
await queryRunner.query(
|
|
10
|
+
`ALTER TABLE "StatusPage" ADD "defaultLanguage" character varying DEFAULT 'en'`,
|
|
11
|
+
);
|
|
12
|
+
await queryRunner.query(
|
|
13
|
+
`ALTER TABLE "StatusPage" ADD "enabledLanguages" jsonb`,
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
18
|
+
await queryRunner.query(
|
|
19
|
+
`ALTER TABLE "StatusPage" DROP COLUMN "enabledLanguages"`,
|
|
20
|
+
);
|
|
21
|
+
await queryRunner.query(
|
|
22
|
+
`ALTER TABLE "StatusPage" DROP COLUMN "defaultLanguage"`,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
export class AddTelemetryRetentionSettings1777018175127
|
|
4
|
+
implements MigrationInterface
|
|
5
|
+
{
|
|
6
|
+
public name = "AddTelemetryRetentionSettings1777018175127";
|
|
7
|
+
|
|
8
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
9
|
+
await queryRunner.query(
|
|
10
|
+
`ALTER TABLE "Project" ADD COLUMN IF NOT EXISTS "defaultTelemetryRetentionInDays" integer NOT NULL DEFAULT '15'`,
|
|
11
|
+
);
|
|
12
|
+
await queryRunner.query(
|
|
13
|
+
`ALTER TABLE "Service" ALTER COLUMN "retainTelemetryDataForDays" DROP DEFAULT`,
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
18
|
+
await queryRunner.query(
|
|
19
|
+
`ALTER TABLE "Service" ALTER COLUMN "retainTelemetryDataForDays" SET DEFAULT '15'`,
|
|
20
|
+
);
|
|
21
|
+
await queryRunner.query(
|
|
22
|
+
`ALTER TABLE "Project" DROP COLUMN IF EXISTS "defaultTelemetryRetentionInDays"`,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -289,6 +289,9 @@ import { MigrationName1776761171349 } from "./1776761171349-MigrationName";
|
|
|
289
289
|
import { MigrationName1776801030808 } from "./1776801030808-MigrationName";
|
|
290
290
|
import { MigrationName1776865086264 } from "./1776865086264-MigrationName";
|
|
291
291
|
import { DedupeKubernetesClustersAndAddUniqueIndex1776881254913 } from "./1776881254913-DedupeKubernetesClustersAndAddUniqueIndex";
|
|
292
|
+
import { MigrationName1776940714709 } from "./1776940714709-MigrationName";
|
|
293
|
+
import { AddStatusPageLanguageSettings1776971364783 } from "./1776971364783-AddStatusPageLanguageSettings";
|
|
294
|
+
import { AddTelemetryRetentionSettings1777018175127 } from "./1777018175127-AddTelemetryRetentionSettings";
|
|
292
295
|
export default [
|
|
293
296
|
InitialMigration,
|
|
294
297
|
MigrationName1717678334852,
|
|
@@ -581,4 +584,7 @@ export default [
|
|
|
581
584
|
MigrationName1776801030808,
|
|
582
585
|
MigrationName1776865086264,
|
|
583
586
|
DedupeKubernetesClustersAndAddUniqueIndex1776881254913,
|
|
587
|
+
MigrationName1776940714709,
|
|
588
|
+
AddStatusPageLanguageSettings1776971364783,
|
|
589
|
+
AddTelemetryRetentionSettings1777018175127,
|
|
584
590
|
];
|
|
@@ -454,10 +454,9 @@ export default class AnalyticsDatabaseService<
|
|
|
454
454
|
|
|
455
455
|
// convert date column from string to date.
|
|
456
456
|
|
|
457
|
-
const
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
: undefined;
|
|
457
|
+
const groupByColumnNames: Array<string> = aggregateBy.groupBy
|
|
458
|
+
? Object.keys(aggregateBy.groupBy)
|
|
459
|
+
: [];
|
|
461
460
|
|
|
462
461
|
for (const item of items) {
|
|
463
462
|
if (
|
|
@@ -483,6 +482,14 @@ export default class AnalyticsDatabaseService<
|
|
|
483
482
|
);
|
|
484
483
|
}
|
|
485
484
|
|
|
485
|
+
/*
|
|
486
|
+
* Preserve every group-by column on the aggregated row. The
|
|
487
|
+
* previous implementation only copied the first column, which
|
|
488
|
+
* silently dropped the rest when callers grouped by more than
|
|
489
|
+
* one dimension (e.g. attributes + name). `AggregatedModel`'s
|
|
490
|
+
* index signature already accepts arbitrary keys, so existing
|
|
491
|
+
* single-column consumers still work.
|
|
492
|
+
*/
|
|
486
493
|
const aggregatedModel: AggregatedModel = {
|
|
487
494
|
timestamp: OneUptimeDate.fromString(
|
|
488
495
|
(item as JSONObject)[
|
|
@@ -492,11 +499,14 @@ export default class AnalyticsDatabaseService<
|
|
|
492
499
|
value: (item as JSONObject)[
|
|
493
500
|
aggregateBy.aggregateColumnName as string
|
|
494
501
|
] as number,
|
|
495
|
-
[groupByColumnName as string]: (item as JSONObject)[
|
|
496
|
-
groupByColumnName as string
|
|
497
|
-
],
|
|
498
502
|
};
|
|
499
503
|
|
|
504
|
+
for (const groupByColumnName of groupByColumnNames) {
|
|
505
|
+
aggregatedModel[groupByColumnName] = (item as JSONObject)[
|
|
506
|
+
groupByColumnName
|
|
507
|
+
] as AggregatedModel[string];
|
|
508
|
+
}
|
|
509
|
+
|
|
500
510
|
aggregatedItems.push(aggregatedModel);
|
|
501
511
|
}
|
|
502
512
|
|
|
@@ -4,7 +4,9 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
4
4
|
import Metric, {
|
|
5
5
|
AggregationTemporality,
|
|
6
6
|
} from "../../Models/AnalyticsModels/Metric";
|
|
7
|
+
import Project from "../../Models/DatabaseModels/Project";
|
|
7
8
|
import Service from "../../Models/DatabaseModels/Service";
|
|
9
|
+
import ProjectService from "../../Server/Services/ProjectService";
|
|
8
10
|
import ServiceService from "../../Server/Services/ServiceService";
|
|
9
11
|
import { DEFAULT_RETENTION_IN_DAYS } from "../../Models/DatabaseModels/TelemetryUsageBilling";
|
|
10
12
|
import TelemetryUtil from "../../Server/Utils/Telemetry/Telemetry";
|
|
@@ -22,6 +24,25 @@ export interface TelemetryServiceMetadata {
|
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
export default class OTelIngestService {
|
|
27
|
+
@CaptureSpan()
|
|
28
|
+
private static async getProjectDefaultRetentionInDays(
|
|
29
|
+
projectId: ObjectID,
|
|
30
|
+
): Promise<number> {
|
|
31
|
+
const project: Project | null = await ProjectService.findOneById({
|
|
32
|
+
id: projectId,
|
|
33
|
+
select: {
|
|
34
|
+
defaultTelemetryRetentionInDays: true,
|
|
35
|
+
},
|
|
36
|
+
props: {
|
|
37
|
+
isRoot: true,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
project?.defaultTelemetryRetentionInDays || DEFAULT_RETENTION_IN_DAYS
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
25
46
|
@CaptureSpan()
|
|
26
47
|
public static async telemetryServiceFromName(data: {
|
|
27
48
|
serviceName: string;
|
|
@@ -45,12 +66,14 @@ export default class OTelIngestService {
|
|
|
45
66
|
});
|
|
46
67
|
|
|
47
68
|
if (!service) {
|
|
69
|
+
const projectDefaultRetention: number =
|
|
70
|
+
await this.getProjectDefaultRetentionInDays(data.projectId);
|
|
71
|
+
|
|
48
72
|
try {
|
|
49
73
|
const newService: Service = new Service();
|
|
50
74
|
newService.projectId = data.projectId;
|
|
51
75
|
newService.name = data.serviceName;
|
|
52
76
|
newService.description = data.serviceName;
|
|
53
|
-
newService.retainTelemetryDataForDays = DEFAULT_RETENTION_IN_DAYS;
|
|
54
77
|
|
|
55
78
|
const createdService: Service = await ServiceService.create({
|
|
56
79
|
data: newService,
|
|
@@ -61,7 +84,7 @@ export default class OTelIngestService {
|
|
|
61
84
|
|
|
62
85
|
return {
|
|
63
86
|
serviceId: createdService.id!,
|
|
64
|
-
dataRententionInDays:
|
|
87
|
+
dataRententionInDays: projectDefaultRetention,
|
|
65
88
|
};
|
|
66
89
|
} catch {
|
|
67
90
|
/*
|
|
@@ -87,7 +110,7 @@ export default class OTelIngestService {
|
|
|
87
110
|
serviceId: existingService.id!,
|
|
88
111
|
dataRententionInDays:
|
|
89
112
|
existingService.retainTelemetryDataForDays ||
|
|
90
|
-
|
|
113
|
+
projectDefaultRetention,
|
|
91
114
|
};
|
|
92
115
|
}
|
|
93
116
|
|
|
@@ -97,10 +120,18 @@ export default class OTelIngestService {
|
|
|
97
120
|
}
|
|
98
121
|
}
|
|
99
122
|
|
|
123
|
+
if (service.retainTelemetryDataForDays) {
|
|
124
|
+
return {
|
|
125
|
+
serviceId: service.id!,
|
|
126
|
+
dataRententionInDays: service.retainTelemetryDataForDays,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
100
130
|
return {
|
|
101
131
|
serviceId: service.id!,
|
|
102
|
-
dataRententionInDays:
|
|
103
|
-
|
|
132
|
+
dataRententionInDays: await this.getProjectDefaultRetentionInDays(
|
|
133
|
+
data.projectId,
|
|
134
|
+
),
|
|
104
135
|
};
|
|
105
136
|
}
|
|
106
137
|
@CaptureSpan()
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import CreateBy from "../Types/Database/CreateBy";
|
|
2
2
|
import { OnCreate } from "../Types/Database/Hooks";
|
|
3
3
|
import DatabaseService from "./DatabaseService";
|
|
4
|
+
import ProjectService from "./ProjectService";
|
|
4
5
|
import ArrayUtil from "../../Utils/Array";
|
|
5
6
|
import { BrightColors } from "../../Types/BrandColors";
|
|
6
7
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
7
8
|
import ObjectID from "../../Types/ObjectID";
|
|
8
9
|
import Model from "../../Models/DatabaseModels/Service";
|
|
10
|
+
import Project from "../../Models/DatabaseModels/Project";
|
|
9
11
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
10
12
|
|
|
13
|
+
const DEFAULT_TELEMETRY_RETENTION_IN_DAYS: number = 15;
|
|
14
|
+
|
|
11
15
|
export class Service extends DatabaseService<Model> {
|
|
12
16
|
public constructor() {
|
|
13
17
|
super(Model);
|
|
@@ -33,6 +37,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
33
37
|
const service: Model | null = await this.findOneById({
|
|
34
38
|
id: serviceId,
|
|
35
39
|
select: {
|
|
40
|
+
projectId: true,
|
|
36
41
|
retainTelemetryDataForDays: true,
|
|
37
42
|
},
|
|
38
43
|
props: {
|
|
@@ -44,7 +49,28 @@ export class Service extends DatabaseService<Model> {
|
|
|
44
49
|
throw new BadDataException("Service not found");
|
|
45
50
|
}
|
|
46
51
|
|
|
47
|
-
|
|
52
|
+
if (service.retainTelemetryDataForDays) {
|
|
53
|
+
return service.retainTelemetryDataForDays;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Fall back to project-level default.
|
|
57
|
+
if (service.projectId) {
|
|
58
|
+
const project: Project | null = await ProjectService.findOneById({
|
|
59
|
+
id: service.projectId,
|
|
60
|
+
select: {
|
|
61
|
+
defaultTelemetryRetentionInDays: true,
|
|
62
|
+
},
|
|
63
|
+
props: {
|
|
64
|
+
isRoot: true,
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
if (project?.defaultTelemetryRetentionInDays) {
|
|
69
|
+
return project.defaultTelemetryRetentionInDays;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return DEFAULT_TELEMETRY_RETENTION_IN_DAYS;
|
|
48
74
|
}
|
|
49
75
|
}
|
|
50
76
|
|