@bywaretech/bysentinel-aws-lambda 0.1.0
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/LICENSE +202 -0
- package/README.md +184 -0
- package/dist/capture.d.ts +16 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +77 -0
- package/dist/capture.js.map +1 -0
- package/dist/context.d.ts +27 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +57 -0
- package/dist/context.js.map +1 -0
- package/dist/dedupe.d.ts +3 -0
- package/dist/dedupe.d.ts.map +1 -0
- package/dist/dedupe.js +25 -0
- package/dist/dedupe.js.map +1 -0
- package/dist/event.d.ts +21 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +72 -0
- package/dist/event.js.map +1 -0
- package/dist/git.d.ts +8 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +31 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +4 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +48 -0
- package/dist/options.js.map +1 -0
- package/dist/request.d.ts +12 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +67 -0
- package/dist/request.js.map +1 -0
- package/dist/runtime.d.ts +22 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +29 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scope.d.ts +14 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +9 -0
- package/dist/scope.js.map +1 -0
- package/dist/transport.d.ts +19 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +101 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/withBySentinel.d.ts +13 -0
- package/dist/withBySentinel.d.ts.map +1 -0
- package/dist/withBySentinel.js +78 -0
- package/dist/withBySentinel.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { consumeColdStart, finishPerf, startPerf } from "./context.js";
|
|
2
|
+
import { isCaptured } from "./dedupe.js";
|
|
3
|
+
import { buildEvent } from "./event.js";
|
|
4
|
+
import { resolveOptions } from "./options.js";
|
|
5
|
+
import { runWithScope } from "./scope.js";
|
|
6
|
+
import { deliver } from "./transport.js";
|
|
7
|
+
/**
|
|
8
|
+
* Wrap a Lambda handler with BySentinel. On an unhandled exception it captures
|
|
9
|
+
* a sanitized event, then re-throws so the Lambda still fails as expected. On
|
|
10
|
+
* success it optionally reports performance metadata (timeout risk / memory).
|
|
11
|
+
*
|
|
12
|
+
* The wrapper never changes the handler's return value and never swallows the
|
|
13
|
+
* business error.
|
|
14
|
+
*/
|
|
15
|
+
export function withBySentinel(handler, options) {
|
|
16
|
+
const resolved = resolveOptions(options);
|
|
17
|
+
return async function bySentinelHandler(event, context) {
|
|
18
|
+
const coldStart = consumeColdStart();
|
|
19
|
+
const probe = startPerf(context);
|
|
20
|
+
const scope = {
|
|
21
|
+
options: resolved,
|
|
22
|
+
lambdaEvent: event,
|
|
23
|
+
lambdaContext: context,
|
|
24
|
+
coldStart,
|
|
25
|
+
};
|
|
26
|
+
return runWithScope(scope, async () => {
|
|
27
|
+
try {
|
|
28
|
+
const result = await handler(event, context);
|
|
29
|
+
// Success path: only emit an event when performance capture is on and a
|
|
30
|
+
// risk was detected, to avoid flooding the collector with healthy runs.
|
|
31
|
+
if (resolved.capture.performance) {
|
|
32
|
+
const performance = finishPerf(probe, context, context?.memoryLimitInMB);
|
|
33
|
+
if (performance.timeoutRisk) {
|
|
34
|
+
const perfEvent = buildEvent({
|
|
35
|
+
options: resolved,
|
|
36
|
+
lambdaEvent: event,
|
|
37
|
+
lambdaContext: context,
|
|
38
|
+
coldStart,
|
|
39
|
+
performance,
|
|
40
|
+
timeline: scope.timeline?.hasSteps ? scope.timeline.finish() : undefined,
|
|
41
|
+
customContext: { kind: "performance-warning" },
|
|
42
|
+
});
|
|
43
|
+
await deliver(resolved, perfEvent);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// Already reported by a manual captureException in the handler — don't
|
|
50
|
+
// double-count. Re-throw so the Lambda still fails.
|
|
51
|
+
if (isCaptured(error))
|
|
52
|
+
throw error;
|
|
53
|
+
const performance = resolved.capture.performance
|
|
54
|
+
? finishPerf(probe, context, context?.memoryLimitInMB)
|
|
55
|
+
: undefined;
|
|
56
|
+
// Finalize the timeline as aborted so the failed step is visible.
|
|
57
|
+
const timeline = scope.timeline?.hasSteps
|
|
58
|
+
? (scope.timeline.fail(), scope.timeline.toJSON(true))
|
|
59
|
+
: undefined;
|
|
60
|
+
const errorEvent = buildEvent({
|
|
61
|
+
options: resolved,
|
|
62
|
+
lambdaEvent: event,
|
|
63
|
+
lambdaContext: context,
|
|
64
|
+
coldStart,
|
|
65
|
+
error,
|
|
66
|
+
performance,
|
|
67
|
+
timeline,
|
|
68
|
+
});
|
|
69
|
+
// Bounded, fail-silent delivery. We await so the event actually leaves
|
|
70
|
+
// the container before Lambda freezes it, but delivery is time-capped.
|
|
71
|
+
await deliver(resolved, errorEvent);
|
|
72
|
+
// Never swallow the business error.
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=withBySentinel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withBySentinel.js","sourceRoot":"","sources":["../src/withBySentinel.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bywaretech/bysentinel-aws-lambda",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI Runtime Monitoring SDK for AWS Lambda",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/bywaretech/bysentinel.git",
|
|
9
|
+
"directory": "packages/aws-lambda"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/bywaretech/bysentinel/tree/main/packages/aws-lambda#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/bywaretech/bysentinel/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"bysentinel",
|
|
17
|
+
"aws-lambda",
|
|
18
|
+
"lambda",
|
|
19
|
+
"serverless",
|
|
20
|
+
"observability",
|
|
21
|
+
"ai-debugging",
|
|
22
|
+
"error-tracking",
|
|
23
|
+
"security"
|
|
24
|
+
],
|
|
25
|
+
"type": "module",
|
|
26
|
+
"main": "./dist/index.js",
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"import": "./dist/index.js"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"README.md",
|
|
37
|
+
"LICENSE"
|
|
38
|
+
],
|
|
39
|
+
"sideEffects": false,
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@bywaretech/bysentinel-core": "0.1.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/aws-lambda": "^8.10.140",
|
|
48
|
+
"typescript": "^5.5.0",
|
|
49
|
+
"vitest": "^2.0.0"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsc -p tsconfig.json",
|
|
53
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"test:watch": "vitest",
|
|
56
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
57
|
+
"lint": "tsc -p tsconfig.json --noEmit",
|
|
58
|
+
"clean": "rm -rf dist .turbo coverage"
|
|
59
|
+
}
|
|
60
|
+
}
|