Skip to content

Commit 68c2d77

Browse files
Added more debug logs (#4)
1 parent 403b6fb commit 68c2d77

File tree

4 files changed

+1166
-875
lines changed

4 files changed

+1166
-875
lines changed

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,8 @@
3434
"arrowParens": "always",
3535
"trailingComma": "es5",
3636
"singleQuote": true
37+
},
38+
"dependencies": {
39+
"winston": "^3.14.2"
3740
}
3841
}

packages/pg/lib/client.js

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var Query = require('./query')
1212
var defaults = require('./defaults')
1313
var Connection = require('./connection')
1414
const dns = require('dns')
15+
const { logger } = require('./logger')
1516
const YB_SERVERS_QUERY = 'SELECT * FROM yb_servers()'
1617
const DEFAULT_FAILED_HOST_TTL_SECONDS = 5
1718

@@ -56,6 +57,7 @@ class Lock {
5657
const lock = new Lock()
5758
class Client extends EventEmitter {
5859
constructor(config) {
60+
logger.silly("Received connection string " + config)
5961
super()
6062
this.connectionParameters = new ConnectionParameters(config)
6163
this.user = this.connectionParameters.user
@@ -152,6 +154,7 @@ class Client extends EventEmitter {
152154
}
153155

154156
getLeastLoadedServer(hostsList) {
157+
logger.silly("getLeaseLoadedServer() is called")
155158
if (hostsList.size === 0) {
156159
return this.host
157160
}
@@ -213,6 +216,8 @@ class Client extends EventEmitter {
213216
}
214217
let randomIdx = Math.floor(Math.random() * leastLoadedHosts.length - 1) + 1
215218
let leastLoadedHost = leastLoadedHosts[randomIdx]
219+
logger.silly("Least loaded servers are " + leastLoadedHosts)
220+
logger.debug("Returning " + leastLoadedHost + "as the least loaded host")
216221
return leastLoadedHost
217222
}
218223

@@ -243,6 +248,7 @@ class Client extends EventEmitter {
243248
}
244249
}
245250
}
251+
logger.warn("Given topology-key " + key + " is invalid")
246252
return false
247253
}
248254

@@ -255,15 +261,18 @@ class Client extends EventEmitter {
255261
if (Client.connectionMap.has(host)) {
256262
prevCount = Client.connectionMap.get(host)
257263
} else if (Client.failedHosts.has(host)) {
264+
logger.debug("Removing " + host + " from failed host list")
258265
let serverInfo = Client.failedHosts.get(host)
259266
Client.hostServerInfo.set(host, serverInfo)
260267
Client.failedHosts.delete(host)
261268
Client.failedHostsTime.delete(host)
262269
}
263270
Client.connectionMap.set(host, prevCount + 1)
271+
logger.debug("Increasing connection count of " + host + " by 1")
264272
}
265273

