nugi-ts-logs-sdk 1.0.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/README.md +218 -0
- package/dist/adapters/common.d.ts +43 -0
- package/dist/adapters/common.d.ts.map +1 -0
- package/dist/adapters/common.js +153 -0
- package/dist/adapters/common.js.map +1 -0
- package/dist/adapters/express.d.ts +29 -0
- package/dist/adapters/express.d.ts.map +1 -0
- package/dist/adapters/express.js +62 -0
- package/dist/adapters/express.js.map +1 -0
- package/dist/adapters/fastify.d.ts +18 -0
- package/dist/adapters/fastify.d.ts.map +1 -0
- package/dist/adapters/fastify.js +78 -0
- package/dist/adapters/fastify.js.map +1 -0
- package/dist/adapters/nestjs.d.ts +93 -0
- package/dist/adapters/nestjs.d.ts.map +1 -0
- package/dist/adapters/nestjs.js +310 -0
- package/dist/adapters/nestjs.js.map +1 -0
- package/dist/client.d.ts +66 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +299 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +116 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +51 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/db-error.d.ts +27 -0
- package/dist/instrumentation/db-error.d.ts.map +1 -0
- package/dist/instrumentation/db-error.js +153 -0
- package/dist/instrumentation/db-error.js.map +1 -0
- package/dist/instrumentation/query-capture.d.ts +39 -0
- package/dist/instrumentation/query-capture.d.ts.map +1 -0
- package/dist/instrumentation/query-capture.js +359 -0
- package/dist/instrumentation/query-capture.js.map +1 -0
- package/dist/internal/breadcrumbs.d.ts +32 -0
- package/dist/internal/breadcrumbs.d.ts.map +1 -0
- package/dist/internal/breadcrumbs.js +31 -0
- package/dist/internal/breadcrumbs.js.map +1 -0
- package/dist/internal/console-capture.d.ts +31 -0
- package/dist/internal/console-capture.d.ts.map +1 -0
- package/dist/internal/console-capture.js +113 -0
- package/dist/internal/console-capture.js.map +1 -0
- package/dist/internal/context.d.ts +21 -0
- package/dist/internal/context.d.ts.map +1 -0
- package/dist/internal/context.js +42 -0
- package/dist/internal/context.js.map +1 -0
- package/dist/internal/diagnostics.d.ts +9 -0
- package/dist/internal/diagnostics.d.ts.map +1 -0
- package/dist/internal/diagnostics.js +43 -0
- package/dist/internal/diagnostics.js.map +1 -0
- package/dist/internal/http-utils.d.ts +16 -0
- package/dist/internal/http-utils.d.ts.map +1 -0
- package/dist/internal/http-utils.js +81 -0
- package/dist/internal/http-utils.js.map +1 -0
- package/dist/internal/ids.d.ts +9 -0
- package/dist/internal/ids.d.ts.map +1 -0
- package/dist/internal/ids.js +34 -0
- package/dist/internal/ids.js.map +1 -0
- package/dist/internal/metadata.d.ts +4 -0
- package/dist/internal/metadata.d.ts.map +1 -0
- package/dist/internal/metadata.js +151 -0
- package/dist/internal/metadata.js.map +1 -0
- package/dist/internal/propagation.d.ts +30 -0
- package/dist/internal/propagation.d.ts.map +1 -0
- package/dist/internal/propagation.js +99 -0
- package/dist/internal/propagation.js.map +1 -0
- package/dist/internal/sanitize.d.ts +11 -0
- package/dist/internal/sanitize.d.ts.map +1 -0
- package/dist/internal/sanitize.js +77 -0
- package/dist/internal/sanitize.js.map +1 -0
- package/dist/internal/stacktrace.d.ts +29 -0
- package/dist/internal/stacktrace.d.ts.map +1 -0
- package/dist/internal/stacktrace.js +182 -0
- package/dist/internal/stacktrace.js.map +1 -0
- package/dist/signals/checkins.d.ts +28 -0
- package/dist/signals/checkins.d.ts.map +1 -0
- package/dist/signals/checkins.js +76 -0
- package/dist/signals/checkins.js.map +1 -0
- package/dist/signals/logger.d.ts +26 -0
- package/dist/signals/logger.d.ts.map +1 -0
- package/dist/signals/logger.js +63 -0
- package/dist/signals/logger.js.map +1 -0
- package/dist/signals/metrics.d.ts +58 -0
- package/dist/signals/metrics.d.ts.map +1 -0
- package/dist/signals/metrics.js +166 -0
- package/dist/signals/metrics.js.map +1 -0
- package/dist/signals/tracer.d.ts +77 -0
- package/dist/signals/tracer.d.ts.map +1 -0
- package/dist/signals/tracer.js +210 -0
- package/dist/signals/tracer.js.map +1 -0
- package/dist/transport/batcher.d.ts +31 -0
- package/dist/transport/batcher.d.ts.map +1 -0
- package/dist/transport/batcher.js +129 -0
- package/dist/transport/batcher.js.map +1 -0
- package/dist/transport/legacy-logs.d.ts +21 -0
- package/dist/transport/legacy-logs.d.ts.map +1 -0
- package/dist/transport/legacy-logs.js +61 -0
- package/dist/transport/legacy-logs.js.map +1 -0
- package/dist/transport/retry.d.ts +16 -0
- package/dist/transport/retry.d.ts.map +1 -0
- package/dist/transport/retry.js +43 -0
- package/dist/transport/retry.js.map +1 -0
- package/dist/transport/transport.d.ts +14 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +70 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { ArgumentsHost, CallHandler, DynamicModule, ExceptionFilter, ExecutionContext, LoggerService, MiddlewareConsumer, NestInterceptor, NestMiddleware, NestModule, OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { NugiClient } from '../client';
|
|
4
|
+
import { NugiConfig } from '../config';
|
|
5
|
+
import { HttpAdapterOptions } from './common';
|
|
6
|
+
export declare const NUGI_CLIENT: unique symbol;
|
|
7
|
+
export declare const NUGI_OPTIONS: unique symbol;
|
|
8
|
+
export interface NugiModuleOptions extends NugiConfig {
|
|
9
|
+
/** HTTP capture options for the request middleware. */
|
|
10
|
+
http?: HttpAdapterOptions;
|
|
11
|
+
}
|
|
12
|
+
interface RawResponse {
|
|
13
|
+
statusCode: number;
|
|
14
|
+
getHeader(name: string): unknown;
|
|
15
|
+
on(event: string, listener: () => void): unknown;
|
|
16
|
+
}
|
|
17
|
+
type NextFn = (err?: unknown) => void;
|
|
18
|
+
/** Per-request tracking middleware (mounted for all routes by NugiModule). */
|
|
19
|
+
export declare class NugiTrackingMiddleware implements NestMiddleware {
|
|
20
|
+
private readonly client;
|
|
21
|
+
private readonly options;
|
|
22
|
+
constructor(client: NugiClient, options: HttpAdapterOptions);
|
|
23
|
+
use(req: unknown, res: RawResponse, next: NextFn): void;
|
|
24
|
+
}
|
|
25
|
+
/** Interceptor that records errors thrown by controllers/handlers. */
|
|
26
|
+
export declare class NugiErrorInterceptor implements NestInterceptor {
|
|
27
|
+
private readonly client;
|
|
28
|
+
constructor(client: NugiClient);
|
|
29
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Nest `LoggerService` bridge. Wire it so the framework's own logs — and any
|
|
33
|
+
* `this.logger.log()` calls — become structured telemetry (and breadcrumbs),
|
|
34
|
+
* not just stdout:
|
|
35
|
+
*
|
|
36
|
+
* const app = await NestFactory.create(AppModule, { bufferLogs: true });
|
|
37
|
+
* app.useLogger(app.get(NugiLoggerService));
|
|
38
|
+
*
|
|
39
|
+
* Each entry is emitted at the matching severity with the Nest `context`
|
|
40
|
+
* (usually the class name) attached. Original console-based logging is
|
|
41
|
+
* unaffected; when you route Nest through this service, its logs stop hitting
|
|
42
|
+
* the console-capture path so there's no duplication.
|
|
43
|
+
*/
|
|
44
|
+
export declare class NugiLoggerService implements LoggerService {
|
|
45
|
+
private readonly client;
|
|
46
|
+
constructor(client: NugiClient);
|
|
47
|
+
log(message: unknown, ...rest: unknown[]): void;
|
|
48
|
+
error(message: unknown, ...rest: unknown[]): void;
|
|
49
|
+
warn(message: unknown, ...rest: unknown[]): void;
|
|
50
|
+
debug(message: unknown, ...rest: unknown[]): void;
|
|
51
|
+
verbose(message: unknown, ...rest: unknown[]): void;
|
|
52
|
+
private emit;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Global exception filter that records unhandled exceptions (Sentry-style) and
|
|
56
|
+
* still returns a correct HTTP error response. Opt-in — register it yourself so
|
|
57
|
+
* it can't interfere with an existing filter chain:
|
|
58
|
+
*
|
|
59
|
+
* app.useGlobalFilters(new NugiExceptionFilter(app.get(NUGI_CLIENT)));
|
|
60
|
+
*
|
|
61
|
+
* By default only server-side failures are captured (non-HttpException, or 5xx);
|
|
62
|
+
* expected 4xx client errors are answered but not reported. Set
|
|
63
|
+
* `captureClientErrors: true` to report those too. Response writing is
|
|
64
|
+
* feature-detected so it works on both Express and Fastify.
|
|
65
|
+
*/
|
|
66
|
+
export declare class NugiExceptionFilter implements ExceptionFilter {
|
|
67
|
+
private readonly client;
|
|
68
|
+
private readonly options;
|
|
69
|
+
constructor(client: NugiClient, options?: {
|
|
70
|
+
captureClientErrors?: boolean;
|
|
71
|
+
});
|
|
72
|
+
catch(exception: unknown, host: ArgumentsHost): void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Root observability module.
|
|
76
|
+
*
|
|
77
|
+
* @Module({ imports: [NugiModule.forRoot({ apiKey, appId, endpoint })] })
|
|
78
|
+
* export class AppModule {}
|
|
79
|
+
*
|
|
80
|
+
* Provides and exports the NUGI_CLIENT token so services can inject the client
|
|
81
|
+
* to emit custom logs/metrics/spans. Flushes on application shutdown.
|
|
82
|
+
*/
|
|
83
|
+
export declare class NugiModule implements NestModule, OnModuleDestroy {
|
|
84
|
+
private readonly client;
|
|
85
|
+
constructor(client: NugiClient);
|
|
86
|
+
configure(consumer: MiddlewareConsumer): void;
|
|
87
|
+
onModuleDestroy(): Promise<void>;
|
|
88
|
+
static forRoot(options: NugiModuleOptions): DynamicModule;
|
|
89
|
+
/** Register an already-constructed client (e.g. shared across modules). */
|
|
90
|
+
static forClient(client: NugiClient, http?: HttpAdapterOptions): DynamicModule;
|
|
91
|
+
}
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=nestjs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.d.ts","sourceRoot":"","sources":["../../src/adapters/nestjs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// NestJS integration: a dynamic module that provides a shared NugiClient plus
|
|
3
|
+
// request-tracking middleware and an error-tracking interceptor. Works on both
|
|
4
|
+
// the Express and Fastify platform adapters (middleware receives raw req/res).
|
|
5
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
6
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
7
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
8
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
9
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
+
};
|
|
11
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
12
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
13
|
+
};
|
|
14
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
15
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
16
|
+
};
|
|
17
|
+
var NugiModule_1;
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.NugiModule = exports.NugiExceptionFilter = exports.NugiLoggerService = exports.NugiErrorInterceptor = exports.NugiTrackingMiddleware = exports.NUGI_OPTIONS = exports.NUGI_CLIENT = void 0;
|
|
20
|
+
const common_1 = require("@nestjs/common");
|
|
21
|
+
const operators_1 = require("rxjs/operators");
|
|
22
|
+
const client_1 = require("../client");
|
|
23
|
+
const context_1 = require("../internal/context");
|
|
24
|
+
const sanitize_1 = require("../internal/sanitize");
|
|
25
|
+
const common_2 = require("./common");
|
|
26
|
+
/**
|
|
27
|
+
* Build a rich, sanitized request-context object to attach to an error so the
|
|
28
|
+
* Errors view can show exactly which request (and payload) triggered it.
|
|
29
|
+
* Returns `{ request: {...} }` ready to spread into trackError attributes.
|
|
30
|
+
*/
|
|
31
|
+
function requestContextFrom(req) {
|
|
32
|
+
if (!req)
|
|
33
|
+
return {};
|
|
34
|
+
try {
|
|
35
|
+
const info = (0, common_2.normalizeRequest)(req);
|
|
36
|
+
const r = req;
|
|
37
|
+
return {
|
|
38
|
+
request: {
|
|
39
|
+
method: info.method,
|
|
40
|
+
url: info.url,
|
|
41
|
+
path: info.route || info.path,
|
|
42
|
+
query: r?.query,
|
|
43
|
+
params: r?.params,
|
|
44
|
+
body: (0, sanitize_1.sanitizeBody)(info.body),
|
|
45
|
+
headers: (0, sanitize_1.sanitizeHeaders)(info.headers),
|
|
46
|
+
ip: info.ip,
|
|
47
|
+
userAgent: info.userAgent,
|
|
48
|
+
userId: info.userId,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.NUGI_CLIENT = Symbol('NUGI_CLIENT');
|
|
57
|
+
exports.NUGI_OPTIONS = Symbol('NUGI_OPTIONS');
|
|
58
|
+
/** Per-request tracking middleware (mounted for all routes by NugiModule). */
|
|
59
|
+
let NugiTrackingMiddleware = class NugiTrackingMiddleware {
|
|
60
|
+
constructor(client, options) {
|
|
61
|
+
this.client = client;
|
|
62
|
+
this.options = options;
|
|
63
|
+
}
|
|
64
|
+
use(req, res, next) {
|
|
65
|
+
let ran = false;
|
|
66
|
+
try {
|
|
67
|
+
const info = (0, common_2.normalizeRequest)(req);
|
|
68
|
+
if (this.options.ignore?.(info)) {
|
|
69
|
+
next();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const startedAtMs = Date.now();
|
|
73
|
+
const span = (0, common_2.startServerSpan)(this.client, info, this.options);
|
|
74
|
+
res.on('finish', () => {
|
|
75
|
+
const finalInfo = (0, common_2.normalizeRequest)(req);
|
|
76
|
+
(0, common_2.completeServerSpan)(this.client, span, finalInfo, {
|
|
77
|
+
statusCode: res.statusCode,
|
|
78
|
+
headers: { 'content-length': res.getHeader('content-length') },
|
|
79
|
+
}, startedAtMs, this.options);
|
|
80
|
+
});
|
|
81
|
+
ran = true;
|
|
82
|
+
(0, context_1.runWithContext)({ span: span.context() }, () => next());
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
this.client.trackError(error, { attributes: { source: 'nest.middleware' } });
|
|
86
|
+
if (!ran)
|
|
87
|
+
next();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
exports.NugiTrackingMiddleware = NugiTrackingMiddleware;
|
|
92
|
+
exports.NugiTrackingMiddleware = NugiTrackingMiddleware = __decorate([
|
|
93
|
+
(0, common_1.Injectable)(),
|
|
94
|
+
__param(0, (0, common_1.Inject)(exports.NUGI_CLIENT)),
|
|
95
|
+
__param(1, (0, common_1.Inject)(exports.NUGI_OPTIONS)),
|
|
96
|
+
__metadata("design:paramtypes", [client_1.NugiClient, Object])
|
|
97
|
+
], NugiTrackingMiddleware);
|
|
98
|
+
/** Interceptor that records errors thrown by controllers/handlers. */
|
|
99
|
+
let NugiErrorInterceptor = class NugiErrorInterceptor {
|
|
100
|
+
constructor(client) {
|
|
101
|
+
this.client = client;
|
|
102
|
+
}
|
|
103
|
+
intercept(context, next) {
|
|
104
|
+
// Snapshot the request now so we can attach it if the handler throws.
|
|
105
|
+
const req = context.getType() === 'http' ? context.switchToHttp().getRequest() : undefined;
|
|
106
|
+
return next.handle().pipe((0, operators_1.tap)({
|
|
107
|
+
error: (error) => {
|
|
108
|
+
this.client.trackError(error, {
|
|
109
|
+
handled: false,
|
|
110
|
+
attributes: { source: 'nest.interceptor', ...requestContextFrom(req) },
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
exports.NugiErrorInterceptor = NugiErrorInterceptor;
|
|
117
|
+
exports.NugiErrorInterceptor = NugiErrorInterceptor = __decorate([
|
|
118
|
+
(0, common_1.Injectable)(),
|
|
119
|
+
__param(0, (0, common_1.Inject)(exports.NUGI_CLIENT)),
|
|
120
|
+
__metadata("design:paramtypes", [client_1.NugiClient])
|
|
121
|
+
], NugiErrorInterceptor);
|
|
122
|
+
/**
|
|
123
|
+
* Nest `LoggerService` bridge. Wire it so the framework's own logs — and any
|
|
124
|
+
* `this.logger.log()` calls — become structured telemetry (and breadcrumbs),
|
|
125
|
+
* not just stdout:
|
|
126
|
+
*
|
|
127
|
+
* const app = await NestFactory.create(AppModule, { bufferLogs: true });
|
|
128
|
+
* app.useLogger(app.get(NugiLoggerService));
|
|
129
|
+
*
|
|
130
|
+
* Each entry is emitted at the matching severity with the Nest `context`
|
|
131
|
+
* (usually the class name) attached. Original console-based logging is
|
|
132
|
+
* unaffected; when you route Nest through this service, its logs stop hitting
|
|
133
|
+
* the console-capture path so there's no duplication.
|
|
134
|
+
*/
|
|
135
|
+
let NugiLoggerService = class NugiLoggerService {
|
|
136
|
+
constructor(client) {
|
|
137
|
+
this.client = client;
|
|
138
|
+
}
|
|
139
|
+
log(message, ...rest) {
|
|
140
|
+
this.emit('info', message, rest);
|
|
141
|
+
}
|
|
142
|
+
error(message, ...rest) {
|
|
143
|
+
// Nest passes (message, stack?, context?) for errors.
|
|
144
|
+
const stack = typeof rest[0] === 'string' ? rest[0] : undefined;
|
|
145
|
+
this.emit('error', message, rest, stack);
|
|
146
|
+
}
|
|
147
|
+
warn(message, ...rest) {
|
|
148
|
+
this.emit('warn', message, rest);
|
|
149
|
+
}
|
|
150
|
+
debug(message, ...rest) {
|
|
151
|
+
this.emit('debug', message, rest);
|
|
152
|
+
}
|
|
153
|
+
verbose(message, ...rest) {
|
|
154
|
+
this.emit('debug', message, rest);
|
|
155
|
+
}
|
|
156
|
+
emit(level, message, rest, stack) {
|
|
157
|
+
try {
|
|
158
|
+
// The trailing string arg is Nest's context (the source class name).
|
|
159
|
+
const context = rest.length > 0 && typeof rest[rest.length - 1] === 'string'
|
|
160
|
+
? rest[rest.length - 1]
|
|
161
|
+
: undefined;
|
|
162
|
+
const attributes = { origin: 'nest.logger' };
|
|
163
|
+
if (context)
|
|
164
|
+
attributes.context = context;
|
|
165
|
+
if (stack && stack !== context)
|
|
166
|
+
attributes.stack = stack;
|
|
167
|
+
this.client.logger.log(level, formatMessage(message), attributes);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
/* logging must never throw into the framework */
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
exports.NugiLoggerService = NugiLoggerService;
|
|
175
|
+
exports.NugiLoggerService = NugiLoggerService = __decorate([
|
|
176
|
+
(0, common_1.Injectable)(),
|
|
177
|
+
__param(0, (0, common_1.Inject)(exports.NUGI_CLIENT)),
|
|
178
|
+
__metadata("design:paramtypes", [client_1.NugiClient])
|
|
179
|
+
], NugiLoggerService);
|
|
180
|
+
function formatMessage(message) {
|
|
181
|
+
if (typeof message === 'string')
|
|
182
|
+
return message;
|
|
183
|
+
if (message instanceof Error)
|
|
184
|
+
return `${message.name}: ${message.message}`;
|
|
185
|
+
try {
|
|
186
|
+
return JSON.stringify(message);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return String(message);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Global exception filter that records unhandled exceptions (Sentry-style) and
|
|
194
|
+
* still returns a correct HTTP error response. Opt-in — register it yourself so
|
|
195
|
+
* it can't interfere with an existing filter chain:
|
|
196
|
+
*
|
|
197
|
+
* app.useGlobalFilters(new NugiExceptionFilter(app.get(NUGI_CLIENT)));
|
|
198
|
+
*
|
|
199
|
+
* By default only server-side failures are captured (non-HttpException, or 5xx);
|
|
200
|
+
* expected 4xx client errors are answered but not reported. Set
|
|
201
|
+
* `captureClientErrors: true` to report those too. Response writing is
|
|
202
|
+
* feature-detected so it works on both Express and Fastify.
|
|
203
|
+
*/
|
|
204
|
+
let NugiExceptionFilter = class NugiExceptionFilter {
|
|
205
|
+
constructor(client, options = {}) {
|
|
206
|
+
this.client = client;
|
|
207
|
+
this.options = options;
|
|
208
|
+
}
|
|
209
|
+
catch(exception, host) {
|
|
210
|
+
const isHttp = exception instanceof common_1.HttpException;
|
|
211
|
+
const status = isHttp ? exception.getStatus() : 500;
|
|
212
|
+
const shouldCapture = !isHttp || status >= 500 || this.options.captureClientErrors === true;
|
|
213
|
+
if (shouldCapture) {
|
|
214
|
+
try {
|
|
215
|
+
const req = host.getType() === 'http' ? host.switchToHttp().getRequest() : undefined;
|
|
216
|
+
this.client.trackError(exception, {
|
|
217
|
+
handled: false,
|
|
218
|
+
attributes: { source: 'nest.exceptionFilter', statusCode: status, ...requestContextFrom(req) },
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
/* never let capture break error handling */
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Only HTTP contexts have a response to write; leave others to Nest.
|
|
226
|
+
if (host.getType() !== 'http')
|
|
227
|
+
return;
|
|
228
|
+
try {
|
|
229
|
+
const response = host.switchToHttp().getResponse();
|
|
230
|
+
const payload = isHttp
|
|
231
|
+
? exception.getResponse()
|
|
232
|
+
: { statusCode: status, message: 'Internal server error' };
|
|
233
|
+
if (response && typeof response.status === 'function') {
|
|
234
|
+
const withStatus = response.status(status);
|
|
235
|
+
if (withStatus && typeof withStatus.json === 'function') {
|
|
236
|
+
withStatus.json(payload); // Express
|
|
237
|
+
}
|
|
238
|
+
else if (withStatus && typeof withStatus.send === 'function') {
|
|
239
|
+
withStatus.send(payload); // Fastify
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
/* if we can't write the response, don't mask the original error */
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
exports.NugiExceptionFilter = NugiExceptionFilter;
|
|
249
|
+
exports.NugiExceptionFilter = NugiExceptionFilter = __decorate([
|
|
250
|
+
(0, common_1.Catch)(),
|
|
251
|
+
__metadata("design:paramtypes", [client_1.NugiClient, Object])
|
|
252
|
+
], NugiExceptionFilter);
|
|
253
|
+
/**
|
|
254
|
+
* Root observability module.
|
|
255
|
+
*
|
|
256
|
+
* @Module({ imports: [NugiModule.forRoot({ apiKey, appId, endpoint })] })
|
|
257
|
+
* export class AppModule {}
|
|
258
|
+
*
|
|
259
|
+
* Provides and exports the NUGI_CLIENT token so services can inject the client
|
|
260
|
+
* to emit custom logs/metrics/spans. Flushes on application shutdown.
|
|
261
|
+
*/
|
|
262
|
+
let NugiModule = NugiModule_1 = class NugiModule {
|
|
263
|
+
constructor(client) {
|
|
264
|
+
this.client = client;
|
|
265
|
+
}
|
|
266
|
+
configure(consumer) {
|
|
267
|
+
consumer.apply(NugiTrackingMiddleware).forRoutes('*');
|
|
268
|
+
}
|
|
269
|
+
async onModuleDestroy() {
|
|
270
|
+
await this.client.shutdown();
|
|
271
|
+
}
|
|
272
|
+
static forRoot(options) {
|
|
273
|
+
const { http, ...config } = options;
|
|
274
|
+
const client = new client_1.NugiClient(config);
|
|
275
|
+
return {
|
|
276
|
+
module: NugiModule_1,
|
|
277
|
+
global: true,
|
|
278
|
+
providers: [
|
|
279
|
+
{ provide: exports.NUGI_CLIENT, useValue: client },
|
|
280
|
+
{ provide: exports.NUGI_OPTIONS, useValue: http ?? {} },
|
|
281
|
+
NugiTrackingMiddleware,
|
|
282
|
+
NugiErrorInterceptor,
|
|
283
|
+
NugiLoggerService,
|
|
284
|
+
],
|
|
285
|
+
exports: [exports.NUGI_CLIENT, NugiErrorInterceptor, NugiLoggerService],
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/** Register an already-constructed client (e.g. shared across modules). */
|
|
289
|
+
static forClient(client, http = {}) {
|
|
290
|
+
return {
|
|
291
|
+
module: NugiModule_1,
|
|
292
|
+
global: true,
|
|
293
|
+
providers: [
|
|
294
|
+
{ provide: exports.NUGI_CLIENT, useValue: client },
|
|
295
|
+
{ provide: exports.NUGI_OPTIONS, useValue: http },
|
|
296
|
+
NugiTrackingMiddleware,
|
|
297
|
+
NugiErrorInterceptor,
|
|
298
|
+
NugiLoggerService,
|
|
299
|
+
],
|
|
300
|
+
exports: [exports.NUGI_CLIENT, NugiErrorInterceptor, NugiLoggerService],
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
exports.NugiModule = NugiModule;
|
|
305
|
+
exports.NugiModule = NugiModule = NugiModule_1 = __decorate([
|
|
306
|
+
(0, common_1.Module)({}),
|
|
307
|
+
__param(0, (0, common_1.Inject)(exports.NUGI_CLIENT)),
|
|
308
|
+
__metadata("design:paramtypes", [client_1.NugiClient])
|
|
309
|
+
], NugiModule);
|
|
310
|
+
//# sourceMappingURL=nestjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../../src/adapters/nestjs.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { NugiConfig, ResolvedConfig } from './config';
|
|
2
|
+
import { Attributes, Resource } from './types';
|
|
3
|
+
import { Logger } from './signals/logger';
|
|
4
|
+
import { Metrics } from './signals/metrics';
|
|
5
|
+
import { Tracer } from './signals/tracer';
|
|
6
|
+
import { Checkins } from './signals/checkins';
|
|
7
|
+
import { type NormalizedDbError } from './instrumentation/db-error';
|
|
8
|
+
export interface TrackErrorOptions {
|
|
9
|
+
handled?: boolean;
|
|
10
|
+
attributes?: Attributes;
|
|
11
|
+
code?: string | number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The SDK entry point. Owns configuration, the batching transport pipeline and
|
|
15
|
+
* the signals (logs, metrics, traces, check-ins, query capture). Construction
|
|
16
|
+
* never throws beyond config validation; all runtime paths are fault-tolerant.
|
|
17
|
+
*/
|
|
18
|
+
export declare class NugiClient {
|
|
19
|
+
readonly config: ResolvedConfig;
|
|
20
|
+
readonly resource: Resource;
|
|
21
|
+
readonly logger: Logger;
|
|
22
|
+
readonly metrics: Metrics;
|
|
23
|
+
readonly tracer: Tracer;
|
|
24
|
+
readonly checkins: Checkins;
|
|
25
|
+
private readonly diagnostics;
|
|
26
|
+
private readonly transport;
|
|
27
|
+
private readonly batcher;
|
|
28
|
+
private readonly legacyLogs;
|
|
29
|
+
private readonly breadcrumbs;
|
|
30
|
+
private readonly consoleCapture?;
|
|
31
|
+
private readonly exitHandler?;
|
|
32
|
+
private readonly uncaughtHandler?;
|
|
33
|
+
private readonly rejectionHandler?;
|
|
34
|
+
private stopQueryCapture?;
|
|
35
|
+
private shuttingDown;
|
|
36
|
+
constructor(config: NugiConfig);
|
|
37
|
+
/**
|
|
38
|
+
* Wrap a PrismaClient so every operation is captured. Returns the extended client.
|
|
39
|
+
* Only needed when using Prisma (driver patches do not cover it).
|
|
40
|
+
*/
|
|
41
|
+
wrapPrisma<T extends {
|
|
42
|
+
$extends: Function;
|
|
43
|
+
}>(prisma: T): T;
|
|
44
|
+
/** Manually record a DB query (when auto-capture is off or for custom drivers). */
|
|
45
|
+
logQuery(query: string, durationMs: number, extra?: {
|
|
46
|
+
orm?: string;
|
|
47
|
+
success?: boolean;
|
|
48
|
+
error?: string;
|
|
49
|
+
requestId?: string;
|
|
50
|
+
dbError?: NormalizedDbError;
|
|
51
|
+
cause?: unknown;
|
|
52
|
+
}): void;
|
|
53
|
+
/** Record an error/exception as a first-class telemetry event. */
|
|
54
|
+
trackError(error: unknown, options?: TrackErrorOptions): void;
|
|
55
|
+
/** Force a flush of buffered telemetry. Never rejects. */
|
|
56
|
+
flush(): Promise<void>;
|
|
57
|
+
/** Flush and tear down timers/handlers. Idempotent. Never rejects. */
|
|
58
|
+
shutdown(): Promise<void>;
|
|
59
|
+
/** Number of buffered (not-yet-sent) events. */
|
|
60
|
+
get bufferSize(): number;
|
|
61
|
+
private captureQuery;
|
|
62
|
+
private emit;
|
|
63
|
+
}
|
|
64
|
+
/** Convenience factory mirroring common SDK ergonomics. */
|
|
65
|
+
export declare function createClient(config: NugiConfig): NugiClient;
|
|
66
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,cAAc,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EACL,UAAU,EAGV,QAAQ,EAET,MAAM,SAAS,CAAC;AAMjB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAU9C,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAA4B;IAC9D,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,UAAU;IAgF9B;;;OAGG;IACH,UAAU,CAAC,CAAC,SAAS;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC;IAI1D,mFAAmF;IACnF,QAAQ,CACN,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE;QACN,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,iBAAiB,CAAC;QAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GACA,IAAI;IAaP,kEAAkE;IAClE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI;IAqCjE,0DAA0D;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,sEAAsE;IAChE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB/B,gDAAgD;IAChD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,OAAO,CAAC,YAAY;IA2GpB,OAAO,CAAC,IAAI;CAQb;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D"}
|