@oneuptime/common 12.0.14 → 12.0.15

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 (195) hide show
  1. package/Models/DatabaseModels/GlobalOidc.ts +20 -0
  2. package/Models/DatabaseModels/GlobalSso.ts +20 -0
  3. package/Models/DatabaseModels/MarketingConversion.ts +19 -9
  4. package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +46 -0
  5. package/Models/DatabaseModels/StatusPage.ts +7 -4
  6. package/Server/API/StatusPageAPI.ts +29 -4
  7. package/Server/EnvironmentConfig.ts +7 -0
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.ts +19 -0
  9. package/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.ts +40 -0
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  11. package/Server/Middleware/SlackAuthorization.ts +43 -6
  12. package/Server/Middleware/UserAuthorization.ts +236 -26
  13. package/Server/Middleware/WhatsAppAuthorization.ts +43 -3
  14. package/Server/Services/GlobalOidcProjectService.ts +126 -1
  15. package/Server/Services/GlobalOidcService.ts +132 -0
  16. package/Server/Services/GlobalSsoProjectService.ts +126 -1
  17. package/Server/Services/GlobalSsoService.ts +132 -0
  18. package/Server/Services/UserEmailService.ts +4 -4
  19. package/Server/Utils/CronTab.ts +73 -0
  20. package/Server/Utils/GlobalSsoAuthorization.ts +175 -0
  21. package/Server/Utils/Marketing/ConversionUploadProvider.ts +35 -5
  22. package/Server/Utils/Marketing/Providers/GoogleAds.ts +1 -1
  23. package/Server/Utils/Marketing/Providers/LinkedIn.ts +1 -1
  24. package/Server/Utils/Marketing/Providers/Meta.ts +1 -1
  25. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +1 -1
  26. package/Server/Utils/Marketing/Providers/Reddit.ts +1 -1
  27. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +48 -33
  28. package/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.ts +35 -30
  29. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +33 -28
  30. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +475 -47
  31. package/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.ts +35 -30
  32. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +34 -28
  33. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +33 -28
  34. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +69 -40
  35. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +35 -29
  36. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +8 -0
  37. package/Server/Utils/Monitor/MonitorResource.ts +161 -21
  38. package/Server/Utils/StatusPageContentSecurityPolicy.ts +56 -0
  39. package/Server/Utils/StatusPageCustomizationAccess.ts +117 -0
  40. package/Tests/Server/API/StatusPageCustomizationOrigin.test.ts +348 -0
  41. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +9 -59
  42. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +227 -0
  43. package/Tests/Server/Middleware/SlackAuthorization.test.ts +149 -0
  44. package/Tests/Server/Middleware/UserAuthorization.test.ts +27 -13
  45. package/Tests/Server/Middleware/UserAuthorizationGlobalSsoGovernance.test.ts +1455 -0
  46. package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +91 -2
  47. package/Tests/Server/Middleware/WhatsAppAuthorization.test.ts +233 -0
  48. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +21 -8
  49. package/Tests/Server/Services/GlobalSsoProviderAuthorization.test.ts +1242 -0
  50. package/Tests/Server/Services/MonitorResourceProbeAgreementHydration.test.ts +459 -0
  51. package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +10 -0
  52. package/Tests/Server/Types/AnalyticsDatabase/AggregateUtilBucketTimestamp.test.ts +416 -0
  53. package/Tests/Server/Types/Database/QueryHelperManyToManyAndEmptyValues.test.ts +551 -0
  54. package/Tests/Server/Types/Database/SelectUtil.test.ts +348 -0
  55. package/Tests/Server/Utils/CronTab.test.ts +116 -0
  56. package/Tests/Server/Utils/GlobalSSOToken.test.ts +581 -0
  57. package/Tests/Server/Utils/GlobalSsoAuthorization.test.ts +1401 -0
  58. package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +254 -0
  59. package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +1 -1
  60. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +508 -0
  61. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +30 -9
  62. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +987 -0
  63. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +916 -0
  64. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +382 -0
  65. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +1219 -0
  66. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +86 -0
  67. package/Tests/Server/Utils/StatusPageContentSecurityPolicy.test.ts +136 -0
  68. package/Tests/Server/Utils/StatusPageCustomizationAccess.test.ts +223 -0
  69. package/Tests/Types/Monitor/MonitorStepConfigHelpers.test.ts +165 -0
  70. package/Tests/Types/NetworkDevice/NetworkDeviceLinkRuleScope.test.ts +215 -0
  71. package/Tests/UI/Components/Forms/FormSubmitAnalytics.test.tsx +206 -0
  72. package/Tests/UI/Utils/AIChatExport/ConversationMarkdown.test.ts +774 -0
  73. package/Tests/UI/Utils/AIChatExport/MarkdownBlocks.test.ts +791 -0
  74. package/Tests/UI/Utils/AIChatExport/MarkdownSafety.test.ts +544 -0
  75. package/Tests/Utils/Analytics.test.ts +187 -0
  76. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +80 -0
  77. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +1291 -0
  78. package/Tests/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.test.ts +214 -0
  79. package/Types/Marketing/MarketingConversion.ts +12 -0
  80. package/Types/Monitor/CriteriaFilter.ts +9 -0
  81. package/Types/NetworkDevice/NetworkDeviceLinkRuleScope.ts +51 -0
  82. package/UI/Components/FormModal/BasicFormModal.tsx +12 -0
  83. package/UI/Components/Forms/BasicForm.tsx +13 -1
  84. package/UI/Components/Forms/BasicModelForm.tsx +2 -1
  85. package/UI/Components/Forms/ModelForm.tsx +10 -1
  86. package/UI/Components/Forms/Utils/FormAnalyticsName.ts +39 -0
  87. package/UI/Components/ModelFormModal/ModelFormModal.tsx +6 -1
  88. package/Utils/Analytics.ts +55 -2
  89. package/Utils/Monitor/MonitorMetricType.ts +40 -0
  90. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +587 -37
  91. package/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.ts +115 -0
  92. package/build/dist/Models/DatabaseModels/GlobalOidc.js +21 -0
  93. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  94. package/build/dist/Models/DatabaseModels/GlobalSso.js +21 -0
  95. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  96. package/build/dist/Models/DatabaseModels/MarketingConversion.js +20 -10
  97. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
  98. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +47 -0
  99. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -1
  100. package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
  101. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  102. package/build/dist/Server/API/StatusPageAPI.js +25 -4
  103. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  104. package/build/dist/Server/EnvironmentConfig.js +6 -0
  105. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  106. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js +12 -0
  107. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js.map +1 -0
  108. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js +29 -0
  109. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js.map +1 -0
  110. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  111. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  112. package/build/dist/Server/Middleware/SlackAuthorization.js +28 -4
  113. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  114. package/build/dist/Server/Middleware/UserAuthorization.js +197 -22
  115. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  116. package/build/dist/Server/Middleware/WhatsAppAuthorization.js +32 -2
  117. package/build/dist/Server/Middleware/WhatsAppAuthorization.js.map +1 -1
  118. package/build/dist/Server/Services/GlobalOidcProjectService.js +105 -0
  119. package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -1
  120. package/build/dist/Server/Services/GlobalOidcService.js +127 -0
  121. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
  122. package/build/dist/Server/Services/GlobalSsoProjectService.js +105 -0
  123. package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -1
  124. package/build/dist/Server/Services/GlobalSsoService.js +127 -0
  125. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
  126. package/build/dist/Server/Services/UserEmailService.js +4 -4
  127. package/build/dist/Server/Utils/CronTab.js +66 -0
  128. package/build/dist/Server/Utils/CronTab.js.map +1 -1
  129. package/build/dist/Server/Utils/GlobalSsoAuthorization.js +112 -0
  130. package/build/dist/Server/Utils/GlobalSsoAuthorization.js.map +1 -0
  131. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +17 -1
  132. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
  133. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +1 -1
  134. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
  135. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +1 -1
  136. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
  137. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +1 -1
  138. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
  139. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +1 -1
  140. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
  141. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +1 -1
  142. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
  143. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +37 -35
  144. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  145. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js +21 -25
  146. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js.map +1 -1
  147. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +20 -22
  148. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  149. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +370 -42
  150. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  151. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js +21 -25
  152. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js.map +1 -1
  153. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +21 -25
  154. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  155. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +21 -25
  156. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  157. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +64 -52
  158. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  159. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +25 -29
  160. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  161. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +8 -0
  162. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  163. package/build/dist/Server/Utils/Monitor/MonitorResource.js +123 -23
  164. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  165. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js +39 -0
  166. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js.map +1 -0
  167. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js +85 -0
  168. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js.map +1 -0
  169. package/build/dist/Types/Marketing/MarketingConversion.js +10 -0
  170. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
  171. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  172. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  173. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js +46 -0
  174. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js.map +1 -0
  175. package/build/dist/UI/Components/FormModal/BasicFormModal.js +2 -1
  176. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  177. package/build/dist/UI/Components/Forms/BasicForm.js +10 -1
  178. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  179. package/build/dist/UI/Components/Forms/BasicModelForm.js +2 -1
  180. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  181. package/build/dist/UI/Components/Forms/ModelForm.js +4 -1
  182. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  183. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js +33 -0
  184. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js.map +1 -0
  185. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +2 -1
  186. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  187. package/build/dist/Utils/Analytics.js +50 -2
  188. package/build/dist/Utils/Analytics.js.map +1 -1
  189. package/build/dist/Utils/Monitor/MonitorMetricType.js +37 -0
  190. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  191. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +318 -37
  192. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
  193. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js +87 -0
  194. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js.map +1 -0
  195. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import DataToProcess from "../DataToProcess";