266274
_connect(callback) {
275+
logger.silly("connect() is called")
267276
var self = this
268277
if (this.connectionParameters.loadBalance && this._connecting) {
269278
this.connection =
@@ -299,16 +308,19 @@ class Client extends EventEmitter {
299308
if (Client.connectionMap.size && Client.hostServerInfo.size) {
300309
this.host = this.getLeastLoadedServer(Client.connectionMap)
301310
this.port = Client.hostServerInfo.get(this.host).port
311+
logger.silly("Least loaded host received " + this.host + " port " + this.port)
302312
} else if (Client.failedHosts.size) {
303313
this.host = this.getLeastLoadedServer(Client.failedHosts)
304314
this.port = Client.failedHosts.get(this.host).port
315+
logger.silly("Least loaded host received " + this.host + " port " + this.port)
305316
}
306317
}
307318
if (Client.usePublic) {
308319
let currentHost = this.host
309320
let serverInfo = Client.hostServerInfo.get(currentHost)
310321
this.prevHostIfUsePublic = currentHost
311322
this.host = serverInfo.public_ip
323+
logger.silly("Using public ips, host " + this.host)
312324
}
313325
if (this.host && this.host.indexOf('/') === 0) {
314326
con.connect(this.host + '/.s.PGSQL.' + this.port)
@@ -362,6 +374,7 @@ class Client extends EventEmitter {
362374
attachErrorListenerOnClientConnection(client) {
363375
client.on('error', () => {
364376
if (Client.hostServerInfo.has(client.host)) {
377+
logger.debug("Not able to connect to host " + client.host + " adding it to failedHosts")
365378
Client.failedHosts.set(client.host, Client.hostServerInfo.get(client.host))
366379
let start = new Date().getTime();
367380
Client.failedHostsTime.set(client.host, start)
@@ -379,6 +392,7 @@ class Client extends EventEmitter {
379392
while (upHost !== undefined && !hostIsUp) {
380393
client.host = upHost.value
381394
client.connectionParameters.host = client.host
395+
logger.debug("Trying to create control connection to " + client.host)
382396
await client
383397
.nowConnect()
384398
.then((res) => {
@@ -401,6 +415,7 @@ class Client extends EventEmitter {
401415
}
402416

403417
async getConnection() {
418+
logger.silly("Creating control connection...")
404419
let currConnectionString = this.connectionString
405420
var client = new Client(currConnectionString)
406421
this.attachErrorListenerOnClientConnection(client)
@@ -441,10 +456,12 @@ class Client extends EventEmitter {
441456
}
442457
})
443458
}
459+
logger.debug("Created control connection to host " + client.host)
444460
return client
445461
}
446462

447463
async getServersInfo() {
464+
logger.silly("Refreshing server info")
448465
var client = Client.controlClient
449466
var result
450467
await client
@@ -466,6 +483,7 @@ class Client extends EventEmitter {
466483
}
467484

468485
createServersList(data) {
486+
logger.silly("Creating servers list")
469487
Client.hostServerInfo.clear()
470488
data.forEach((eachServer) => {
471489
var placementInfo = eachServer.cloud + '.' + eachServer.region + '.' + eachServer.zone
@@ -477,14 +495,17 @@ class Client extends EventEmitter {
477495
} else {
478496
Client.placementInfoHostMap.set(placementInfo, [eachServer.host])
479497
}
498+
logger.debug("Updated placementInfoHost Map " + [...Client.placementInfoHostMap])
480499
Client.hostServerInfo.set(eachServer.host, server)
481500
if (eachServer.public_ip === this.host) {
482501
Client.usePublic = true
483502
}
503+
logger.debug("Updated hostServerInfo to " + [...Client.hostServerInfo] + " and usePublic to " + Client.usePublic)
484504
})
485505
}
486506

487507
createConnectionMap(data) {
508+
logger.silly("Creating connection map")
488509
const currConnectionMap = new Map(Client.connectionMap)
489510
Client.connectionMap.clear()
490511
data.forEach((eachServer) => {
@@ -496,16 +517,19 @@ class Client extends EventEmitter {
496517
}
497518
} else {
498519
let start = new Date().getTime();
499-
if(start - Client.failedHostsTime.get(eachServer.host) > (DEFAULT_FAILED_HOST_TTL_SECONDS * 1000)){
520+
if (start - Client.failedHostsTime.get(eachServer.host) > (DEFAULT_FAILED_HOST_TTL_SECONDS * 1000)) {
521+
logger.debug("Removing " + eachServer.host + " from failed host list")
500522
Client.connectionMap.set(eachServer.host, 0)
501523
Client.failedHosts.delete(eachServer.host)
502524
Client.failedHostsTime.delete(eachServer.host)
503525
}
504526
}
505527
})
528+
logger.debug("Updated connection map " + [...Client.connectionMap])
506529
}
507530

508531
createTopologyKeyMap() {
532+
logger.silly("Creating Topology key map")
509533
var seperatedKeys = this.connectionParameters.topologyKeys.split(',')
510534
for (let idx = 0; idx < seperatedKeys.length; idx++) {
511535
let key = seperatedKeys[idx]
@@ -526,9 +550,11 @@ class Client extends EventEmitter {
526550
throw new Error('Bad Topology Key found - ' + key)
527551
}
528552
}
553+
logger.debug("Updated topologyKey Map " + [...Client.topologyKeyMap])
529554
}
530555

531556
createMetaData(data) {
557+
logger.silly("Creating metadata ...")
532558
this.createServersList(data)
533559
Client.lastTimeMetaDataFetched = new Date().getTime() / 1000
534560
this.createConnectionMap(data)
@@ -538,12 +564,14 @@ class Client extends EventEmitter {
538564
}
539565

540566
nowConnect(callback) {
567+
logger.silly("nowConnect() is called...")
541568
if (callback) {
542569
if (this.connectionParameters.loadBalance) {
543570
this._connect((error) => {
544571
if (error) {
545572
if (this.connectionParameters.loadBalance) {
546573
if (Client.hostServerInfo.has(this.host)) {
574+
logger.debug("Adding " + this.host + " to failed host list")
547575
Client.failedHosts.set(this.host, Client.hostServerInfo.get(this.host))
548576
let start = new Date().getTime();
549577
Client.failedHostsTime.set(this.host, start)
@@ -579,6 +607,7 @@ class Client extends EventEmitter {
579607
if (error) {
580608
if (this.connectionParameters.loadBalance) {
581609
if (Client.hostServerInfo.has(this.host)) {
610+
logger.debug("Adding " + this.host + " to failed host list")
582611
Client.failedHosts.set(this.host, Client.hostServerInfo.get(this.host))
583612
let start = new Date().getTime();
584613
Client.failedHostsTime.set(this.host, start)
@@ -605,14 +634,16 @@ class Client extends EventEmitter {
605634
}
606635

607636
updateConnectionMapAfterRefresh() {
637+
logger.silly("Updating connection map after refresh")
608638
let hostsInfoList = Client.hostServerInfo.keys()
609639
for (let eachHost of hostsInfoList) {
610640
if (!Client.connectionMap.has(eachHost)) {
611641
if(!Client.failedHosts.has(eachHost)){
612642
Client.connectionMap.set(eachHost, 0)
613643
} else {
614644
let start = new Date().getTime();
615-
if(start - Client.failedHostsTime.get(eachHost) > (DEFAULT_FAILED_HOST_TTL_SECONDS * 1000)){
645+
if (start - Client.failedHostsTime.get(eachHost) > (DEFAULT_FAILED_HOST_TTL_SECONDS * 1000)) {
646+
logger.debug("Removing" + eachHost + " from failed host list")
616647
Client.connectionMap.set(eachHost, 0)
617648
Client.failedHosts.delete(eachHost)
618649
Client.failedHostsTime.delete(eachHost)
@@ -626,9 +657,12 @@ class Client extends EventEmitter {
626657
Client.connectionMap.delete(eachHost)
627658
}
628659
}
660+
logger.debug("Updated connection Map after refresh " + [...Client.connectionMap]);
661+
logger.debug("Updated failed host list after refresh " + [...Client.failedHosts]);
629662
}
630663

631664
updateMetaData(data) {
665+
logger.silly("Updating MetaData")
632666
this.createServersList(data)
633667
Client.lastTimeMetaDataFetched = new Date().getTime() / 1000
634668
this.updateConnectionMapAfterRefresh()
@@ -637,7 +671,13 @@ class Client extends EventEmitter {
637671
isRefreshRequired() {
638672
let currentTime = new Date().getTime() / 1000
639673
let diff = Math.floor(currentTime - Client.lastTimeMetaDataFetched)
640-
return diff >= this.connectionParameters.ybServersRefreshInterval
674+
if (diff >= this.connectionParameters.ybServersRefreshInterval) {
675+
logger.silly("Refresh is required")
676+
return true
677+
} else {
678+
logger.silly("Refresh is not required")
679+
return false
680+
}
641681
}
642682

643683
connect(callback) {
@@ -1127,6 +1167,7 @@ class Client extends EventEmitter {
11271167
if (this.connectionParameters.loadBalance) {
11281168
let prevCount = Client.connectionMap.get(this.host)
11291169
if (prevCount > 0) {
1170+
logger.debug("Decreasing connection count (" + prevCount + ") of " + this.host + " by 1")
11301171
Client.connectionMap.set(this.host, prevCount - 1)
11311172
}
11321173
lock.release()

packages/pg/lib/logger.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
'use strict'
2+
3+
const winston = require('winston');
4+
5+
/*
6+
7+
Users can set the log level either by using an enviornment variable:
8+
9+
`LOG_LEVEL = debug`
10+
11+
or by using `setLogLevel` method:`
12+
13+
const { logger, setLogLevel } = require('./logger');
14+
15+
// Change log level dynamically
16+
setLogLevel('debug');
17+
18+
// Log messages
19+
logger.debug('This is a debug message');
20+
logger.info('This is an info message');
21+
22+
*/
23+
24+
// Set the initial log level from the environment variable, default to 'info'
25+
let logLevel = process.env.LOG_LEVEL || 'info';
26+
27+
// Configure the winston logger
28+
var logger = winston.createLogger({
29+
level: logLevel,
30+
levels: winston.config.npm.levels,
31+
format: winston.format.combine(
32+
winston.format.colorize(),
33+
winston.format.timestamp(),
34+
winston.format.printf(({ timestamp, level, message }) => {
35+
return `${timestamp} [${level}]: ${message}`;
36+
})
37+
),
38+
transports: [
39+
new winston.transports.Console(),
40+
new winston.transports.File({ filename: 'app.log' })
41+
]
42+
});
43+
44+
// Function to set the log level dynamically and update the environment variable
45+
var setLogLevel = (level) => {
46+
logLevel = level;
47+
process.env.LOG_LEVEL = level; // Update the environment variable
48+
logger.level = level; // Update the logger's level
49+
logger.info('Log level set to ' + level);
50+
};
51+
52+
module.exports = {
53+
logger,
54+
setLogLevel
55+
};

0 commit comments

Comments
 (0)