@eyevinn/player-analytics-shared 0.9.1 → 0.9.2
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.
|
@@ -23,6 +23,7 @@ export class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
23
23
|
client: SQSClient;
|
|
24
24
|
queueUrl: string;
|
|
25
25
|
queueExists: boolean = false;
|
|
26
|
+
private httpAgent: any = null;
|
|
26
27
|
|
|
27
28
|
constructor(logger: winston.Logger, options?: SqsQueueAdapterOptions) {
|
|
28
29
|
this.logger = logger;
|
|
@@ -41,10 +42,15 @@ export class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
if (options?.maxSockets) {
|
|
45
|
+
const httpAgent = { maxSockets: options.maxSockets, keepAlive: true };
|
|
46
|
+
const httpsAgent = { maxSockets: options.maxSockets, keepAlive: true };
|
|
47
|
+
|
|
44
48
|
clientConfig.requestHandler = new NodeHttpHandler({
|
|
45
|
-
httpAgent
|
|
46
|
-
httpsAgent
|
|
49
|
+
httpAgent,
|
|
50
|
+
httpsAgent
|
|
47
51
|
});
|
|
52
|
+
|
|
53
|
+
this.httpAgent = { http: httpAgent, https: httpsAgent };
|
|
48
54
|
this.logger.info(`SQS max sockets set to: ${options.maxSockets}`);
|
|
49
55
|
}
|
|
50
56
|
|
|
@@ -71,6 +77,36 @@ export class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
71
77
|
this.logger.info(`Queue created: ${response.QueueUrl} (expected ${this.queueUrl})`);
|
|
72
78
|
}
|
|
73
79
|
|
|
80
|
+
private getSocketStats(): any {
|
|
81
|
+
if (!this.httpAgent) {
|
|
82
|
+
return { message: 'No HTTP agent configured' };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const stats: any = {};
|
|
86
|
+
|
|
87
|
+
if (this.httpAgent.http) {
|
|
88
|
+
stats.http = {
|
|
89
|
+
maxSockets: this.httpAgent.http.maxSockets,
|
|
90
|
+
keepAlive: this.httpAgent.http.keepAlive,
|
|
91
|
+
requests: this.httpAgent.http.requests || {},
|
|
92
|
+
sockets: this.httpAgent.http.sockets || {},
|
|
93
|
+
freeSockets: this.httpAgent.http.freeSockets || {}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (this.httpAgent.https) {
|
|
98
|
+
stats.https = {
|
|
99
|
+
maxSockets: this.httpAgent.https.maxSockets,
|
|
100
|
+
keepAlive: this.httpAgent.https.keepAlive,
|
|
101
|
+
requests: this.httpAgent.https.requests || {},
|
|
102
|
+
sockets: this.httpAgent.https.sockets || {},
|
|
103
|
+
freeSockets: this.httpAgent.https.freeSockets || {}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return stats;
|
|
108
|
+
}
|
|
109
|
+
|
|
74
110
|
async pushToQueue(event: Object): Promise<any> {
|
|
75
111
|
if (this.queueUrl === 'undefined') {
|
|
76
112
|
return { message: 'SQS_QUEUE_URL is undefined' };
|
|
@@ -102,13 +138,31 @@ export class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
102
138
|
MessageBody: JSON.stringify(event),
|
|
103
139
|
};
|
|
104
140
|
const sendMessageCommand = new SendMessageCommand(params);
|
|
141
|
+
|
|
142
|
+
const startTime = Date.now();
|
|
105
143
|
try {
|
|
106
144
|
const sendMessageResult = await this.client.send(sendMessageCommand);
|
|
145
|
+
const duration = Date.now() - startTime;
|
|
146
|
+
|
|
147
|
+
if (duration > 2000) {
|
|
148
|
+
const socketStats = this.getSocketStats();
|
|
149
|
+
this.logger.warn(
|
|
150
|
+
`SQS message send took ${duration}ms (>2000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
107
154
|
this.logger.debug(
|
|
108
155
|
`Response from SQS: ${JSON.stringify(sendMessageResult)}`
|
|
109
156
|
);
|
|
110
157
|
return sendMessageResult;
|
|
111
158
|
} catch (err) {
|
|
159
|
+
const duration = Date.now() - startTime;
|
|
160
|
+
if (duration > 2000) {
|
|
161
|
+
const socketStats = this.getSocketStats();
|
|
162
|
+
this.logger.warn(
|
|
163
|
+
`SQS message send failed after ${duration}ms (>2000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
112
166
|
this.logger.error(err);
|
|
113
167
|
return err;
|
|
114
168
|
}
|
|
@@ -9,9 +9,11 @@ export declare class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
9
9
|
client: SQSClient;
|
|
10
10
|
queueUrl: string;
|
|
11
11
|
queueExists: boolean;
|
|
12
|
+
private httpAgent;
|
|
12
13
|
constructor(logger: winston.Logger, options?: SqsQueueAdapterOptions);
|
|
13
14
|
private checkQueueExists;
|
|
14
15
|
private createQueue;
|
|
16
|
+
private getSocketStats;
|
|
15
17
|
pushToQueue(event: Object): Promise<any>;
|
|
16
18
|
pullFromQueue(): Promise<any>;
|
|
17
19
|
removeFromQueue(queueMsg: Message): Promise<any>;
|
|
@@ -22,6 +22,7 @@ const node_http_handler_1 = require("@smithy/node-http-handler");
|
|
|
22
22
|
class SqsQueueAdapter {
|
|
23
23
|
constructor(logger, options) {
|
|
24
24
|
this.queueExists = false;
|
|
25
|
+
this.httpAgent = null;
|
|
25
26
|
this.logger = logger;
|
|
26
27
|
let region;
|
|
27
28
|
if ('QUEUE_REGION' in process.env) {
|
|
@@ -37,10 +38,13 @@ class SqsQueueAdapter {
|
|
|
37
38
|
endpoint: process.env.SQS_ENDPOINT
|
|
38
39
|
};
|
|
39
40
|
if (options === null || options === void 0 ? void 0 : options.maxSockets) {
|
|
41
|
+
const httpAgent = { maxSockets: options.maxSockets, keepAlive: true };
|
|
42
|
+
const httpsAgent = { maxSockets: options.maxSockets, keepAlive: true };
|
|
40
43
|
clientConfig.requestHandler = new node_http_handler_1.NodeHttpHandler({
|
|
41
|
-
httpAgent
|
|
42
|
-
httpsAgent
|
|
44
|
+
httpAgent,
|
|
45
|
+
httpsAgent
|
|
43
46
|
});
|
|
47
|
+
this.httpAgent = { http: httpAgent, https: httpsAgent };
|
|
44
48
|
this.logger.info(`SQS max sockets set to: ${options.maxSockets}`);
|
|
45
49
|
}
|
|
46
50
|
this.client = new client_sqs_1.SQSClient(clientConfig);
|
|
@@ -78,6 +82,31 @@ class SqsQueueAdapter {
|
|
|
78
82
|
this.logger.info(`Queue created: ${response.QueueUrl} (expected ${this.queueUrl})`);
|
|
79
83
|
});
|
|
80
84
|
}
|
|
85
|
+
getSocketStats() {
|
|
86
|
+
if (!this.httpAgent) {
|
|
87
|
+
return { message: 'No HTTP agent configured' };
|
|
88
|
+
}
|
|
89
|
+
const stats = {};
|
|
90
|
+
if (this.httpAgent.http) {
|
|
91
|
+
stats.http = {
|
|
92
|
+
maxSockets: this.httpAgent.http.maxSockets,
|
|
93
|
+
keepAlive: this.httpAgent.http.keepAlive,
|
|
94
|
+
requests: this.httpAgent.http.requests || {},
|
|
95
|
+
sockets: this.httpAgent.http.sockets || {},
|
|
96
|
+
freeSockets: this.httpAgent.http.freeSockets || {}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (this.httpAgent.https) {
|
|
100
|
+
stats.https = {
|
|
101
|
+
maxSockets: this.httpAgent.https.maxSockets,
|
|
102
|
+
keepAlive: this.httpAgent.https.keepAlive,
|
|
103
|
+
requests: this.httpAgent.https.requests || {},
|
|
104
|
+
sockets: this.httpAgent.https.sockets || {},
|
|
105
|
+
freeSockets: this.httpAgent.https.freeSockets || {}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return stats;
|
|
109
|
+
}
|
|
81
110
|
pushToQueue(event) {
|
|
82
111
|
return __awaiter(this, void 0, void 0, function* () {
|
|
83
112
|
if (this.queueUrl === 'undefined') {
|
|
@@ -111,12 +140,23 @@ class SqsQueueAdapter {
|
|
|
111
140
|
MessageBody: JSON.stringify(event),
|
|
112
141
|
};
|
|
113
142
|
const sendMessageCommand = new client_sqs_1.SendMessageCommand(params);
|
|
143
|
+
const startTime = Date.now();
|
|
114
144
|
try {
|
|
115
145
|
const sendMessageResult = yield this.client.send(sendMessageCommand);
|
|
146
|
+
const duration = Date.now() - startTime;
|
|
147
|
+
if (duration > 2000) {
|
|
148
|
+
const socketStats = this.getSocketStats();
|
|
149
|
+
this.logger.warn(`SQS message send took ${duration}ms (>2000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`);
|
|
150
|
+
}
|
|
116
151
|
this.logger.debug(`Response from SQS: ${JSON.stringify(sendMessageResult)}`);
|
|
117
152
|
return sendMessageResult;
|
|
118
153
|
}
|
|
119
154
|
catch (err) {
|
|
155
|
+
const duration = Date.now() - startTime;
|
|
156
|
+
if (duration > 2000) {
|
|
157
|
+
const socketStats = this.getSocketStats();
|
|
158
|
+
this.logger.warn(`SQS message send failed after ${duration}ms (>2000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`);
|
|
159
|
+
}
|
|
120
160
|
this.logger.error(err);
|
|
121
161
|
return err;
|
|
122
162
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqsQueueAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/SqsQueueAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,oDAW6B;AAC7B,iEAA4D;AAQ5D,MAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"SqsQueueAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/SqsQueueAdapter.ts"],"names":[],"mappings":"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"}
|