@vtex/api 6.48.1-beta.2 → 6.48.1-beta.3
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/lib/HttpClient/GraphQLClient.d.ts +1 -1
- package/lib/HttpClient/HttpClient.d.ts +2 -3
- package/lib/HttpClient/HttpClient.js +14 -14
- package/lib/HttpClient/agents.d.ts +2 -5
- package/lib/HttpClient/agents.js +4 -10
- package/lib/HttpClient/index.js +2 -7
- package/lib/HttpClient/middlewares/cache.d.ts +1 -1
- package/lib/HttpClient/middlewares/cache.js +36 -38
- package/lib/HttpClient/middlewares/cancellationToken.d.ts +1 -1
- package/lib/HttpClient/middlewares/cancellationToken.js +1 -2
- package/lib/HttpClient/middlewares/inflight.d.ts +1 -1
- package/lib/HttpClient/middlewares/inflight.js +3 -6
- package/lib/HttpClient/middlewares/memoization.d.ts +1 -1
- package/lib/HttpClient/middlewares/memoization.js +8 -9
- package/lib/HttpClient/middlewares/metrics.js +7 -8
- package/lib/HttpClient/middlewares/notFound.d.ts +1 -1
- package/lib/HttpClient/middlewares/notFound.js +2 -4
- package/lib/HttpClient/middlewares/recorder.js +1 -2
- package/lib/HttpClient/middlewares/request/HttpAgentSingleton.js +1 -1
- package/lib/HttpClient/middlewares/request/index.d.ts +1 -1
- package/lib/HttpClient/middlewares/request/index.js +10 -13
- package/lib/HttpClient/middlewares/request/setupAxios/index.d.ts +1 -0
- package/lib/HttpClient/middlewares/request/setupAxios/index.js +4 -5
- package/lib/HttpClient/middlewares/request/setupAxios/interceptors/exponentialBackoff.js +5 -6
- package/lib/HttpClient/middlewares/request/setupAxios/interceptors/index.js +0 -1
- package/lib/HttpClient/middlewares/request/setupAxios/interceptors/tracing/index.js +8 -8
- package/lib/HttpClient/middlewares/request/setupAxios/interceptors/tracing/spanSetup.js +8 -10
- package/lib/HttpClient/middlewares/tracing.js +10 -11
- package/lib/HttpClient/typings.d.ts +2 -2
- package/lib/caches/DiskCache.js +2 -2
- package/lib/caches/LRUCache.d.ts +2 -2
- package/lib/caches/LRUDiskCache.d.ts +1 -1
- package/lib/caches/LRUDiskCache.js +2 -2
- package/lib/caches/MultilayeredCache.d.ts +2 -2
- package/lib/caches/MultilayeredCache.js +6 -6
- package/lib/caches/index.js +2 -6
- package/lib/caches/typings.d.ts +5 -5
- package/lib/clients/IOClient.d.ts +1 -1
- package/lib/clients/IOClients.d.ts +1 -1
- package/lib/clients/apps/AppClient.js +1 -1
- package/lib/clients/apps/AppGraphQLClient.js +1 -1
- package/lib/clients/apps/Billing.d.ts +1 -1
- package/lib/clients/apps/Builder.d.ts +7 -7
- package/lib/clients/apps/Builder.js +1 -1
- package/lib/clients/apps/MessagesGraphQL.d.ts +1 -1
- package/lib/clients/apps/MessagesGraphQL.js +3 -3
- package/lib/clients/apps/Settings.js +3 -3
- package/lib/clients/apps/catalogGraphQL/index.d.ts +4 -4
- package/lib/clients/apps/catalogGraphQL/index.js +4 -4
- package/lib/clients/apps/index.js +2 -6
- package/lib/clients/external/ID.d.ts +4 -4
- package/lib/clients/external/PaymentProvider.d.ts +2 -2
- package/lib/clients/external/index.js +2 -6
- package/lib/clients/index.js +2 -6
- package/lib/clients/infra/Apps.d.ts +27 -32
- package/lib/clients/infra/Apps.js +16 -16
- package/lib/clients/infra/Assets.d.ts +5 -6
- package/lib/clients/infra/Assets.js +11 -11
- package/lib/clients/infra/BillingMetrics.d.ts +1 -1
- package/lib/clients/infra/Events.d.ts +1 -1
- package/lib/clients/infra/Events.js +1 -1
- package/lib/clients/infra/Housekeeper.d.ts +3 -3
- package/lib/clients/infra/Registry.d.ts +17 -23
- package/lib/clients/infra/Registry.js +3 -3
- package/lib/clients/infra/Router.d.ts +8 -8
- package/lib/clients/infra/Sphinx.d.ts +2 -2
- package/lib/clients/infra/VBase.d.ts +14 -15
- package/lib/clients/infra/VBase.js +2 -2
- package/lib/clients/infra/Workspaces.d.ts +7 -7
- package/lib/clients/infra/index.js +2 -6
- package/lib/clients/janus/JanusClient.d.ts +1 -1
- package/lib/clients/janus/LicenseManager.js +1 -1
- package/lib/clients/janus/Segment.d.ts +3 -3
- package/lib/clients/janus/Segment.js +2 -2
- package/lib/clients/janus/Session.d.ts +2 -2
- package/lib/clients/janus/Tenant.d.ts +1 -1
- package/lib/clients/janus/index.js +2 -6
- package/lib/constants.d.ts +1 -1
- package/lib/constants.js +1 -1
- package/lib/errors/ResolverError.js +1 -1
- package/lib/errors/index.js +2 -6
- package/lib/index.js +2 -6
- package/lib/metrics/MetricsAccumulator.d.ts +2 -2
- package/lib/metrics/MetricsAccumulator.js +9 -9
- package/lib/responses.d.ts +4 -4
- package/lib/service/index.js +6 -7
- package/lib/service/loaders.js +6 -8
- package/lib/service/logger/console.js +4 -7
- package/lib/service/logger/index.js +2 -6
- package/lib/service/logger/logger.js +2 -2
- package/lib/service/logger/metricsLogger.js +10 -10
- package/lib/service/master.js +6 -7
- package/lib/service/metrics/requestMetricsMiddleware.js +13 -14
- package/lib/service/tracing/TracerSingleton.js +9 -9
- package/lib/service/tracing/metrics/MetricNames.js +12 -12
- package/lib/service/tracing/metrics/instruments.js +7 -14
- package/lib/service/tracing/metrics/measurers/EventLoopLagMeasurer.js +5 -5
- package/lib/service/tracing/tracingMiddlewares.js +15 -18
- package/lib/service/worker/index.js +23 -24
- package/lib/service/worker/listeners.js +1 -2
- package/lib/service/worker/runtime/Service.js +1 -1
- package/lib/service/worker/runtime/builtIn/handlers.js +3 -6
- package/lib/service/worker/runtime/builtIn/middlewares.js +3 -5
- package/lib/service/worker/runtime/events/index.d.ts +1 -1
- package/lib/service/worker/runtime/events/index.js +10 -11
- package/lib/service/worker/runtime/events/middlewares/body.js +2 -2
- package/lib/service/worker/runtime/events/middlewares/context.js +1 -1
- package/lib/service/worker/runtime/events/router.js +2 -3
- package/lib/service/worker/runtime/graphql/index.js +7 -8
- package/lib/service/worker/runtime/graphql/middlewares/error.js +5 -5
- package/lib/service/worker/runtime/graphql/middlewares/query.js +6 -7
- package/lib/service/worker/runtime/graphql/middlewares/response.js +1 -1
- package/lib/service/worker/runtime/graphql/middlewares/run.js +2 -3
- package/lib/service/worker/runtime/graphql/middlewares/updateSchema.js +3 -4
- package/lib/service/worker/runtime/graphql/middlewares/upload.js +1 -1
- package/lib/service/worker/runtime/graphql/schema/index.d.ts +1 -1
- package/lib/service/worker/runtime/graphql/schema/index.js +7 -8
- package/lib/service/worker/runtime/graphql/schema/messagesLoaderV2.d.ts +2 -2
- package/lib/service/worker/runtime/graphql/schema/messagesLoaderV2.js +3 -4
- package/lib/service/worker/runtime/graphql/schema/schemaDirectives/Deprecated.js +1 -1
- package/lib/service/worker/runtime/graphql/schema/schemaDirectives/Settings.js +1 -1
- package/lib/service/worker/runtime/graphql/schema/schemaDirectives/TranslatableV2.js +2 -2
- package/lib/service/worker/runtime/graphql/schema/schemaDirectives/TranslateTo.js +2 -2
- package/lib/service/worker/runtime/graphql/schema/schemaDirectives/index.js +1 -1
- package/lib/service/worker/runtime/graphql/schema/typeDefs/index.js +1 -2
- package/lib/service/worker/runtime/graphql/schema/typeDefs/sanitizedString.js +2 -2
- package/lib/service/worker/runtime/graphql/typings.d.ts +3 -3
- package/lib/service/worker/runtime/graphql/utils/cacheControl.js +1 -2
- package/lib/service/worker/runtime/graphql/utils/error.js +9 -10
- package/lib/service/worker/runtime/graphql/utils/pathname.js +2 -3
- package/lib/service/worker/runtime/graphql/utils/translations.d.ts +1 -1
- package/lib/service/worker/runtime/graphql/utils/translations.js +4 -7
- package/lib/service/worker/runtime/http/index.d.ts +2 -2
- package/lib/service/worker/runtime/http/index.js +20 -22
- package/lib/service/worker/runtime/http/middlewares/context.js +5 -7
- package/lib/service/worker/runtime/http/middlewares/error.js +1 -1
- package/lib/service/worker/runtime/http/middlewares/rateLimit.js +1 -1
- package/lib/service/worker/runtime/http/middlewares/setCookie.js +5 -5
- package/lib/service/worker/runtime/http/middlewares/settings.d.ts +1 -1
- package/lib/service/worker/runtime/http/middlewares/settings.js +9 -13
- package/lib/service/worker/runtime/http/middlewares/timings.js +3 -3
- package/lib/service/worker/runtime/http/router.js +2 -3
- package/lib/service/worker/runtime/http/routes.js +5 -8
- package/lib/service/worker/runtime/method.d.ts +2 -2
- package/lib/service/worker/runtime/method.js +1 -1
- package/lib/service/worker/runtime/statusTrack.d.ts +1 -1
- package/lib/service/worker/runtime/statusTrack.js +5 -10
- package/lib/service/worker/runtime/typings.d.ts +10 -10
- package/lib/service/worker/runtime/utils/compose.d.ts +2 -2
- package/lib/service/worker/runtime/utils/compose.js +2 -4
- package/lib/service/worker/runtime/utils/context.d.ts +2 -2
- package/lib/service/worker/runtime/utils/context.js +4 -5
- package/lib/service/worker/runtime/utils/recorder.js +1 -1
- package/lib/service/worker/runtime/utils/toArray.js +1 -2
- package/lib/tracing/UserLandTracer.js +2 -3
- package/lib/tracing/errorReporting/ErrorReport.js +13 -13
- package/lib/tracing/index.js +1 -1
- package/lib/tracing/utils.js +4 -5
- package/lib/utils/MineWinsConflictsResolver.d.ts +4 -4
- package/lib/utils/MineWinsConflictsResolver.js +10 -10
- package/lib/utils/app.js +23 -39
- package/lib/utils/appsStaleIfError.d.ts +0 -1
- package/lib/utils/appsStaleIfError.js +9 -17
- package/lib/utils/billingOptions.js +1 -2
- package/lib/utils/binding.js +2 -4
- package/lib/utils/buildFullPath.d.ts +11 -0
- package/lib/utils/buildFullPath.js +54 -0
- package/lib/utils/domain.js +1 -1
- package/lib/utils/error.js +4 -5
- package/lib/utils/index.js +2 -6
- package/lib/utils/log.js +2 -3
- package/lib/utils/message.js +5 -8
- package/lib/utils/renameBy.js +1 -2
- package/lib/utils/retry.js +6 -8
- package/lib/utils/status.js +1 -2
- package/lib/utils/tenant.js +2 -4
- package/lib/utils/time.d.ts +1 -1
- package/lib/utils/time.js +14 -23
- package/package.json +2 -2
|
@@ -4,16 +4,16 @@ exports.addRequestMetricsMiddleware = void 0;
|
|
|
4
4
|
const stream_1 = require("stream");
|
|
5
5
|
const utils_1 = require("../../utils");
|
|
6
6
|
const instruments_1 = require("../tracing/metrics/instruments");
|
|
7
|
-
|
|
8
|
-
const concurrentRequests =
|
|
9
|
-
const requestTimings =
|
|
10
|
-
const totalRequests =
|
|
11
|
-
const responseSizes =
|
|
12
|
-
const abortedRequests =
|
|
7
|
+
exports.addRequestMetricsMiddleware = () => {
|
|
8
|
+
const concurrentRequests = instruments_1.createConcurrentRequestsInstrument();
|
|
9
|
+
const requestTimings = instruments_1.createRequestsTimingsInstrument();
|
|
10
|
+
const totalRequests = instruments_1.createTotalRequestsInstrument();
|
|
11
|
+
const responseSizes = instruments_1.createRequestsResponseSizesInstrument();
|
|
12
|
+
const abortedRequests = instruments_1.createTotalAbortedRequestsInstrument();
|
|
13
13
|
return async function addRequestMetrics(ctx, next) {
|
|
14
14
|
const start = process.hrtime();
|
|
15
15
|
concurrentRequests.inc(1);
|
|
16
|
-
ctx.req.once('aborted', () => abortedRequests.inc({ ["handler" /*
|
|
16
|
+
ctx.req.once('aborted', () => abortedRequests.inc({ ["handler" /* REQUEST_HANDLER */]: ctx.requestHandlerName }, 1));
|
|
17
17
|
let responseClosed = false;
|
|
18
18
|
ctx.res.once('close', () => (responseClosed = true));
|
|
19
19
|
try {
|
|
@@ -22,25 +22,24 @@ const addRequestMetricsMiddleware = () => {
|
|
|
22
22
|
finally {
|
|
23
23
|
const responseLength = ctx.response.length;
|
|
24
24
|
if (responseLength) {
|
|
25
|
-
responseSizes.observe({ ["handler" /*
|
|
25
|
+
responseSizes.observe({ ["handler" /* REQUEST_HANDLER */]: ctx.requestHandlerName }, responseLength);
|
|
26
26
|
}
|
|
27
27
|
totalRequests.inc({
|
|
28
|
-
["handler" /*
|
|
29
|
-
["status_code" /*
|
|
28
|
+
["handler" /* REQUEST_HANDLER */]: ctx.requestHandlerName,
|
|
29
|
+
["status_code" /* STATUS_CODE */]: ctx.response.status,
|
|
30
30
|
}, 1);
|
|
31
31
|
const onResFinished = () => {
|
|
32
32
|
requestTimings.observe({
|
|
33
|
-
["handler" /*
|
|
34
|
-
},
|
|
33
|
+
["handler" /* REQUEST_HANDLER */]: ctx.requestHandlerName,
|
|
34
|
+
}, utils_1.hrToMillisFloat(process.hrtime(start)));
|
|
35
35
|
concurrentRequests.dec(1);
|
|
36
36
|
};
|
|
37
37
|
if (responseClosed) {
|
|
38
38
|
onResFinished();
|
|
39
39
|
}
|
|
40
40
|
else {
|
|
41
|
-
|
|
41
|
+
stream_1.finished(ctx.res, onResFinished);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
45
|
};
|
|
46
|
-
exports.addRequestMetricsMiddleware = addRequestMetricsMiddleware;
|
|
@@ -16,14 +16,14 @@ class TracerSingleton {
|
|
|
16
16
|
return TracerSingleton.singleton;
|
|
17
17
|
}
|
|
18
18
|
static initServiceTracer() {
|
|
19
|
-
return TracerSingleton.createJaegerTracer(
|
|
20
|
-
["app.linked" /*
|
|
21
|
-
["app.node_vtex_api_version" /*
|
|
22
|
-
["app.production" /*
|
|
23
|
-
["app.region" /*
|
|
24
|
-
["app.version" /*
|
|
25
|
-
["app.workspace" /*
|
|
26
|
-
["app.node_env" /*
|
|
19
|
+
return TracerSingleton.createJaegerTracer(utils_1.appIdToAppAtMajor(constants_1.APP.ID), {
|
|
20
|
+
["app.linked" /* VTEX_APP_LINKED */]: constants_1.LINKED,
|
|
21
|
+
["app.node_vtex_api_version" /* VTEX_APP_NODE_VTEX_API_VERSION */]: constants_1.NODE_VTEX_API_VERSION,
|
|
22
|
+
["app.production" /* VTEX_APP_PRODUCTION */]: constants_1.PRODUCTION,
|
|
23
|
+
["app.region" /* VTEX_APP_REGION */]: constants_1.REGION,
|
|
24
|
+
["app.version" /* VTEX_APP_VERSION */]: constants_1.APP.VERSION,
|
|
25
|
+
["app.workspace" /* VTEX_APP_WORKSPACE */]: constants_1.WORKSPACE,
|
|
26
|
+
["app.node_env" /* VTEX_APP_NODE_ENV */]: constants_1.NODE_ENV !== null && constants_1.NODE_ENV !== void 0 ? constants_1.NODE_ENV : 'undefined',
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
static createJaegerTracer(serviceName, defaultTags) {
|
|
@@ -43,7 +43,7 @@ class TracerSingleton {
|
|
|
43
43
|
metrics: new jaeger_client_1.PrometheusMetricsFactory(prom_client_1.default, 'runtime'),
|
|
44
44
|
tags: defaultTags,
|
|
45
45
|
};
|
|
46
|
-
return
|
|
46
|
+
return jaeger_client_1.initTracer(config, options);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
exports.TracerSingleton = TracerSingleton;
|
|
@@ -4,42 +4,42 @@ exports.BETWEEN_SCRAPES_EVENT_LOOP_LAG_PERCENTILES = exports.BETWEEN_SCRAPES_EVE
|
|
|
4
4
|
exports.CONCURRENT_REQUESTS = {
|
|
5
5
|
name: 'io_http_requests_current',
|
|
6
6
|
help: 'The current number of requests in course.',
|
|
7
|
-
type: "gauge" /*
|
|
7
|
+
type: "gauge" /* GAUGE */,
|
|
8
8
|
};
|
|
9
9
|
exports.REQUESTS_TOTAL = {
|
|
10
10
|
name: 'runtime_http_requests_total',
|
|
11
11
|
help: 'The total number of HTTP requests.',
|
|
12
|
-
labelNames: ["status_code" /*
|
|
13
|
-
type: "counter" /*
|
|
12
|
+
labelNames: ["status_code" /* STATUS_CODE */, "handler" /* REQUEST_HANDLER */],
|
|
13
|
+
type: "counter" /* COUNTER */,
|
|
14
14
|
};
|
|
15
15
|
exports.REQUESTS_ABORTED = {
|
|
16
16
|
name: 'runtime_http_aborted_requests_total',
|
|
17
17
|
help: 'The total number of HTTP requests aborted.',
|
|
18
|
-
labelNames: ["handler" /*
|
|
19
|
-
type: "counter" /*
|
|
18
|
+
labelNames: ["handler" /* REQUEST_HANDLER */],
|
|
19
|
+
type: "counter" /* COUNTER */,
|
|
20
20
|
};
|
|
21
21
|
exports.REQUEST_TIMINGS = {
|
|
22
22
|
name: 'runtime_http_requests_duration_milliseconds',
|
|
23
23
|
help: 'The incoming http requests total duration.',
|
|
24
|
-
labelNames: ["handler" /*
|
|
24
|
+
labelNames: ["handler" /* REQUEST_HANDLER */],
|
|
25
25
|
buckets: [10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120],
|
|
26
|
-
type: "histogram" /*
|
|
26
|
+
type: "histogram" /* HISTOGRAM */,
|
|
27
27
|
};
|
|
28
28
|
exports.REQUEST_RESPONSE_SIZES = {
|
|
29
29
|
name: 'runtime_http_response_size_bytes',
|
|
30
30
|
help: `The outgoing response sizes (only applicable when the response isn't a stream).`,
|
|
31
|
-
labelNames: ["handler" /*
|
|
31
|
+
labelNames: ["handler" /* REQUEST_HANDLER */],
|
|
32
32
|
buckets: [500, 2000, 8000, 16000, 64000, 256000, 1024000, 4096000],
|
|
33
|
-
type: "histogram" /*
|
|
33
|
+
type: "histogram" /* HISTOGRAM */,
|
|
34
34
|
};
|
|
35
35
|
exports.BETWEEN_SCRAPES_EVENT_LOOP_LAG_MAX = {
|
|
36
36
|
name: 'runtime_event_loop_lag_max_between_scrapes_seconds',
|
|
37
37
|
help: 'The max event loop lag that occurred between this and the previous scrape',
|
|
38
|
-
type: "gauge" /*
|
|
38
|
+
type: "gauge" /* GAUGE */,
|
|
39
39
|
};
|
|
40
40
|
exports.BETWEEN_SCRAPES_EVENT_LOOP_LAG_PERCENTILES = {
|
|
41
41
|
name: 'runtime_event_loop_lag_percentiles_between_scrapes_seconds',
|
|
42
42
|
help: 'Event loop lag percentiles from the observations that occurred between this and the previous scrape',
|
|
43
|
-
labelNames: ["percentile" /*
|
|
44
|
-
type: "gauge" /*
|
|
43
|
+
labelNames: ["percentile" /* PERCENTILE */],
|
|
44
|
+
type: "gauge" /* GAUGE */,
|
|
45
45
|
};
|
|
@@ -3,17 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createEventLoopLagPercentilesInstrument = exports.createEventLoopLagMaxInstrument = exports.createConcurrentRequestsInstrument = exports.createRequestsResponseSizesInstrument = exports.createRequestsTimingsInstrument = exports.createTotalAbortedRequestsInstrument = exports.createTotalRequestsInstrument = void 0;
|
|
4
4
|
const prom_client_1 = require("prom-client");
|
|
5
5
|
const MetricNames_1 = require("./MetricNames");
|
|
6
|
-
|
|
7
|
-
exports.
|
|
8
|
-
|
|
9
|
-
exports.
|
|
10
|
-
|
|
11
|
-
exports.
|
|
12
|
-
|
|
13
|
-
exports.createRequestsResponseSizesInstrument = createRequestsResponseSizesInstrument;
|
|
14
|
-
const createConcurrentRequestsInstrument = () => new prom_client_1.Gauge(MetricNames_1.CONCURRENT_REQUESTS);
|
|
15
|
-
exports.createConcurrentRequestsInstrument = createConcurrentRequestsInstrument;
|
|
16
|
-
const createEventLoopLagMaxInstrument = () => new prom_client_1.Gauge(MetricNames_1.BETWEEN_SCRAPES_EVENT_LOOP_LAG_MAX);
|
|
17
|
-
exports.createEventLoopLagMaxInstrument = createEventLoopLagMaxInstrument;
|
|
18
|
-
const createEventLoopLagPercentilesInstrument = () => new prom_client_1.Gauge(MetricNames_1.BETWEEN_SCRAPES_EVENT_LOOP_LAG_PERCENTILES);
|
|
19
|
-
exports.createEventLoopLagPercentilesInstrument = createEventLoopLagPercentilesInstrument;
|
|
6
|
+
exports.createTotalRequestsInstrument = () => new prom_client_1.Counter(MetricNames_1.REQUESTS_TOTAL);
|
|
7
|
+
exports.createTotalAbortedRequestsInstrument = () => new prom_client_1.Counter(MetricNames_1.REQUESTS_ABORTED);
|
|
8
|
+
exports.createRequestsTimingsInstrument = () => new prom_client_1.Histogram(MetricNames_1.REQUEST_TIMINGS);
|
|
9
|
+
exports.createRequestsResponseSizesInstrument = () => new prom_client_1.Histogram(MetricNames_1.REQUEST_RESPONSE_SIZES);
|
|
10
|
+
exports.createConcurrentRequestsInstrument = () => new prom_client_1.Gauge(MetricNames_1.CONCURRENT_REQUESTS);
|
|
11
|
+
exports.createEventLoopLagMaxInstrument = () => new prom_client_1.Gauge(MetricNames_1.BETWEEN_SCRAPES_EVENT_LOOP_LAG_MAX);
|
|
12
|
+
exports.createEventLoopLagPercentilesInstrument = () => new prom_client_1.Gauge(MetricNames_1.BETWEEN_SCRAPES_EVENT_LOOP_LAG_PERCENTILES);
|
|
@@ -6,21 +6,21 @@ const utils_1 = require("../../../../utils");
|
|
|
6
6
|
const instruments_1 = require("../instruments");
|
|
7
7
|
class EventLoopLagMeasurer {
|
|
8
8
|
constructor() {
|
|
9
|
-
this.eventLoopDelayMonitor =
|
|
10
|
-
this.percentilesInstrument =
|
|
11
|
-
this.maxInstrument =
|
|
9
|
+
this.eventLoopDelayMonitor = perf_hooks_1.monitorEventLoopDelay({ resolution: 10 });
|
|
10
|
+
this.percentilesInstrument = instruments_1.createEventLoopLagPercentilesInstrument();
|
|
11
|
+
this.maxInstrument = instruments_1.createEventLoopLagMaxInstrument();
|
|
12
12
|
}
|
|
13
13
|
start() {
|
|
14
14
|
this.eventLoopDelayMonitor.enable();
|
|
15
15
|
}
|
|
16
16
|
async updateInstrumentsAndReset() {
|
|
17
|
-
this.maxInstrument.set(
|
|
17
|
+
this.maxInstrument.set(utils_1.nanosecondsToSeconds(this.eventLoopDelayMonitor.max));
|
|
18
18
|
this.setPercentileObservation(95);
|
|
19
19
|
this.setPercentileObservation(99);
|
|
20
20
|
this.eventLoopDelayMonitor.reset();
|
|
21
21
|
}
|
|
22
22
|
setPercentileObservation(percentile) {
|
|
23
|
-
this.percentilesInstrument.set({ ["percentile" /*
|
|
23
|
+
this.percentilesInstrument.set({ ["percentile" /* PERCENTILE */]: percentile }, utils_1.nanosecondsToSeconds(this.eventLoopDelayMonitor.percentile(percentile)));
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
exports.EventLoopLagMeasurer = EventLoopLagMeasurer;
|
|
@@ -9,7 +9,7 @@ const Tags_1 = require("../../tracing/Tags");
|
|
|
9
9
|
const utils_1 = require("../../tracing/utils");
|
|
10
10
|
const utils_2 = require("../../utils");
|
|
11
11
|
const PATHS_BLACKLISTED_FOR_TRACING = ['/_status', '/healthcheck'];
|
|
12
|
-
|
|
12
|
+
exports.addTracingMiddleware = (tracer) => {
|
|
13
13
|
return async function addTracing(ctx, next) {
|
|
14
14
|
var _a;
|
|
15
15
|
const rootSpan = tracer.extract(opentracing_1.FORMAT_HTTP_HEADERS, ctx.request.headers);
|
|
@@ -22,7 +22,7 @@ const addTracingMiddleware = (tracer) => {
|
|
|
22
22
|
childOf: rootSpan,
|
|
23
23
|
tags: { [Tags_1.OpentracingTags.SPAN_KIND]: Tags_1.OpentracingTags.SPAN_KIND_RPC_SERVER },
|
|
24
24
|
});
|
|
25
|
-
const initialSamplingDecision =
|
|
25
|
+
const initialSamplingDecision = tracing_1.getTraceInfo(currentSpan).isSampled;
|
|
26
26
|
ctx.tracing = { currentSpan, tracer };
|
|
27
27
|
let responseClosed = false;
|
|
28
28
|
ctx.res.once('close', () => (responseClosed = true));
|
|
@@ -37,7 +37,7 @@ const addTracingMiddleware = (tracer) => {
|
|
|
37
37
|
throw err;
|
|
38
38
|
}
|
|
39
39
|
finally {
|
|
40
|
-
const traceInfo =
|
|
40
|
+
const traceInfo = tracing_1.getTraceInfo(currentSpan);
|
|
41
41
|
if (traceInfo === null || traceInfo === void 0 ? void 0 : traceInfo.isSampled) {
|
|
42
42
|
if (!initialSamplingDecision) {
|
|
43
43
|
currentSpan === null || currentSpan === void 0 ? void 0 : currentSpan.setTag(Tags_1.OpentracingTags.SPAN_KIND, Tags_1.OpentracingTags.SPAN_KIND_RPC_SERVER);
|
|
@@ -46,13 +46,13 @@ const addTracingMiddleware = (tracer) => {
|
|
|
46
46
|
[Tags_1.OpentracingTags.HTTP_URL]: ctx.request.href,
|
|
47
47
|
[Tags_1.OpentracingTags.HTTP_METHOD]: ctx.request.method,
|
|
48
48
|
[Tags_1.OpentracingTags.HTTP_STATUS_CODE]: ctx.response.status,
|
|
49
|
-
["http.path" /*
|
|
50
|
-
["vtex.request_id" /*
|
|
51
|
-
["vtex.incoming.workspace" /*
|
|
52
|
-
["vtex.incoming.account" /*
|
|
49
|
+
["http.path" /* HTTP_PATH */]: ctx.request.path,
|
|
50
|
+
["vtex.request_id" /* VTEX_REQUEST_ID */]: ctx.get(constants_1.REQUEST_ID_HEADER),
|
|
51
|
+
["vtex.incoming.workspace" /* VTEX_WORKSPACE */]: ctx.get(constants_1.WORKSPACE_HEADER),
|
|
52
|
+
["vtex.incoming.account" /* VTEX_ACCOUNT */]: ctx.get(constants_1.ACCOUNT_HEADER),
|
|
53
53
|
});
|
|
54
|
-
currentSpan === null || currentSpan === void 0 ? void 0 : currentSpan.log(
|
|
55
|
-
currentSpan === null || currentSpan === void 0 ? void 0 : currentSpan.log(
|
|
54
|
+
currentSpan === null || currentSpan === void 0 ? void 0 : currentSpan.log(utils_1.cloneAndSanitizeHeaders(ctx.request.headers, 'req.headers.'));
|
|
55
|
+
currentSpan === null || currentSpan === void 0 ? void 0 : currentSpan.log(utils_1.cloneAndSanitizeHeaders(ctx.response.headers, 'res.headers.'));
|
|
56
56
|
ctx.set(constants_1.TRACE_ID_HEADER, traceInfo.traceId);
|
|
57
57
|
}
|
|
58
58
|
const onResFinished = () => {
|
|
@@ -62,13 +62,12 @@ const addTracingMiddleware = (tracer) => {
|
|
|
62
62
|
onResFinished();
|
|
63
63
|
}
|
|
64
64
|
else {
|
|
65
|
-
|
|
65
|
+
stream_1.finished(ctx.res, onResFinished);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
};
|
|
69
69
|
};
|
|
70
|
-
exports.
|
|
71
|
-
const nameSpanOperationMiddleware = (operationType, operationName) => {
|
|
70
|
+
exports.nameSpanOperationMiddleware = (operationType, operationName) => {
|
|
72
71
|
return function nameSpanOperation(ctx, next) {
|
|
73
72
|
var _a, _b;
|
|
74
73
|
ctx.requestHandlerName = `${operationType}:${operationName}`;
|
|
@@ -76,8 +75,7 @@ const nameSpanOperationMiddleware = (operationType, operationName) => {
|
|
|
76
75
|
return next();
|
|
77
76
|
};
|
|
78
77
|
};
|
|
79
|
-
exports.
|
|
80
|
-
const traceUserLandRemainingPipelineMiddleware = () => {
|
|
78
|
+
exports.traceUserLandRemainingPipelineMiddleware = () => {
|
|
81
79
|
return async function traceUserLandRemainingPipeline(ctx, next) {
|
|
82
80
|
const tracingCtx = ctx.tracing;
|
|
83
81
|
ctx.tracing = undefined;
|
|
@@ -87,7 +85,7 @@ const traceUserLandRemainingPipelineMiddleware = () => {
|
|
|
87
85
|
userLandTracer.lockFallbackSpan();
|
|
88
86
|
const startTime = process.hrtime();
|
|
89
87
|
try {
|
|
90
|
-
span === null || span === void 0 ? void 0 : span.log({ event: "user-middlewares-start" /*
|
|
88
|
+
span === null || span === void 0 ? void 0 : span.log({ event: "user-middlewares-start" /* USER_MIDDLEWARES_START */ });
|
|
91
89
|
await next();
|
|
92
90
|
}
|
|
93
91
|
catch (err) {
|
|
@@ -99,14 +97,13 @@ const traceUserLandRemainingPipelineMiddleware = () => {
|
|
|
99
97
|
}
|
|
100
98
|
finally {
|
|
101
99
|
span === null || span === void 0 ? void 0 : span.log({
|
|
102
|
-
event: "user-middlewares-finish" /*
|
|
103
|
-
["user-middlewares-duration" /*
|
|
100
|
+
event: "user-middlewares-finish" /* USER_MIDDLEWARES_FINISH */,
|
|
101
|
+
["user-middlewares-duration" /* USER_MIDDLEWARES_DURATION */]: utils_2.hrToMillis(process.hrtime(startTime)),
|
|
104
102
|
});
|
|
105
103
|
ctx.tracing = tracingCtx;
|
|
106
104
|
}
|
|
107
105
|
};
|
|
108
106
|
};
|
|
109
|
-
exports.traceUserLandRemainingPipelineMiddleware = traceUserLandRemainingPipelineMiddleware;
|
|
110
107
|
function shouldTrace(ctx, rootSpan) {
|
|
111
108
|
var _a, _b, _c;
|
|
112
109
|
/** Should trace if path isnt blacklisted and sampling decision came from the edge
|
|
@@ -41,7 +41,7 @@ const upSignal = () => {
|
|
|
41
41
|
path: '/_up',
|
|
42
42
|
port: 5000,
|
|
43
43
|
};
|
|
44
|
-
const req =
|
|
44
|
+
const req = http_1.request(options);
|
|
45
45
|
req.write(data);
|
|
46
46
|
req.end();
|
|
47
47
|
};
|
|
@@ -49,10 +49,10 @@ const isUpSignal = (message) => message === constants_1.UP_SIGNAL;
|
|
|
49
49
|
const onMessage = (service) => (message) => {
|
|
50
50
|
if (isUpSignal(message)) {
|
|
51
51
|
upSignal();
|
|
52
|
-
|
|
52
|
+
routes_1.logAvailableRoutes(service);
|
|
53
53
|
}
|
|
54
|
-
else if (
|
|
55
|
-
|
|
54
|
+
else if (statusTrack_1.isStatusTrack(message)) {
|
|
55
|
+
statusTrack_1.trackStatus();
|
|
56
56
|
}
|
|
57
57
|
else {
|
|
58
58
|
listeners_1.logger.warn({
|
|
@@ -73,13 +73,13 @@ const createAppHttpHandlers = ({ config: { routes, clients } }, serviceJSON, glo
|
|
|
73
73
|
const { path: servicePath, public: publicRoute = false, extensible = false, } = serviceRoute;
|
|
74
74
|
if (publicRoute || extensible) {
|
|
75
75
|
acc.pub[routeId] = {
|
|
76
|
-
handler:
|
|
76
|
+
handler: http_2.createPublicHttpRoute(clients, routes[routeId], serviceRoute, routeId, globalLimiter),
|
|
77
77
|
path: servicePath,
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
80
|
else {
|
|
81
81
|
acc.pvt[routeId] = {
|
|
82
|
-
handler:
|
|
82
|
+
handler: http_2.createPrivateHttpRoute(clients, routes[routeId], serviceRoute, routeId, globalLimiter),
|
|
83
83
|
path: `/:account/:workspace${servicePath.replace(/\*([^/]*)/g, ':$1*')}`,
|
|
84
84
|
};
|
|
85
85
|
}
|
|
@@ -98,7 +98,7 @@ const createAppGraphQLHandler = ({ config: { graphql, clients } }, { routes }, g
|
|
|
98
98
|
return {
|
|
99
99
|
pvt: {
|
|
100
100
|
[graphql_1.GRAPHQL_ROUTE]: {
|
|
101
|
-
handler:
|
|
101
|
+
handler: graphql_1.createGraphQLRoute(graphql, clients, route, graphql_1.GRAPHQL_ROUTE, globalLimiter),
|
|
102
102
|
path: `/:account/:workspace${route.path}`,
|
|
103
103
|
},
|
|
104
104
|
},
|
|
@@ -111,7 +111,7 @@ const createAppEventHandlers = ({ config: { events, clients } }, serviceJSON, gl
|
|
|
111
111
|
return Object.keys(events).reduce((acc, eventId) => {
|
|
112
112
|
var _a;
|
|
113
113
|
const serviceEvent = (_a = serviceJSON.events) === null || _a === void 0 ? void 0 : _a[eventId];
|
|
114
|
-
acc[eventId] =
|
|
114
|
+
acc[eventId] = events_1.createEventHandler(clients, eventId, events[eventId], serviceEvent, globalLimiter);
|
|
115
115
|
return acc;
|
|
116
116
|
}, {});
|
|
117
117
|
}
|
|
@@ -120,11 +120,11 @@ const createAppEventHandlers = ({ config: { events, clients } }, serviceJSON, gl
|
|
|
120
120
|
const createRuntimeHttpHandlers = (appEventHandlers, serviceJSON) => ({
|
|
121
121
|
pvt: {
|
|
122
122
|
__events: {
|
|
123
|
-
handler:
|
|
123
|
+
handler: router_1.routerFromEventHandlers(appEventHandlers),
|
|
124
124
|
path: '/:account/:workspace/_events',
|
|
125
125
|
},
|
|
126
126
|
__healthCheck: {
|
|
127
|
-
handler:
|
|
127
|
+
handler: handlers_1.healthcheckHandler(serviceJSON),
|
|
128
128
|
path: '/healthcheck',
|
|
129
129
|
},
|
|
130
130
|
__metricsLogger: {
|
|
@@ -136,7 +136,7 @@ const createRuntimeHttpHandlers = (appEventHandlers, serviceJSON) => ({
|
|
|
136
136
|
path: '/_status',
|
|
137
137
|
},
|
|
138
138
|
__whoami: {
|
|
139
|
-
handler:
|
|
139
|
+
handler: handlers_1.whoAmIHandler(serviceJSON),
|
|
140
140
|
path: '/:account/:workspace/_whoami',
|
|
141
141
|
},
|
|
142
142
|
},
|
|
@@ -146,30 +146,30 @@ const scaleClientCaches = (scaleFactor, options) => Object.entries(options || {}
|
|
|
146
146
|
const previous = opts.memoryCache.storage.max;
|
|
147
147
|
const current = previous / scaleFactor;
|
|
148
148
|
opts.memoryCache.storage.max = current;
|
|
149
|
-
|
|
149
|
+
console_1.logOnceToDevConsole(`Scaling ${name} cache capacity from ${previous} to ${current}`, logger_1.LogLevel.Warn);
|
|
150
150
|
}
|
|
151
151
|
});
|
|
152
|
-
|
|
152
|
+
exports.startWorker = (serviceJSON) => {
|
|
153
153
|
var _a, _b;
|
|
154
|
-
|
|
154
|
+
listeners_1.addProcessListeners();
|
|
155
155
|
const tracer = TracerSingleton_1.TracerSingleton.getTracer();
|
|
156
156
|
const app = new koa_1.default();
|
|
157
157
|
app.proxy = true;
|
|
158
158
|
app
|
|
159
159
|
.use(error_1.error)
|
|
160
|
-
.use(
|
|
161
|
-
.use(
|
|
162
|
-
.use(
|
|
163
|
-
.use(
|
|
164
|
-
.use(
|
|
165
|
-
.use(
|
|
160
|
+
.use(middlewares_1.prometheusLoggerMiddleware())
|
|
161
|
+
.use(tracingMiddlewares_1.addTracingMiddleware(tracer))
|
|
162
|
+
.use(requestMetricsMiddleware_1.addRequestMetricsMiddleware())
|
|
163
|
+
.use(middlewares_1.addMetricsLoggerMiddleware())
|
|
164
|
+
.use(rateLimit_1.concurrentRateLimiter((_a = serviceJSON === null || serviceJSON === void 0 ? void 0 : serviceJSON.rateLimitPerReplica) === null || _a === void 0 ? void 0 : _a.concurrent))
|
|
165
|
+
.use(koa_compress_1.default())
|
|
166
166
|
.use(middlewares_1.recorderMiddleware);
|
|
167
|
-
const service =
|
|
167
|
+
const service = loaders_1.getService();
|
|
168
168
|
const { config: { clients } } = service;
|
|
169
169
|
if (clients) {
|
|
170
170
|
scaleClientCaches(serviceJSON.workers, clients.options);
|
|
171
171
|
}
|
|
172
|
-
const globalLimiter =
|
|
172
|
+
const globalLimiter = tokenBucket_1.createTokenBucket((_b = serviceJSON === null || serviceJSON === void 0 ? void 0 : serviceJSON.rateLimitPerReplica) === null || _b === void 0 ? void 0 : _b.perMinute);
|
|
173
173
|
const appHttpHandlers = createAppHttpHandlers(service, serviceJSON, globalLimiter);
|
|
174
174
|
const appEventHandlers = createAppEventHandlers(service, serviceJSON, globalLimiter);
|
|
175
175
|
const appGraphQLHandlers = createAppGraphQLHandler(service, serviceJSON, globalLimiter);
|
|
@@ -183,7 +183,7 @@ const startWorker = (serviceJSON) => {
|
|
|
183
183
|
// TODO: Fix ramda typings. Apparently there was an update that broke things
|
|
184
184
|
.reduce(ramda_1.mergeDeepRight);
|
|
185
185
|
if (httpHandlers === null || httpHandlers === void 0 ? void 0 : httpHandlers.pub) {
|
|
186
|
-
const publicHandlersRouter =
|
|
186
|
+
const publicHandlersRouter = router_2.routerFromPublicHttpHandlers(httpHandlers.pub);
|
|
187
187
|
app.use(publicHandlersRouter);
|
|
188
188
|
}
|
|
189
189
|
if (httpHandlers === null || httpHandlers === void 0 ? void 0 : httpHandlers.pvt) {
|
|
@@ -193,5 +193,4 @@ const startWorker = (serviceJSON) => {
|
|
|
193
193
|
process.on('message', onMessage(serviceJSON));
|
|
194
194
|
return app;
|
|
195
195
|
};
|
|
196
|
-
exports.startWorker = startWorker;
|
|
197
196
|
global.metrics = new MetricsAccumulator_1.MetricsAccumulator();
|
|
@@ -9,7 +9,7 @@ let watched;
|
|
|
9
9
|
const handleSignal = signal => {
|
|
10
10
|
process.exit(os_1.constants.signals[signal]);
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
exports.addProcessListeners = () => {
|
|
13
13
|
// Listeners already set up
|
|
14
14
|
if (watched) {
|
|
15
15
|
return;
|
|
@@ -38,4 +38,3 @@ const addProcessListeners = () => {
|
|
|
38
38
|
process.on('SIGINT', handleSignal);
|
|
39
39
|
process.on('SIGTERM', handleSignal);
|
|
40
40
|
};
|
|
41
|
-
exports.addProcessListeners = addProcessListeners;
|
|
@@ -17,7 +17,7 @@ class Service {
|
|
|
17
17
|
constructor(config) {
|
|
18
18
|
this.config = config;
|
|
19
19
|
if (config.routes && config.routes.graphql) {
|
|
20
|
-
|
|
20
|
+
logger_1.logOnceToDevConsole(`Route id "graphql" is reserved and apps containing this routes will stop working in the near future. To create a GraphQL app, export a "graphql" key with {resolvers}.`, logger_1.LogLevel.Warn);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.metricsLoggerHandler = exports.healthcheckHandler = exports.whoAmIHandler = void 0;
|
|
4
|
-
|
|
4
|
+
exports.whoAmIHandler = ({ events, routes, }) => (ctx) => {
|
|
5
5
|
var _a, _b;
|
|
6
6
|
ctx.requestHandlerName = 'builtin:whoami';
|
|
7
7
|
(_b = (_a = ctx.tracing) === null || _a === void 0 ? void 0 : _a.currentSpan) === null || _b === void 0 ? void 0 : _b.setOperationName(ctx.requestHandlerName);
|
|
@@ -12,8 +12,7 @@ const whoAmIHandler = ({ events, routes, }) => (ctx) => {
|
|
|
12
12
|
};
|
|
13
13
|
ctx.set('Cache-Control', 'public, max-age=86400'); // cache for 24 hours
|
|
14
14
|
};
|
|
15
|
-
exports.
|
|
16
|
-
const healthcheckHandler = ({ events, routes, }) => (ctx) => {
|
|
15
|
+
exports.healthcheckHandler = ({ events, routes, }) => (ctx) => {
|
|
17
16
|
var _a, _b;
|
|
18
17
|
ctx.requestHandlerName = 'builtin:healthcheck';
|
|
19
18
|
(_b = (_a = ctx.tracing) === null || _a === void 0 ? void 0 : _a.currentSpan) === null || _b === void 0 ? void 0 : _b.setOperationName(ctx.requestHandlerName);
|
|
@@ -23,12 +22,10 @@ const healthcheckHandler = ({ events, routes, }) => (ctx) => {
|
|
|
23
22
|
routes,
|
|
24
23
|
};
|
|
25
24
|
};
|
|
26
|
-
exports.
|
|
27
|
-
const metricsLoggerHandler = (ctx) => {
|
|
25
|
+
exports.metricsLoggerHandler = (ctx) => {
|
|
28
26
|
var _a, _b;
|
|
29
27
|
ctx.requestHandlerName = 'builtin:metrics-logger';
|
|
30
28
|
(_b = (_a = ctx.tracing) === null || _a === void 0 ? void 0 : _a.currentSpan) === null || _b === void 0 ? void 0 : _b.setOperationName(ctx.requestHandlerName);
|
|
31
29
|
ctx.status = 200;
|
|
32
30
|
ctx.body = ctx.metricsLogger.getSummaries();
|
|
33
31
|
};
|
|
34
|
-
exports.metricsLoggerHandler = metricsLoggerHandler;
|
|
@@ -14,16 +14,15 @@ async function recorderMiddleware(ctx, next) {
|
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
16
|
exports.recorderMiddleware = recorderMiddleware;
|
|
17
|
-
|
|
17
|
+
exports.addMetricsLoggerMiddleware = () => {
|
|
18
18
|
const metricsLogger = new metricsLogger_1.MetricsLogger();
|
|
19
19
|
return (ctx, next) => {
|
|
20
20
|
ctx.metricsLogger = metricsLogger;
|
|
21
21
|
return next();
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
|
-
exports.
|
|
25
|
-
|
|
26
|
-
(0, prom_client_1.collectDefaultMetrics)();
|
|
24
|
+
exports.prometheusLoggerMiddleware = () => {
|
|
25
|
+
prom_client_1.collectDefaultMetrics();
|
|
27
26
|
const eventLoopLagMeasurer = new EventLoopLagMeasurer_1.EventLoopLagMeasurer();
|
|
28
27
|
eventLoopLagMeasurer.start();
|
|
29
28
|
return async (ctx, next) => {
|
|
@@ -40,4 +39,3 @@ const prometheusLoggerMiddleware = () => {
|
|
|
40
39
|
ctx.status = 200;
|
|
41
40
|
};
|
|
42
41
|
};
|
|
43
|
-
exports.prometheusLoggerMiddleware = prometheusLoggerMiddleware;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import TokenBucket from 'tokenbucket';
|
|
2
2
|
import { IOClients } from '../../../../clients/IOClients';
|
|
3
3
|
import { ClientsConfig, EventHandler, ParamsContext, RecorderState, ServiceContext, ServiceEvent } from '../typings';
|
|
4
|
-
export declare const createEventHandler: <T extends IOClients, U extends RecorderState, V extends ParamsContext>(clientsConfig: ClientsConfig<T>, eventId: string, handler:
|
|
4
|
+
export declare const createEventHandler: <T extends IOClients, U extends RecorderState, V extends ParamsContext>(clientsConfig: ClientsConfig<T>, eventId: string, handler: import("koa-compose").Middleware<import("../typings").EventContext<T, U>> | import("koa-compose").Middleware<import("../typings").EventContext<T, U>>[], serviceEvent: ServiceEvent | undefined, globalLimiter: TokenBucket | undefined) => import("koa-compose").ComposedMiddleware<ServiceContext<T, U, V>>;
|
|
@@ -10,25 +10,24 @@ const compose_1 = require("../utils/compose");
|
|
|
10
10
|
const toArray_1 = require("../utils/toArray");
|
|
11
11
|
const body_1 = require("./middlewares/body");
|
|
12
12
|
const context_1 = require("./middlewares/context");
|
|
13
|
-
|
|
13
|
+
exports.createEventHandler = (clientsConfig, eventId, handler, serviceEvent, globalLimiter) => {
|
|
14
14
|
var _a, _b;
|
|
15
15
|
const { implementation, options } = clientsConfig;
|
|
16
|
-
const middlewares =
|
|
16
|
+
const middlewares = toArray_1.toArray(handler);
|
|
17
17
|
const pipeline = [
|
|
18
|
-
|
|
18
|
+
tracingMiddlewares_1.nameSpanOperationMiddleware('event-handler', eventId),
|
|
19
19
|
context_1.eventContextMiddleware,
|
|
20
20
|
body_1.parseBodyMiddleware,
|
|
21
|
-
|
|
22
|
-
...((serviceEvent === null || serviceEvent === void 0 ? void 0 : serviceEvent.settingsType) === 'workspace' || (serviceEvent === null || serviceEvent === void 0 ? void 0 : serviceEvent.settingsType) === 'userAndWorkspace' ? [
|
|
21
|
+
clients_1.clients(implementation, options),
|
|
22
|
+
...((serviceEvent === null || serviceEvent === void 0 ? void 0 : serviceEvent.settingsType) === 'workspace' || (serviceEvent === null || serviceEvent === void 0 ? void 0 : serviceEvent.settingsType) === 'userAndWorkspace' ? [settings_1.getServiceSettings()] : []),
|
|
23
23
|
timings_1.timings,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
rateLimit_1.concurrentRateLimiter((_a = serviceEvent === null || serviceEvent === void 0 ? void 0 : serviceEvent.rateLimitPerReplica) === null || _a === void 0 ? void 0 : _a.concurrent),
|
|
25
|
+
rateLimit_1.perMinuteRateLimiter((_b = serviceEvent === null || serviceEvent === void 0 ? void 0 : serviceEvent.rateLimitPerReplica) === null || _b === void 0 ? void 0 : _b.perMinute, globalLimiter),
|
|
26
|
+
tracingMiddlewares_1.traceUserLandRemainingPipelineMiddleware(),
|
|
27
27
|
contextAdapter(middlewares),
|
|
28
28
|
];
|
|
29
|
-
return
|
|
29
|
+
return compose_1.compose(pipeline);
|
|
30
30
|
};
|
|
31
|
-
exports.createEventHandler = createEventHandler;
|
|
32
31
|
function contextAdapter(middlewares) {
|
|
33
32
|
return async function middlewareCascade(ctx) {
|
|
34
33
|
const ctxEvent = {
|
|
@@ -42,7 +41,7 @@ function contextAdapter(middlewares) {
|
|
|
42
41
|
timings: ctx.timings,
|
|
43
42
|
vtex: ctx.vtex,
|
|
44
43
|
};
|
|
45
|
-
await
|
|
44
|
+
await compose_1.composeForEvents(middlewares)(ctxEvent);
|
|
46
45
|
ctx.status = 204;
|
|
47
46
|
};
|
|
48
47
|
}
|
|
@@ -9,7 +9,7 @@ const logger_1 = require("../../../../logger");
|
|
|
9
9
|
const console_1 = require("./../../../../logger/console");
|
|
10
10
|
async function parseBodyMiddleware(ctx, next) {
|
|
11
11
|
try {
|
|
12
|
-
ctx.state.body = await
|
|
12
|
+
ctx.state.body = await co_body_1.default(ctx.req);
|
|
13
13
|
}
|
|
14
14
|
catch (err) {
|
|
15
15
|
if (!(err instanceof Error)) {
|
|
@@ -18,7 +18,7 @@ async function parseBodyMiddleware(ctx, next) {
|
|
|
18
18
|
const msg = `Error parsing event body: ${err.message || err}`;
|
|
19
19
|
ctx.status = 500;
|
|
20
20
|
ctx.body = msg;
|
|
21
|
-
|
|
21
|
+
console_1.logOnceToDevConsole(msg, logger_1.LogLevel.Error);
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
await next();
|
|
@@ -6,7 +6,7 @@ const context_1 = require("../../utils/context");
|
|
|
6
6
|
async function eventContextMiddleware(ctx, next) {
|
|
7
7
|
const { request: { header } } = ctx;
|
|
8
8
|
ctx.vtex = {
|
|
9
|
-
...
|
|
9
|
+
...context_1.prepareHandlerCtx(header, ctx.tracing),
|
|
10
10
|
eventInfo: {
|
|
11
11
|
key: header[constants_1.EVENT_KEY_HEADER],
|
|
12
12
|
sender: header[constants_1.EVENT_SENDER_HEADER],
|
|
@@ -4,7 +4,7 @@ exports.routerFromEventHandlers = void 0;
|
|
|
4
4
|
const constants_1 = require("../../../../constants");
|
|
5
5
|
const logger_1 = require("../../../logger");
|
|
6
6
|
const console_1 = require("./../../../logger/console");
|
|
7
|
-
|
|
7
|
+
exports.routerFromEventHandlers = (events) => {
|
|
8
8
|
return async (ctx, next) => {
|
|
9
9
|
const handlerId = ctx.get(constants_1.EVENT_HANDLER_ID_HEADER);
|
|
10
10
|
if (!handlerId || !events) {
|
|
@@ -20,10 +20,9 @@ const routerFromEventHandlers = (events) => {
|
|
|
20
20
|
const msg = `Event handler not found for ${handlerId}`;
|
|
21
21
|
ctx.response.status = 404;
|
|
22
22
|
ctx.response.body = msg;
|
|
23
|
-
|
|
23
|
+
console_1.logOnceToDevConsole(msg, logger_1.LogLevel.Error);
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
await handler(ctx, next);
|
|
27
27
|
};
|
|
28
28
|
};
|
|
29
|
-
exports.routerFromEventHandlers = routerFromEventHandlers;
|