2
2
  import CompareCriteria from "./CompareCriteria";
3
- import EvaluateOverTime from "./EvaluateOverTime";
3
+ import EvaluateOverTime, { OverTimeCriteriaValue } from "./EvaluateOverTime";
4
4
  import { JSONObject } from "../../../../Types/JSON";
5
5
  import {
6
6
  CheckOn,
@@ -10,50 +10,65 @@ import {
10
10
  import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
11
11
  import Typeof from "../../../../Types/Typeof";
12
12
  import CaptureSpan from "../../Telemetry/CaptureSpan";
13
- import logger from "../../Logger";
14
13
 
15
14
  export default class APIRequestCriteria {
16
15
  @CaptureSpan()
17
16
  public static async isMonitorInstanceCriteriaFilterMet(input: {
18
17
  dataToProcess: DataToProcess;
19
18
  criteriaFilter: CriteriaFilter;
19
+ /*
20
+ * The monitor's monitoringInterval cron. Over-time filters use it to
21
+ * work out how many samples a fully covered window should hold, so a
22
+ * monitor that has only just started is not mistaken for one whose
23
+ * whole window is breaching.
24
+ */
25
+ monitoringInterval?: string | undefined;
20
26
  }): Promise<string | null> {
21
27
  // Server Monitoring Checks
22
28
 
23
29
  let threshold: number | string | undefined | null =
24
30
  input.criteriaFilter.value;
25
31
 
26
- let overTimeValue: Array<number | boolean> | number | boolean | undefined =
27
- undefined;
32
+ const overTime: OverTimeCriteriaValue =
33
+ await EvaluateOverTime.getOverTimeValueForCriteriaFilter({
34
+ projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
35
+ monitorId: input.dataToProcess.monitorId!,
36
+ criteriaFilter: input.criteriaFilter,
37
+ /*
38
+ * Only the disk-usage series carries a diskPath attribute, so
39
+ * scoping any other series by it would filter against an attribute
40
+ * no row has - and an empty window now means "cannot judge yet"
41
+ * rather than "compare the live value", which would silence the
42
+ * filter outright.
43
+ */
44
+ miscData:
45
+ input.criteriaFilter.checkOn === CheckOn.DiskUsagePercent
46
+ ? (input.criteriaFilter.serverMonitorOptions as JSONObject)
47
+ : undefined,
48
+ monitoringInterval: input.monitoringInterval,
49
+ });
28
50
 
29
- if (
30
- input.criteriaFilter.evaluateOverTime &&
31
- input.criteriaFilter.evaluateOverTimeOptions
32
- ) {
33
- try {
34
- overTimeValue = await EvaluateOverTime.getValueOverTime({
35
- projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
36
- monitorId: input.dataToProcess.monitorId!,
37
- evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
38
- metricType: input.criteriaFilter.checkOn,
39
- miscData: input.criteriaFilter.serverMonitorOptions as JSONObject,
40
- });
41
-
42
- if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
43
- overTimeValue = undefined;
44
- }
45
- } catch (err) {
46
- logger.error(
47
- `Error in getting over time value for ${input.criteriaFilter.checkOn}`,
48
- );
49
- logger.error(err);
50
- overTimeValue = undefined;
51
- }
51
+ /*
52
+ * The window could not back this over-time filter (nothing recorded yet,
53
+ * or the monitor has not been running long enough to cover it). Return
54
+ * the decision the no-data policy already made instead of falling
55
+ * through to the value that arrived with this one check - that fallback
56
+ * is what let "all values over the last N minutes" fire off a single
57
+ * bad reading.
58
+ */
59
+ if (overTime.earlyReturn) {
60
+ return overTime.earlyReturn.result;
52
61
  }
53
62
 
63
+ const overTimeValue:
64
+ | Array<number | boolean>
65
+ | number
66
+ | boolean
67
+ | undefined = overTime.value;
68
+
54
69
  if (input.criteriaFilter.checkOn === CheckOn.IsOnline) {
55
70
  const currentIsOnline: boolean | Array<boolean> =
56
- (overTimeValue as Array<boolean>) ||
71
+ (overTimeValue as Array<boolean>) ??
57
72
  (input.dataToProcess as ProbeMonitorResponse).isOnline;
58
73
 
59
74
  return CompareCriteria.compareCriteriaBoolean({
@@ -64,7 +79,7 @@ export default class APIRequestCriteria {
64
79
 
65
80
  if (input.criteriaFilter.checkOn === CheckOn.IsRequestTimeout) {
66
81
  const currentIsTimeout: boolean | Array<boolean> =
67
- (overTimeValue as Array<boolean>) ||
82
+ (overTimeValue as Array<boolean>) ??
68
83
  (input.dataToProcess as ProbeMonitorResponse).isTimeout;
69
84
 
70
85
  return CompareCriteria.compareCriteriaBoolean({
@@ -78,7 +93,7 @@ export default class APIRequestCriteria {
78
93
  threshold = CompareCriteria.convertToNumber(threshold);
79
94
 
80
95
  const value: Array<number> | number =
81
- (overTimeValue as Array<number>) ||
96
+ (overTimeValue as Array<number>) ??
82
97
  (input.dataToProcess as ProbeMonitorResponse).responseTimeInMs!;
83
98
 
84
99
  return CompareCriteria.compareCriteriaNumbers({
@@ -124,7 +139,7 @@ export default class APIRequestCriteria {
124
139
  ).pingResponse?.packetLossPercent;
125
140
 
126
141
  const value: Array<number> | number | undefined =
127
- (overTimeValue as Array<number>) || packetLossPercent;
142
+ (overTimeValue as Array<number>) ?? packetLossPercent;
128
143
 
129
144
  if (value === undefined) {
130
145
  return null;
@@ -146,7 +161,7 @@ export default class APIRequestCriteria {
146
161
  ).pingResponse?.jitterInMs;
147
162
 
148
163
  const value: Array<number> | number | undefined =
149
- (overTimeValue as Array<number>) || jitterInMs;
164
+ (overTimeValue as Array<number>) ?? jitterInMs;
150
165
 
151
166
  if (value === undefined) {
152
167
  return null;
@@ -169,7 +184,7 @@ export default class APIRequestCriteria {
169
184
  threshold = CompareCriteria.convertToNumber(threshold);
170
185
 
171
186
  const value: Array<number> | number =
172
- (overTimeValue as Array<number>) ||
187
+ (overTimeValue as Array<number>) ??
173
188
  (input.dataToProcess as ProbeMonitorResponse).responseCode!;
174
189
 
175
190
  return CompareCriteria.compareCriteriaNumbers({
@@ -7,15 +7,21 @@ import {
7
7
  } from "../../../../Types/Monitor/CriteriaFilter";
8
8
  import DnsMonitorResponse from "../../../../Types/Monitor/DnsMonitor/DnsMonitorResponse";
9
9
  import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
10
- import EvaluateOverTime from "./EvaluateOverTime";
10
+ import EvaluateOverTime, { OverTimeCriteriaValue } from "./EvaluateOverTime";
11
11
  import CaptureSpan from "../../Telemetry/CaptureSpan";
12
- import logger from "../../Logger";
13
12
 
14
13
  export default class DnsMonitorCriteria {
15
14
  @CaptureSpan()
16
15
  public static async isMonitorInstanceCriteriaFilterMet(input: {
17
16
  dataToProcess: DataToProcess;
18
17
  criteriaFilter: CriteriaFilter;
18
+ /*
19
+ * The monitor's monitoringInterval cron. Over-time filters use it to
20
+ * work out how many samples a fully covered window should hold, so a
21
+ * monitor that has only just started is not mistaken for one whose
22
+ * whole window is breaching.
23
+ */
24
+ monitoringInterval?: string | undefined;
19
25
  }): Promise<string | null> {
20
26
  let threshold: number | string | undefined | null =
21
27
  input.criteriaFilter.value;
@@ -26,37 +32,36 @@ export default class DnsMonitorCriteria {
26
32
  const dnsResponse: DnsMonitorResponse | undefined =
27
33
  dataToProcess.dnsResponse;
28
34
 
29
- let overTimeValue: Array<number | boolean> | number | boolean | undefined =
30
- undefined;
31
-
32
- if (
33
- input.criteriaFilter.evaluateOverTime &&
34
- input.criteriaFilter.evaluateOverTimeOptions
35
- ) {
36
- try {
37
- overTimeValue = await EvaluateOverTime.getValueOverTime({
38
- projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
39
- monitorId: input.dataToProcess.monitorId!,
40
- evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
41
- metricType: input.criteriaFilter.checkOn,
42
- });
35
+ const overTime: OverTimeCriteriaValue =
36
+ await EvaluateOverTime.getOverTimeValueForCriteriaFilter({
37
+ projectId: (input.dataToProcess as ProbeMonitorResponse).projectId,
38
+ monitorId: input.dataToProcess.monitorId!,
39
+ criteriaFilter: input.criteriaFilter,
40
+ monitoringInterval: input.monitoringInterval,
41
+ });
43
42
 
44
- if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
45
- overTimeValue = undefined;
46
- }
47
- } catch (err) {
48
- logger.error(
49
- `Error in getting over time value for ${input.criteriaFilter.checkOn}`,
50
- );
51
- logger.error(err);
52
- overTimeValue = undefined;
53
- }
43
+ /*
44
+ * The window could not back this over-time filter (nothing recorded yet,
45
+ * or the monitor has not been running long enough to cover it). Return
46
+ * the decision the no-data policy already made instead of falling
47
+ * through to the value that arrived with this one check - that fallback
48
+ * is what let "all values over the last N minutes" fire off a single
49
+ * bad reading.
50
+ */
51
+ if (overTime.earlyReturn) {
52
+ return overTime.earlyReturn.result;
54
53
  }
55
54
 
55
+ const overTimeValue:
56
+ | Array<number | boolean>
57
+ | number
58
+ | boolean
59
+ | undefined = overTime.value;
60
+
56
61
  // Check if DNS is online
57
62
  if (input.criteriaFilter.checkOn === CheckOn.DnsIsOnline) {
58
63
  const currentIsOnline: boolean | Array<boolean> =
59
- (overTimeValue as Array<boolean>) ||
64
+ (overTimeValue as Array<boolean>) ??
60
65
  (input.dataToProcess as ProbeMonitorResponse).isOnline;
61
66
 
62
67
  return CompareCriteria.compareCriteriaBoolean({
@@ -74,9 +79,9 @@ export default class DnsMonitorCriteria {
74
79
  }
75
80
 
76
81
  const currentResponseTime: number | Array<number> =
77
- (overTimeValue as Array<number>) ||
78
- dnsResponse?.responseTimeInMs ||
79
- (input.dataToProcess as ProbeMonitorResponse).responseTimeInMs;
82
+ (overTimeValue as Array<number>) ??
83
+ (dnsResponse?.responseTimeInMs ||
84
+ (input.dataToProcess as ProbeMonitorResponse).responseTimeInMs);
80
85
 
81
86
  if (currentResponseTime === null || currentResponseTime === undefined) {
82
87
  return null;
@@ -8,14 +8,20 @@ import {
8
8
  import DomainMonitorResponse from "../../../../Types/Monitor/DomainMonitor/DomainMonitorResponse";
9
9
  import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
10
10
  import CaptureSpan from "../../Telemetry/CaptureSpan";
11
- import EvaluateOverTime from "./EvaluateOverTime";
12
- import logger from "../../Logger";
11
+ import EvaluateOverTime, { OverTimeCriteriaValue } from "./EvaluateOverTime";
13
12
 
14
13
  export default class DomainMonitorCriteria {
15
14
  @CaptureSpan()
16
15
  public static async isMonitorInstanceCriteriaFilterMet(input: {
17
16
  dataToProcess: DataToProcess;
18
17
  criteriaFilter: CriteriaFilter;
18
+ /*
19
+ * The monitor's monitoringInterval cron. Over-time filters use it to
20
+ * work out how many samples a fully covered window should hold, so a
21
+ * monitor that has only just started is not mistaken for one whose
22
+ * whole window is breaching.
23
+ */
24
+ monitoringInterval?: string | undefined;
19
25
  }): Promise<string | null> {
20
26
  let threshold: number | string | undefined | null =
21
27
  input.criteriaFilter.value;
@@ -26,33 +32,32 @@ export default class DomainMonitorCriteria {
26
32
  const domainResponse: DomainMonitorResponse | undefined =
27
33
  dataToProcess.domainResponse;
28
34
 
29
- let overTimeValue: Array<number | boolean> | number | boolean | undefined =
30
- undefined;
31
-
32
- if (
33
- input.criteriaFilter.evaluateOverTime &&
34
- input.criteriaFilter.evaluateOverTimeOptions
35
- ) {
36
- try {
37
- overTimeValue = await EvaluateOverTime.getValueOverTime({
38
- projectId: dataToProcess.projectId,
39
- monitorId: input.dataToProcess.monitorId!,
40
- evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions,
41
- metricType: input.criteriaFilter.checkOn,
42
- });
35
+ const overTime: OverTimeCriteriaValue =
36
+ await EvaluateOverTime.getOverTimeValueForCriteriaFilter({
37
+ projectId: dataToProcess.projectId,
38
+ monitorId: input.dataToProcess.monitorId!,
39
+ criteriaFilter: input.criteriaFilter,
40
+ monitoringInterval: input.monitoringInterval,
41
+ });
43
42
 
44
- if (Array.isArray(overTimeValue) && overTimeValue.length === 0) {
45
- overTimeValue = undefined;
46
- }
47
- } catch (err) {
48
- logger.error(
49
- `Error in getting over time value for ${input.criteriaFilter.checkOn}`,
50
- );
51
- logger.error(err);
52
- overTimeValue = undefined;
53
- }
43
+ /*
44
+ * The window could not back this over-time filter (nothing recorded yet,
45
+ * or the monitor has not been running long enough to cover it). Return
46
+ * the decision the no-data policy already made instead of falling
47
+ * through to the value that arrived with this one check - that fallback
48
+ * is what let "all values over the last N minutes" fire off a single
49
+ * bad reading.
50
+ */
51
+ if (overTime.earlyReturn) {
52
+ return overTime.earlyReturn.result;
54
53
  }
55
54
 
55
+ const overTimeValue:
56
+ | Array<number | boolean>
57
+ | number
58
+ | boolean
59
+ | undefined = overTime.value;
60
+
56
61
  /*
57
62
  * Whether the registration lookup itself succeeded. Without this, a
58
63
  * domain whose TLD has no working WHOIS or RDAP service produces a
@@ -62,7 +67,7 @@ export default class DomainMonitorCriteria {
62
67
  */
63
68
  if (input.criteriaFilter.checkOn === CheckOn.IsOnline) {
64
69
  const currentIsOnline: boolean | Array<boolean> =
65
- (overTimeValue as Array<boolean>) || dataToProcess.isOnline;
70
+ (overTimeValue as Array<boolean>) ?? dataToProcess.isOnline;
66
71
 
67
72
  return CompareCriteria.compareCriteriaBoolean({
68
73
  value: currentIsOnline,
@@ -72,7 +77,7 @@ export default class DomainMonitorCriteria {
72
77
 
73
78
  if (input.criteriaFilter.checkOn === CheckOn.IsRequestTimeout) {
74
79
  const currentIsTimeout: boolean | Array<boolean> =
75
- (overTimeValue as Array<boolean>) || dataToProcess.isTimeout;
80
+ (overTimeValue as Array<boolean>) ?? dataToProcess.isTimeout;
76
81
 
77
82
  return CompareCriteria.compareCriteriaBoolean({
78
83
  value: currentIsTimeout,