@golemio/pid 2.11.10-dev.1185200204 → 2.11.10-dev.1186645272
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/dist/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.d.ts +1 -1
- package/dist/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.js +4 -2
- package/dist/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.js.map +1 -1
- package/dist/integration-engine/ropid-gtfs/workers/presets/data-access/interfaces/IPresetLogRepository.d.ts +1 -1
- package/dist/integration-engine/ropid-gtfs/workers/presets/tasks/ProcessAndSendLogsTask.d.ts +5 -1
- package/dist/integration-engine/ropid-gtfs/workers/presets/tasks/ProcessAndSendLogsTask.js +44 -21
- package/dist/integration-engine/ropid-gtfs/workers/presets/tasks/ProcessAndSendLogsTask.js.map +1 -1
- package/package.json +1 -1
package/dist/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { IPresetLogRepository } from "./interfaces/IPresetLogRepository";
|
|
|
7
7
|
export declare class PresetLogRepository extends PostgresModel implements IPresetLogRepository {
|
|
8
8
|
sequelizeModel: ModelStatic<PresetLogModel>;
|
|
9
9
|
constructor(departurePresetsRepository: DeparturePresetsRepository);
|
|
10
|
-
findUnprocessed: (
|
|
10
|
+
findUnprocessed: () => Promise<PresetLogModel[]>;
|
|
11
11
|
saveData: (data: IPresetLogOutputDto[]) => Promise<void>;
|
|
12
12
|
markAsProcessed: (logIds: string[]) => Promise<void>;
|
|
13
13
|
deleteNHoursOldData: (hours: number) => Promise<number>;
|
package/dist/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.js
CHANGED
|
@@ -63,7 +63,7 @@ let PresetLogRepository = exports.PresetLogRepository = class PresetLogRepositor
|
|
|
63
63
|
outputSequelizeAttributes: models_1.PresetLogModel.attributeModel,
|
|
64
64
|
savingType: "insertOrUpdate",
|
|
65
65
|
}, new golemio_validator_1.JSONSchemaValidator("PresetLogPepository", models_1.PresetLogModel.arrayJsonSchema));
|
|
66
|
-
this.findUnprocessed = (
|
|
66
|
+
this.findUnprocessed = () => __awaiter(this, void 0, void 0, function* () {
|
|
67
67
|
try {
|
|
68
68
|
return yield this.sequelizeModel.findAll({
|
|
69
69
|
attributes: ["id", "device_alias", "received_at"],
|
|
@@ -76,8 +76,10 @@ let PresetLogRepository = exports.PresetLogRepository = class PresetLogRepositor
|
|
|
76
76
|
],
|
|
77
77
|
where: {
|
|
78
78
|
is_processed: false,
|
|
79
|
+
received_at: {
|
|
80
|
+
[sequelize_1.Op.gte]: sequelize_1.default.literal(`NOW() - INTERVAL '10 MIN'`),
|
|
81
|
+
},
|
|
79
82
|
},
|
|
80
|
-
limit,
|
|
81
83
|
});
|
|
82
84
|
}
|
|
83
85
|
catch (err) {
|
package/dist/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresetLogRepository.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+EAAoE;AACpE,gGAAmG;AACnG,mEAAuC;AACvC,kGAA0E;AAE1E,yGAAuE;AACvE,yEAA6E;AAC7E,6EAAwE;AACxE,mFAAkF;AAClF,iFAAiF;AACjF,iEAAwE;AAIjE,IAAM,mBAAmB,iCAAzB,MAAM,mBAAoB,SAAQ,sBAAa;IAGlD,YAAqE,0BAAsD;QACvH,KAAK,CACD,qBAAqB,EACrB;YACI,WAAW,EAAE,uBAAc,CAAC,SAAS;YACrC,QAAQ,EAAE,iBAAS;YACnB,yBAAyB,EAAE,uBAAc,CAAC,cAAc;YACxD,UAAU,EAAE,gBAAgB;SAC/B,EACD,IAAI,uCAAmB,CAAC,qBAAqB,EAAE,uBAAc,CAAC,eAAe,CAAC,CACjF,CAAC;QAaC,oBAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"PresetLogRepository.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/ropid-gtfs/workers/presets/data-access/PresetLogRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { IModel } from "@golemio/core/dist/integration-engine/models";
|
|
|
4
4
|
import { ModelStatic } from "@golemio/core/dist/shared/sequelize";
|
|
5
5
|
export interface IPresetLogRepository extends IModel {
|
|
6
6
|
sequelizeModel: ModelStatic<PresetLogModel>;
|
|
7
|
-
findUnprocessed: (
|
|
7
|
+
findUnprocessed: () => Promise<PresetLogModel[]>;
|
|
8
8
|
saveData: (data: IPresetLogOutputDto[]) => Promise<void>;
|
|
9
9
|
markAsProcessed: (logIds: string[]) => Promise<void>;
|
|
10
10
|
deleteNHoursOldData: (hours: number) => Promise<number>;
|
package/dist/integration-engine/ropid-gtfs/workers/presets/tasks/ProcessAndSendLogsTask.d.ts
CHANGED
|
@@ -2,12 +2,16 @@ import { AbstractEmptyTask } from "@golemio/core/dist/integration-engine/workers
|
|
|
2
2
|
export declare class ProcessAndSendLogsTask extends AbstractEmptyTask {
|
|
3
3
|
readonly queueName = "processAndSendLogs";
|
|
4
4
|
readonly queueTtl: number;
|
|
5
|
+
private readonly LOCK_KEY_PHRASE;
|
|
6
|
+
private lockTimeout;
|
|
7
|
+
private readonly refreshInterval;
|
|
5
8
|
private logRepository;
|
|
6
9
|
private monitoringService;
|
|
7
10
|
private logger;
|
|
8
|
-
private
|
|
11
|
+
private redisClient;
|
|
9
12
|
private batchSize;
|
|
10
13
|
constructor(queuePrefix: string);
|
|
11
14
|
protected execute(): Promise<void>;
|
|
12
15
|
private processBatch;
|
|
16
|
+
private createMutex;
|
|
13
17
|
}
|
|
@@ -13,35 +13,56 @@ exports.ProcessAndSendLogsTask = void 0;
|
|
|
13
13
|
const Di_1 = require("../../../../ioc/Di");
|
|
14
14
|
const ModuleContainerToken_1 = require("../../../../ioc/ModuleContainerToken");
|
|
15
15
|
const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
|
|
16
|
+
const ioc_1 = require("@golemio/core/dist/integration-engine/ioc");
|
|
16
17
|
const workers_1 = require("@golemio/core/dist/integration-engine/workers");
|
|
18
|
+
const redis_semaphore_1 = require("@golemio/core/dist/shared/redis-semaphore");
|
|
17
19
|
const LogDateTimeUtils_1 = require("../helpers/LogDateTimeUtils");
|
|
18
|
-
const DEFAULT_LOG_LIMIT = 10000;
|
|
19
20
|
const DEFAULT_BATCH_SIZE = 1000;
|
|
21
|
+
const DEFAULT_SEND_LOGS_LOCK_TIMEOUT = 60 * 1000;
|
|
20
22
|
class ProcessAndSendLogsTask extends workers_1.AbstractEmptyTask {
|
|
21
23
|
constructor(queuePrefix) {
|
|
22
24
|
super(queuePrefix);
|
|
23
25
|
this.queueName = "processAndSendLogs";
|
|
24
26
|
this.queueTtl = 59 * 1000; // 59 seconds
|
|
27
|
+
this.LOCK_KEY_PHRASE = "ropidGTFSProcessAndSendLogsTask";
|
|
25
28
|
const config = Di_1.PidContainer.resolve(CoreToken_1.CoreToken.SimpleConfig);
|
|
26
29
|
this.logRepository = Di_1.PidContainer.resolve(ModuleContainerToken_1.ModuleContainerToken.PresetLogRepository);
|
|
27
30
|
this.monitoringService = Di_1.PidContainer.resolve(ModuleContainerToken_1.ModuleContainerToken.RopidMonitoringService);
|
|
31
|
+
this.redisClient = Di_1.PidContainer.resolve(ioc_1.ContainerToken.RedisConnector);
|
|
28
32
|
this.logger = Di_1.PidContainer.resolve(CoreToken_1.CoreToken.Logger);
|
|
29
|
-
const logLimit = config.getValue("env.ROPID_PRESET_LOG_LIMIT", DEFAULT_LOG_LIMIT.toString());
|
|
30
|
-
this.logLimit = Number.parseInt(logLimit);
|
|
31
33
|
const batchSize = config.getValue("env.ROPID_PRESET_LOG_BATCH_SIZE", DEFAULT_BATCH_SIZE.toString());
|
|
32
34
|
this.batchSize = Number.parseInt(batchSize);
|
|
35
|
+
const lockTimeout = config.getValue("env.ROPID_PRESET_SEND_LOGS_LOCK_TIMEOUT", DEFAULT_SEND_LOGS_LOCK_TIMEOUT.toString());
|
|
36
|
+
this.lockTimeout = Number.parseInt(lockTimeout);
|
|
37
|
+
this.refreshInterval = this.lockTimeout * 0.8; // recommended
|
|
33
38
|
}
|
|
34
39
|
execute() {
|
|
35
40
|
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
const mutex = this.createMutex();
|
|
42
|
+
const lockAcquired = yield mutex.tryAcquire();
|
|
43
|
+
if (!lockAcquired) {
|
|
44
|
+
this.logger.error(`${this.constructor.name}: unable to obtain mutex lock.`);
|
|
39
45
|
return;
|
|
40
46
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
try {
|
|
48
|
+
const logEntries = yield this.logRepository.findUnprocessed();
|
|
49
|
+
if (logEntries.length === 0) {
|
|
50
|
+
this.logger.warn(`${this.constructor.name}: no logs found to send to the ROPID monitoring system`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Process logs in batches to avoid exceeding the maximum allowed size of the request
|
|
54
|
+
for (let i = 0; i < logEntries.length; i += this.batchSize) {
|
|
55
|
+
try {
|
|
56
|
+
const batchedLogs = logEntries.slice(i, i + this.batchSize);
|
|
57
|
+
yield this.processBatch(batchedLogs);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
this.logger.warn(err, `${this.constructor.name}: error while processing DCIP system logs`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
yield mutex.release();
|
|
45
66
|
}
|
|
46
67
|
});
|
|
47
68
|
}
|
|
@@ -57,17 +78,19 @@ class ProcessAndSendLogsTask extends workers_1.AbstractEmptyTask {
|
|
|
57
78
|
receivedAt: LogDateTimeUtils_1.LogDateTimeUtils.parseISONoFractionalFromDate(received_at),
|
|
58
79
|
});
|
|
59
80
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
81
|
+
yield this.monitoringService.sendLogsToMonitoringSystem(logData);
|
|
82
|
+
this.logger.info(`${this.constructor.name}: ${logData.length} logs sent to the ROPID monitoring system`);
|
|
83
|
+
yield this.logRepository.markAsProcessed(logIds);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
createMutex() {
|
|
87
|
+
return new redis_semaphore_1.Mutex(this.redisClient.getConnection(), this.LOCK_KEY_PHRASE, {
|
|
88
|
+
acquireAttemptsLimit: 1,
|
|
89
|
+
lockTimeout: this.lockTimeout,
|
|
90
|
+
refreshInterval: this.refreshInterval,
|
|
91
|
+
onLockLost: (err) => {
|
|
92
|
+
this.logger.error(err, `${this.constructor.name}: mutex lock was lost`);
|
|
93
|
+
},
|
|
71
94
|
});
|
|
72
95
|
}
|
|
73
96
|
}
|
package/dist/integration-engine/ropid-gtfs/workers/presets/tasks/ProcessAndSendLogsTask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcessAndSendLogsTask.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/ropid-gtfs/workers/presets/tasks/ProcessAndSendLogsTask.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0C;AAC1C,+EAAoE;
|
|
1
|
+
{"version":3,"file":"ProcessAndSendLogsTask.js","sourceRoot":"","sources":["../../../../../../src/integration-engine/ropid-gtfs/workers/presets/tasks/ProcessAndSendLogsTask.ts"],"names":[],"mappings":"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"}
|