Skip to content
This repository was archived by the owner on Aug 12, 2023. It is now read-only.

Commit 35f9533

Browse files
authored
Improve error handling and database logging (#334)
* Improve error handling and database logging * Bump yarn version
1 parent c08cc02 commit 35f9533

File tree

9 files changed

+133
-50
lines changed

9 files changed

+133
-50
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
},
2727
"engines": {
2828
"node": "10.17.0",
29-
"yarn": "1.19.2"
29+
"yarn": "1.21.1"
3030
},
3131
"private": true,
3232
"workspaces": [

packages/core/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"@0x-event-extractor/extractor-v2": "^1.0.0",
88
"@0x-event-extractor/extractor-v3": "^1.0.0",
99
"@0x-event-extractor/shared": "^1.0.0",
10+
"@bugsnag/js": "6.5.0",
1011
"bugsnag": "^2.4.3",
1112
"delay": "^4.3.0",
1213
"lodash": "^4.17.15",

packages/core/src/index.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@ const extractorV2 = require('@0x-event-extractor/extractor-v2');
44
const extractorV3 = require('@0x-event-extractor/extractor-v3');
55

66
const db = require('./util/db');
7+
const errorLogger = require('./util/error-logger');
78
const getJobs = require('./jobs');
89
const jobRunner = require('./util/job-runner');
9-
const logger = require('./util/logger');
1010
const web3 = require('../../shared/src/web3');
1111

12-
const configure = initialConfig => {
12+
const configure = async initialConfig => {
1313
config.init(initialConfig);
14-
logger.configure({ bugsnagToken: config.get('bugsnag.token') });
15-
db.connect(config.get('database.connectionString'));
14+
errorLogger.configure({
15+
bugsnagToken: config.get('bugsnag.token'),
16+
});
17+
await db.connect(config.get('database.connectionString'));
1618
web3.configure({ endpoint: config.get('web3.endpoint') });
1719
extractorV1.configure({ networkId: config.get('web3.networkId') });
1820
extractorV2.configure({ networkId: config.get('web3.networkId') });

packages/core/src/util/db.js

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,47 @@
11
const mongoose = require('mongoose');
22
const signale = require('signale');
33

4-
const logger = require('./logger');
4+
const { logError } = require('./error-logger');
5+
6+
const logger = signale.scope('mongodb');
57

68
mongoose.Promise = global.Promise;
79

810
module.exports = {
9-
connect: connectionString => {
10-
mongoose.connect(connectionString, {
11-
useFindAndModify: false,
12-
useNewUrlParser: true,
13-
useUnifiedTopology: true,
11+
connect: async connectionString => {
12+
mongoose.connection.on('connecting', () => {
13+
logger.info('connecting to database');
1414
});
1515

1616
mongoose.connection.on('connected', () => {
17-
signale.scope('mongodb').success('database connection established');
17+
logger.success('database connection established');
1818
});
1919

2020
mongoose.connection.on('error', err => {
21-
logger.logError(err);
21+
logError(err);
22+
});
23+
24+
mongoose.connection.on('disconnecting', () => {
25+
logger.warn('disconnecting from database');
2226
});
2327

2428
mongoose.connection.on('disconnected', () => {
25-
signale.scope('mongodb').warn('database connection terminated');
29+
logger.warn('database connection terminated');
30+
});
31+
32+
mongoose.connection.on('reconnected', () => {
33+
logger.warn('reconnected to database');
34+
});
35+
36+
mongoose.connection.on('reconnectFailed', () => {
37+
logError('Database reconnection failed');
38+
});
39+
40+
await mongoose.connect(connectionString, {
41+
autoIndex: false,
42+
useFindAndModify: false,
43+
useNewUrlParser: true,
44+
useUnifiedTopology: true,
2645
});
2746
},
2847
disconnect: () => {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const _ = require('lodash');
2+
const bugsnag = require('@bugsnag/js');
3+
const signale = require('signale');
4+
5+
const logger = signale.scope('application');
6+
7+
let bugsnagClient;
8+
9+
const logError = (error, metaData) => {
10+
if (bugsnagClient !== undefined) {
11+
bugsnagClient.notify(error, { metaData });
12+
}
13+
14+
logger.error(error);
15+
};
16+
17+
const configure = ({ appVersion, bugsnagToken }) => {
18+
if (_.isString(bugsnagToken)) {
19+
// The bugsnag client automatically attaches itself to uncaughtException
20+
// and unhandledRejection events.
21+
bugsnagClient = bugsnag({
22+
apiKey: bugsnagToken,
23+
appVersion,
24+
});
25+
} else {
26+
process.on('uncaughtException', logger.error);
27+
process.on('unhandledRejection', logger.error);
28+
}
29+
};
30+
31+
module.exports = {
32+
configure,
33+
logError,
34+
};

packages/core/src/util/job-runner.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
const delay = require('delay');
22
const withRetry = require('promise-poller').default;
33

4-
const logger = require('./logger');
4+
const { logError } = require('./error-logger');
55

66
const repeatTask = (task, { minInterval, maxInterval }) =>
77
withRetry({
88
max: maxInterval,
99
min: minInterval,
10-
progressCallback: (retriesRemaining, error) => logger.logError(error),
10+
progressCallback: (retriesRemaining, error) => logError(error),
1111
retries: 999999, // Setting a large number because poller does not work properly with Infinity
1212
strategy: 'exponential-backoff',
1313
taskFn: task,
1414
})
1515
.then(() => delay(minInterval))
1616
.then(() => repeatTask(task, { maxInterval, minInterval }))
1717
.catch(error => {
18-
logger.logError(error);
19-
logger.logError(`Stopped running ${task.name}.`);
18+
logError(error);
19+
logError(`Stopped running ${task.name}.`);
2020
});
2121

2222
const runJobs = jobs => {

packages/core/src/util/logger.js

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,9 @@ require('dotenv-safe').config({
88
const extractor = require('@0x-event-extractor/core');
99
const config = require('config');
1010

11-
extractor.configure(config.util.toObject());
12-
extractor.start();
11+
extractor
12+
.configure(config.util.toObject())
13+
.then(() => {
14+
extractor.start();
15+
})
16+
.catch(console.error); // eslint-disable-line no-console

yarn.lock

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,30 @@
691691
lodash "^4.17.13"
692692
to-fast-properties "^2.0.0"
693693

694+
"@bugsnag/browser@^6.5.0":
695+
version "6.5.0"
696+
resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-6.5.0.tgz#cec29fba00b47cbfca464be7f52b3900dd809cef"
697+
integrity sha512-BBUK4XlCkzRsAwFbdAOBPSa353EqDmGuVvbnXom0xG1D2IySGyNmYdPBproTRNKp+h0XuCkXeBrjsyC9Wph6+g==
698+
699+
"@bugsnag/js@6.5.0":
700+
version "6.5.0"
701+
resolved "https://registry.yarnpkg.com/@bugsnag/js/-/js-6.5.0.tgz#4961e799d93c84ca9dd37877ecdbfa939ebf3404"
702+
integrity sha512-iY0e3BOjDkTV6YssVeAC/TfP27RRdqZoZWJGKBU1mTdfKdNb0aSkR8DsU5UTriwY900ughNVONLQm87ecHyNUQ==
703+
dependencies:
704+
"@bugsnag/browser" "^6.5.0"
705+
"@bugsnag/node" "^6.5.0"
706+
707+
"@bugsnag/node@^6.5.0":
708+
version "6.5.0"
709+
resolved "https://registry.yarnpkg.com/@bugsnag/node/-/node-6.5.0.tgz#10ebba701f3f78bbbc1cf7cc806ffa633d61e5ec"
710+
integrity sha512-qW6+MYeXxcUA1nYzfeO637PzwPhKP89udYrIRXhhTLFIZwMyyFRes9Fok4M6RGN6VKP6H4zpQrzMc6/dU08Jxw==
711+
dependencies:
712+
byline "^5.0.0"
713+
error-stack-parser "^2.0.2"
714+
iserror "^0.0.2"
715+
pump "^3.0.0"
716+
stack-generator "^2.0.3"
717+
694718
"@cnakazawa/watch@^1.0.3":
695719
version "1.0.3"
696720
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
@@ -2509,6 +2533,11 @@ bugsnag@^2.4.3:
25092533
request "^2.81.0"
25102534
stack-trace "~0.0.9"
25112535

2536+
byline@^5.0.0:
2537+
version "5.0.0"
2538+
resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
2539+
integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
2540+
25122541
bytes@3.1.0:
25132542
version "3.1.0"
25142543
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
@@ -3597,6 +3626,13 @@ error-ex@^1.2.0, error-ex@^1.3.1:
35973626
dependencies:
35983627
is-arrayish "^0.2.1"
35993628

3629+
error-stack-parser@^2.0.2:
3630+
version "2.0.6"
3631+
resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8"
3632+
integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==
3633+
dependencies:
3634+
stackframe "^1.1.1"
3635+
36003636
es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
36013637
version "1.15.0"
36023638
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57"
@@ -5981,6 +6017,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
59816017
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
59826018
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
59836019

6020+
iserror@^0.0.2:
6021+
version "0.0.2"
6022+
resolved "https://registry.yarnpkg.com/iserror/-/iserror-0.0.2.tgz#bd53451fe2f668b9f2402c1966787aaa2c7c0bf5"
6023+
integrity sha1-vVNFH+L2aLnyQCwZZnh6qix8C/U=
6024+
59846025
isexe@^2.0.0:
59856026
version "2.0.0"
59866027
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -9642,6 +9683,13 @@ sshpk@^1.7.0:
96429683
safer-buffer "^2.0.2"
96439684
tweetnacl "~0.14.0"
96449685

9686+
stack-generator@^2.0.3:
9687+
version "2.0.5"
9688+
resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36"
9689+
integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==
9690+
dependencies:
9691+
stackframe "^1.1.1"
9692+
96459693
stack-trace@0.0.10, stack-trace@~0.0.9:
96469694
version "0.0.10"
96479695
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
@@ -9652,6 +9700,11 @@ stack-utils@^1.0.1:
96529700
resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
96539701
integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
96549702

9703+
stackframe@^1.1.1:
9704+
version "1.1.1"
9705+
resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.1.1.tgz#ffef0a3318b1b60c3b58564989aca5660729ec71"
9706+
integrity sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ==
9707+
96559708
static-extend@^0.1.1:
96569709
version "0.1.2"
96579710
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"

0 commit comments

Comments
 (0)