@rsdk/grpc.server 3.6.1 → 3.8.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/CHANGELOG.md +12 -0
- package/dist/grpc-logger.interceptor.d.ts +10 -0
- package/dist/grpc-logger.interceptor.js +72 -0
- package/dist/grpc-logger.interceptor.js.map +1 -0
- package/dist/grpc.config.d.ts +1 -0
- package/dist/grpc.config.js +8 -0
- package/dist/grpc.config.js.map +1 -1
- package/dist/grpc.transport.d.ts +2 -1
- package/dist/grpc.transport.js +17 -2
- package/dist/grpc.transport.js.map +1 -1
- package/package.json +3 -2
- package/src/grpc-logger.interceptor.ts +72 -0
- package/src/grpc.config.ts +7 -0
- package/src/grpc.transport.ts +17 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.8.0](https://github.com/R-Vision/rsdk/compare/v3.7.0...v3.8.0) (2023-11-15)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* added configuration for request logging and move to trace level all request logging ([#158](https://github.com/R-Vision/rsdk/issues/158)) ([0304672](https://github.com/R-Vision/rsdk/commit/0304672c112fd626642a2d44b0384fbf188e71b4))
|
|
11
|
+
|
|
12
|
+
## [3.7.0](https://github.com/R-Vision/rsdk/compare/v3.6.1...v3.7.0) (2023-11-15)
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* added logging to rpc and http transports ([#156](https://github.com/R-Vision/rsdk/issues/156)) ([7ebddb9](https://github.com/R-Vision/rsdk/commit/7ebddb97d2c30811eba9868b6d3ff9778708c957))
|
|
17
|
+
|
|
6
18
|
## [3.6.1](https://github.com/R-Vision/rsdk/compare/v3.6.1-next.1...v3.6.1) (2023-10-24)
|
|
7
19
|
|
|
8
20
|
**Note:** Version bump only for package @rsdk/grpc.server
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common/interfaces';
|
|
2
|
+
import { ILogger } from '@rsdk/logging';
|
|
3
|
+
import type { Observable } from 'rxjs';
|
|
4
|
+
import { GRPCConfig } from './grpc.config';
|
|
5
|
+
export declare class GrpcLoggerInterceptor implements NestInterceptor {
|
|
6
|
+
private logger;
|
|
7
|
+
private grpcConfig;
|
|
8
|
+
constructor(logger: ILogger, grpcConfig: GRPCConfig);
|
|
9
|
+
intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GrpcLoggerInterceptor = void 0;
|
|
16
|
+
const core_1 = require("@rsdk/core");
|
|
17
|
+
const rxjs_1 = require("rxjs");
|
|
18
|
+
const grpc_config_1 = require("./grpc.config");
|
|
19
|
+
let GrpcLoggerInterceptor = exports.GrpcLoggerInterceptor = class GrpcLoggerInterceptor {
|
|
20
|
+
logger;
|
|
21
|
+
grpcConfig;
|
|
22
|
+
constructor(logger, grpcConfig) {
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
this.grpcConfig = grpcConfig;
|
|
25
|
+
}
|
|
26
|
+
intercept(context, next) {
|
|
27
|
+
if (!this.grpcConfig.requestLogging) {
|
|
28
|
+
return next.handle();
|
|
29
|
+
}
|
|
30
|
+
const isRpc = context.getType() === 'rpc';
|
|
31
|
+
if (!isRpc) {
|
|
32
|
+
return next.handle();
|
|
33
|
+
}
|
|
34
|
+
const rpc = context.switchToRpc();
|
|
35
|
+
const startDate = Date.now();
|
|
36
|
+
const rpcContext = rpc.getContext();
|
|
37
|
+
const serializedCtx = rpcContext?.toJSON?.() ?? rpcContext;
|
|
38
|
+
const requestForLog = {
|
|
39
|
+
data: rpc.getData(),
|
|
40
|
+
ctx: serializedCtx,
|
|
41
|
+
};
|
|
42
|
+
this.logger.trace('received rpc request', {
|
|
43
|
+
request: requestForLog,
|
|
44
|
+
timestamp: startDate,
|
|
45
|
+
});
|
|
46
|
+
return next.handle().pipe((0, rxjs_1.catchError)((error) => {
|
|
47
|
+
const endDate = Date.now();
|
|
48
|
+
this.logger.trace('handled rpc request with error', {
|
|
49
|
+
request: requestForLog,
|
|
50
|
+
startDate,
|
|
51
|
+
endDate,
|
|
52
|
+
duration: endDate - startDate,
|
|
53
|
+
error,
|
|
54
|
+
});
|
|
55
|
+
return (0, rxjs_1.throwError)(() => error);
|
|
56
|
+
}), (0, rxjs_1.tap)((response) => {
|
|
57
|
+
const endDate = Date.now();
|
|
58
|
+
this.logger.trace('handled rpc request', {
|
|
59
|
+
request: requestForLog,
|
|
60
|
+
startDate,
|
|
61
|
+
endDate,
|
|
62
|
+
duration: endDate - startDate,
|
|
63
|
+
response,
|
|
64
|
+
});
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
exports.GrpcLoggerInterceptor = GrpcLoggerInterceptor = __decorate([
|
|
69
|
+
__param(0, (0, core_1.InjectLogger)(GrpcLoggerInterceptor)),
|
|
70
|
+
__metadata("design:paramtypes", [Object, grpc_config_1.GRPCConfig])
|
|
71
|
+
], GrpcLoggerInterceptor);
|
|
72
|
+
//# sourceMappingURL=grpc-logger.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc-logger.interceptor.js","sourceRoot":"","sources":["../src/grpc-logger.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAKA,qCAA0C;AAG1C,+BAAmD;AAEnD,+CAA2C;AAE3C,IAAa,qBAAqB,mCAAlC,MAAa,qBAAqB;IAEe;IACrC;IAFV,YAC+C,MAAe,EACpD,UAAsB;QADe,WAAM,GAAN,MAAM,CAAS;QACpD,eAAU,GAAV,UAAU,CAAY;IAC7B,CAAC;IAEJ,SAAS,CACP,OAAyB,EACzB,IAAsB;QAEtB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;YACnC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;SACtB;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;SACtB;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,UAAU,CAAC;QAC3D,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE;YACnB,GAAG,EAAE,aAAa;SACnB,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACxC,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,iBAAU,EAAC,CAAC,KAAK,EAAE,EAAE;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAClD,OAAO,EAAE,aAAa;gBACtB,SAAS;gBACT,OAAO;gBACP,QAAQ,EAAE,OAAO,GAAG,SAAS;gBAC7B,KAAK;aACN,CAAC,CAAC;YACH,OAAO,IAAA,iBAAU,EAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,CAAC,QAAQ,EAAE,EAAE;YACf,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;gBACvC,OAAO,EAAE,aAAa;gBACtB,SAAS;gBACT,OAAO;gBACP,QAAQ,EAAE,OAAO,GAAG,SAAS;gBAC7B,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;gCA3DY,qBAAqB;IAE7B,WAAA,IAAA,mBAAY,EAAC,qBAAqB,CAAC,CAAA;6CAChB,wBAAU;GAHrB,qBAAqB,CA2DjC"}
|
package/dist/grpc.config.d.ts
CHANGED
package/dist/grpc.config.js
CHANGED
|
@@ -18,6 +18,7 @@ let GRPCConfig = exports.GRPCConfig = class GRPCConfig extends core_1.Config {
|
|
|
18
18
|
address;
|
|
19
19
|
maxRecv;
|
|
20
20
|
maxSend;
|
|
21
|
+
requestLogging;
|
|
21
22
|
};
|
|
22
23
|
__decorate([
|
|
23
24
|
(0, core_1.Property)('GRPC_ADDRESS', new grpc_common_1.GrpcAddressParser(), {
|
|
@@ -43,6 +44,13 @@ __decorate([
|
|
|
43
44
|
}),
|
|
44
45
|
__metadata("design:type", Number)
|
|
45
46
|
], GRPCConfig.prototype, "maxSend", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, core_1.Property)('GRPC_REQUEST_LOGGING', new core_1.BoolParser(), {
|
|
49
|
+
defaultValue: false,
|
|
50
|
+
description: 'Enable trace logging all requests',
|
|
51
|
+
}),
|
|
52
|
+
__metadata("design:type", Boolean)
|
|
53
|
+
], GRPCConfig.prototype, "requestLogging", void 0);
|
|
46
54
|
exports.GRPCConfig = GRPCConfig = __decorate([
|
|
47
55
|
(0, core_1.ConfigSection)({
|
|
48
56
|
tags: [core_1.ConfigTag.infrastructure, core_1.ConfigTag.transport, core_1.ConfigTag.grpcServer],
|
package/dist/grpc.config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc.config.js","sourceRoot":"","sources":["../src/grpc.config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAG2C;AAC3C,yCAAoC;AACpC,
|
|
1
|
+
{"version":3,"file":"grpc.config.js","sourceRoot":"","sources":["../src/grpc.config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAG2C;AAC3C,yCAAoC;AACpC,qCAOoB;AACpB,mDAAsD;AAK/C,IAAM,UAAU,wBAAhB,MAAM,UAAW,SAAQ,aAAM;IAQ3B,OAAO,CAAU;IAMjB,OAAO,CAAU;IAMjB,OAAO,CAAU;IAMjB,cAAc,CAAW;CACnC,CAAA;AAnBU;IAPR,IAAA,eAAQ,EAAC,cAAc,EAAE,IAAI,+BAAiB,EAAE,EAAE;QACjD,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,IAAA,aAAI,EAAA;;;KAGhB;KACF,CAAC;;2CACwB;AAMjB;IAJR,IAAA,eAAQ,EAAC,iCAAiC,EAAE,IAAI,gBAAS,EAAE,EAAE;QAC5D,YAAY,EAAE,8CAAkC;QAChD,WAAW,EAAE,iCAAiC;KAC/C,CAAC;;2CACwB;AAMjB;IAJR,IAAA,eAAQ,EAAC,8BAA8B,EAAE,IAAI,gBAAS,EAAE,EAAE;QACzD,YAAY,EAAE,2CAA+B;QAC7C,WAAW,EAAE,8BAA8B;KAC5C,CAAC;;2CACwB;AAMjB;IAJR,IAAA,eAAQ,EAAC,sBAAsB,EAAE,IAAI,iBAAU,EAAE,EAAE;QAClD,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,mCAAmC;KACjD,CAAC;;kDACgC;qBA1BvB,UAAU;IAHtB,IAAA,oBAAa,EAAC;QACb,IAAI,EAAE,CAAC,gBAAS,CAAC,cAAc,EAAE,gBAAS,CAAC,SAAS,EAAE,gBAAS,CAAC,UAAU,CAAC;KAC5E,CAAC;GACW,UAAU,CA2BtB"}
|
package/dist/grpc.transport.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Controller } from '@nestjs/common/interfaces';
|
|
2
2
|
import type { MicroserviceOptions } from '@nestjs/microservices';
|
|
3
3
|
import type { Constructor } from '@rsdk/common';
|
|
4
|
-
import type { ConfigContext, IErrorsFormatter, IErrorsSender, IErrorsTransformer, IMicroserviceTransport } from '@rsdk/core';
|
|
4
|
+
import type { ConfigContext, IErrorsFormatter, IErrorsSender, IErrorsTransformer, IMicroserviceTransport, NestModuleDefinitions } from '@rsdk/core';
|
|
5
5
|
import type { Package } from '@rsdk/grpc.loader';
|
|
6
6
|
export declare class GrpcTransport implements IMicroserviceTransport {
|
|
7
7
|
private readonly logger;
|
|
@@ -17,6 +17,7 @@ export declare class GrpcTransport implements IMicroserviceTransport {
|
|
|
17
17
|
getErrorTransformers(): IErrorsTransformer[];
|
|
18
18
|
getMetricsController(): Constructor<Controller>;
|
|
19
19
|
getHealthController(): Constructor<Controller>;
|
|
20
|
+
modules(): NestModuleDefinitions;
|
|
20
21
|
/**
|
|
21
22
|
* Unfortunally we can't access GRPCConfig in constructor because
|
|
22
23
|
* PlatformConfigModule is not initilalized yet
|
package/dist/grpc.transport.js
CHANGED
|
@@ -4,15 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.GrpcTransport = void 0;
|
|
7
|
+
const core_1 = require("@nestjs/core");
|
|
7
8
|
const grpc_health_v1_1 = __importDefault(require("@rsdk/builtin-contract/dist/grpc.health.v1"));
|
|
8
9
|
const grpc_metrics_v1_1 = __importDefault(require("@rsdk/builtin-contract/dist/grpc.metrics.v1"));
|
|
9
|
-
const
|
|
10
|
+
const core_2 = require("@rsdk/core");
|
|
10
11
|
const grpc_loader_1 = require("@rsdk/grpc.loader");
|
|
11
12
|
const logging_1 = require("@rsdk/logging");
|
|
12
13
|
const controllers_1 = require("./controllers");
|
|
13
14
|
const grpc_config_1 = require("./grpc.config");
|
|
14
15
|
const grpc_errors_formatter_1 = require("./grpc-errors.formatter");
|
|
15
16
|
const grpc_errors_sender_1 = require("./grpc-errors.sender");
|
|
17
|
+
const grpc_logger_interceptor_1 = require("./grpc-logger.interceptor");
|
|
16
18
|
class GrpcTransport {
|
|
17
19
|
logger = logging_1.LoggerFactory.create(GrpcTransport);
|
|
18
20
|
packages;
|
|
@@ -41,6 +43,19 @@ class GrpcTransport {
|
|
|
41
43
|
getHealthController() {
|
|
42
44
|
return controllers_1.HealthController;
|
|
43
45
|
}
|
|
46
|
+
modules() {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
module: GrpcTransport,
|
|
50
|
+
providers: [
|
|
51
|
+
{
|
|
52
|
+
provide: core_1.APP_INTERCEPTOR,
|
|
53
|
+
useClass: grpc_logger_interceptor_1.GrpcLoggerInterceptor,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
44
59
|
/**
|
|
45
60
|
* Unfortunally we can't access GRPCConfig in constructor because
|
|
46
61
|
* PlatformConfigModule is not initilalized yet
|
|
@@ -79,7 +94,7 @@ class GrpcTransport {
|
|
|
79
94
|
}
|
|
80
95
|
checkIsInitialized() {
|
|
81
96
|
if (!this.isInitialized) {
|
|
82
|
-
throw new
|
|
97
|
+
throw new core_2.SequenceException('You should call init() method first!');
|
|
83
98
|
}
|
|
84
99
|
}
|
|
85
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc.transport.js","sourceRoot":"","sources":["../src/grpc.transport.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"grpc.transport.js","sourceRoot":"","sources":["../src/grpc.transport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/grpc.server",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.8.0",
|
|
4
4
|
"description": "Grpc transport for platform, clients and common grpc stuff",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"peerDependencies": {
|
|
17
17
|
"@grpc/grpc-js": "^1.8.8",
|
|
18
18
|
"@nestjs/common": "^10.1.3",
|
|
19
|
+
"@nestjs/core": "^10.1.3",
|
|
19
20
|
"@nestjs/microservices": "^10.1.3",
|
|
20
21
|
"@rsdk/builtin-contract": "^3.5.0",
|
|
21
22
|
"@rsdk/common": "^3.5.0",
|
|
@@ -27,5 +28,5 @@
|
|
|
27
28
|
"nice-grpc-opentelemetry": "^0.1.3",
|
|
28
29
|
"rxjs": "^7.0.0"
|
|
29
30
|
},
|
|
30
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "2ea4aa82c26a18c1211054ea01652d40af0a82f3"
|
|
31
32
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CallHandler,
|
|
3
|
+
ExecutionContext,
|
|
4
|
+
NestInterceptor,
|
|
5
|
+
} from '@nestjs/common/interfaces';
|
|
6
|
+
import { InjectLogger } from '@rsdk/core';
|
|
7
|
+
import { ILogger } from '@rsdk/logging';
|
|
8
|
+
import type { Observable } from 'rxjs';
|
|
9
|
+
import { catchError, tap, throwError } from 'rxjs';
|
|
10
|
+
|
|
11
|
+
import { GRPCConfig } from './grpc.config';
|
|
12
|
+
|
|
13
|
+
export class GrpcLoggerInterceptor implements NestInterceptor {
|
|
14
|
+
constructor(
|
|
15
|
+
@InjectLogger(GrpcLoggerInterceptor) private logger: ILogger,
|
|
16
|
+
private grpcConfig: GRPCConfig,
|
|
17
|
+
) {}
|
|
18
|
+
|
|
19
|
+
intercept(
|
|
20
|
+
context: ExecutionContext,
|
|
21
|
+
next: CallHandler<any>,
|
|
22
|
+
): Observable<any> | Promise<Observable<any>> {
|
|
23
|
+
if (!this.grpcConfig.requestLogging) {
|
|
24
|
+
return next.handle();
|
|
25
|
+
}
|
|
26
|
+
const isRpc = context.getType() === 'rpc';
|
|
27
|
+
if (!isRpc) {
|
|
28
|
+
return next.handle();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const rpc = context.switchToRpc();
|
|
32
|
+
|
|
33
|
+
const startDate = Date.now();
|
|
34
|
+
const rpcContext = rpc.getContext();
|
|
35
|
+
const serializedCtx = rpcContext?.toJSON?.() ?? rpcContext;
|
|
36
|
+
const requestForLog = {
|
|
37
|
+
data: rpc.getData(),
|
|
38
|
+
ctx: serializedCtx,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
this.logger.trace('received rpc request', {
|
|
42
|
+
request: requestForLog,
|
|
43
|
+
timestamp: startDate,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return next.handle().pipe(
|
|
47
|
+
catchError((error) => {
|
|
48
|
+
const endDate = Date.now();
|
|
49
|
+
|
|
50
|
+
this.logger.trace('handled rpc request with error', {
|
|
51
|
+
request: requestForLog,
|
|
52
|
+
startDate,
|
|
53
|
+
endDate,
|
|
54
|
+
duration: endDate - startDate,
|
|
55
|
+
error,
|
|
56
|
+
});
|
|
57
|
+
return throwError(() => error);
|
|
58
|
+
}),
|
|
59
|
+
tap((response) => {
|
|
60
|
+
const endDate = Date.now();
|
|
61
|
+
|
|
62
|
+
this.logger.trace('handled rpc request', {
|
|
63
|
+
request: requestForLog,
|
|
64
|
+
startDate,
|
|
65
|
+
endDate,
|
|
66
|
+
duration: endDate - startDate,
|
|
67
|
+
response,
|
|
68
|
+
});
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
package/src/grpc.config.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
} from '@grpc/grpc-js/build/src/constants';
|
|
5
5
|
import { text } from '@rsdk/common';
|
|
6
6
|
import {
|
|
7
|
+
BoolParser,
|
|
7
8
|
Config,
|
|
8
9
|
ConfigSection,
|
|
9
10
|
ConfigTag,
|
|
@@ -36,4 +37,10 @@ export class GRPCConfig extends Config {
|
|
|
36
37
|
description: 'Max gRPC message size (send)',
|
|
37
38
|
})
|
|
38
39
|
readonly maxSend!: number;
|
|
40
|
+
|
|
41
|
+
@Property('GRPC_REQUEST_LOGGING', new BoolParser(), {
|
|
42
|
+
defaultValue: false,
|
|
43
|
+
description: 'Enable trace logging all requests',
|
|
44
|
+
})
|
|
45
|
+
readonly requestLogging!: boolean;
|
|
39
46
|
}
|
package/src/grpc.transport.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Controller } from '@nestjs/common/interfaces';
|
|
2
|
+
import { APP_INTERCEPTOR } from '@nestjs/core';
|
|
2
3
|
import type { MicroserviceOptions } from '@nestjs/microservices';
|
|
3
4
|
import HealthGrpcPackage from '@rsdk/builtin-contract/dist/grpc.health.v1';
|
|
4
5
|
import MetricsGrpcPackage from '@rsdk/builtin-contract/dist/grpc.metrics.v1';
|
|
@@ -9,6 +10,7 @@ import type {
|
|
|
9
10
|
IErrorsSender,
|
|
10
11
|
IErrorsTransformer,
|
|
11
12
|
IMicroserviceTransport,
|
|
13
|
+
NestModuleDefinitions,
|
|
12
14
|
} from '@rsdk/core';
|
|
13
15
|
import { SequenceException } from '@rsdk/core';
|
|
14
16
|
import type { Package } from '@rsdk/grpc.loader';
|
|
@@ -19,6 +21,7 @@ import { HealthController, MetricsController } from './controllers';
|
|
|
19
21
|
import { GRPCConfig } from './grpc.config';
|
|
20
22
|
import { GrpcErrorsFormatter } from './grpc-errors.formatter';
|
|
21
23
|
import { GrpcErrorsSender } from './grpc-errors.sender';
|
|
24
|
+
import { GrpcLoggerInterceptor } from './grpc-logger.interceptor';
|
|
22
25
|
|
|
23
26
|
export class GrpcTransport implements IMicroserviceTransport {
|
|
24
27
|
private readonly logger = LoggerFactory.create(GrpcTransport);
|
|
@@ -58,6 +61,20 @@ export class GrpcTransport implements IMicroserviceTransport {
|
|
|
58
61
|
return HealthController;
|
|
59
62
|
}
|
|
60
63
|
|
|
64
|
+
modules(): NestModuleDefinitions {
|
|
65
|
+
return [
|
|
66
|
+
{
|
|
67
|
+
module: GrpcTransport,
|
|
68
|
+
providers: [
|
|
69
|
+
{
|
|
70
|
+
provide: APP_INTERCEPTOR,
|
|
71
|
+
useClass: GrpcLoggerInterceptor,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
|
|
61
78
|
/**
|
|
62
79
|
* Unfortunally we can't access GRPCConfig in constructor because
|
|
63
80
|
* PlatformConfigModule is not initilalized yet
|