@yolo-croket-dev/core 1.9.6 → 1.9.7-slowquery.1

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.
@@ -0,0 +1,5 @@
1
+ import { HttpException } from '@nestjs/common';
2
+ import { AbstractErrorResponse } from '../interfaces';
3
+ export declare class CustomException extends HttpException {
4
+ constructor(status: number, body: AbstractErrorResponse);
5
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomException = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class CustomException extends common_1.HttpException {
6
+ constructor(status, body) {
7
+ super(body, status);
8
+ }
9
+ }
10
+ exports.CustomException = CustomException;
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  interface RequestContext {
3
2
  abortSignal: AbortSignal;
4
3
  requestId: string;
@@ -1,5 +1,4 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="node" />
3
2
  /**
4
3
  * 현재 컨텍스트의 AbortSignal을 가져오는 전역 함수
5
4
  * @returns 현재 AbortSignal 또는 null
@@ -41,6 +41,12 @@ const operators_1 = require("rxjs/operators");
41
41
  const dd_trace_1 = __importDefault(require("dd-trace"));
42
42
  const { SERVER_NAME } = process.env;
43
43
  const msaLogger = new msa_logger_1.default(msa_logger_1.ServerTypeEnum.SERVICE);
44
+ // interface IContent {
45
+ // pattern: string;
46
+ // data: IRequest;
47
+ // /** 무슨 아이디인지 모르겠음 */
48
+ // id: string;
49
+ // }
44
50
  const MAX_CUT_LENGTH = 500;
45
51
  dd_trace_1.default.init();
46
52
  let LoggingServiceInterceptor = class LoggingServiceInterceptor {
@@ -76,29 +82,61 @@ let LoggingServiceInterceptor = class LoggingServiceInterceptor {
76
82
  }
77
83
  intercept(context, next) {
78
84
  const now = Date.now();
79
- // const args = context.getArgs();
80
- const rmqContext = context.switchToRpc().getContext();
81
- const data = context.switchToRpc().getData();
82
- const pastFrom = data.param.from ? JSON.parse(JSON.stringify(data.param.from)) : '-';
83
- const pastFroms = data.param.froms ? JSON.parse(JSON.stringify(data.param.froms)) : [pastFrom];
84
- const originalMessage = rmqContext.getMessage();
85
- const ctx = context.switchToHttp();
86
- const request = ctx.getRequest();
87
- const pastParam = JSON.parse(JSON.stringify(request.param));
88
- const originalcontent = originalMessage.content;
89
- const content = JSON.parse(originalcontent.toString());
90
- const traceId = content.data.param ? content.data.param.traceId : '-';
85
+ const args = context.getArgs();
86
+ const rpcContext = context.switchToRpc();
87
+ const rmqContext = rpcContext.getContext();
88
+ const data = rpcContext.getData();
89
+ const metadata = args[1];
90
+ const isGrpc = rpcContext.contextType === 'rpc';
91
+ let param;
92
+ let pastFrom;
93
+ let pastFroms;
94
+ let originalMessage;
95
+ let pattern; /** @xxx: Grpc: path , Mq: 메시지 패턴명 */
96
+ let payload;
97
+ if (isGrpc) {
98
+ param = metadata.get('param') || { param: { from: '-', froms: '-' } };
99
+ pastFrom = metadata.get('pastFrom') || '-';
100
+ pastFroms = metadata.get('pastFroms') || [pastFrom];
101
+ originalMessage = args[0];
102
+ let gRPCArg = args[3];
103
+ pattern = gRPCArg.path;
104
+ payload = data;
105
+ }
106
+ else {
107
+ param = data.param;
108
+ pastFrom = param.from ? JSON.parse(JSON.stringify(param.from)) : '-';
109
+ pastFroms = param.froms ? JSON.parse(JSON.stringify(param.froms)) : [pastFrom];
110
+ originalMessage = rmqContext.getMessage();
111
+ pattern = originalMessage.messagePattern;
112
+ // const originalcontent = originalMessage.content;
113
+ // const content = JSON.parse(originalcontent.toString()) as IContent;
114
+ payload = context.switchToHttp().getRequest().data;
115
+ }
116
+ // const pastFrom = data.param.from ? JSON.parse(JSON.stringify(data.param.from)) : '-';
117
+ // const pastFroms = data.param.froms ? JSON.parse(JSON.stringify(data.param.froms)) : [pastFrom];
118
+ // const originalMessage = rmqContext.getMessage();
119
+ // const ctx = context.switchToHttp();
120
+ // const request = ctx.getRequest() as IRequest;
121
+ const pastParam = JSON.parse(JSON.stringify(param));
122
+ const traceId = param ? param.traceId : '-';
91
123
  /** from 변경 */
92
- const tmpFrom = `${SERVER_NAME}: ${content.pattern}`;
93
- data.param.from = tmpFrom;
124
+ const tmpFrom = `${SERVER_NAME}: ${pattern}`;
94
125
  const tmpFroms = JSON.parse(JSON.stringify(pastFroms));
95
126
  tmpFroms.push(tmpFrom);
96
- data.param.froms = tmpFroms;
127
+ if (isGrpc) {
128
+ metadata.set('from', JSON.stringify(tmpFrom));
129
+ metadata.set('froms', JSON.stringify(tmpFroms));
130
+ }
131
+ else {
132
+ data.param.from = tmpFrom;
133
+ data.param.froms = tmpFroms;
134
+ }
97
135
  msaLogger.printInputInterceptorService({
98
136
  traceId,
99
137
  messageBrokerInfo: {
100
- messagePatten: content.pattern,
101
- payload: JSON.stringify(this.keyCutter(JSON.stringify(request.payload))),
138
+ messagePatten: pattern,
139
+ payload: JSON.stringify(this.keyCutter(JSON.stringify(payload))),
102
140
  },
103
141
  paramInfo: pastParam,
104
142
  traceInfo: {
@@ -110,11 +148,11 @@ let LoggingServiceInterceptor = class LoggingServiceInterceptor {
110
148
  const currentSpan = dd_trace_1.default.scope().active();
111
149
  let loggingSpan = null;
112
150
  if (currentSpan) {
113
- loggingSpan = dd_trace_1.default.startSpan(`logging-service-interceptor-${content.pattern}`, { childOf: currentSpan.context() });
151
+ loggingSpan = dd_trace_1.default.startSpan(`logging-service-interceptor-${pattern}`, { childOf: currentSpan.context() });
114
152
  }
115
153
  if (loggingSpan) {
116
154
  loggingSpan.setTag('traceId', traceId);
117
- loggingSpan.setTag('messagePattern', content.pattern);
155
+ loggingSpan.setTag('messagePattern', pattern);
118
156
  }
119
157
  return next.handle()
120
158
  .pipe((0, operators_1.tap)(() => {
@@ -126,8 +164,8 @@ let LoggingServiceInterceptor = class LoggingServiceInterceptor {
126
164
  ms: elapsed,
127
165
  },
128
166
  messageBrokerInfo: {
129
- messagePatten: content.pattern,
130
- payload: JSON.stringify(this.keyCutter(JSON.stringify(request.payload))),
167
+ messagePatten: pattern,
168
+ payload: JSON.stringify(this.keyCutter(JSON.stringify(payload))),
131
169
  },
132
170
  traceInfo: {
133
171
  from: pastFrom,
@@ -156,8 +194,8 @@ let LoggingServiceInterceptor = class LoggingServiceInterceptor {
156
194
  errOption: error.errOption,
157
195
  },
158
196
  messageBrokerInfo: {
159
- messagePatten: content.pattern,
160
- payload: JSON.stringify(this.keyCutter(JSON.stringify(request.payload))),
197
+ messagePatten: pattern,
198
+ payload: JSON.stringify(this.keyCutter(JSON.stringify(payload))),
161
199
  },
162
200
  traceInfo: {
163
201
  from: pastFrom,
@@ -172,8 +210,8 @@ let LoggingServiceInterceptor = class LoggingServiceInterceptor {
172
210
  ms: elapsed,
173
211
  },
174
212
  messageBrokerInfo: {
175
- messagePatten: content.pattern,
176
- payload: JSON.stringify(this.keyCutter(JSON.stringify(request.payload))),
213
+ messagePatten: pattern,
214
+ payload: JSON.stringify(this.keyCutter(JSON.stringify(payload))),
177
215
  },
178
216
  traceInfo: {
179
217
  from: pastFrom,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yolo-croket-dev/core",
3
- "version": "1.9.6",
3
+ "version": "1.9.7-slowquery.1",
4
4
  "author": "Yolo Co., Ltd.",
5
5
  "description": "Yolo commonization module",
6
6
  "main": "index.js",
@@ -1,17 +0,0 @@
1
- declare global {
2
- var Promise: PromiseConstructor;
3
- }
4
- export declare class EnhancedPromisePatch {
5
- private static isPatched;
6
- private static originalPromise;
7
- private static originalSetTimeout;
8
- static patch(): void;
9
- private static patchPromise;
10
- private static patchSetTimeout;
11
- static unpatch(): void;
12
- /**
13
- * 현재 패치 상태 확인
14
- * @returns 패치 여부
15
- */
16
- static getPatchStatus(): boolean;
17
- }
@@ -1,115 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EnhancedPromisePatch = void 0;
4
- const abort_1 = require("./abort");
5
- class EnhancedPromisePatch {
6
- static patch() {
7
- if (this.isPatched) {
8
- return;
9
- }
10
- this.patchPromise();
11
- this.patchSetTimeout();
12
- this.isPatched = true;
13
- }
14
- static patchPromise() {
15
- this.originalPromise = global.Promise;
16
- // Promise 생성자 패치
17
- global.Promise = new Proxy(global.Promise, {
18
- construct(target, args) {
19
- const abortSignal = (0, abort_1.getCurrentAbortSignal)();
20
- if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
21
- return Promise.reject(new Error('REQUEST_ABORTED: Promise가 중단되었습니다'));
22
- }
23
- // target은 Promise 생성자이므로, new 연산자와 함께 사용해야 하며, args는 [executor] 형태의 튜플임을 명시합니다.
24
- const promise = Reflect.construct(target, args);
25
- if (!abortSignal) {
26
- return promise;
27
- }
28
- // Promise 체인에 중단 확인 추가
29
- return promise.then((result) => {
30
- if (abortSignal.aborted) {
31
- throw new Error('REQUEST_ABORTED: Promise 실행 중 중단되었습니다');
32
- }
33
- return result;
34
- }, (error) => {
35
- if (abortSignal.aborted) {
36
- throw new Error('REQUEST_ABORTED: Promise 실행 중 중단되었습니다');
37
- }
38
- throw error;
39
- });
40
- },
41
- });
42
- // Promise.resolve 패치
43
- const originalResolve = global.Promise.resolve;
44
- global.Promise.resolve = (value) => {
45
- const abortSignal = (0, abort_1.getCurrentAbortSignal)();
46
- if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
47
- return Promise.reject(new Error('REQUEST_ABORTED: Promise.resolve가 중단되었습니다'));
48
- }
49
- const promise = originalResolve.call(global.Promise, value);
50
- if (!abortSignal) {
51
- return promise;
52
- }
53
- return promise.then((result) => {
54
- if (abortSignal.aborted) {
55
- throw new Error('REQUEST_ABORTED: Promise.resolve 실행 중 중단되었습니다');
56
- }
57
- return result;
58
- }, (error) => {
59
- if (abortSignal.aborted) {
60
- throw new Error('REQUEST_ABORTED: Promise.resolve 실행 중 중단되었습니다');
61
- }
62
- throw error;
63
- });
64
- };
65
- // Promise.reject 패치
66
- const originalReject = global.Promise.reject;
67
- global.Promise.reject = (reason) => {
68
- const abortSignal = (0, abort_1.getCurrentAbortSignal)();
69
- if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
70
- return Promise.reject(new Error('REQUEST_ABORTED: Promise.reject가 중단되었습니다'));
71
- }
72
- return originalReject.call(global.Promise, reason);
73
- };
74
- }
75
- static patchSetTimeout() {
76
- this.originalSetTimeout = global.setTimeout;
77
- // eslint-disable-next-line @typescript-eslint/ban-types
78
- global.setTimeout = (callback, delay, ...args) => {
79
- const abortSignal = (0, abort_1.getCurrentAbortSignal)();
80
- if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
81
- throw new Error('REQUEST_ABORTED: setTimeout이 중단되었습니다');
82
- }
83
- const timerId = this.originalSetTimeout(() => {
84
- if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
85
- throw new Error('REQUEST_ABORTED: setTimeout 콜백이 중단되었습니다');
86
- }
87
- callback(...args);
88
- }, delay);
89
- if (abortSignal) {
90
- const abortHandler = () => {
91
- clearTimeout(timerId);
92
- };
93
- abortSignal.addEventListener('abort', abortHandler, { once: true });
94
- }
95
- return timerId;
96
- };
97
- }
98
- static unpatch() {
99
- if (!this.isPatched) {
100
- return;
101
- }
102
- global.Promise = this.originalPromise;
103
- global.setTimeout = this.originalSetTimeout;
104
- this.isPatched = false;
105
- }
106
- /**
107
- * 현재 패치 상태 확인
108
- * @returns 패치 여부
109
- */
110
- static getPatchStatus() {
111
- return this.isPatched;
112
- }
113
- }
114
- exports.EnhancedPromisePatch = EnhancedPromisePatch;
115
- EnhancedPromisePatch.isPatched = false;