@oneuptime/common 7.0.3365 → 7.0.3377

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 (47) hide show
  1. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +4 -1
  2. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +81 -0
  3. package/Server/Utils/Monitor/DataToProcess.ts +3 -1
  4. package/Server/Utils/Monitor/MonitorResource.ts +14 -0
  5. package/Types/Monitor/CriteriaFilter.ts +8 -0
  6. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +11 -0
  7. package/Types/Monitor/MonitorCriteriaInstance.ts +89 -0
  8. package/Types/Monitor/MonitorStep.ts +26 -0
  9. package/Types/Monitor/MonitorStepMetricMonitor.ts +28 -0
  10. package/Types/Monitor/MonitorType.ts +1 -2
  11. package/Types/RollingTime/RollingTime.ts +24 -0
  12. package/Types/RollingTime/RollingTimeUtil.ts +98 -0
  13. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -1
  14. package/UI/Components/Date/StartAndEndDate.tsx +65 -71
  15. package/UI/Components/Filters/DateFilter.tsx +1 -1
  16. package/UI/Components/RollingTimePicker/RollingTimePicker.tsx +58 -0
  17. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +2 -1
  18. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  19. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +51 -0
  20. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -0
  21. package/build/dist/Server/Utils/Monitor/MonitorResource.js +11 -0
  22. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  23. package/build/dist/Types/Monitor/CriteriaFilter.js +2 -0
  24. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  25. package/build/dist/Types/Monitor/MetricMonitor/MetricMonitorResponse.js +2 -0
  26. package/build/dist/Types/Monitor/MetricMonitor/MetricMonitorResponse.js.map +1 -0
  27. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +76 -0
  28. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  29. package/build/dist/Types/Monitor/MonitorStep.js +18 -1
  30. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  31. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +19 -0
  32. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -0
  33. package/build/dist/Types/Monitor/MonitorType.js +1 -2
  34. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  35. package/build/dist/Types/RollingTime/RollingTime.js +25 -0
  36. package/build/dist/Types/RollingTime/RollingTime.js.map +1 -0
  37. package/build/dist/Types/RollingTime/RollingTimeUtil.js +74 -0
  38. package/build/dist/Types/RollingTime/RollingTimeUtil.js.map +1 -0
  39. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
  40. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  41. package/build/dist/UI/Components/Date/StartAndEndDate.js +33 -46
  42. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  43. package/build/dist/UI/Components/Filters/DateFilter.js +1 -1
  44. package/build/dist/UI/Components/Filters/DateFilter.js.map +1 -1
  45. package/build/dist/UI/Components/RollingTimePicker/RollingTimePicker.js +32 -0
  46. package/build/dist/UI/Components/RollingTimePicker/RollingTimePicker.js.map +1 -0
  47. package/package.json +2 -2
@@ -70,7 +70,10 @@ export default class APIRequestCriteria {
70
70
  }
71
71
 
72
72
  //check response code
