@bitblit/ratchet-aws 4.0.80-alpha
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/cjs/batch/aws-batch-background-processor.js +44 -0
- package/dist/cjs/batch/aws-batch-ratchet.js +55 -0
- package/dist/cjs/build/ratchet-aws-info.js +18 -0
- package/dist/cjs/cache/dynamo-db-storage-provider.js +111 -0
- package/dist/cjs/cache/s3-storage-provider.js +44 -0
- package/dist/cjs/cache/simple-cache-object-wrapper.js +2 -0
- package/dist/cjs/cache/simple-cache-read-options.js +2 -0
- package/dist/cjs/cache/simple-cache-storage-provider.js +2 -0
- package/dist/cjs/cache/simple-cache.js +66 -0
- package/dist/cjs/cloudwatch/cloud-watch-log-group-ratchet.js +73 -0
- package/dist/cjs/cloudwatch/cloud-watch-logs-ratchet.js +173 -0
- package/dist/cjs/cloudwatch/cloud-watch-metrics-ratchet.js +57 -0
- package/dist/cjs/daemon/daemon-like.js +2 -0
- package/dist/cjs/daemon/daemon-process-create-options.js +2 -0
- package/dist/cjs/daemon/daemon-process-state-public-token.js +2 -0
- package/dist/cjs/daemon/daemon-process-state.js +2 -0
- package/dist/cjs/daemon/daemon-util.js +152 -0
- package/dist/cjs/daemon/daemon.js +126 -0
- package/dist/cjs/dao/prototype-dao-config.js +2 -0
- package/dist/cjs/dao/prototype-dao-db.js +2 -0
- package/dist/cjs/dao/prototype-dao-provider.js +2 -0
- package/dist/cjs/dao/prototype-dao.js +88 -0
- package/dist/cjs/dao/s3-prototype-dao-provider.js +28 -0
- package/dist/cjs/dao/s3-simple-dao.js +78 -0
- package/dist/cjs/dao/simple-dao-item.js +2 -0
- package/dist/cjs/dynamodb/dynamo-ratchet-like.js +2 -0
- package/dist/cjs/dynamodb/dynamo-ratchet.js +667 -0
- package/dist/cjs/dynamodb/dynamo-table-ratchet.js +91 -0
- package/dist/cjs/dynamodb/hash-spreader.js +62 -0
- package/dist/cjs/ec2/ec2-ratchet.js +107 -0
- package/dist/cjs/environment/cascade-environment-service-provider.js +27 -0
- package/dist/cjs/environment/env-var-environment-service-provider.js +33 -0
- package/dist/cjs/environment/environment-service-config.js +2 -0
- package/dist/cjs/environment/environment-service-provider.js +2 -0
- package/dist/cjs/environment/environment-service.js +52 -0
- package/dist/cjs/environment/fixed-environment-service-provider.js +24 -0
- package/dist/cjs/environment/s3-environment-service-provider.js +29 -0
- package/dist/cjs/environment/ssm-environment-service-provider.js +61 -0
- package/dist/cjs/expiring-code/dynamo-expiring-code-provider.js +26 -0
- package/dist/cjs/expiring-code/expiring-code-params.js +2 -0
- package/dist/cjs/expiring-code/expiring-code-provider.js +2 -0
- package/dist/cjs/expiring-code/expiring-code-ratchet.js +37 -0
- package/dist/cjs/expiring-code/expiring-code.js +2 -0
- package/dist/cjs/expiring-code/s3-expiring-code-provider.js +49 -0
- package/dist/cjs/iam/aws-credentials-ratchet.js +21 -0
- package/dist/cjs/index.js +81 -0
- package/dist/cjs/lambda/lambda-event-detector.js +42 -0
- package/dist/cjs/lambda/lambda-event-type-guards.js +28 -0
- package/dist/cjs/model/cloud-watch-metrics-minute-level-dynamo-count-request.js +2 -0
- package/dist/cjs/model/cloud-watch-metrics-unit.js +33 -0
- package/dist/cjs/model/dynamo/doc-put-item-command-input.js +2 -0
- package/dist/cjs/model/dynamo/doc-query-command-input.js +2 -0
- package/dist/cjs/model/dynamo/doc-scan-command-input.js +2 -0
- package/dist/cjs/model/dynamo/doc-update-item-command-input.js +2 -0
- package/dist/cjs/model/dynamo-count-result.js +2 -0
- package/dist/cjs/route53/route-53-ratchet.js +57 -0
- package/dist/cjs/runtime-parameter/cached-stored-runtime-parameter.js +2 -0
- package/dist/cjs/runtime-parameter/dynamo-runtime-parameter-provider.js +38 -0
- package/dist/cjs/runtime-parameter/global-variable-override-runtime-parameter-provider.js +54 -0
- package/dist/cjs/runtime-parameter/memory-runtime-parameter-provider.js +30 -0
- package/dist/cjs/runtime-parameter/runtime-parameter-provider.js +2 -0
- package/dist/cjs/runtime-parameter/runtime-parameter-ratchet.js +74 -0
- package/dist/cjs/runtime-parameter/stored-runtime-parameter.js +2 -0
- package/dist/cjs/s3/s3-cache-ratchet.js +332 -0
- package/dist/cjs/s3/s3-cache-to-local-disk-ratchet.js +105 -0
- package/dist/cjs/s3/s3-location-sync-ratchet.js +142 -0
- package/dist/cjs/s3/s3-ratchet.js +26 -0
- package/dist/cjs/ses/email-attachment.js +2 -0
- package/dist/cjs/ses/mailer-config.js +2 -0
- package/dist/cjs/ses/mailer-like.js +2 -0
- package/dist/cjs/ses/mailer.js +208 -0
- package/dist/cjs/ses/ratchet-template-renderer.js +2 -0
- package/dist/cjs/ses/ready-to-send-email.js +2 -0
- package/dist/cjs/ses/remote-handlebars-template-renderer.js +79 -0
- package/dist/cjs/ses/resolved-ready-to-send-email.js +2 -0
- package/dist/cjs/sns/sns-ratchet.js +47 -0
- package/dist/cjs/sync-lock/dynamo-db-sync-lock.js +69 -0
- package/dist/cjs/sync-lock/memory-sync-lock.js +40 -0
- package/dist/cjs/sync-lock/sync-lock-provider.js +2 -0
- package/dist/es/batch/aws-batch-background-processor.js +40 -0
- package/dist/es/batch/aws-batch-ratchet.js +51 -0
- package/dist/es/build/ratchet-aws-info.js +14 -0
- package/dist/es/cache/dynamo-db-storage-provider.js +107 -0
- package/dist/es/cache/s3-storage-provider.js +40 -0
- package/dist/es/cache/simple-cache-object-wrapper.js +1 -0
- package/dist/es/cache/simple-cache-read-options.js +1 -0
- package/dist/es/cache/simple-cache-storage-provider.js +1 -0
- package/dist/es/cache/simple-cache.js +62 -0
- package/dist/es/cloudwatch/cloud-watch-log-group-ratchet.js +69 -0
- package/dist/es/cloudwatch/cloud-watch-logs-ratchet.js +169 -0
- package/dist/es/cloudwatch/cloud-watch-metrics-ratchet.js +53 -0
- package/dist/es/daemon/daemon-like.js +1 -0
- package/dist/es/daemon/daemon-process-create-options.js +1 -0
- package/dist/es/daemon/daemon-process-state-public-token.js +1 -0
- package/dist/es/daemon/daemon-process-state.js +1 -0
- package/dist/es/daemon/daemon-util.js +148 -0
- package/dist/es/daemon/daemon.js +122 -0
- package/dist/es/dao/prototype-dao-config.js +1 -0
- package/dist/es/dao/prototype-dao-db.js +1 -0
- package/dist/es/dao/prototype-dao-provider.js +1 -0
- package/dist/es/dao/prototype-dao.js +84 -0
- package/dist/es/dao/s3-prototype-dao-provider.js +24 -0
- package/dist/es/dao/s3-simple-dao.js +74 -0
- package/dist/es/dao/simple-dao-item.js +1 -0
- package/dist/es/dynamodb/dynamo-ratchet-like.js +1 -0
- package/dist/es/dynamodb/dynamo-ratchet.js +663 -0
- package/dist/es/dynamodb/dynamo-table-ratchet.js +87 -0
- package/dist/es/dynamodb/hash-spreader.js +58 -0
- package/dist/es/ec2/ec2-ratchet.js +103 -0
- package/dist/es/environment/cascade-environment-service-provider.js +23 -0
- package/dist/es/environment/env-var-environment-service-provider.js +29 -0
- package/dist/es/environment/environment-service-config.js +1 -0
- package/dist/es/environment/environment-service-provider.js +1 -0
- package/dist/es/environment/environment-service.js +48 -0
- package/dist/es/environment/fixed-environment-service-provider.js +20 -0
- package/dist/es/environment/s3-environment-service-provider.js +25 -0
- package/dist/es/environment/ssm-environment-service-provider.js +56 -0
- package/dist/es/expiring-code/dynamo-expiring-code-provider.js +22 -0
- package/dist/es/expiring-code/expiring-code-params.js +1 -0
- package/dist/es/expiring-code/expiring-code-provider.js +1 -0
- package/dist/es/expiring-code/expiring-code-ratchet.js +33 -0
- package/dist/es/expiring-code/expiring-code.js +1 -0
- package/dist/es/expiring-code/s3-expiring-code-provider.js +45 -0
- package/dist/es/iam/aws-credentials-ratchet.js +17 -0
- package/dist/es/index.js +78 -0
- package/dist/es/lambda/lambda-event-detector.js +38 -0
- package/dist/es/lambda/lambda-event-type-guards.js +24 -0
- package/dist/es/model/cloud-watch-metrics-minute-level-dynamo-count-request.js +1 -0
- package/dist/es/model/cloud-watch-metrics-unit.js +30 -0
- package/dist/es/model/dynamo/doc-put-item-command-input.js +1 -0
- package/dist/es/model/dynamo/doc-query-command-input.js +1 -0
- package/dist/es/model/dynamo/doc-scan-command-input.js +1 -0
- package/dist/es/model/dynamo/doc-update-item-command-input.js +1 -0
- package/dist/es/model/dynamo-count-result.js +1 -0
- package/dist/es/route53/route-53-ratchet.js +53 -0
- package/dist/es/runtime-parameter/cached-stored-runtime-parameter.js +1 -0
- package/dist/es/runtime-parameter/dynamo-runtime-parameter-provider.js +34 -0
- package/dist/es/runtime-parameter/global-variable-override-runtime-parameter-provider.js +49 -0
- package/dist/es/runtime-parameter/memory-runtime-parameter-provider.js +26 -0
- package/dist/es/runtime-parameter/runtime-parameter-provider.js +1 -0
- package/dist/es/runtime-parameter/runtime-parameter-ratchet.js +70 -0
- package/dist/es/runtime-parameter/stored-runtime-parameter.js +1 -0
- package/dist/es/s3/s3-cache-ratchet.js +328 -0
- package/dist/es/s3/s3-cache-to-local-disk-ratchet.js +100 -0
- package/dist/es/s3/s3-location-sync-ratchet.js +137 -0
- package/dist/es/s3/s3-ratchet.js +22 -0
- package/dist/es/ses/email-attachment.js +1 -0
- package/dist/es/ses/mailer-config.js +1 -0
- package/dist/es/ses/mailer-like.js +1 -0
- package/dist/es/ses/mailer.js +204 -0
- package/dist/es/ses/ratchet-template-renderer.js +1 -0
- package/dist/es/ses/ready-to-send-email.js +1 -0
- package/dist/es/ses/remote-handlebars-template-renderer.js +74 -0
- package/dist/es/ses/resolved-ready-to-send-email.js +1 -0
- package/dist/es/sns/sns-ratchet.js +43 -0
- package/dist/es/sync-lock/dynamo-db-sync-lock.js +65 -0
- package/dist/es/sync-lock/memory-sync-lock.js +36 -0
- package/dist/es/sync-lock/sync-lock-provider.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.es.tsbuildinfo +1 -0
- package/dist/tsconfig.types.tsbuildinfo +1 -0
- package/dist/types/batch/aws-batch-background-processor.d.ts +12 -0
- package/dist/types/batch/aws-batch-ratchet.d.ts +16 -0
- package/dist/types/build/ratchet-aws-info.d.ts +5 -0
- package/dist/types/cache/dynamo-db-storage-provider.d.ts +25 -0
- package/dist/types/cache/s3-storage-provider.d.ts +14 -0
- package/dist/types/cache/simple-cache-object-wrapper.d.ts +7 -0
- package/dist/types/cache/simple-cache-read-options.d.ts +5 -0
- package/dist/types/cache/simple-cache-storage-provider.d.ts +8 -0
- package/dist/types/cache/simple-cache.d.ts +14 -0
- package/dist/types/cloudwatch/cloud-watch-log-group-ratchet.d.ts +9 -0
- package/dist/types/cloudwatch/cloud-watch-logs-ratchet.d.ts +14 -0
- package/dist/types/cloudwatch/cloud-watch-metrics-ratchet.d.ts +10 -0
- package/dist/types/daemon/daemon-like.d.ts +17 -0
- package/dist/types/daemon/daemon-process-create-options.d.ts +7 -0
- package/dist/types/daemon/daemon-process-state-public-token.d.ts +4 -0
- package/dist/types/daemon/daemon-process-state.d.ts +13 -0
- package/dist/types/daemon/daemon-util.d.ts +24 -0
- package/dist/types/daemon/daemon.d.ts +33 -0
- package/dist/types/dao/prototype-dao-config.d.ts +8 -0
- package/dist/types/dao/prototype-dao-db.d.ts +4 -0
- package/dist/types/dao/prototype-dao-provider.d.ts +5 -0
- package/dist/types/dao/prototype-dao.d.ts +15 -0
- package/dist/types/dao/s3-prototype-dao-provider.d.ts +10 -0
- package/dist/types/dao/s3-simple-dao.d.ts +15 -0
- package/dist/types/dao/simple-dao-item.d.ts +5 -0
- package/dist/types/dynamodb/dynamo-ratchet-like.d.ts +27 -0
- package/dist/types/dynamodb/dynamo-ratchet.d.ts +36 -0
- package/dist/types/dynamodb/dynamo-table-ratchet.d.ts +11 -0
- package/dist/types/dynamodb/hash-spreader.d.ts +15 -0
- package/dist/types/ec2/ec2-ratchet.d.ts +25 -0
- package/dist/types/environment/cascade-environment-service-provider.d.ts +9 -0
- package/dist/types/environment/env-var-environment-service-provider.d.ts +10 -0
- package/dist/types/environment/environment-service-config.d.ts +7 -0
- package/dist/types/environment/environment-service-provider.d.ts +7 -0
- package/dist/types/environment/environment-service.d.ts +14 -0
- package/dist/types/environment/fixed-environment-service-provider.d.ts +10 -0
- package/dist/types/environment/s3-environment-service-provider.d.ts +18 -0
- package/dist/types/environment/ssm-environment-service-provider.d.ts +12 -0
- package/dist/types/expiring-code/dynamo-expiring-code-provider.d.ts +12 -0
- package/dist/types/expiring-code/expiring-code-params.d.ts +7 -0
- package/dist/types/expiring-code/expiring-code-provider.d.ts +5 -0
- package/dist/types/expiring-code/expiring-code-ratchet.d.ts +13 -0
- package/dist/types/expiring-code/expiring-code.d.ts +6 -0
- package/dist/types/expiring-code/s3-expiring-code-provider.d.ts +17 -0
- package/dist/types/iam/aws-credentials-ratchet.d.ts +9 -0
- package/dist/types/index.d.ts +81 -0
- package/dist/types/lambda/lambda-event-detector.d.ts +14 -0
- package/dist/types/lambda/lambda-event-type-guards.d.ts +10 -0
- package/dist/types/model/cloud-watch-metrics-minute-level-dynamo-count-request.d.ts +12 -0
- package/dist/types/model/cloud-watch-metrics-unit.d.ts +29 -0
- package/dist/types/model/dynamo/doc-put-item-command-input.d.ts +4 -0
- package/dist/types/model/dynamo/doc-query-command-input.d.ts +5 -0
- package/dist/types/model/dynamo/doc-scan-command-input.d.ts +5 -0
- package/dist/types/model/dynamo/doc-update-item-command-input.d.ts +5 -0
- package/dist/types/model/dynamo-count-result.d.ts +5 -0
- package/dist/types/route53/route-53-ratchet.d.ts +7 -0
- package/dist/types/runtime-parameter/cached-stored-runtime-parameter.d.ts +4 -0
- package/dist/types/runtime-parameter/dynamo-runtime-parameter-provider.d.ts +11 -0
- package/dist/types/runtime-parameter/global-variable-override-runtime-parameter-provider.d.ts +24 -0
- package/dist/types/runtime-parameter/memory-runtime-parameter-provider.d.ts +13 -0
- package/dist/types/runtime-parameter/runtime-parameter-provider.d.ts +11 -0
- package/dist/types/runtime-parameter/runtime-parameter-ratchet.d.ts +15 -0
- package/dist/types/runtime-parameter/stored-runtime-parameter.d.ts +6 -0
- package/dist/types/s3/s3-cache-ratchet.d.ts +38 -0
- package/dist/types/s3/s3-cache-to-local-disk-ratchet.d.ts +21 -0
- package/dist/types/s3/s3-location-sync-ratchet.d.ts +21 -0
- package/dist/types/s3/s3-ratchet.d.ts +5 -0
- package/dist/types/ses/email-attachment.d.ts +23 -0
- package/dist/types/ses/mailer-config.d.ts +15 -0
- package/dist/types/ses/mailer-like.d.ts +18 -0
- package/dist/types/ses/mailer.d.ts +26 -0
- package/dist/types/ses/ratchet-template-renderer.d.ts +8 -0
- package/dist/types/ses/ready-to-send-email.d.ts +66 -0
- package/dist/types/ses/remote-handlebars-template-renderer.d.ts +15 -0
- package/dist/types/ses/resolved-ready-to-send-email.d.ts +16 -0
- package/dist/types/sns/sns-ratchet.d.ts +8 -0
- package/dist/types/sync-lock/dynamo-db-sync-lock.d.ts +10 -0
- package/dist/types/sync-lock/memory-sync-lock.d.ts +11 -0
- package/dist/types/sync-lock/sync-lock-provider.d.ts +5 -0
- package/package.json +112 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AwsBatchBackgroundProcessor = void 0;
|
|
4
|
+
const luxon_1 = require("luxon");
|
|
5
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
6
|
+
class AwsBatchBackgroundProcessor {
|
|
7
|
+
constructor(batchRatchet, validTaskNames) {
|
|
8
|
+
this.batchRatchet = batchRatchet;
|
|
9
|
+
this.validTaskNames = validTaskNames;
|
|
10
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.batchRatchet, 'batchRatchet');
|
|
11
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.batchRatchet.batchClient, 'batchRatchet.batchClient');
|
|
12
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultJobDefinition, 'batchRatchet.defaultJobDefinition');
|
|
13
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultQueueName, 'batchRatchet.defaultQueueName');
|
|
14
|
+
}
|
|
15
|
+
async scheduleBackgroundTask(taskName, data = {}, meta = {}) {
|
|
16
|
+
if (this.validTaskNames &&
|
|
17
|
+
this.validTaskNames.length &&
|
|
18
|
+
(!ratchet_common_1.StringRatchet.trimToNull(taskName) || !this.validTaskNames.includes(taskName))) {
|
|
19
|
+
ratchet_common_1.ErrorRatchet.throwFormattedErr('Cannot start task %s - not found in valid task list', taskName);
|
|
20
|
+
}
|
|
21
|
+
ratchet_common_1.Logger.info('Submitting background task to AWS batch: %s %j %s', taskName, data, this.batchRatchet.defaultQueueName);
|
|
22
|
+
let rval = null;
|
|
23
|
+
const jobName = `${this.batchRatchet.defaultJobDefinition}-${taskName}_${luxon_1.DateTime.utc().toFormat('yyyy-MM-dd-HH-mm')}`;
|
|
24
|
+
const options = {
|
|
25
|
+
jobName: jobName,
|
|
26
|
+
jobDefinition: this.batchRatchet.defaultJobDefinition,
|
|
27
|
+
jobQueue: this.batchRatchet.defaultQueueName,
|
|
28
|
+
parameters: {
|
|
29
|
+
taskName,
|
|
30
|
+
taskData: JSON.stringify(data),
|
|
31
|
+
taskMetadata: JSON.stringify(meta),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
try {
|
|
35
|
+
rval = await this.batchRatchet.scheduleJob(options);
|
|
36
|
+
ratchet_common_1.Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
ratchet_common_1.Logger.error('Cannot submit batch job taskName: %s jobDef: %s queue: %s jobName: %s data: %j', taskName, this.batchRatchet.defaultJobDefinition, this.batchRatchet.defaultQueueName, jobName, data, err);
|
|
40
|
+
}
|
|
41
|
+
return rval;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.AwsBatchBackgroundProcessor = AwsBatchBackgroundProcessor;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AwsBatchRatchet = void 0;
|
|
4
|
+
const client_batch_1 = require("@aws-sdk/client-batch");
|
|
5
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
6
|
+
class AwsBatchRatchet {
|
|
7
|
+
constructor(_batchClient, _defaultQueueName, _defaultJobDefinition) {
|
|
8
|
+
this._batchClient = _batchClient;
|
|
9
|
+
this._defaultQueueName = _defaultQueueName;
|
|
10
|
+
this._defaultJobDefinition = _defaultJobDefinition;
|
|
11
|
+
}
|
|
12
|
+
get batchClient() {
|
|
13
|
+
return this._batchClient;
|
|
14
|
+
}
|
|
15
|
+
get defaultQueueName() {
|
|
16
|
+
return this._defaultQueueName;
|
|
17
|
+
}
|
|
18
|
+
get defaultJobDefinition() {
|
|
19
|
+
return this._defaultJobDefinition;
|
|
20
|
+
}
|
|
21
|
+
async scheduleJob(options) {
|
|
22
|
+
ratchet_common_1.Logger.info('Submitting batch job %s', options.jobName);
|
|
23
|
+
try {
|
|
24
|
+
const rval = await this._batchClient.send(new client_batch_1.SubmitJobCommand(options));
|
|
25
|
+
ratchet_common_1.Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);
|
|
26
|
+
return rval;
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
ratchet_common_1.Logger.error('Cannot submit batch job %s: %s', options.jobName, err);
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
async jobCountInState(jobStatus, queueName = this.defaultQueueName) {
|
|
34
|
+
const all = await this.listJobs(queueName, jobStatus);
|
|
35
|
+
return all.length;
|
|
36
|
+
}
|
|
37
|
+
async listJobs(queueName = this.defaultQueueName, jobStatus = null) {
|
|
38
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(queueName, 'queueName');
|
|
39
|
+
let rval = [];
|
|
40
|
+
const request = {
|
|
41
|
+
jobQueue: queueName,
|
|
42
|
+
jobStatus: jobStatus,
|
|
43
|
+
nextToken: null,
|
|
44
|
+
};
|
|
45
|
+
ratchet_common_1.Logger.info('Fetching %j', request);
|
|
46
|
+
do {
|
|
47
|
+
ratchet_common_1.Logger.info('Pulling page...');
|
|
48
|
+
const tmp = await this._batchClient.send(new client_batch_1.ListJobsCommand(request));
|
|
49
|
+
rval = rval.concat(tmp.jobSummaryList);
|
|
50
|
+
request.nextToken = tmp.nextToken;
|
|
51
|
+
} while (request.nextToken);
|
|
52
|
+
return rval;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.AwsBatchRatchet = AwsBatchRatchet;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RatchetAwsInfo = void 0;
|
|
4
|
+
class RatchetAwsInfo {
|
|
5
|
+
constructor() { }
|
|
6
|
+
static buildInformation() {
|
|
7
|
+
const val = {
|
|
8
|
+
version: '80',
|
|
9
|
+
hash: '10fcb761c2fa4186df89e527e948f5780a4e14ac',
|
|
10
|
+
branch: 'alpha-2023-03-12-2',
|
|
11
|
+
tag: 'alpha-2023-03-12-2',
|
|
12
|
+
timeBuiltISO: '2023-03-12T20:00:51-0700',
|
|
13
|
+
notes: '',
|
|
14
|
+
};
|
|
15
|
+
return val;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.RatchetAwsInfo = RatchetAwsInfo;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DynamoDbStorageProvider = void 0;
|
|
4
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
5
|
+
class DynamoDbStorageProvider {
|
|
6
|
+
constructor(dynamo, opts) {
|
|
7
|
+
this.dynamo = dynamo;
|
|
8
|
+
this.opts = opts;
|
|
9
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.dynamo, 'dynamo');
|
|
10
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.opts, 'opts');
|
|
11
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.opts.tableName, 'opts.tableName');
|
|
12
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.opts.hashKeyName, 'opts.hashKeyName');
|
|
13
|
+
ratchet_common_1.RequireRatchet.true(!this.opts.useRangeKeys || (!!this.opts.rangeKeyName && !!this.opts.hashKeyValue), 'invalid range configuration');
|
|
14
|
+
}
|
|
15
|
+
static createDefaultOptions() {
|
|
16
|
+
const rval = {
|
|
17
|
+
tableName: 'simple-cache',
|
|
18
|
+
useRangeKeys: false,
|
|
19
|
+
hashKeyName: 'cache-key',
|
|
20
|
+
rangeKeyName: null,
|
|
21
|
+
hashKeyValue: null,
|
|
22
|
+
};
|
|
23
|
+
return rval;
|
|
24
|
+
}
|
|
25
|
+
createKeyObject(cacheKey) {
|
|
26
|
+
const keys = {};
|
|
27
|
+
if (this.opts.useRangeKeys) {
|
|
28
|
+
keys[this.opts.hashKeyName] = this.opts.hashKeyValue;
|
|
29
|
+
keys[this.opts.rangeKeyName] = cacheKey;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
keys[this.opts.hashKeyName] = cacheKey;
|
|
33
|
+
}
|
|
34
|
+
return keys;
|
|
35
|
+
}
|
|
36
|
+
cleanDynamoFieldsFromObjectInPlace(rval) {
|
|
37
|
+
if (rval) {
|
|
38
|
+
delete rval[this.opts.hashKeyName];
|
|
39
|
+
if (this.opts.rangeKeyName) {
|
|
40
|
+
delete rval[this.opts.rangeKeyName];
|
|
41
|
+
}
|
|
42
|
+
if (this.opts.dynamoExpiresColumnName) {
|
|
43
|
+
delete rval[this.opts.dynamoExpiresColumnName];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
extractKeysFromObject(rval) {
|
|
48
|
+
let keys = null;
|
|
49
|
+
if (rval) {
|
|
50
|
+
keys = {};
|
|
51
|
+
if (this.opts.useRangeKeys) {
|
|
52
|
+
keys[this.opts.hashKeyName] = this.opts.hashKeyValue;
|
|
53
|
+
keys[this.opts.rangeKeyName] = rval.cacheKey;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
keys[this.opts.hashKeyName] = rval.cacheKey;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return keys;
|
|
60
|
+
}
|
|
61
|
+
async readFromCache(cacheKey) {
|
|
62
|
+
const dKey = this.createKeyObject(cacheKey);
|
|
63
|
+
const rval = await this.dynamo.simpleGet(this.opts.tableName, dKey);
|
|
64
|
+
this.cleanDynamoFieldsFromObjectInPlace(rval);
|
|
65
|
+
return rval;
|
|
66
|
+
}
|
|
67
|
+
async storeInCache(value) {
|
|
68
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(value, 'value');
|
|
69
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');
|
|
70
|
+
const toSave = Object.assign({}, value, this.createKeyObject(value.cacheKey));
|
|
71
|
+
if (this.opts.dynamoExpiresColumnName && value.expiresEpochMS) {
|
|
72
|
+
toSave[this.opts.dynamoExpiresColumnName] = Math.floor(value.expiresEpochMS / 1000);
|
|
73
|
+
}
|
|
74
|
+
const wrote = await this.dynamo.simplePut(this.opts.tableName, toSave);
|
|
75
|
+
return !!wrote;
|
|
76
|
+
}
|
|
77
|
+
async removeFromCache(cacheKey) {
|
|
78
|
+
await this.dynamo.simpleDelete(this.opts.tableName, this.createKeyObject(cacheKey));
|
|
79
|
+
}
|
|
80
|
+
async clearCache() {
|
|
81
|
+
const allValues = await this.readAll();
|
|
82
|
+
const allKeys = allValues.map((a) => this.extractKeysFromObject(a));
|
|
83
|
+
const rval = await this.dynamo.deleteAllInBatches(this.opts.tableName, allKeys, 25);
|
|
84
|
+
return rval;
|
|
85
|
+
}
|
|
86
|
+
async readAll() {
|
|
87
|
+
let rval = null;
|
|
88
|
+
if (this.opts.useRangeKeys) {
|
|
89
|
+
const qry = {
|
|
90
|
+
TableName: this.opts.tableName,
|
|
91
|
+
KeyConditionExpression: '#cacheKey = :cacheKey',
|
|
92
|
+
ExpressionAttributeNames: {
|
|
93
|
+
'#cacheKey': this.opts.hashKeyName,
|
|
94
|
+
},
|
|
95
|
+
ExpressionAttributeValues: {
|
|
96
|
+
':cacheKey': this.opts.hashKeyValue,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
rval = await this.dynamo.fullyExecuteQuery(qry);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const scan = {
|
|
103
|
+
TableName: this.opts.tableName,
|
|
104
|
+
};
|
|
105
|
+
rval = await this.dynamo.fullyExecuteScan(scan);
|
|
106
|
+
}
|
|
107
|
+
rval.forEach((r) => this.cleanDynamoFieldsFromObjectInPlace(r));
|
|
108
|
+
return rval;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.DynamoDbStorageProvider = DynamoDbStorageProvider;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3StorageProvider = void 0;
|
|
4
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
5
|
+
class S3StorageProvider {
|
|
6
|
+
constructor(s3CacheRatchet, prefix) {
|
|
7
|
+
this.s3CacheRatchet = s3CacheRatchet;
|
|
8
|
+
this.prefix = prefix;
|
|
9
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.s3CacheRatchet, 's3CacheRatchet');
|
|
10
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(this.s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');
|
|
11
|
+
}
|
|
12
|
+
keyToPath(cacheKey) {
|
|
13
|
+
let rval = ratchet_common_1.StringRatchet.trimToEmpty(this.prefix);
|
|
14
|
+
if (rval.length > 0 && !rval.endsWith('/')) {
|
|
15
|
+
rval += '/';
|
|
16
|
+
}
|
|
17
|
+
rval += cacheKey;
|
|
18
|
+
return rval;
|
|
19
|
+
}
|
|
20
|
+
async readFromCache(cacheKey) {
|
|
21
|
+
const rval = await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyToPath(cacheKey));
|
|
22
|
+
return rval;
|
|
23
|
+
}
|
|
24
|
+
async storeInCache(value) {
|
|
25
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(value, 'value');
|
|
26
|
+
ratchet_common_1.RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');
|
|
27
|
+
const tmp = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyToPath(value.cacheKey), value);
|
|
28
|
+
return !!tmp;
|
|
29
|
+
}
|
|
30
|
+
async removeFromCache(cacheKey) {
|
|
31
|
+
await this.s3CacheRatchet.removeCacheFile(this.keyToPath(cacheKey));
|
|
32
|
+
}
|
|
33
|
+
async clearCache() {
|
|
34
|
+
const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));
|
|
35
|
+
const removed = await Promise.all(keys.map((k) => this.removeFromCache(k)));
|
|
36
|
+
return keys.length;
|
|
37
|
+
}
|
|
38
|
+
async readAll() {
|
|
39
|
+
const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));
|
|
40
|
+
const rval = await Promise.all(keys.map((k) => this.readFromCache(k)));
|
|
41
|
+
return rval;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.S3StorageProvider = S3StorageProvider;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SimpleCache = void 0;
|
|
4
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
5
|
+
class SimpleCache {
|
|
6
|
+
constructor(provider, defaultTimeToLiveMS = 1000 * 60) {
|
|
7
|
+
this.provider = provider;
|
|
8
|
+
this.defaultTimeToLiveMS = defaultTimeToLiveMS;
|
|
9
|
+
}
|
|
10
|
+
createDefaultReadOptions() {
|
|
11
|
+
return {
|
|
12
|
+
maxStalenessMS: null,
|
|
13
|
+
timeToLiveMS: this.defaultTimeToLiveMS,
|
|
14
|
+
cacheNullValues: false,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async fetchWrapper(cacheKey, producer, opts = this.createDefaultReadOptions()) {
|
|
18
|
+
ratchet_common_1.Logger.silly('Fetching %s', cacheKey);
|
|
19
|
+
const now = new Date().getTime();
|
|
20
|
+
let rval = await this.provider.readFromCache(cacheKey);
|
|
21
|
+
if (rval && rval.expiresEpochMS < now) {
|
|
22
|
+
ratchet_common_1.Logger.debug('Object found, but expired - removing');
|
|
23
|
+
rval = null;
|
|
24
|
+
}
|
|
25
|
+
if (rval && opts && opts.maxStalenessMS && now - rval.createdEpochMS > opts.maxStalenessMS) {
|
|
26
|
+
ratchet_common_1.Logger.debug('Object found by too stale - removing');
|
|
27
|
+
rval = null;
|
|
28
|
+
}
|
|
29
|
+
if (!rval) {
|
|
30
|
+
ratchet_common_1.Logger.debug('%s not found in cache, generating', cacheKey);
|
|
31
|
+
const tmp = await producer();
|
|
32
|
+
if (tmp || (opts === null || opts === void 0 ? void 0 : opts.cacheNullValues)) {
|
|
33
|
+
ratchet_common_1.Logger.debug('Writing %j to cache');
|
|
34
|
+
rval = {
|
|
35
|
+
cacheKey: cacheKey,
|
|
36
|
+
createdEpochMS: now,
|
|
37
|
+
expiresEpochMS: opts && opts.timeToLiveMS ? now + opts.timeToLiveMS : null,
|
|
38
|
+
value: tmp,
|
|
39
|
+
generated: false,
|
|
40
|
+
};
|
|
41
|
+
await this.provider.storeInCache(rval);
|
|
42
|
+
rval.generated = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return rval;
|
|
46
|
+
}
|
|
47
|
+
async fetch(cacheKey, producer, opts = null) {
|
|
48
|
+
const wrapper = await this.fetchWrapper(cacheKey, producer, opts);
|
|
49
|
+
return wrapper ? wrapper.value : null;
|
|
50
|
+
}
|
|
51
|
+
async removeFromCache(cacheKey, returnOldValue) {
|
|
52
|
+
let rval = null;
|
|
53
|
+
if (returnOldValue) {
|
|
54
|
+
rval = await this.fetchWrapper(cacheKey, () => null);
|
|
55
|
+
}
|
|
56
|
+
await this.provider.removeFromCache(cacheKey);
|
|
57
|
+
return rval;
|
|
58
|
+
}
|
|
59
|
+
async clearCache() {
|
|
60
|
+
return this.provider.clearCache();
|
|
61
|
+
}
|
|
62
|
+
async readAll() {
|
|
63
|
+
return this.provider.readAll();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.SimpleCache = SimpleCache;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudWatchLogGroupRatchet = void 0;
|
|
4
|
+
const client_cloudwatch_logs_1 = require("@aws-sdk/client-cloudwatch-logs");
|
|
5
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
6
|
+
const ratchet_common_2 = require("@bitblit/ratchet-common");
|
|
7
|
+
class CloudWatchLogGroupRatchet {
|
|
8
|
+
constructor(logGroup, awsCWLogs = new client_cloudwatch_logs_1.CloudWatchLogsClient({ region: 'us-east-1' })) {
|
|
9
|
+
this.logGroup = logGroup;
|
|
10
|
+
this.awsCWLogs = awsCWLogs;
|
|
11
|
+
}
|
|
12
|
+
async readLogStreams(startTimestamp = null, endTimestamp = null) {
|
|
13
|
+
const params = {
|
|
14
|
+
logGroupName: this.logGroup,
|
|
15
|
+
orderBy: 'LastEventTime',
|
|
16
|
+
};
|
|
17
|
+
const rval = [];
|
|
18
|
+
do {
|
|
19
|
+
ratchet_common_1.Logger.debug('Pulling more log streams (%d found so far)', rval.length);
|
|
20
|
+
const temp = await this.awsCWLogs.send(new client_cloudwatch_logs_1.DescribeLogStreamsCommand(params));
|
|
21
|
+
temp.logStreams.forEach((s) => {
|
|
22
|
+
if (s.lastEventTimestamp !== null) {
|
|
23
|
+
if (!startTimestamp || s.lastEventTimestamp >= startTimestamp) {
|
|
24
|
+
if (!endTimestamp || s.firstEventTimestamp <= endTimestamp) {
|
|
25
|
+
rval.push(s);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
params.nextToken = temp.nextToken;
|
|
31
|
+
} while (!!params.nextToken);
|
|
32
|
+
ratchet_common_1.Logger.debug('Found %d total, returning', rval.length);
|
|
33
|
+
return rval;
|
|
34
|
+
}
|
|
35
|
+
async readLogStreamNames(startTimestamp = null, endTimestamp = null) {
|
|
36
|
+
const streams = await this.readLogStreams(startTimestamp, endTimestamp);
|
|
37
|
+
const rval = streams.map((s) => s.logStreamName);
|
|
38
|
+
return rval;
|
|
39
|
+
}
|
|
40
|
+
async readEvents(filter, startTimestamp = null, endTimestamp = null, sortEvents = true, maxEvents = null) {
|
|
41
|
+
const sw = new ratchet_common_2.StopWatch();
|
|
42
|
+
const params = {
|
|
43
|
+
logGroupName: this.logGroup,
|
|
44
|
+
endTime: endTimestamp,
|
|
45
|
+
startTime: startTimestamp,
|
|
46
|
+
};
|
|
47
|
+
if (filter) {
|
|
48
|
+
params.filterPattern = filter;
|
|
49
|
+
}
|
|
50
|
+
ratchet_common_1.Logger.debug('Reading log events matching : %j', params);
|
|
51
|
+
let rval = [];
|
|
52
|
+
do {
|
|
53
|
+
ratchet_common_1.Logger.debug('Pulling more log events (%d found so far) : %s', rval.length, sw.dump());
|
|
54
|
+
const temp = await this.awsCWLogs.send(new client_cloudwatch_logs_1.FilterLogEventsCommand(params));
|
|
55
|
+
rval = rval.concat(temp.events);
|
|
56
|
+
params.nextToken = temp.nextToken;
|
|
57
|
+
} while (!!params.nextToken && (!maxEvents || rval.length < maxEvents));
|
|
58
|
+
ratchet_common_1.Logger.debug('Found %d total in %s', rval.length, sw.dump());
|
|
59
|
+
if (sortEvents) {
|
|
60
|
+
ratchet_common_1.Logger.debug('Sorting events by timestamp');
|
|
61
|
+
rval = rval.sort((a, b) => {
|
|
62
|
+
let rval = a.timestamp - b.timestamp;
|
|
63
|
+
if (rval === 0) {
|
|
64
|
+
rval = a.message.localeCompare(b.message);
|
|
65
|
+
}
|
|
66
|
+
return rval;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
sw.log();
|
|
70
|
+
return rval;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.CloudWatchLogGroupRatchet = CloudWatchLogGroupRatchet;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudWatchLogsRatchet = void 0;
|
|
4
|
+
const client_cloudwatch_logs_1 = require("@aws-sdk/client-cloudwatch-logs");
|
|
5
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
6
|
+
const ratchet_common_2 = require("@bitblit/ratchet-common");
|
|
7
|
+
const ratchet_common_3 = require("@bitblit/ratchet-common");
|
|
8
|
+
const ratchet_common_4 = require("@bitblit/ratchet-common");
|
|
9
|
+
class CloudWatchLogsRatchet {
|
|
10
|
+
constructor(cloudwatchLogs = null) {
|
|
11
|
+
this.cwLogs = cloudwatchLogs ? cloudwatchLogs : new client_cloudwatch_logs_1.CloudWatchLogsClient({ region: 'us-east-1' });
|
|
12
|
+
}
|
|
13
|
+
async removeEmptyOrOldLogStreams(logGroupName, maxToRemove = 1000, oldestEventEpochMS = null) {
|
|
14
|
+
ratchet_common_1.Logger.info('Removing empty streams from %s, oldest event epoch MS : %d', logGroupName, oldestEventEpochMS);
|
|
15
|
+
const streamSearchParams = {
|
|
16
|
+
logGroupName: logGroupName,
|
|
17
|
+
orderBy: 'LastEventTime',
|
|
18
|
+
};
|
|
19
|
+
const oldestEventTester = oldestEventEpochMS || 1;
|
|
20
|
+
let totalStreams = 0;
|
|
21
|
+
const removedStreams = [];
|
|
22
|
+
const failedRemovedStreams = [];
|
|
23
|
+
let waitPerDescribe = 10;
|
|
24
|
+
do {
|
|
25
|
+
ratchet_common_1.Logger.debug('Executing search for streams');
|
|
26
|
+
try {
|
|
27
|
+
const streams = await this.cwLogs.send(new client_cloudwatch_logs_1.DescribeLogStreamsCommand(streamSearchParams));
|
|
28
|
+
totalStreams += streams.logStreams.length;
|
|
29
|
+
ratchet_common_1.Logger.debug('Found %d streams (%d so far, %d to delete)', streams.logStreams.length, totalStreams, removedStreams.length);
|
|
30
|
+
for (let i = 0; i < streams.logStreams.length && removedStreams.length < maxToRemove; i++) {
|
|
31
|
+
const st = streams.logStreams[i];
|
|
32
|
+
if (!st.firstEventTimestamp) {
|
|
33
|
+
removedStreams.push(st);
|
|
34
|
+
}
|
|
35
|
+
else if (st.lastEventTimestamp < oldestEventTester) {
|
|
36
|
+
removedStreams.push(st);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
streamSearchParams['nextToken'] = streams.nextToken;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const oldWait = waitPerDescribe;
|
|
43
|
+
waitPerDescribe = Math.min(1000, waitPerDescribe * 1.5);
|
|
44
|
+
ratchet_common_1.Logger.info('Caught while describing %s, increasing wait between deletes (was %d, now %d)', err, oldWait, waitPerDescribe);
|
|
45
|
+
}
|
|
46
|
+
} while (!!streamSearchParams['nextToken'] && removedStreams.length < maxToRemove);
|
|
47
|
+
ratchet_common_1.Logger.info('Found %d streams to delete', removedStreams.length);
|
|
48
|
+
let waitPer = 10;
|
|
49
|
+
for (let i = 0; i < removedStreams.length; i++) {
|
|
50
|
+
const delParams = {
|
|
51
|
+
logGroupName: logGroupName,
|
|
52
|
+
logStreamName: removedStreams[i].logStreamName,
|
|
53
|
+
};
|
|
54
|
+
const type = removedStreams[i].storedBytes === 0 ? 'empty' : 'old';
|
|
55
|
+
ratchet_common_1.Logger.info('Removing %s stream %s', type, removedStreams[i].logStreamName);
|
|
56
|
+
let removed = false;
|
|
57
|
+
let retry = 0;
|
|
58
|
+
while (!removed && retry < CloudWatchLogsRatchet.MAX_DELETE_RETRIES) {
|
|
59
|
+
try {
|
|
60
|
+
await this.cwLogs.send(new client_cloudwatch_logs_1.DeleteLogStreamCommand(delParams));
|
|
61
|
+
removed = true;
|
|
62
|
+
await ratchet_common_2.PromiseRatchet.wait(waitPer);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
retry++;
|
|
66
|
+
const oldWait = waitPer;
|
|
67
|
+
waitPer = Math.min(1000, waitPer * 1.5);
|
|
68
|
+
ratchet_common_1.Logger.info('Caught %s, increasing wait between deletes and retrying (wait was %d, now %d) (Retry %d of %d)', err, oldWait, waitPer, retry, CloudWatchLogsRatchet.MAX_DELETE_RETRIES);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!removed) {
|
|
72
|
+
failedRemovedStreams.push(removedStreams[i]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
ratchet_common_1.Logger.warn('Failed to remove streams : %j', failedRemovedStreams);
|
|
76
|
+
return removedStreams;
|
|
77
|
+
}
|
|
78
|
+
async findOldestEventTimestampInGroup(logGroupName) {
|
|
79
|
+
const stream = await this.findStreamWithOldestEventInGroup(logGroupName);
|
|
80
|
+
return stream ? stream.firstEventTimestamp : null;
|
|
81
|
+
}
|
|
82
|
+
async findStreamWithOldestEventInGroup(logGroupName) {
|
|
83
|
+
ratchet_common_1.Logger.info('Finding oldest event in : %s', logGroupName);
|
|
84
|
+
let rval = null;
|
|
85
|
+
try {
|
|
86
|
+
const streamSearchParams = {
|
|
87
|
+
logGroupName: logGroupName,
|
|
88
|
+
orderBy: 'LastEventTime',
|
|
89
|
+
};
|
|
90
|
+
let totalStreams = 0;
|
|
91
|
+
do {
|
|
92
|
+
ratchet_common_1.Logger.debug('Executing search for streams');
|
|
93
|
+
const streams = await this.cwLogs.send(new client_cloudwatch_logs_1.DescribeLogStreamsCommand(streamSearchParams));
|
|
94
|
+
totalStreams += streams.logStreams.length;
|
|
95
|
+
ratchet_common_1.Logger.debug('Found %d streams (%d so far)', streams.logStreams.length, totalStreams);
|
|
96
|
+
streams.logStreams.forEach((s) => {
|
|
97
|
+
if (s.firstEventTimestamp && (rval === null || s.firstEventTimestamp < rval.firstEventTimestamp)) {
|
|
98
|
+
rval = s;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
streamSearchParams['nextToken'] = streams.nextToken;
|
|
102
|
+
} while (!!streamSearchParams['nextToken']);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
ratchet_common_1.Logger.error('Error attempting to find oldest event in group : %s : %s', logGroupName, err, err);
|
|
106
|
+
}
|
|
107
|
+
return rval;
|
|
108
|
+
}
|
|
109
|
+
async findLogGroups(prefix) {
|
|
110
|
+
ratchet_common_3.RequireRatchet.notNullOrUndefined(prefix);
|
|
111
|
+
const params = {
|
|
112
|
+
logGroupNamePrefix: prefix,
|
|
113
|
+
};
|
|
114
|
+
let rval = [];
|
|
115
|
+
do {
|
|
116
|
+
ratchet_common_1.Logger.info('%d found, pulling log groups : %j', rval.length, params);
|
|
117
|
+
const res = await this.cwLogs.send(new client_cloudwatch_logs_1.DescribeLogGroupsCommand(params));
|
|
118
|
+
rval = rval.concat(res.logGroups);
|
|
119
|
+
params.nextToken = res.nextToken;
|
|
120
|
+
} while (!!params.nextToken);
|
|
121
|
+
return rval;
|
|
122
|
+
}
|
|
123
|
+
async removeLogGroups(groups) {
|
|
124
|
+
ratchet_common_3.RequireRatchet.notNullOrUndefined(groups);
|
|
125
|
+
const rval = [];
|
|
126
|
+
for (let i = 0; i < groups.length; i++) {
|
|
127
|
+
try {
|
|
128
|
+
ratchet_common_1.Logger.info('Deleting %j', groups[i]);
|
|
129
|
+
const req = {
|
|
130
|
+
logGroupName: groups[i].logGroupName,
|
|
131
|
+
};
|
|
132
|
+
await this.cwLogs.send(new client_cloudwatch_logs_1.DeleteLogGroupCommand(req));
|
|
133
|
+
rval.push(true);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
ratchet_common_1.Logger.error('Failure to delete %j : %s', groups[i], err);
|
|
137
|
+
rval.push(false);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return rval;
|
|
141
|
+
}
|
|
142
|
+
async removeLogGroupsWithPrefix(prefix) {
|
|
143
|
+
ratchet_common_3.RequireRatchet.notNullOrUndefined(prefix);
|
|
144
|
+
ratchet_common_3.RequireRatchet.true(ratchet_common_4.StringRatchet.trimToEmpty(prefix).length > 0);
|
|
145
|
+
ratchet_common_1.Logger.info('Removing log groups with prefix %s', prefix);
|
|
146
|
+
const groups = await this.findLogGroups(prefix);
|
|
147
|
+
return await this.removeLogGroups(groups);
|
|
148
|
+
}
|
|
149
|
+
async fullyExecuteInsightsQuery(sqr) {
|
|
150
|
+
ratchet_common_3.RequireRatchet.notNullOrUndefined(sqr);
|
|
151
|
+
ratchet_common_1.Logger.debug('Starting insights query : %j', sqr);
|
|
152
|
+
const resp = await this.cwLogs.send(new client_cloudwatch_logs_1.StartQueryCommand(sqr));
|
|
153
|
+
ratchet_common_1.Logger.debug('Got query id %j', resp);
|
|
154
|
+
let rval = null;
|
|
155
|
+
let delayMS = 100;
|
|
156
|
+
while (!rval || ['Running', 'Scheduled'].includes(rval.status)) {
|
|
157
|
+
rval = await this.cwLogs.send(new client_cloudwatch_logs_1.GetQueryResultsCommand({ queryId: resp.queryId }));
|
|
158
|
+
await ratchet_common_2.PromiseRatchet.wait(delayMS);
|
|
159
|
+
delayMS *= 2;
|
|
160
|
+
ratchet_common_1.Logger.info('Got : %j', rval);
|
|
161
|
+
}
|
|
162
|
+
return rval;
|
|
163
|
+
}
|
|
164
|
+
async abortInsightsQuery(queryId) {
|
|
165
|
+
let rval = null;
|
|
166
|
+
if (!!queryId) {
|
|
167
|
+
rval = await this.cwLogs.send(new client_cloudwatch_logs_1.StopQueryCommand({ queryId: queryId }));
|
|
168
|
+
}
|
|
169
|
+
return rval;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.CloudWatchLogsRatchet = CloudWatchLogsRatchet;
|
|
173
|
+
CloudWatchLogsRatchet.MAX_DELETE_RETRIES = 5;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudWatchMetricsRatchet = void 0;
|
|
4
|
+
const client_cloudwatch_1 = require("@aws-sdk/client-cloudwatch");
|
|
5
|
+
const ratchet_common_1 = require("@bitblit/ratchet-common");
|
|
6
|
+
const cloud_watch_metrics_unit_1 = require("../model/cloud-watch-metrics-unit");
|
|
7
|
+
const luxon_1 = require("luxon");
|
|
8
|
+
class CloudWatchMetricsRatchet {
|
|
9
|
+
constructor(cloudWatch = null) {
|
|
10
|
+
this.cw = cloudWatch ? cloudWatch : new client_cloudwatch_1.CloudWatchClient({ region: 'us-east-1', apiVersion: '2010-08-01' });
|
|
11
|
+
}
|
|
12
|
+
async writeSingleMetric(namespace, metric, dims, unit = cloud_watch_metrics_unit_1.CloudWatchMetricsUnit.None, value, timestampDate = new Date(), highResolution = false) {
|
|
13
|
+
const cwDims = [];
|
|
14
|
+
if (!!dims && dims.length > 0) {
|
|
15
|
+
dims.forEach((d) => {
|
|
16
|
+
cwDims.push({ Name: d.key, Value: d.value });
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const storageResolution = highResolution ? 1 : 60;
|
|
20
|
+
const metricData = {
|
|
21
|
+
Namespace: namespace,
|
|
22
|
+
MetricData: [
|
|
23
|
+
{
|
|
24
|
+
MetricName: metric,
|
|
25
|
+
Dimensions: cwDims,
|
|
26
|
+
Unit: String(unit),
|
|
27
|
+
Value: value,
|
|
28
|
+
Timestamp: timestampDate,
|
|
29
|
+
StorageResolution: storageResolution,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
ratchet_common_1.Logger.silly('Writing metric to cw : %j', metricData);
|
|
34
|
+
const result = await this.cw.send(new client_cloudwatch_1.PutMetricDataCommand(metricData));
|
|
35
|
+
ratchet_common_1.Logger.silly('Result: %j', result);
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
async writeDynamoCountAsMinuteLevelMetric(req) {
|
|
39
|
+
ratchet_common_1.Logger.info('Publishing %s / %s metric for %s UTC', req.namespace, req.metric, req.minuteUTC);
|
|
40
|
+
if (!!req.scan && !!req.query) {
|
|
41
|
+
throw new Error('Must send query or scan, but not both');
|
|
42
|
+
}
|
|
43
|
+
if (!req.scan && !req.query) {
|
|
44
|
+
throw new Error('You must specify either a scan or a query');
|
|
45
|
+
}
|
|
46
|
+
const cnt = !!req.query
|
|
47
|
+
? await req.dynamoRatchet.fullyExecuteQueryCount(req.query)
|
|
48
|
+
: await req.dynamoRatchet.fullyExecuteScanCount(req.scan);
|
|
49
|
+
ratchet_common_1.Logger.debug('%s / %s for %s are %j', req.namespace, req.metric, req.minuteUTC, cnt);
|
|
50
|
+
const parseDateString = req.minuteUTC.split(' ').join('T') + ':00Z';
|
|
51
|
+
const parseDate = luxon_1.DateTime.fromISO(parseDateString).toJSDate();
|
|
52
|
+
const metricRes = await this.writeSingleMetric(req.namespace, req.metric, req.dims, cloud_watch_metrics_unit_1.CloudWatchMetricsUnit.Count, cnt.count, parseDate, false);
|
|
53
|
+
ratchet_common_1.Logger.debug('Metrics response: %j', metricRes);
|
|
54
|
+
return cnt.count;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.CloudWatchMetricsRatchet = CloudWatchMetricsRatchet;
|