@oneuptime/common 10.7.2 → 10.8.1
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/CloudResource.ts +846 -0
- package/Models/DatabaseModels/CloudResourceInstance.ts +276 -0
- package/Models/DatabaseModels/CloudResourceLabelRule.ts +510 -0
- package/Models/DatabaseModels/CloudResourceOwnerRule.ts +592 -0
- package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/CloudResourceOwnerUser.ts +486 -0
- package/Models/DatabaseModels/Host.ts +209 -0
- package/Models/DatabaseModels/Index.ts +36 -0
- package/Models/DatabaseModels/RumApplication.ts +731 -0
- package/Models/DatabaseModels/RumApplicationClient.ts +229 -0
- package/Models/DatabaseModels/RumApplicationLabelRule.ts +510 -0
- package/Models/DatabaseModels/RumApplicationOwnerRule.ts +592 -0
- package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +486 -0
- package/Models/DatabaseModels/RumApplicationOwnerUser.ts +485 -0
- package/Models/DatabaseModels/ServerlessFunction.ts +881 -0
- package/Models/DatabaseModels/ServerlessFunctionInstance.ts +212 -0
- package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +510 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +592 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +486 -0
- package/Models/DatabaseModels/Service.ts +268 -0
- package/Models/DatabaseModels/TelemetryException.ts +15 -1
- package/Models/DatabaseModels/WorkflowLog.ts +52 -0
- package/Server/API/TelemetryAPI.ts +78 -25
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780931746908-AddResumeStateToWorkflowLog.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.ts +205 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.ts +195 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780936579718-AddRumApplicationTables.ts +202 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780938407319-AddServerlessFunctionRuleTables.ts +156 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780940721814-AddCloudResourceRuleTables.ts +149 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780940998002-AddRumApplicationRuleTables.ts +149 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780941762204-AddTelemetryResourceInventoryTables.ts +95 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780985763463-AddRumApplicationSdkLanguage.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780987192743-RecastCloudResourcesByEnvironment.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +22 -0
- package/Server/Infrastructure/Queue.ts +11 -0
- package/Server/Services/CloudResourceInstanceService.ts +76 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +175 -0
- package/Server/Services/CloudResourceLabelRuleService.ts +14 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +192 -0
- package/Server/Services/CloudResourceOwnerRuleService.ts +14 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +10 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +10 -0
- package/Server/Services/CloudResourceService.ts +342 -0
- package/Server/Services/ExceptionAggregationService.ts +3 -0
- package/Server/Services/HostService.ts +42 -0
- package/Server/Services/LogAggregationService.ts +44 -16
- package/Server/Services/MetricAggregationService.ts +3 -0
- package/Server/Services/OpenTelemetryIngestService.ts +148 -1
- package/Server/Services/RumApplicationClientService.ts +69 -0
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +175 -0
- package/Server/Services/RumApplicationLabelRuleService.ts +14 -0
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +192 -0
- package/Server/Services/RumApplicationOwnerRuleService.ts +14 -0
- package/Server/Services/RumApplicationOwnerTeamService.ts +10 -0
- package/Server/Services/RumApplicationOwnerUserService.ts +10 -0
- package/Server/Services/RumApplicationService.ts +301 -0
- package/Server/Services/ServerlessFunctionInstanceService.ts +61 -0
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +182 -0
- package/Server/Services/ServerlessFunctionLabelRuleService.ts +14 -0
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +199 -0
- package/Server/Services/ServerlessFunctionOwnerRuleService.ts +14 -0
- package/Server/Services/ServerlessFunctionOwnerTeamService.ts +10 -0
- package/Server/Services/ServerlessFunctionOwnerUserService.ts +10 -0
- package/Server/Services/ServerlessFunctionService.ts +351 -0
- package/Server/Services/ServiceService.ts +95 -8
- package/Server/Services/TraceAggregationService.ts +131 -4
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +39 -0
- package/Server/Types/Workflow/ComponentCode.ts +9 -0
- package/Server/Types/Workflow/Components/Index.ts +2 -0
- package/Server/Types/Workflow/Components/Sleep.ts +105 -0
- package/Server/Types/Workflow/Workflow.ts +6 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +150 -0
- package/Types/Permission.ts +692 -1
- package/Types/Telemetry/ServiceType.ts +3 -0
- package/Types/Workflow/ComponentID.ts +1 -0
- package/Types/Workflow/Components/Sleep.ts +71 -0
- package/Types/Workflow/Components.ts +2 -0
- package/Types/Workflow/WorkflowStatus.ts +1 -0
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +159 -32
- package/UI/Components/Navbar/NavBar.tsx +72 -123
- package/UI/Components/Navbar/NavBarMenuModal.tsx +642 -0
- package/UI/Components/Workflow/WorkflowStatus.tsx +3 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js +871 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceInstance.js +300 -0
- package/build/dist/Models/DatabaseModels/CloudResourceInstance.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +520 -0
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +601 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Host.js +215 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +36 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +751 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationClient.js +252 -0
- package/build/dist/Models/DatabaseModels/RumApplicationClient.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +520 -0
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +601 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js +908 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionInstance.js +234 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionInstance.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +520 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +601 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Service.js +276 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +12 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLog.js +53 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +61 -23
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931746908-AddResumeStateToWorkflowLog.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931746908-AddResumeStateToWorkflowLog.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.js +53 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780936579718-AddRumApplicationTables.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780936579718-AddRumApplicationTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780938407319-AddServerlessFunctionRuleTables.js +67 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780938407319-AddServerlessFunctionRuleTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940721814-AddCloudResourceRuleTables.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940721814-AddCloudResourceRuleTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940998002-AddRumApplicationRuleTables.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940998002-AddRumApplicationRuleTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780941762204-AddTelemetryResourceInventoryTables.js +45 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780941762204-AddTelemetryResourceInventoryTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780985763463-AddRumApplicationSdkLanguage.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780985763463-AddRumApplicationSdkLanguage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780987192743-RecastCloudResourcesByEnvironment.js +27 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780987192743-RecastCloudResourcesByEnvironment.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +3 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +76 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +160 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleService.js +13 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +179 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +9 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceService.js +287 -0
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js +3 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +29 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +36 -10
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +3 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +98 -2
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationClientService.js +70 -0
- package/build/dist/Server/Services/RumApplicationClientService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +160 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleService.js +13 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +179 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/RumApplicationOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerUserService.js +9 -0
- package/build/dist/Server/Services/RumApplicationOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationService.js +259 -0
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +64 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +160 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleService.js +13 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +179 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerUserService.js +9 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js +299 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -0
- package/build/dist/Server/Services/ServiceService.js +63 -7
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +108 -4
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +39 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Sleep.js +85 -0
- package/build/dist/Server/Types/Workflow/Components/Sleep.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +90 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Types/Permission.js +609 -1
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +3 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/Types/Workflow/ComponentID.js +1 -0
- package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Sleep.js +64 -0
- package/build/dist/Types/Workflow/Components/Sleep.js.map +1 -0
- package/build/dist/Types/Workflow/Components.js +2 -0
- package/build/dist/Types/Workflow/Components.js.map +1 -1
- package/build/dist/Types/Workflow/WorkflowStatus.js +1 -0
- package/build/dist/Types/Workflow/WorkflowStatus.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +113 -19
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +34 -66
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +412 -0
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatus.js +3 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatus.js.map +1 -1
- package/package.json +1 -1
- package/UI/Components/Navbar/NavBarMenu.tsx +0 -183
- package/UI/Components/Navbar/NavBarMenuItem.tsx +0 -146
- package/build/dist/UI/Components/Navbar/NavBarMenu.js +0 -82
- package/build/dist/UI/Components/Navbar/NavBarMenu.js.map +0 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuItem.js +0 -109
- package/build/dist/UI/Components/Navbar/NavBarMenuItem.js.map +0 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import Label from "../../Models/DatabaseModels/Label";
|
|
2
|
+
import ServerlessFunction from "../../Models/DatabaseModels/ServerlessFunction";
|
|
3
|
+
import ServerlessFunctionOwnerRule from "../../Models/DatabaseModels/ServerlessFunctionOwnerRule";
|
|
4
|
+
import ServerlessFunctionOwnerUser from "../../Models/DatabaseModels/ServerlessFunctionOwnerUser";
|
|
5
|
+
import ServerlessFunctionOwnerTeam from "../../Models/DatabaseModels/ServerlessFunctionOwnerTeam";
|
|
6
|
+
import ServerlessFunctionOwnerRuleService from "./ServerlessFunctionOwnerRuleService";
|
|
7
|
+
import ServerlessFunctionOwnerUserService from "./ServerlessFunctionOwnerUserService";
|
|
8
|
+
import ServerlessFunctionOwnerTeamService from "./ServerlessFunctionOwnerTeamService";
|
|
9
|
+
import ServerlessFunctionService from "./ServerlessFunctionService";
|
|
10
|
+
import ObjectID from "../../Types/ObjectID";
|
|
11
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
12
|
+
import logger, { LogAttributes } from "../Utils/Logger";
|
|
13
|
+
|
|
14
|
+
class ServerlessFunctionOwnerRuleEngineServiceClass {
|
|
15
|
+
/**
|
|
16
|
+
* Evaluates ServerlessFunctionOwnerRule rows for the given function and adds
|
|
17
|
+
* matched owner users / teams. Rules with notifyOwners set notify the added
|
|
18
|
+
* owners; rules with notifyOwners off add silently.
|
|
19
|
+
*/
|
|
20
|
+
@CaptureSpan()
|
|
21
|
+
public async applyRulesToServerlessFunction(
|
|
22
|
+
serverlessFunction: ServerlessFunction,
|
|
23
|
+
): Promise<void> {
|
|
24
|
+
if (!serverlessFunction.id || !serverlessFunction.projectId) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const rules: Array<ServerlessFunctionOwnerRule> =
|
|
30
|
+
await ServerlessFunctionOwnerRuleService.findBy({
|
|
31
|
+
query: {
|
|
32
|
+
projectId: serverlessFunction.projectId,
|
|
33
|
+
isEnabled: true,
|
|
34
|
+
},
|
|
35
|
+
props: { isRoot: true },
|
|
36
|
+
select: {
|
|
37
|
+
_id: true,
|
|
38
|
+
name: true,
|
|
39
|
+
notifyOwners: true,
|
|
40
|
+
matchLabels: { _id: true },
|
|
41
|
+
nameRegexPattern: true,
|
|
42
|
+
descriptionRegexPattern: true,
|
|
43
|
+
ownerUsers: { _id: true },
|
|
44
|
+
ownerTeams: { _id: true },
|
|
45
|
+
},
|
|
46
|
+
limit: 100,
|
|
47
|
+
skip: 0,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
if (rules.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const fnWithDetails: ServerlessFunction | null =
|
|
55
|
+
await ServerlessFunctionService.findOneById({
|
|
56
|
+
id: serverlessFunction.id,
|
|
57
|
+
select: {
|
|
58
|
+
name: true,
|
|
59
|
+
description: true,
|
|
60
|
+
labels: { _id: true },
|
|
61
|
+
},
|
|
62
|
+
props: { isRoot: true },
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
if (!fnWithDetails) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const usersByNotify: Map<boolean, Set<string>> = new Map([
|
|
70
|
+
[true, new Set()],
|
|
71
|
+
[false, new Set()],
|
|
72
|
+
]);
|
|
73
|
+
const teamsByNotify: Map<boolean, Set<string>> = new Map([
|
|
74
|
+
[true, new Set()],
|
|
75
|
+
[false, new Set()],
|
|
76
|
+
]);
|
|
77
|
+
|
|
78
|
+
let anyMatched: boolean = false;
|
|
79
|
+
|
|
80
|
+
for (const rule of rules) {
|
|
81
|
+
if (!this.doesMatchRule(fnWithDetails, rule)) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const notify: boolean = rule.notifyOwners !== false;
|
|
85
|
+
for (const user of rule.ownerUsers || []) {
|
|
86
|
+
if (user.id) {
|
|
87
|
+
usersByNotify.get(notify)!.add(user.id.toString());
|
|
88
|
+
anyMatched = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const team of rule.ownerTeams || []) {
|
|
92
|
+
if (team.id) {
|
|
93
|
+
teamsByNotify.get(notify)!.add(team.id.toString());
|
|
94
|
+
anyMatched = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!anyMatched) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const notify of [true, false]) {
|
|
104
|
+
const userIds: Set<string> = usersByNotify.get(notify)!;
|
|
105
|
+
const teamIds: Set<string> = teamsByNotify.get(notify)!;
|
|
106
|
+
|
|
107
|
+
for (const userId of userIds) {
|
|
108
|
+
const owner: ServerlessFunctionOwnerUser =
|
|
109
|
+
new ServerlessFunctionOwnerUser();
|
|
110
|
+
owner.serverlessFunctionId = serverlessFunction.id;
|
|
111
|
+
owner.projectId = serverlessFunction.projectId;
|
|
112
|
+
owner.userId = new ObjectID(userId);
|
|
113
|
+
owner.isOwnerNotified = !notify;
|
|
114
|
+
await ServerlessFunctionOwnerUserService.create({
|
|
115
|
+
data: owner,
|
|
116
|
+
props: { isRoot: true },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for (const teamId of teamIds) {
|
|
121
|
+
const owner: ServerlessFunctionOwnerTeam =
|
|
122
|
+
new ServerlessFunctionOwnerTeam();
|
|
123
|
+
owner.serverlessFunctionId = serverlessFunction.id;
|
|
124
|
+
owner.projectId = serverlessFunction.projectId;
|
|
125
|
+
owner.teamId = new ObjectID(teamId);
|
|
126
|
+
owner.isOwnerNotified = !notify;
|
|
127
|
+
await ServerlessFunctionOwnerTeamService.create({
|
|
128
|
+
data: owner,
|
|
129
|
+
props: { isRoot: true },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
} catch (error) {
|
|
134
|
+
logger.error(`Error applying serverless function owner rules: ${error}`, {
|
|
135
|
+
projectId: serverlessFunction.projectId?.toString(),
|
|
136
|
+
serverlessFunctionId: serverlessFunction.id?.toString(),
|
|
137
|
+
} as LogAttributes);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private doesMatchRule(
|
|
142
|
+
serverlessFunction: ServerlessFunction,
|
|
143
|
+
rule: ServerlessFunctionOwnerRule,
|
|
144
|
+
): boolean {
|
|
145
|
+
if (rule.matchLabels && rule.matchLabels.length > 0) {
|
|
146
|
+
if (!serverlessFunction.labels || serverlessFunction.labels.length === 0) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const ruleLabelIds: Array<string> = rule.matchLabels.map((l: Label) => {
|
|
150
|
+
return l.id?.toString() || "";
|
|
151
|
+
});
|
|
152
|
+
const labelIds: Array<string> = serverlessFunction.labels.map(
|
|
153
|
+
(l: Label) => {
|
|
154
|
+
return l.id?.toString() || "";
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
if (
|
|
158
|
+
!ruleLabelIds.some((id: string) => {
|
|
159
|
+
return labelIds.includes(id);
|
|
160
|
+
})
|
|
161
|
+
) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (
|
|
167
|
+
rule.nameRegexPattern &&
|
|
168
|
+
(!serverlessFunction.name ||
|
|
169
|
+
!this.testRegex(rule.nameRegexPattern, serverlessFunction.name))
|
|
170
|
+
) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (
|
|
175
|
+
rule.descriptionRegexPattern &&
|
|
176
|
+
(!serverlessFunction.description ||
|
|
177
|
+
!this.testRegex(
|
|
178
|
+
rule.descriptionRegexPattern,
|
|
179
|
+
serverlessFunction.description,
|
|
180
|
+
))
|
|
181
|
+
) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private testRegex(pattern: string, value: string): boolean {
|
|
189
|
+
try {
|
|
190
|
+
const regex: RegExp = new RegExp(pattern, "i");
|
|
191
|
+
return regex.test(value);
|
|
192
|
+
} catch {
|
|
193
|
+
logger.warn(`Invalid regex in serverless function owner rule: ${pattern}`);
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export default new ServerlessFunctionOwnerRuleEngineServiceClass();
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/ServerlessFunctionOwnerRule";
|
|
3
|
+
import { IsBillingEnabled } from "../EnvironmentConfig";
|
|
4
|
+
|
|
5
|
+
export class Service extends DatabaseService<Model> {
|
|
6
|
+
public constructor() {
|
|
7
|
+
super(Model);
|
|
8
|
+
if (IsBillingEnabled) {
|
|
9
|
+
this.hardDeleteItemsOlderThanInDays("createdAt", 3 * 365);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default new Service();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/ServerlessFunctionOwnerTeam";
|
|
3
|
+
|
|
4
|
+
export class Service extends DatabaseService<Model> {
|
|
5
|
+
public constructor() {
|
|
6
|
+
super(Model);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default new Service();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/ServerlessFunctionOwnerUser";
|
|
3
|
+
|
|
4
|
+
export class Service extends DatabaseService<Model> {
|
|
5
|
+
public constructor() {
|
|
6
|
+
super(Model);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default new Service();
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/ServerlessFunction";
|
|
3
|
+
import Label from "../../Models/DatabaseModels/Label";
|
|
4
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
5
|
+
import ObjectID from "../../Types/ObjectID";
|
|
6
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
7
|
+
import OneUptimeDate from "../../Types/Date";
|
|
8
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
9
|
+
import GlobalCache from "../Infrastructure/GlobalCache";
|
|
10
|
+
import logger, { LogAttributes } from "../Utils/Logger";
|
|
11
|
+
import crypto from "crypto";
|
|
12
|
+
import { OnCreate } from "../Types/Database/Hooks";
|
|
13
|
+
import ServerlessFunctionLabelRuleEngineService from "./ServerlessFunctionLabelRuleEngineService";
|
|
14
|
+
import ServerlessFunctionOwnerRuleEngineService from "./ServerlessFunctionOwnerRuleEngineService";
|
|
15
|
+
|
|
16
|
+
const LAST_SEEN_CACHE_NAMESPACE: string = "serverless-function-last-seen";
|
|
17
|
+
const LAST_SEEN_THROTTLE_SECONDS: number = 60;
|
|
18
|
+
|
|
19
|
+
const LABELS_APPLIED_CACHE_NAMESPACE: string =
|
|
20
|
+
"serverless-function-labels-applied";
|
|
21
|
+
const LABELS_APPLIED_CACHE_TTL_SECONDS: number = 60;
|
|
22
|
+
|
|
23
|
+
export class Service extends DatabaseService<Model> {
|
|
24
|
+
public constructor() {
|
|
25
|
+
super(Model);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@CaptureSpan()
|
|
29
|
+
protected override async onCreateSuccess(
|
|
30
|
+
_onCreate: OnCreate<Model>,
|
|
31
|
+
createdItem: Model,
|
|
32
|
+
): Promise<Model> {
|
|
33
|
+
if (createdItem.projectId && createdItem.id) {
|
|
34
|
+
Promise.resolve()
|
|
35
|
+
.then(async () => {
|
|
36
|
+
await ServerlessFunctionLabelRuleEngineService.applyRulesToServerlessFunction(
|
|
37
|
+
createdItem,
|
|
38
|
+
);
|
|
39
|
+
})
|
|
40
|
+
.then(async () => {
|
|
41
|
+
await ServerlessFunctionOwnerRuleEngineService.applyRulesToServerlessFunction(
|
|
42
|
+
createdItem,
|
|
43
|
+
);
|
|
44
|
+
})
|
|
45
|
+
.catch((error: Error) => {
|
|
46
|
+
logger.error(
|
|
47
|
+
`Error applying serverless function rules in ServerlessFunctionService.onCreateSuccess: ${error}`,
|
|
48
|
+
{
|
|
49
|
+
projectId: createdItem.projectId?.toString(),
|
|
50
|
+
serverlessFunctionId: createdItem.id?.toString(),
|
|
51
|
+
} as LogAttributes,
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return createdItem;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@CaptureSpan()
|
|
59
|
+
public async findOrCreateByFunctionIdentifier(data: {
|
|
60
|
+
projectId: ObjectID;
|
|
61
|
+
functionIdentifier: string;
|
|
62
|
+
}): Promise<Model> {
|
|
63
|
+
/*
|
|
64
|
+
* Look up case-insensitively. The unique guard on name/functionIdentifier
|
|
65
|
+
* (checkUniqueColumnBy -> findWithSameText) compares case-insensitively,
|
|
66
|
+
* so a case-sensitive lookup would miss an existing row on casing drift
|
|
67
|
+
* (faas.name), then fail to create it ("ServerlessFunction with the same
|
|
68
|
+
* name already exists") and wedge ingest. We keep the stored casing as-is
|
|
69
|
+
* so it stays in sync with the raw-cased resource.faas.name attribute the
|
|
70
|
+
* detail page filters on.
|
|
71
|
+
*/
|
|
72
|
+
const existingFunction: Model | null = await this.findOneBy({
|
|
73
|
+
query: {
|
|
74
|
+
projectId: data.projectId,
|
|
75
|
+
functionIdentifier: QueryHelper.findWithSameText(
|
|
76
|
+
data.functionIdentifier,
|
|
77
|
+
),
|
|
78
|
+
},
|
|
79
|
+
select: {
|
|
80
|
+
_id: true,
|
|
81
|
+
projectId: true,
|
|
82
|
+
functionIdentifier: true,
|
|
83
|
+
},
|
|
84
|
+
props: {
|
|
85
|
+
isRoot: true,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (existingFunction) {
|
|
90
|
+
return existingFunction;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const newFunction: Model = new Model();
|
|
95
|
+
newFunction.projectId = data.projectId;
|
|
96
|
+
newFunction.name = data.functionIdentifier;
|
|
97
|
+
newFunction.functionIdentifier = data.functionIdentifier;
|
|
98
|
+
newFunction.otelCollectorStatus = "connected";
|
|
99
|
+
newFunction.lastSeenAt = OneUptimeDate.getCurrentDate();
|
|
100
|
+
|
|
101
|
+
const createdFunction: Model = await this.create({
|
|
102
|
+
data: newFunction,
|
|
103
|
+
props: {
|
|
104
|
+
isRoot: true,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return createdFunction;
|
|
109
|
+
} catch {
|
|
110
|
+
/*
|
|
111
|
+
* Race condition: another request created the function concurrently.
|
|
112
|
+
* Re-fetch the existing row.
|
|
113
|
+
*/
|
|
114
|
+
const reFetchedFunction: Model | null = await this.findOneBy({
|
|
115
|
+
query: {
|
|
116
|
+
projectId: data.projectId,
|
|
117
|
+
functionIdentifier: QueryHelper.findWithSameText(
|
|
118
|
+
data.functionIdentifier,
|
|
119
|
+
),
|
|
120
|
+
},
|
|
121
|
+
select: {
|
|
122
|
+
_id: true,
|
|
123
|
+
projectId: true,
|
|
124
|
+
functionIdentifier: true,
|
|
125
|
+
},
|
|
126
|
+
props: {
|
|
127
|
+
isRoot: true,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
if (reFetchedFunction) {
|
|
132
|
+
return reFetchedFunction;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
throw new Error(
|
|
136
|
+
"Failed to create or find serverless function: " +
|
|
137
|
+
data.functionIdentifier,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
@CaptureSpan()
|
|
143
|
+
public async updateLastSeen(
|
|
144
|
+
serverlessFunctionId: ObjectID,
|
|
145
|
+
extra?: {
|
|
146
|
+
agentVersion?: string | undefined;
|
|
147
|
+
cloudPlatform?: string | undefined;
|
|
148
|
+
cloudProvider?: string | undefined;
|
|
149
|
+
cloudRegion?: string | undefined;
|
|
150
|
+
cloudAccountId?: string | undefined;
|
|
151
|
+
functionVersion?: string | undefined;
|
|
152
|
+
runtimeName?: string | undefined;
|
|
153
|
+
runtimeVersion?: string | undefined;
|
|
154
|
+
},
|
|
155
|
+
): Promise<void> {
|
|
156
|
+
const cacheKey: string = serverlessFunctionId.toString();
|
|
157
|
+
const extrasFingerprint: string = crypto
|
|
158
|
+
.createHash("sha1")
|
|
159
|
+
.update(
|
|
160
|
+
JSON.stringify({
|
|
161
|
+
agentVersion: extra?.agentVersion ?? null,
|
|
162
|
+
cloudPlatform: extra?.cloudPlatform ?? null,
|
|
163
|
+
cloudProvider: extra?.cloudProvider ?? null,
|
|
164
|
+
cloudRegion: extra?.cloudRegion ?? null,
|
|
165
|
+
cloudAccountId: extra?.cloudAccountId ?? null,
|
|
166
|
+
functionVersion: extra?.functionVersion ?? null,
|
|
167
|
+
runtimeName: extra?.runtimeName ?? null,
|
|
168
|
+
runtimeVersion: extra?.runtimeVersion ?? null,
|
|
169
|
+
}),
|
|
170
|
+
)
|
|
171
|
+
.digest("hex");
|
|
172
|
+
|
|
173
|
+
const cached: string | null = await GlobalCache.getString(
|
|
174
|
+
LAST_SEEN_CACHE_NAMESPACE,
|
|
175
|
+
cacheKey,
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
if (cached === extrasFingerprint) {
|
|
179
|
+
return; // same data was written recently
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
await GlobalCache.setString(
|
|
183
|
+
LAST_SEEN_CACHE_NAMESPACE,
|
|
184
|
+
cacheKey,
|
|
185
|
+
extrasFingerprint,
|
|
186
|
+
{ expiresInSeconds: LAST_SEEN_THROTTLE_SECONDS },
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
190
|
+
const data: any = {
|
|
191
|
+
lastSeenAt: OneUptimeDate.getCurrentDate(),
|
|
192
|
+
otelCollectorStatus: "connected",
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
if (extra?.agentVersion) {
|
|
196
|
+
data.agentVersion = extra.agentVersion;
|
|
197
|
+
}
|
|
198
|
+
if (extra?.cloudPlatform) {
|
|
199
|
+
data.cloudPlatform = extra.cloudPlatform;
|
|
200
|
+
}
|
|
201
|
+
if (extra?.cloudProvider) {
|
|
202
|
+
data.cloudProvider = extra.cloudProvider;
|
|
203
|
+
}
|
|
204
|
+
if (extra?.cloudRegion) {
|
|
205
|
+
data.cloudRegion = extra.cloudRegion;
|
|
206
|
+
}
|
|
207
|
+
if (extra?.cloudAccountId) {
|
|
208
|
+
data.cloudAccountId = extra.cloudAccountId;
|
|
209
|
+
}
|
|
210
|
+
if (extra?.functionVersion) {
|
|
211
|
+
data.functionVersion = extra.functionVersion;
|
|
212
|
+
}
|
|
213
|
+
if (extra?.runtimeName) {
|
|
214
|
+
data.runtimeName = extra.runtimeName;
|
|
215
|
+
}
|
|
216
|
+
if (extra?.runtimeVersion) {
|
|
217
|
+
data.runtimeVersion = extra.runtimeVersion;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
await this.updateOneById({
|
|
221
|
+
id: serverlessFunctionId,
|
|
222
|
+
data: data,
|
|
223
|
+
props: {
|
|
224
|
+
isRoot: true,
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Additively attach labels to a serverless function. Existing labels are
|
|
231
|
+
* never removed — manual labels set via the UI survive ingest. The set of
|
|
232
|
+
* labelIds is fingerprinted and cached for 60s so steady-state ingest with
|
|
233
|
+
* an unchanged label set costs one in-memory lookup.
|
|
234
|
+
*/
|
|
235
|
+
@CaptureSpan()
|
|
236
|
+
public async attachLabels(data: {
|
|
237
|
+
serverlessFunctionId: ObjectID;
|
|
238
|
+
labelIds: Array<ObjectID>;
|
|
239
|
+
}): Promise<void> {
|
|
240
|
+
if (!data.labelIds || data.labelIds.length === 0) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const cacheKey: string = data.serverlessFunctionId.toString();
|
|
245
|
+
const fingerprint: string = fingerprintLabelIds(data.labelIds);
|
|
246
|
+
const cached: string | null = await GlobalCache.getString(
|
|
247
|
+
LABELS_APPLIED_CACHE_NAMESPACE,
|
|
248
|
+
cacheKey,
|
|
249
|
+
);
|
|
250
|
+
if (cached === fingerprint) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
const functionIdStr: string = data.serverlessFunctionId.toString();
|
|
256
|
+
const existingLabels: Array<Label> = await this.getRepository()
|
|
257
|
+
.createQueryBuilder()
|
|
258
|
+
.relation(Model, "labels")
|
|
259
|
+
.of(functionIdStr)
|
|
260
|
+
.loadMany();
|
|
261
|
+
|
|
262
|
+
const existingIds: Set<string> = new Set();
|
|
263
|
+
for (const lbl of existingLabels) {
|
|
264
|
+
const idStr: string | undefined = lbl._id?.toString();
|
|
265
|
+
if (idStr) {
|
|
266
|
+
existingIds.add(idStr);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const toAddIds: Array<string> = [];
|
|
271
|
+
const seen: Set<string> = new Set();
|
|
272
|
+
for (const id of data.labelIds) {
|
|
273
|
+
const idStr: string = id.toString();
|
|
274
|
+
if (existingIds.has(idStr) || seen.has(idStr)) {
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
seen.add(idStr);
|
|
278
|
+
toAddIds.push(idStr);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (toAddIds.length > 0) {
|
|
282
|
+
await this.getRepository()
|
|
283
|
+
.createQueryBuilder()
|
|
284
|
+
.relation(Model, "labels")
|
|
285
|
+
.of(functionIdStr)
|
|
286
|
+
.add(toAddIds);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
await GlobalCache.setString(
|
|
290
|
+
LABELS_APPLIED_CACHE_NAMESPACE,
|
|
291
|
+
cacheKey,
|
|
292
|
+
fingerprint,
|
|
293
|
+
{ expiresInSeconds: LABELS_APPLIED_CACHE_TTL_SECONDS },
|
|
294
|
+
);
|
|
295
|
+
} catch (err) {
|
|
296
|
+
logger.warn(
|
|
297
|
+
`ServerlessFunctionService.attachLabels failed for function ${data.serverlessFunctionId.toString()}: ${
|
|
298
|
+
err instanceof Error ? err.message : String(err)
|
|
299
|
+
}`,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@CaptureSpan()
|
|
305
|
+
public async markDisconnectedFunctions(): Promise<void> {
|
|
306
|
+
const fiveMinutesAgo: Date = OneUptimeDate.addRemoveMinutes(
|
|
307
|
+
OneUptimeDate.getCurrentDate(),
|
|
308
|
+
-5,
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
const connectedFunctions: Array<Model> = await this.findBy({
|
|
312
|
+
query: {
|
|
313
|
+
otelCollectorStatus: "connected",
|
|
314
|
+
lastSeenAt: QueryHelper.lessThan(fiveMinutesAgo),
|
|
315
|
+
},
|
|
316
|
+
select: {
|
|
317
|
+
_id: true,
|
|
318
|
+
},
|
|
319
|
+
limit: LIMIT_MAX,
|
|
320
|
+
skip: 0,
|
|
321
|
+
props: {
|
|
322
|
+
isRoot: true,
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
for (const serverlessFunction of connectedFunctions) {
|
|
327
|
+
if (serverlessFunction._id) {
|
|
328
|
+
await this.updateOneById({
|
|
329
|
+
id: new ObjectID(serverlessFunction._id.toString()),
|
|
330
|
+
data: {
|
|
331
|
+
otelCollectorStatus: "disconnected",
|
|
332
|
+
},
|
|
333
|
+
props: {
|
|
334
|
+
isRoot: true,
|
|
335
|
+
},
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function fingerprintLabelIds(labelIds: Array<ObjectID>): string {
|
|
343
|
+
const sorted: Array<string> = labelIds
|
|
344
|
+
.map((id: ObjectID) => {
|
|
345
|
+
return id.toString();
|
|
346
|
+
})
|
|
347
|
+
.sort();
|
|
348
|
+
return crypto.createHash("sha1").update(sorted.join(",")).digest("hex");
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export default new Service();
|