73
- if (input.criteriaFilter.checkOn === CheckOn.ResponseStatusCode) {
73
+ if (
74
+ input.criteriaFilter.checkOn === CheckOn.ResponseStatusCode &&
75
+ (input.dataToProcess as ProbeMonitorResponse).responseCode
76
+ ) {
74
77
  threshold = CompareCriteria.convertToNumber(threshold);
75
78
 
76
79
  const value: Array<number> | number =
@@ -0,0 +1,81 @@
1
+ import AggregateModel from "../../../../Types/BaseDatabase/AggregatedModel";
2
+ import AggregatedResult from "../../../../Types/BaseDatabase/AggregatedResult";
3
+ import MetricQueryConfigData from "../../../../Types/Metrics/MetricQueryConfigData";
4
+ import MetricMonitorResponse from "../../../../Types/Monitor/MetricMonitor/MetricMonitorResponse";
5
+ import DataToProcess from "../DataToProcess";
6
+ import CompareCriteria from "./CompareCriteria";
7
+ import { CheckOn, CriteriaFilter } from "Common/Types/Monitor/CriteriaFilter";
8
+
9
+ export default class MetricMonitorCriteria {
10
+ public static async isMonitorInstanceCriteriaFilterMet(input: {
11
+ dataToProcess: DataToProcess;
12
+ criteriaFilter: CriteriaFilter;
13
+ }): Promise<string | null> {
14
+ // Metric Monitoring Checks
15
+
16
+ let threshold: number | string | undefined | null =
17
+ input.criteriaFilter.value;
18
+
19
+ if (input.criteriaFilter.checkOn === CheckOn.MetricValue) {
20
+ threshold = CompareCriteria.convertToNumber(threshold);
21
+
22
+ const metricAggregaredResult: Array<AggregatedResult> =
23
+ (input.dataToProcess as MetricMonitorResponse).metricResult || [];
24
+
25
+ const metricAlias: string =
26
+ input.criteriaFilter.metricMonitorOptions?.metricAlias || "";
27
+
28
+ const aggregatedResult: AggregatedResult | undefined =
29
+ metricAggregaredResult && metricAggregaredResult.length > 0
30
+ ? metricAggregaredResult[0]
31
+ : undefined;
32
+
33
+ if (metricAlias) {
34
+ // find the index of the alias in the dataToProcess.
35
+ const indexOfAlias: number = (
36
+ input.dataToProcess as MetricMonitorResponse
37
+ ).metricViewConfig.queryConfigs.findIndex(
38
+ (queryConfig: MetricQueryConfigData) => {
39
+ return queryConfig.metricAliasData?.metricVariable === metricAlias;
40
+ },
41
+ );
42
+
43
+ // now get the aggregated result for that alias
44
+ if (indexOfAlias !== -1) {
45
+ const aggregatedResultForAlias: AggregatedResult | undefined =
46
+ metricAggregaredResult[indexOfAlias];
47
+ if (aggregatedResultForAlias) {
48
+ const numbers: Array<number> = aggregatedResultForAlias.data.map(
49
+ (data: AggregateModel) => {
50
+ return data.value;
51
+ },
52
+ );
53
+
54
+ return CompareCriteria.compareCriteriaNumbers({
55
+ value: numbers,
56
+ threshold: threshold as number,
57
+ criteriaFilter: input.criteriaFilter,
58
+ });
59
+ }
60
+ }
61
+ }
62
+
63
+ // if there's no alias then this is the default case
64
+ if (aggregatedResult) {
65
+ const numbers: Array<number> = aggregatedResult.data.map(
66
+ (data: AggregateModel) => {
67
+ return data.value;
68
+ },
69
+ );
70
+
71
+ return CompareCriteria.compareCriteriaNumbers({
72
+ value: numbers,
73
+ threshold: threshold as number,
74
+ criteriaFilter: input.criteriaFilter,
75
+ });
76
+ }
77
+ }
78
+
79
+ return null;
80
+ }
81
+ }
@@ -3,12 +3,14 @@ import ServerMonitorResponse from "Common/Types/Monitor/ServerMonitor/ServerMoni
3
3
  import ProbeMonitorResponse from "Common/Types/Probe/ProbeMonitorResponse";
4
4
  import LogMonitorResponse from "Common/Types/Monitor/LogMonitor/LogMonitorResponse";
5
5
  import TraceMonitorResponse from "Common/Types/Monitor/TraceMonitor/TraceMonitorResponse";
6
+ import MetricMonitorResponse from "../../../Types/Monitor/MetricMonitor/MetricMonitorResponse";
6
7
 
7
8
  type DataToProcess =
8
9
  | ProbeMonitorResponse
9
10
  | IncomingMonitorRequest
10
11
  | ServerMonitorResponse
11
12
  | LogMonitorResponse
12
- | TraceMonitorResponse;
13
+ | TraceMonitorResponse
14
+ | MetricMonitorResponse;
13
15
 
14
16
  export default DataToProcess;
@@ -55,6 +55,7 @@ import Metric, {
55
55
  import MetricService from "../../Services/MetricService";
56
56
  import MonitorMetricType from "../../../Types/Monitor/MonitorMetricType";
57
57
  import TelemetryUtil from "../Telemetry/Telemetry";
58
+ import MetricMonitorCriteria from "./Criteria/MetricMonitorCriteria";
58
59
 
59
60
  export default class MonitorResourceUtil {
60
61
  public static async monitorResource(
@@ -1273,6 +1274,19 @@ export default class MonitorResourceUtil {
1273
1274
  }
1274
1275
  }
1275
1276
 
1277
+ if (input.monitor.monitorType === MonitorType.Metrics) {
1278
+ // check server monitor
1279
+ const logMonitorResult: string | null =
1280
+ await MetricMonitorCriteria.isMonitorInstanceCriteriaFilterMet({
1281
+ dataToProcess: input.dataToProcess,
1282
+ criteriaFilter: input.criteriaFilter,
1283
+ });
1284
+
1285
+ if (logMonitorResult) {
1286
+ return logMonitorResult;
1287
+ }
1288
+ }
1289
+
1276
1290
  if (input.monitor.monitorType === MonitorType.Traces) {
1277
1291
  // check server monitor
1278
1292
  const traceMonitorResult: string | null =
@@ -38,12 +38,19 @@ export enum CheckOn {
38
38
 
39
39
  // Trace monitors.
40
40
  SpanCount = "Span Count",
41
+
42
+ // Metric Monitors.
43
+ MetricValue = "Metric Value",
41
44
  }
42
45
 
43
46
  export interface ServerMonitorOptions {
44
47
  diskPath?: string | undefined;
45
48
  }
46
49
 
50
+ export interface MetricMonitorOptions {
51
+ metricAlias?: string | undefined;
52
+ }
53
+
47
54
  export enum EvaluateOverTimeType {
48
55
  Average = "Average",
49
56
  Sum = "Sum",
@@ -73,6 +80,7 @@ export interface EvaluateOverTimeOptions {
73
80
  export interface CriteriaFilter {
74
81
  checkOn: CheckOn;
75
82
  serverMonitorOptions?: ServerMonitorOptions | undefined;
83
+ metricMonitorOptions?: MetricMonitorOptions | undefined;
76
84
  filterType: FilterType | undefined;
77
85
  value: string | number | undefined;
78
86
  eveluateOverTime?: boolean | undefined;
@@ -0,0 +1,11 @@
1
+ import AggregatedResult from "../../BaseDatabase/AggregatedResult";
2
+ import InBetween from "../../BaseDatabase/InBetween";
3
+ import MetricsViewConfig from "../../Metrics/MetricsViewConfig";
4
+ import ObjectID from "../../ObjectID";
5
+
6
+ export default interface MetricMonitorResponse {
7
+ startAndEndDate?: InBetween<Date>;
8
+ metricResult: Array<AggregatedResult>;
9
+ metricViewConfig: MetricsViewConfig;
10
+ monitorId: ObjectID;
11
+ }
@@ -59,6 +59,9 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
59
59
  monitorType: MonitorType;
60
60
  monitorStatusId: ObjectID;
61
61
  monitorName: string;
62
+ metricOptions?: {
63
+ metricAliases: Array<string>;
64
+ };
62
65
  }): MonitorCriteriaInstance | null {
63
66
  if (arg.monitorType === MonitorType.IncomingRequest) {
64
67
  const monitorCriteriaInstance: MonitorCriteriaInstance =
@@ -114,6 +117,41 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
114
117
  return monitorCriteriaInstance;
115
118
  }
116
119
 
120
+ if (arg.monitorType === MonitorType.Metrics) {
121
+ const monitorCriteriaInstance: MonitorCriteriaInstance =
122
+ new MonitorCriteriaInstance();
123
+
124
+ monitorCriteriaInstance.data = {
125
+ id: ObjectID.generate().toString(),
126
+ monitorStatusId: arg.monitorStatusId,
127
+ filterCondition: FilterCondition.Any,
128
+ filters: [
129
+ {
130
+ checkOn: CheckOn.MetricValue,
131
+ filterType: FilterType.GreaterThan,
132
+ metricMonitorOptions: {
133
+ metricAlias:
134
+ arg.metricOptions &&
135
+ arg.metricOptions.metricAliases &&
136
+ arg.metricOptions.metricAliases.length > 0
137
+ ? arg.metricOptions.metricAliases[0]
138
+ : undefined,
139
+ },
140
+ value: 0, // if there are some logs then monitor is online.
141
+ },
142
+ ],
143
+ incidents: [],
144
+ alerts: [],
145
+ changeMonitorStatus: true,
146
+ createIncidents: false,
147
+ createAlerts: false,
148
+ name: `Check if ${arg.monitorName} is online`,
149
+ description: `This criteria checks if the ${arg.monitorName} is online`,
150
+ };
151
+
152
+ return monitorCriteriaInstance;
153
+ }
154
+
117
155
  if (arg.monitorType === MonitorType.Traces) {
118
156
  const monitorCriteriaInstance: MonitorCriteriaInstance =
119
157
  new MonitorCriteriaInstance();
@@ -278,6 +316,9 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
278
316
  incidentSeverityId: ObjectID;
279
317
  alertSeverityId: ObjectID;
280
318
  monitorName: string;
319
+ metricOptions?: {
320
+ metricAliases: Array<string>;
321
+ };
281
322
  }): MonitorCriteriaInstance {
282
323
  const monitorCriteriaInstance: MonitorCriteriaInstance =
283
324
  new MonitorCriteriaInstance();
@@ -415,6 +456,54 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
415
456
  };
416
457
  }
417
458
 
459
+ if (arg.monitorType === MonitorType.Metrics) {
460
+ monitorCriteriaInstance.data = {
461
+ id: ObjectID.generate().toString(),
462
+ monitorStatusId: arg.monitorStatusId,
463
+ filterCondition: FilterCondition.Any,
464
+ filters: [
465
+ {
466
+ checkOn: CheckOn.MetricValue,
467
+ filterType: FilterType.EqualTo,
468
+ metricMonitorOptions: {
469
+ metricAlias:
470
+ arg.metricOptions &&
471
+ arg.metricOptions.metricAliases &&
472
+ arg.metricOptions.metricAliases.length > 0
473
+ ? arg.metricOptions.metricAliases[0]
474
+ : undefined,
475
+ },
476
+ value: 0, // if there are no logs then the monitor is offline
477
+ },
478
+ ],
479
+ incidents: [
480
+ {
481
+ title: `${arg.monitorName} is offline`,
482
+ description: `${arg.monitorName} is currently offline.`,
483
+ incidentSeverityId: arg.incidentSeverityId,
484
+ autoResolveIncident: true,
485
+ id: ObjectID.generate().toString(),
486
+ onCallPolicyIds: [],
487
+ },
488
+ ],
489
+ alerts: [
490
+ {
491
+ title: `${arg.monitorName} is offline`,
492
+ description: `${arg.monitorName} is currently offline.`,
493
+ alertSeverityId: arg.alertSeverityId,
494
+ autoResolveAlert: true,
495
+ id: ObjectID.generate().toString(),
496
+ onCallPolicyIds: [],
497
+ },
498
+ ],
499
+ createAlerts: false,
500
+ changeMonitorStatus: true,
501
+ createIncidents: true,
502
+ name: `Check if ${arg.monitorName} is offline`,
503
+ description: `This criteria checks if the ${arg.monitorName} is offline`,
504
+ };
505
+ }
506
+
418
507
  if (arg.monitorType === MonitorType.Traces) {
419
508
  monitorCriteriaInstance.data = {
420
509
  id: ObjectID.generate().toString(),
@@ -20,6 +20,9 @@ import { FindOperator } from "typeorm";
20
20
  import MonitorStepTraceMonitor, {
21
21
  MonitorStepTraceMonitorUtil,
22
22
  } from "./MonitorStepTraceMonitor";
23
+ import MonitorStepMetricMonitor, {
24
+ MonitorStepMetricMonitorUtil,
25
+ } from "./MonitorStepMetricMonitor";
23
26
 
24
27
  export interface MonitorStepType {
25
28
  id: string;
@@ -50,6 +53,9 @@ export interface MonitorStepType {
50
53
 
51
54
  // trace monitor type.
52
55
  traceMonitor?: MonitorStepTraceMonitor | undefined;
56
+
57
+ // Metric Monitor
58
+ metricMonitor: MonitorStepMetricMonitor | undefined;
53
59
  }
54
60
 
55
61
  export default class MonitorStep extends DatabaseProperty {
@@ -72,6 +78,7 @@ export default class MonitorStep extends DatabaseProperty {
72
78
  browserTypes: undefined,
73
79
  logMonitor: undefined,
74
80
  traceMonitor: undefined,
81
+ metricMonitor: undefined,
75
82
  };
76
83
  }
77
84
 
@@ -99,6 +106,7 @@ export default class MonitorStep extends DatabaseProperty {
99
106
  browserTypes: undefined,
100
107
  logMonitor: undefined,
101
108
  traceMonitor: undefined,
109
+ metricMonitor: undefined,
102
110
  };
103
111
 
104
112
  return monitorStep;
@@ -165,6 +173,13 @@ export default class MonitorStep extends DatabaseProperty {
165
173
  return this;
166
174
  }
167
175
 
176
+ public setMetricMonitor(
177
+ metricMonitor: MonitorStepMetricMonitor,
178
+ ): MonitorStep {
179
+ this.data!.metricMonitor = metricMonitor;
180
+ return this;
181
+ }
182
+
168
183
  public setTraceMonitor(traceMonitor: MonitorStepTraceMonitor): MonitorStep {
169
184
  this.data!.traceMonitor = traceMonitor;
170
185
  return this;
@@ -285,6 +300,9 @@ export default class MonitorStep extends DatabaseProperty {
285
300
  this.data.logMonitor || MonitorStepLogMonitorUtil.getDefault(),
286
301
  )
287
302
  : undefined,
303
+ metricMonitor: this.data.metricMonitor
304
+ ? MonitorStepMetricMonitorUtil.toJSON(this.data.metricMonitor)
305
+ : undefined,
288
306
  traceMonitor: this.data.traceMonitor
289
307
  ? MonitorStepTraceMonitorUtil.toJSON(
290
308
  this.data.traceMonitor ||
@@ -383,6 +401,9 @@ export default class MonitorStep extends DatabaseProperty {
383
401
  logMonitor: json["logMonitor"]
384
402
  ? (json["logMonitor"] as JSONObject)
385
403
  : undefined,
404
+ metricMonitor: json["metricMonitor"]
405
+ ? (json["metricMonitor"] as JSONObject)
406
+ : undefined,
386
407
  traceMonitor: json["traceMonitor"]
387
408
  ? (json["traceMonitor"] as JSONObject)
388
409
  : undefined,
@@ -396,6 +417,11 @@ export default class MonitorStep extends DatabaseProperty {
396
417
  monitorStep.data.traceMonitor = MonitorStepTraceMonitorUtil.getDefault();
397
418
  }
398
419
 
420
+ if (monitorStep.data && !monitorStep.data?.metricMonitor) {
421
+ monitorStep.data.metricMonitor =
422
+ MonitorStepMetricMonitorUtil.getDefault();
423
+ }
424
+
399
425
  return monitorStep;
400
426
  }
401
427
 
@@ -0,0 +1,28 @@
1
+ import { JSONObject } from "../JSON";
2
+ import MetricsViewConfig from "../Metrics/MetricsViewConfig";
3
+ import RollingTime from "../RollingTime/RollingTime";
4
+
5
+ export default interface MonitorStepMetricMonitor {
6
+ metricViewConfig: MetricsViewConfig;
7
+ rollingTime: RollingTime;
8
+ }
9
+
10
+ export class MonitorStepMetricMonitorUtil {
11
+ public static getDefault(): MonitorStepMetricMonitor {
12
+ return {
13
+ metricViewConfig: {
14
+ queryConfigs: [],
15
+ formulaConfigs: [],
16
+ },
17
+ rollingTime: RollingTime.Past1Minute,
18
+ };
19
+ }
20
+
21
+ public static fromJSON(json: JSONObject): MonitorStepMetricMonitor {
22
+ return json as any as MonitorStepMetricMonitor;
23
+ }
24
+
25
+ public static toJSON(monitor: MonitorStepMetricMonitor): JSONObject {
26
+ return monitor as any as JSONObject;
27
+ }
28
+ }
@@ -115,7 +115,6 @@ export class MonitorTypeHelper {
115
115
  description:
116
116
  "This monitor type lets you monitor traces from any source.",
117
117
  },
118
- // ,
119
118
  // {
120
119
  // monitorType: MonitorType.Metrics,
121
120
  // title: "Metrics",
@@ -205,7 +204,7 @@ export class MonitorTypeHelper {
205
204
  return monitorType !== MonitorType.Manual;
206
205
  }
207
206
 
208
- public static doesMonitorTypeHaveMetrics(monitorType: MonitorType): boolean {
207
+ public static doesMonitorTypeHaveGraphs(monitorType: MonitorType): boolean {
209
208
  if (
210
209
  monitorType === MonitorType.Website ||
211
210
  monitorType === MonitorType.API ||
@@ -0,0 +1,24 @@
1
+ enum RollingTime {
2
+ Past1Minute = "Past 1 Minute",
3
+ Past5Minutes = "Past 5 Minutes",
4
+ Past10Minutes = "Past 10 Minutes",
5
+ Past15Minutes = "Past 15 Minutes",
6
+ Past30Minutes = "Past 30 Minutes",
7
+ Past1Hour = "Past 1 Hour",
8
+ Past2Hours = "Past 2 Hours",
9
+ Past3Hours = "Past 3 Hours",
10
+ Past6Hours = "Past 6 Hours",
11
+ Past12Hours = "Past 12 Hours",
12
+ Past1Hours = "Past 1 Day",
13
+ Past2Days = "Past 2 Days",
14
+ Past3Days = "Past 3 Days",
15
+ Past7Days = "Past 7 Days",
16
+ Past14Days = "Past 14 Days",
17
+ Past30Days = "Past 30 Days",
18
+ Past60Days = "Past 60 Days",
19
+ Past90Days = "Past 90 Days",
20
+ Past180Days = "Past 180 Days",
21
+ Past365Days = "Past 365 Days",
22
+ }
23
+
24
+ export default RollingTime;
@@ -0,0 +1,98 @@
1
+ import InBetween from "../BaseDatabase/InBetween";
2
+ import OneUptimeDate from "../Date";
3
+ import RollingTime from "./RollingTime";
4
+
5
+ export default class RollingTimeUtil {
6
+ public static getDefault(): RollingTime {
7
+ return RollingTime.Past1Minute;
8
+ }
9
+
10
+ public static convertToStartAndEndDate(
11
+ rollingTime: RollingTime,
12
+ ): InBetween<Date> {
13
+ const endDate: Date = OneUptimeDate.getCurrentDate();
14
+ let startDate: Date = OneUptimeDate.getCurrentDate();
15
+
16
+ if (rollingTime === RollingTime.Past1Minute) {
17
+ startDate = OneUptimeDate.addRemoveMinutes(endDate, -1);
18
+ }
19
+
20
+ if (rollingTime === RollingTime.Past5Minutes) {
21
+ startDate = OneUptimeDate.addRemoveMinutes(endDate, -5);
22
+ }
23
+
24
+ if (rollingTime === RollingTime.Past10Minutes) {
25
+ startDate = OneUptimeDate.addRemoveMinutes(endDate, -10);
26
+ }
27
+
28
+ if (rollingTime === RollingTime.Past15Minutes) {
29
+ startDate = OneUptimeDate.addRemoveMinutes(endDate, -15);
30
+ }
31
+
32
+ if (rollingTime === RollingTime.Past30Minutes) {
33
+ startDate = OneUptimeDate.addRemoveMinutes(endDate, -30);
34
+ }
35
+
36
+ if (rollingTime === RollingTime.Past1Hour) {
37
+ startDate = OneUptimeDate.addRemoveHours(endDate, -1);
38
+ }
39
+
40
+ if (rollingTime === RollingTime.Past2Hours) {
41
+ startDate = OneUptimeDate.addRemoveHours(endDate, -2);
42
+ }
43
+
44
+ if (rollingTime === RollingTime.Past3Hours) {
45
+ startDate = OneUptimeDate.addRemoveHours(endDate, -3);
46
+ }
47
+
48
+ if (rollingTime === RollingTime.Past6Hours) {
49
+ startDate = OneUptimeDate.addRemoveHours(endDate, -6);
50
+ }
51
+
52
+ if (rollingTime === RollingTime.Past12Hours) {
53
+ startDate = OneUptimeDate.addRemoveHours(endDate, -12);
54
+ }
55
+
56
+ if (rollingTime === RollingTime.Past1Hours) {
57
+ startDate = OneUptimeDate.addRemoveDays(endDate, -1);
58
+ }
59
+
60
+ if (rollingTime === RollingTime.Past2Days) {
61
+ startDate = OneUptimeDate.addRemoveDays(endDate, -2);
62
+ }
63
+
64
+ if (rollingTime === RollingTime.Past3Days) {
65
+ startDate = OneUptimeDate.addRemoveDays(endDate, -3);
66
+ }
67
+
68
+ if (rollingTime === RollingTime.Past7Days) {
69
+ startDate = OneUptimeDate.addRemoveDays(endDate, -7);
70
+ }
71
+
72
+ if (rollingTime === RollingTime.Past14Days) {
73
+ startDate = OneUptimeDate.addRemoveDays(endDate, -14);
74
+ }
75
+
76
+ if (rollingTime === RollingTime.Past30Days) {
77
+ startDate = OneUptimeDate.addRemoveDays(endDate, -30);
78
+ }
79
+
80
+ if (rollingTime === RollingTime.Past60Days) {
81
+ startDate = OneUptimeDate.addRemoveDays(endDate, -60);
82
+ }
83
+
84
+ if (rollingTime === RollingTime.Past90Days) {
85
+ startDate = OneUptimeDate.addRemoveDays(endDate, -90);
86
+ }
87
+
88
+ if (rollingTime === RollingTime.Past180Days) {
89
+ startDate = OneUptimeDate.addRemoveDays(endDate, -180);
90
+ }
91
+
92
+ if (rollingTime === RollingTime.Past365Days) {
93
+ startDate = OneUptimeDate.addRemoveDays(endDate, -365);
94
+ }
95
+
96
+ return new InBetween(startDate, endDate);
97
+ }
98
+ }
@@ -20,6 +20,7 @@ export interface ComponentProps {
20
20
  charts: Array<Chart>;
21
21
  hideCard?: boolean | undefined;
22
22
  heightInPx?: number | undefined;
23
+ chartCssClass?: string | undefined;
23
24
  }
24
25
 
25
26
  const ChartGroup: FunctionComponent<ComponentProps> = (
@@ -35,7 +36,7 @@ const ChartGroup: FunctionComponent<ComponentProps> = (
35
36
  return (
36
37
  <div
37
38
  key={index}
38
- className={`p-6 ${props.hideCard ? "" : "rounded-md bg-white shadow"}`}
39
+ className={`p-6 ${props.hideCard ? "" : "rounded-md bg-white shadow"} ${props.chartCssClass || ""}`}
39
40
  >
40
41
  <h2
41
42
  data-testid="card-details-heading"