node-consul-service 1.0.70 → 1.0.72
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/dist/index.cjs.js +105 -22
- package/dist/index.esm.js +105 -22
- package/dist/utils/memoryStore.d.ts +17 -0
- package/dist/utils/slowCallLogger.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -88,10 +88,10 @@ async function deregisterService(id) {
|
|
|
88
88
|
console.log(`🛑 Service "${id}" deregistered successfully.`);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
const BASE_LOG_DIR$
|
|
91
|
+
const BASE_LOG_DIR$2 = '/home/log';
|
|
92
92
|
// اسم السيرفس الحالي اللي بيعمل الـ discovery
|
|
93
|
-
const CURRENT_SERVICE$
|
|
94
|
-
async function ensureLogDir$
|
|
93
|
+
const CURRENT_SERVICE$2 = process.env.SERVICE_NAME || 'unknown-service';
|
|
94
|
+
async function ensureLogDir$2(dir) {
|
|
95
95
|
await require$$6.promises.mkdir(dir, { recursive: true });
|
|
96
96
|
}
|
|
97
97
|
function formatLogLine(targetService, instance, elapsedMs) {
|
|
@@ -107,8 +107,8 @@ function formatLogLine(targetService, instance, elapsedMs) {
|
|
|
107
107
|
async function appendDiscoveryLog(targetService, instance, elapsedMs) {
|
|
108
108
|
try {
|
|
109
109
|
// فولدر خاص بالسيرفس الحالي
|
|
110
|
-
const serviceDir = path.join(BASE_LOG_DIR$
|
|
111
|
-
await ensureLogDir$
|
|
110
|
+
const serviceDir = path.join(BASE_LOG_DIR$2, CURRENT_SERVICE$2);
|
|
111
|
+
await ensureLogDir$2(serviceDir);
|
|
112
112
|
// اللوج يروح في ملف ثابت detect.log
|
|
113
113
|
const file = path.join(serviceDir, 'detect.log');
|
|
114
114
|
const line = formatLogLine(targetService, instance, elapsedMs);
|
|
@@ -119,18 +119,60 @@ async function appendDiscoveryLog(targetService, instance, elapsedMs) {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
const store = new Map();
|
|
123
|
+
/**
|
|
124
|
+
* Set a value in memory with optional TTL (ms).
|
|
125
|
+
*/
|
|
126
|
+
function set(key, value, ttl) {
|
|
127
|
+
const record = { value };
|
|
128
|
+
{
|
|
129
|
+
record.expiresAt = Date.now() + ttl;
|
|
130
|
+
}
|
|
131
|
+
store.set(key, record);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get a value from memory.
|
|
135
|
+
* Returns undefined if key does not exist or expired.
|
|
136
|
+
*/
|
|
137
|
+
function get$1(key) {
|
|
138
|
+
const record = store.get(key);
|
|
139
|
+
if (!record)
|
|
140
|
+
return undefined;
|
|
141
|
+
if (record.expiresAt && record.expiresAt < Date.now()) {
|
|
142
|
+
store.delete(key);
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
return record.value;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const CACHE_TTL = 60000;
|
|
122
149
|
async function listServices() {
|
|
150
|
+
const cacheKey = 'services:list';
|
|
151
|
+
const cached = get$1(cacheKey);
|
|
152
|
+
if (cached)
|
|
153
|
+
return cached;
|
|
123
154
|
const services = await getClient().agent.service.list();
|
|
124
|
-
|
|
155
|
+
const values = Object.values(services);
|
|
156
|
+
set(cacheKey, values, CACHE_TTL);
|
|
157
|
+
return values;
|
|
125
158
|
}
|
|
126
159
|
async function getServiceInstances(serviceName) {
|
|
160
|
+
const cacheKey = `services:${serviceName}`;
|
|
161
|
+
const cached = get$1(cacheKey);
|
|
162
|
+
if (cached)
|
|
163
|
+
return cached;
|
|
127
164
|
const start = Date.now();
|
|
128
165
|
const services = await getClient().catalog.service.nodes(serviceName);
|
|
129
166
|
const elapsed = Date.now() - start;
|
|
130
167
|
console.log(`⏱️ Discovery for ${serviceName} took ${elapsed}ms`);
|
|
168
|
+
set(cacheKey, services, CACHE_TTL);
|
|
131
169
|
return services;
|
|
132
170
|
}
|
|
133
171
|
async function getRandomServiceInstance(serviceName) {
|
|
172
|
+
const cacheKey = `random:${serviceName}`;
|
|
173
|
+
const cached = get$1(cacheKey);
|
|
174
|
+
if (cached)
|
|
175
|
+
return cached;
|
|
134
176
|
const start = Date.now();
|
|
135
177
|
const instances = await getServiceInstances(serviceName);
|
|
136
178
|
if (!instances.length)
|
|
@@ -139,11 +181,20 @@ async function getRandomServiceInstance(serviceName) {
|
|
|
139
181
|
const instance = instances[randomIndex];
|
|
140
182
|
const elapsed = Date.now() - start;
|
|
141
183
|
await appendDiscoveryLog(serviceName, instance, elapsed);
|
|
184
|
+
// cache random instance
|
|
185
|
+
set(cacheKey, instance, CACHE_TTL);
|
|
142
186
|
return instance;
|
|
143
187
|
}
|
|
144
188
|
async function getServiceUrl(serviceName) {
|
|
189
|
+
const cacheKey = `url:${serviceName}`;
|
|
190
|
+
const cached = get$1(cacheKey);
|
|
191
|
+
if (cached)
|
|
192
|
+
return cached;
|
|
145
193
|
const instance = await getRandomServiceInstance(serviceName);
|
|
146
|
-
|
|
194
|
+
const url = `http://${instance.ServiceAddress}:${instance.ServicePort}`;
|
|
195
|
+
// cache url
|
|
196
|
+
set(cacheKey, url, CACHE_TTL);
|
|
197
|
+
return url;
|
|
147
198
|
}
|
|
148
199
|
|
|
149
200
|
function bind(fn, thisArg) {
|
|
@@ -20261,32 +20312,32 @@ const {
|
|
|
20261
20312
|
mergeConfig
|
|
20262
20313
|
} = axios;
|
|
20263
20314
|
|
|
20264
|
-
const BASE_LOG_DIR = '/home/log';
|
|
20265
|
-
|
|
20266
|
-
|
|
20267
|
-
async function ensureLogDir(dir) {
|
|
20315
|
+
const BASE_LOG_DIR$1 = '/home/log';
|
|
20316
|
+
const CURRENT_SERVICE$1 = process.env.SERVICE_NAME || 'unknown-service';
|
|
20317
|
+
async function ensureLogDir$1(dir) {
|
|
20268
20318
|
await require$$6.promises.mkdir(dir, { recursive: true });
|
|
20269
20319
|
}
|
|
20270
20320
|
function getLogFileForStatus(status) {
|
|
20271
|
-
const
|
|
20321
|
+
const date = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
|
|
20322
|
+
const serviceDir = path.join(BASE_LOG_DIR$1, CURRENT_SERVICE$1);
|
|
20272
20323
|
if (status >= 200 && status < 300)
|
|
20273
|
-
return path.join(serviceDir,
|
|
20324
|
+
return path.join(serviceDir, `calls-2xx-${date}.log`);
|
|
20274
20325
|
if (status >= 400 && status < 500)
|
|
20275
|
-
return path.join(serviceDir,
|
|
20326
|
+
return path.join(serviceDir, `calls-4xx-${date}.log`);
|
|
20276
20327
|
if (status >= 500 && status < 600)
|
|
20277
|
-
return path.join(serviceDir,
|
|
20278
|
-
return path.join(serviceDir,
|
|
20328
|
+
return path.join(serviceDir, `calls-5xx-${date}.log`);
|
|
20329
|
+
return path.join(serviceDir, `calls-other-${date}.log`);
|
|
20279
20330
|
}
|
|
20280
20331
|
function formatCallLogLine(targetService, url, method, status, elapsedMs, errorMessage) {
|
|
20281
20332
|
const ts = new Date().toISOString();
|
|
20282
20333
|
const errPart = errorMessage ? ` | Error="${errorMessage}"` : '';
|
|
20283
|
-
return `${ts} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
|
|
20334
|
+
return `${ts} | Caller=${CURRENT_SERVICE$1} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
|
|
20284
20335
|
}
|
|
20285
20336
|
async function appendCallLog(targetService, url, method, status, elapsedMs, errorMessage) {
|
|
20286
20337
|
try {
|
|
20287
20338
|
const file = getLogFileForStatus(status);
|
|
20288
20339
|
const dir = path.dirname(file);
|
|
20289
|
-
await ensureLogDir(dir);
|
|
20340
|
+
await ensureLogDir$1(dir);
|
|
20290
20341
|
const line = formatCallLogLine(targetService, url, method, status, elapsedMs, errorMessage);
|
|
20291
20342
|
await require$$6.promises.appendFile(file, line, { encoding: 'utf8' });
|
|
20292
20343
|
}
|
|
@@ -20295,18 +20346,48 @@ async function appendCallLog(targetService, url, method, status, elapsedMs, erro
|
|
|
20295
20346
|
}
|
|
20296
20347
|
}
|
|
20297
20348
|
|
|
20349
|
+
const BASE_LOG_DIR = '/home/log';
|
|
20350
|
+
const CURRENT_SERVICE = process.env.SERVICE_NAME || 'unknown-service';
|
|
20351
|
+
const THRESHOLD = Number(process.env.SLOW_CALL_THRESHOLD || 200); // الافتراضي 200ms
|
|
20352
|
+
async function ensureLogDir(dir) {
|
|
20353
|
+
await require$$6.promises.mkdir(dir, { recursive: true });
|
|
20354
|
+
}
|
|
20355
|
+
function getLogFile() {
|
|
20356
|
+
const serviceDir = path.join(BASE_LOG_DIR, CURRENT_SERVICE);
|
|
20357
|
+
return path.join(serviceDir, 'slow-calls.log');
|
|
20358
|
+
}
|
|
20359
|
+
function formatSlowCallLine(targetService, url, method, status, elapsedMs) {
|
|
20360
|
+
const ts = new Date().toISOString();
|
|
20361
|
+
return `${ts} | Caller=${CURRENT_SERVICE} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms\n`;
|
|
20362
|
+
}
|
|
20363
|
+
async function appendSlowCallLog(targetService, url, method, status, elapsedMs) {
|
|
20364
|
+
if (elapsedMs < THRESHOLD)
|
|
20365
|
+
return; // ما يكتبش غير اللي عدّى الحد
|
|
20366
|
+
try {
|
|
20367
|
+
const file = getLogFile();
|
|
20368
|
+
const dir = path.dirname(file);
|
|
20369
|
+
await ensureLogDir(dir);
|
|
20370
|
+
const line = formatSlowCallLine(targetService, url, method, status, elapsedMs);
|
|
20371
|
+
await require$$6.promises.appendFile(file, line, { encoding: 'utf8' });
|
|
20372
|
+
}
|
|
20373
|
+
catch (err) {
|
|
20374
|
+
console.error('❌ Failed to write slow call log:', err);
|
|
20375
|
+
}
|
|
20376
|
+
}
|
|
20377
|
+
|
|
20298
20378
|
async function callService(serviceName, options = {}) {
|
|
20299
20379
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
20300
20380
|
const { method = 'GET', path = '/', data, headers, params, } = options;
|
|
20301
20381
|
const start = Date.now();
|
|
20302
20382
|
try {
|
|
20303
|
-
// ...
|
|
20304
20383
|
const instance = await getRandomServiceInstance(serviceName);
|
|
20305
20384
|
const url = `http://${instance.ServiceAddress}:${instance.ServicePort}${path}`;
|
|
20306
20385
|
const response = await axios.request({ url, method, data, headers, params });
|
|
20307
20386
|
const elapsed = Date.now() - start;
|
|
20308
|
-
// سجل
|
|
20387
|
+
// 📌 سجل الكول
|
|
20309
20388
|
await appendCallLog(serviceName, url, method, response.status, elapsed);
|
|
20389
|
+
// 📌 لو بطيء → يتسجل في slow-calls.log
|
|
20390
|
+
await appendSlowCallLog(serviceName, url, method, response.status, elapsed);
|
|
20310
20391
|
return response.data;
|
|
20311
20392
|
}
|
|
20312
20393
|
catch (error) {
|
|
@@ -20315,13 +20396,15 @@ async function callService(serviceName, options = {}) {
|
|
|
20315
20396
|
const url = (_d = (_c = error.config) === null || _c === void 0 ? void 0 : _c.url) !== null && _d !== void 0 ? _d : '';
|
|
20316
20397
|
const methodUsed = (_f = (_e = error.config) === null || _e === void 0 ? void 0 : _e.method) !== null && _f !== void 0 ? _f : method;
|
|
20317
20398
|
const message = (_g = error.message) !== null && _g !== void 0 ? _g : 'Unknown error';
|
|
20318
|
-
// 📌 سجل الفشل
|
|
20399
|
+
// 📌 سجل الفشل
|
|
20319
20400
|
await appendCallLog(serviceName, url, methodUsed, status, elapsed, message);
|
|
20401
|
+
// 📌 لو بطيء → يتسجل برضه في slow-calls.log
|
|
20402
|
+
await appendSlowCallLog(serviceName, url, methodUsed, status, elapsed);
|
|
20320
20403
|
return {
|
|
20321
20404
|
success: false,
|
|
20322
20405
|
message,
|
|
20323
20406
|
status,
|
|
20324
|
-
code: (_k = (_j = (_h = error.response) === null || _h === void 0 ? void 0 : _h.data) === null || _j === void 0 ? void 0 : _j.code) !== null && _k !== void 0 ? _k :
|
|
20407
|
+
code: (_k = (_j = (_h = error.response) === null || _h === void 0 ? void 0 : _h.data) === null || _j === void 0 ? void 0 : _j.code) !== null && _k !== void 0 ? _k : '',
|
|
20325
20408
|
data: (_l = error.response) === null || _l === void 0 ? void 0 : _l.data,
|
|
20326
20409
|
};
|
|
20327
20410
|
}
|
package/dist/index.esm.js
CHANGED
|
@@ -86,10 +86,10 @@ async function deregisterService(id) {
|
|
|
86
86
|
console.log(`🛑 Service "${id}" deregistered successfully.`);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
const BASE_LOG_DIR$
|
|
89
|
+
const BASE_LOG_DIR$2 = '/home/log';
|
|
90
90
|
// اسم السيرفس الحالي اللي بيعمل الـ discovery
|
|
91
|
-
const CURRENT_SERVICE$
|
|
92
|
-
async function ensureLogDir$
|
|
91
|
+
const CURRENT_SERVICE$2 = process.env.SERVICE_NAME || 'unknown-service';
|
|
92
|
+
async function ensureLogDir$2(dir) {
|
|
93
93
|
await promises.mkdir(dir, { recursive: true });
|
|
94
94
|
}
|
|
95
95
|
function formatLogLine(targetService, instance, elapsedMs) {
|
|
@@ -105,8 +105,8 @@ function formatLogLine(targetService, instance, elapsedMs) {
|
|
|
105
105
|
async function appendDiscoveryLog(targetService, instance, elapsedMs) {
|
|
106
106
|
try {
|
|
107
107
|
// فولدر خاص بالسيرفس الحالي
|
|
108
|
-
const serviceDir = path.join(BASE_LOG_DIR$
|
|
109
|
-
await ensureLogDir$
|
|
108
|
+
const serviceDir = path.join(BASE_LOG_DIR$2, CURRENT_SERVICE$2);
|
|
109
|
+
await ensureLogDir$2(serviceDir);
|
|
110
110
|
// اللوج يروح في ملف ثابت detect.log
|
|
111
111
|
const file = path.join(serviceDir, 'detect.log');
|
|
112
112
|
const line = formatLogLine(targetService, instance, elapsedMs);
|
|
@@ -117,18 +117,60 @@ async function appendDiscoveryLog(targetService, instance, elapsedMs) {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
const store = new Map();
|
|
121
|
+
/**
|
|
122
|
+
* Set a value in memory with optional TTL (ms).
|
|
123
|
+
*/
|
|
124
|
+
function set(key, value, ttl) {
|
|
125
|
+
const record = { value };
|
|
126
|
+
{
|
|
127
|
+
record.expiresAt = Date.now() + ttl;
|
|
128
|
+
}
|
|
129
|
+
store.set(key, record);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get a value from memory.
|
|
133
|
+
* Returns undefined if key does not exist or expired.
|
|
134
|
+
*/
|
|
135
|
+
function get$1(key) {
|
|
136
|
+
const record = store.get(key);
|
|
137
|
+
if (!record)
|
|
138
|
+
return undefined;
|
|
139
|
+
if (record.expiresAt && record.expiresAt < Date.now()) {
|
|
140
|
+
store.delete(key);
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
return record.value;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const CACHE_TTL = 60000;
|
|
120
147
|
async function listServices() {
|
|
148
|
+
const cacheKey = 'services:list';
|
|
149
|
+
const cached = get$1(cacheKey);
|
|
150
|
+
if (cached)
|
|
151
|
+
return cached;
|
|
121
152
|
const services = await getClient().agent.service.list();
|
|
122
|
-
|
|
153
|
+
const values = Object.values(services);
|
|
154
|
+
set(cacheKey, values, CACHE_TTL);
|
|
155
|
+
return values;
|
|
123
156
|
}
|
|
124
157
|
async function getServiceInstances(serviceName) {
|
|
158
|
+
const cacheKey = `services:${serviceName}`;
|
|
159
|
+
const cached = get$1(cacheKey);
|
|
160
|
+
if (cached)
|
|
161
|
+
return cached;
|
|
125
162
|
const start = Date.now();
|
|
126
163
|
const services = await getClient().catalog.service.nodes(serviceName);
|
|
127
164
|
const elapsed = Date.now() - start;
|
|
128
165
|
console.log(`⏱️ Discovery for ${serviceName} took ${elapsed}ms`);
|
|
166
|
+
set(cacheKey, services, CACHE_TTL);
|
|
129
167
|
return services;
|
|
130
168
|
}
|
|
131
169
|
async function getRandomServiceInstance(serviceName) {
|
|
170
|
+
const cacheKey = `random:${serviceName}`;
|
|
171
|
+
const cached = get$1(cacheKey);
|
|
172
|
+
if (cached)
|
|
173
|
+
return cached;
|
|
132
174
|
const start = Date.now();
|
|
133
175
|
const instances = await getServiceInstances(serviceName);
|
|
134
176
|
if (!instances.length)
|
|
@@ -137,11 +179,20 @@ async function getRandomServiceInstance(serviceName) {
|
|
|
137
179
|
const instance = instances[randomIndex];
|
|
138
180
|
const elapsed = Date.now() - start;
|
|
139
181
|
await appendDiscoveryLog(serviceName, instance, elapsed);
|
|
182
|
+
// cache random instance
|
|
183
|
+
set(cacheKey, instance, CACHE_TTL);
|
|
140
184
|
return instance;
|
|
141
185
|
}
|
|
142
186
|
async function getServiceUrl(serviceName) {
|
|
187
|
+
const cacheKey = `url:${serviceName}`;
|
|
188
|
+
const cached = get$1(cacheKey);
|
|
189
|
+
if (cached)
|
|
190
|
+
return cached;
|
|
143
191
|
const instance = await getRandomServiceInstance(serviceName);
|
|
144
|
-
|
|
192
|
+
const url = `http://${instance.ServiceAddress}:${instance.ServicePort}`;
|
|
193
|
+
// cache url
|
|
194
|
+
set(cacheKey, url, CACHE_TTL);
|
|
195
|
+
return url;
|
|
145
196
|
}
|
|
146
197
|
|
|
147
198
|
function bind(fn, thisArg) {
|
|
@@ -20259,32 +20310,32 @@ const {
|
|
|
20259
20310
|
mergeConfig
|
|
20260
20311
|
} = axios;
|
|
20261
20312
|
|
|
20262
|
-
const BASE_LOG_DIR = '/home/log';
|
|
20263
|
-
|
|
20264
|
-
|
|
20265
|
-
async function ensureLogDir(dir) {
|
|
20313
|
+
const BASE_LOG_DIR$1 = '/home/log';
|
|
20314
|
+
const CURRENT_SERVICE$1 = process.env.SERVICE_NAME || 'unknown-service';
|
|
20315
|
+
async function ensureLogDir$1(dir) {
|
|
20266
20316
|
await promises.mkdir(dir, { recursive: true });
|
|
20267
20317
|
}
|
|
20268
20318
|
function getLogFileForStatus(status) {
|
|
20269
|
-
const
|
|
20319
|
+
const date = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
|
|
20320
|
+
const serviceDir = path.join(BASE_LOG_DIR$1, CURRENT_SERVICE$1);
|
|
20270
20321
|
if (status >= 200 && status < 300)
|
|
20271
|
-
return path.join(serviceDir,
|
|
20322
|
+
return path.join(serviceDir, `calls-2xx-${date}.log`);
|
|
20272
20323
|
if (status >= 400 && status < 500)
|
|
20273
|
-
return path.join(serviceDir,
|
|
20324
|
+
return path.join(serviceDir, `calls-4xx-${date}.log`);
|
|
20274
20325
|
if (status >= 500 && status < 600)
|
|
20275
|
-
return path.join(serviceDir,
|
|
20276
|
-
return path.join(serviceDir,
|
|
20326
|
+
return path.join(serviceDir, `calls-5xx-${date}.log`);
|
|
20327
|
+
return path.join(serviceDir, `calls-other-${date}.log`);
|
|
20277
20328
|
}
|
|
20278
20329
|
function formatCallLogLine(targetService, url, method, status, elapsedMs, errorMessage) {
|
|
20279
20330
|
const ts = new Date().toISOString();
|
|
20280
20331
|
const errPart = errorMessage ? ` | Error="${errorMessage}"` : '';
|
|
20281
|
-
return `${ts} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
|
|
20332
|
+
return `${ts} | Caller=${CURRENT_SERVICE$1} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
|
|
20282
20333
|
}
|
|
20283
20334
|
async function appendCallLog(targetService, url, method, status, elapsedMs, errorMessage) {
|
|
20284
20335
|
try {
|
|
20285
20336
|
const file = getLogFileForStatus(status);
|
|
20286
20337
|
const dir = path.dirname(file);
|
|
20287
|
-
await ensureLogDir(dir);
|
|
20338
|
+
await ensureLogDir$1(dir);
|
|
20288
20339
|
const line = formatCallLogLine(targetService, url, method, status, elapsedMs, errorMessage);
|
|
20289
20340
|
await promises.appendFile(file, line, { encoding: 'utf8' });
|
|
20290
20341
|
}
|
|
@@ -20293,18 +20344,48 @@ async function appendCallLog(targetService, url, method, status, elapsedMs, erro
|
|
|
20293
20344
|
}
|
|
20294
20345
|
}
|
|
20295
20346
|
|
|
20347
|
+
const BASE_LOG_DIR = '/home/log';
|
|
20348
|
+
const CURRENT_SERVICE = process.env.SERVICE_NAME || 'unknown-service';
|
|
20349
|
+
const THRESHOLD = Number(process.env.SLOW_CALL_THRESHOLD || 200); // الافتراضي 200ms
|
|
20350
|
+
async function ensureLogDir(dir) {
|
|
20351
|
+
await promises.mkdir(dir, { recursive: true });
|
|
20352
|
+
}
|
|
20353
|
+
function getLogFile() {
|
|
20354
|
+
const serviceDir = path.join(BASE_LOG_DIR, CURRENT_SERVICE);
|
|
20355
|
+
return path.join(serviceDir, 'slow-calls.log');
|
|
20356
|
+
}
|
|
20357
|
+
function formatSlowCallLine(targetService, url, method, status, elapsedMs) {
|
|
20358
|
+
const ts = new Date().toISOString();
|
|
20359
|
+
return `${ts} | Caller=${CURRENT_SERVICE} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms\n`;
|
|
20360
|
+
}
|
|
20361
|
+
async function appendSlowCallLog(targetService, url, method, status, elapsedMs) {
|
|
20362
|
+
if (elapsedMs < THRESHOLD)
|
|
20363
|
+
return; // ما يكتبش غير اللي عدّى الحد
|
|
20364
|
+
try {
|
|
20365
|
+
const file = getLogFile();
|
|
20366
|
+
const dir = path.dirname(file);
|
|
20367
|
+
await ensureLogDir(dir);
|
|
20368
|
+
const line = formatSlowCallLine(targetService, url, method, status, elapsedMs);
|
|
20369
|
+
await promises.appendFile(file, line, { encoding: 'utf8' });
|
|
20370
|
+
}
|
|
20371
|
+
catch (err) {
|
|
20372
|
+
console.error('❌ Failed to write slow call log:', err);
|
|
20373
|
+
}
|
|
20374
|
+
}
|
|
20375
|
+
|
|
20296
20376
|
async function callService(serviceName, options = {}) {
|
|
20297
20377
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
20298
20378
|
const { method = 'GET', path = '/', data, headers, params, } = options;
|
|
20299
20379
|
const start = Date.now();
|
|
20300
20380
|
try {
|
|
20301
|
-
// ...
|
|
20302
20381
|
const instance = await getRandomServiceInstance(serviceName);
|
|
20303
20382
|
const url = `http://${instance.ServiceAddress}:${instance.ServicePort}${path}`;
|
|
20304
20383
|
const response = await axios.request({ url, method, data, headers, params });
|
|
20305
20384
|
const elapsed = Date.now() - start;
|
|
20306
|
-
// سجل
|
|
20385
|
+
// 📌 سجل الكول
|
|
20307
20386
|
await appendCallLog(serviceName, url, method, response.status, elapsed);
|
|
20387
|
+
// 📌 لو بطيء → يتسجل في slow-calls.log
|
|
20388
|
+
await appendSlowCallLog(serviceName, url, method, response.status, elapsed);
|
|
20308
20389
|
return response.data;
|
|
20309
20390
|
}
|
|
20310
20391
|
catch (error) {
|
|
@@ -20313,13 +20394,15 @@ async function callService(serviceName, options = {}) {
|
|
|
20313
20394
|
const url = (_d = (_c = error.config) === null || _c === void 0 ? void 0 : _c.url) !== null && _d !== void 0 ? _d : '';
|
|
20314
20395
|
const methodUsed = (_f = (_e = error.config) === null || _e === void 0 ? void 0 : _e.method) !== null && _f !== void 0 ? _f : method;
|
|
20315
20396
|
const message = (_g = error.message) !== null && _g !== void 0 ? _g : 'Unknown error';
|
|
20316
|
-
// 📌 سجل الفشل
|
|
20397
|
+
// 📌 سجل الفشل
|
|
20317
20398
|
await appendCallLog(serviceName, url, methodUsed, status, elapsed, message);
|
|
20399
|
+
// 📌 لو بطيء → يتسجل برضه في slow-calls.log
|
|
20400
|
+
await appendSlowCallLog(serviceName, url, methodUsed, status, elapsed);
|
|
20318
20401
|
return {
|
|
20319
20402
|
success: false,
|
|
20320
20403
|
message,
|
|
20321
20404
|
status,
|
|
20322
|
-
code: (_k = (_j = (_h = error.response) === null || _h === void 0 ? void 0 : _h.data) === null || _j === void 0 ? void 0 : _j.code) !== null && _k !== void 0 ? _k :
|
|
20405
|
+
code: (_k = (_j = (_h = error.response) === null || _h === void 0 ? void 0 : _h.data) === null || _j === void 0 ? void 0 : _j.code) !== null && _k !== void 0 ? _k : '',
|
|
20323
20406
|
data: (_l = error.response) === null || _l === void 0 ? void 0 : _l.data,
|
|
20324
20407
|
};
|
|
20325
20408
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Set a value in memory with optional TTL (ms).
|
|
3
|
+
*/
|
|
4
|
+
export declare function set(key: string, value: any, ttl?: number): void;
|
|
5
|
+
/**
|
|
6
|
+
* Get a value from memory.
|
|
7
|
+
* Returns undefined if key does not exist or expired.
|
|
8
|
+
*/
|
|
9
|
+
export declare function get<T = any>(key: string): T | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Delete a value.
|
|
12
|
+
*/
|
|
13
|
+
export declare function del(key: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Clear all keys.
|
|
16
|
+
*/
|
|
17
|
+
export declare function clear(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function appendSlowCallLog(targetService: string, url: string, method: string, status: number, elapsedMs: number): Promise<void>;
|