@substrate/api-sidecar 17.0.0 → 17.1.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/README.md CHANGED
@@ -242,6 +242,26 @@ file you can `symlink` it with `.env.test`. For example you could run
242
242
  `ln -s .env.myEnv .env.test && yarn start:log-rpc` to use `.env.myEnv` to set ENV variables. (see linux
243
243
  commands `ln` and `unlink` for more info.)
244
244
 
245
+ ### Prometheus server
246
+ Prometheus metrics can be enabled by running sidecar with the following flag :
247
+
248
+ ```bash
249
+ yarn start --prometheus
250
+ ```
251
+
252
+ You can also define a custom port by running :
253
+
254
+ ```bash
255
+ yarn start --prometheus --prometheus-port=<YOUR_CUSTOM_PORT>
256
+ ```
257
+
258
+ The metrics endpoint can then be accessed :
259
+ - on the default port : `http://127.0.0.1:9100/metrics` or
260
+ - on your custom port if you defined one : `http://127.0.0.1:<YOUR_CUSTOM_PORT>/metrics`
261
+
262
+ That way you will have access to the default prometheus metrics and one extra custom metric called `sas_http_errors` (of type counter). This counter is increased by 1 every time an http error has occured in sidecar.
263
+
264
+
245
265
  ## Debugging fee and staking payout calculations
246
266
 
247
267
  It is possible to get more information about the fee and staking payout calculation process logged to
@@ -258,7 +278,7 @@ CALC_DEBUG=1 sh calc/build.sh
258
278
 
259
279
  ## Chain integration guide
260
280
 
261
- [Click here for chain integration guide.](./guides/CHAIN_INTEGRATION.md))
281
+ [Click here for chain integration guide.](./guides/CHAIN_INTEGRATION.md)
262
282
 
263
283
  ## Docker
264
284
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "17.0.0",
2
+ "version": "17.1.0",
3
3
  "name": "@substrate/api-sidecar",
4
4
  "description": "REST service that makes it easy to interact with blockchain nodes built using Substrate's FRAME framework.",
5
5
  "homepage": "https://github.com/paritytech/substrate-api-sidecar#readme",
@@ -42,17 +42,17 @@
42
42
  "start:latest-e2e-scripts": "yarn build:scripts && node scripts/build/runLatestE2eTests.js",
43
43
  "start:historical-e2e-tests": "yarn build:e2e-tests && node ./e2e-tests/build/historical/historical.js --config=./e2e-tests/jest.config.js",
44
44
  "start:historical-e2e-scripts": "yarn build:scripts && node scripts/build/runHistoricalE2eTests.js",
45
- "test": "NODE_ENV=test substrate-exec-jest --detectOpenHandles",
45
+ "test": "NODE_ENV=test substrate-exec-jest",
46
46
  "test:watch": "NODE_ENV=test substrate-exec-jest --watch",
47
- "test:ci": "NODE_ENV=test substrate-exec-jest --runInBand",
47
+ "test:ci": "NODE_ENV=test substrate-exec-jest",
48
48
  "test:latest-e2e-tests": "yarn start:latest-e2e-scripts",
49
49
  "test:historical-e2e-tests": "yarn start:historical-e2e-scripts",
50
50
  "test:test-release": "yarn build:scripts && node scripts/build/runYarnPack.js"
51
51
  },
52
52
  "dependencies": {
53
- "@polkadot/api": "^10.7.2",
54
- "@polkadot/api-contract": "^10.7.2",
55
- "@polkadot/util-crypto": "^12.2.1",
53
+ "@polkadot/api": "^10.9.1",
54
+ "@polkadot/api-contract": "^10.9.1",
55
+ "@polkadot/util-crypto": "^12.3.2",
56
56
  "@substrate/calc": "^0.3.1",
57
57
  "argparse": "^2.0.1",
58
58
  "confmgr": "^1.0.10",
@@ -60,6 +60,7 @@
60
60
  "express-winston": "^4.2.0",
61
61
  "http-errors": "^2.0.0",
62
62
  "lru-cache": "^7.13.1",
63
+ "prom-client": "^14.2.0",
63
64
  "rxjs": "^7.5.6",
64
65
  "winston": "^3.8.1"
65
66
  },
@@ -30,6 +30,7 @@ exports.westendControllers = {
30
30
  'AccountsVestingInfo',
31
31
  'Blocks',
32
32
  'BlocksExtrinsics',
33
+ 'BlocksTrace',
33
34
  'NodeNetwork',
34
35
  'NodeTransactionPool',
35
36
  'NodeVersion',
@@ -1 +1 @@
1
- {"version":3,"file":"westendControllers.js","sourceRoot":"","sources":["../../../src/chains-config/westendControllers.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;AAGxE,mCAA6D;AAE7D;;GAEG;AACU,QAAA,kBAAkB,GAAqB;IACnD,WAAW,EAAE;QACZ,qBAAqB;QACrB,iBAAiB;QACjB,qBAAqB;QACrB,wBAAwB;QACxB,kBAAkB;QAClB,qBAAqB;QACrB,QAAQ;QACR,kBAAkB;QAClB,aAAa;QACb,qBAAqB;QACrB,aAAa;QACb,sBAAsB;QACtB,eAAe;QACf,eAAe;QACf,eAAe;QACf,wBAAwB;QACxB,wBAAwB;QACxB,0BAA0B;QAC1B,gBAAgB;QAChB,OAAO;QACP,aAAa;QACb,iBAAiB;QACjB,aAAa;QACb,mBAAmB;QACnB,wBAAwB;QACxB,qBAAqB;QACrB,mBAAmB;KACnB;IACD,OAAO,EAAE;QACR,SAAS,EAAE,IAAI;QACf,iBAAiB,EAAE,CAAC;QACpB,UAAU,EAAE,IAAA,oBAAY,GAAE;QAC1B,cAAc,EAAE,IAAI,4BAAoB,CAAC,IAAI,EAAE,IAAI,CAAC;KACpD;CACD,CAAC"}
1
+ {"version":3,"file":"westendControllers.js","sourceRoot":"","sources":["../../../src/chains-config/westendControllers.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;AAGxE,mCAA6D;AAE7D;;GAEG;AACU,QAAA,kBAAkB,GAAqB;IACnD,WAAW,EAAE;QACZ,qBAAqB;QACrB,iBAAiB;QACjB,qBAAqB;QACrB,wBAAwB;QACxB,kBAAkB;QAClB,qBAAqB;QACrB,QAAQ;QACR,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,qBAAqB;QACrB,aAAa;QACb,sBAAsB;QACtB,eAAe;QACf,eAAe;QACf,eAAe;QACf,wBAAwB;QACxB,wBAAwB;QACxB,0BAA0B;QAC1B,gBAAgB;QAChB,OAAO;QACP,aAAa;QACb,iBAAiB;QACjB,aAAa;QACb,mBAAmB;QACnB,wBAAwB;QACxB,qBAAqB;QACrB,mBAAmB;KACnB;IACD,OAAO,EAAE;QACR,SAAS,EAAE,IAAI;QACf,iBAAiB,EAAE,CAAC;QACpB,UAAU,EAAE,IAAA,oBAAY,GAAE;QAC1B,cAAc,EAAE,IAAI,4BAAoB,CAAC,IAAI,EAAE,IAAI,CAAC;KACpD;CACD,CAAC"}
package/build/src/main.js CHANGED
@@ -55,6 +55,7 @@ const Log_1 = require("./logging/Log");
55
55
  const middleware = __importStar(require("./middleware"));
56
56
  const parseArgs_1 = require("./parseArgs");
57
57
  const SidecarConfig_1 = require("./SidecarConfig");
58
+ const metrics_1 = __importDefault(require("./util/metrics"));
58
59
  async function main() {
59
60
  const { config } = SidecarConfig_1.SidecarConfig;
60
61
  const { logger } = Log_1.Log;
@@ -104,6 +105,15 @@ async function main() {
104
105
  const server = app.listen();
105
106
  server.keepAliveTimeout = config.EXPRESS.KEEP_ALIVE_TIMEOUT;
106
107
  server.headersTimeout = config.EXPRESS.KEEP_ALIVE_TIMEOUT + 5000;
108
+ if (args.prometheus) {
109
+ // Create Metrics App
110
+ const metricsApp = new metrics_1.default({
111
+ port: 9100,
112
+ host: config.EXPRESS.HOST,
113
+ });
114
+ // Start the Metrics server
115
+ metricsApp.listen();
116
+ }
107
117
  }
108
118
  /**
109
119
  * Prompt the user with some basic info about the node and the network they have
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.httpErrorMiddleware = void 0;
19
19
  const http_errors_1 = require("http-errors");
20
20
  const Log_1 = require("../../logging/Log");
21
+ const parseArgs_1 = require("../../parseArgs");
22
+ const metrics_1 = require("../../util/metrics");
21
23
  /**
22
24
  * Handle HttpError instances.
23
25
  *
@@ -33,12 +35,16 @@ const httpErrorMiddleware = (err, _req, res, next) => {
33
35
  if (res.headersSent || !(err instanceof http_errors_1.HttpError)) {
34
36
  return next(err);
35
37
  }
38
+ const args = (0, parseArgs_1.parseArgs)();
36
39
  const code = err.status;
37
40
  const info = {
38
41
  code,
39
42
  message: err.message,
40
43
  stack: err.stack,
41
44
  };
45
+ if (args.prometheus) {
46
+ metrics_1.httpErrorCounter.inc();
47
+ }
42
48
  Log_1.Log.logger.error(info);
43
49
  res.status(code).send(info);
44
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"httpErrorMiddleware.js","sourceRoot":"","sources":["../../../../src/middleware/error/httpErrorMiddleware.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;AAGxE,6CAAwC;AAExC,2CAAwC;AACxC;;;;;;;;;;GAUG;AACI,MAAM,mBAAmB,GAAwB,CACvD,GAAY,EACZ,IAAI,EACJ,GAAG,EACH,IAAI,EACG,EAAE;IACT,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,YAAY,uBAAS,CAAC,EAAE;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;KACjB;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;IAExB,MAAM,IAAI,GAAG;QACZ,IAAI;QACJ,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;KAChB,CAAC;IAEF,SAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC;AArBW,QAAA,mBAAmB,uBAqB9B"}
1
+ {"version":3,"file":"httpErrorMiddleware.js","sourceRoot":"","sources":["../../../../src/middleware/error/httpErrorMiddleware.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;AAGxE,6CAAwC;AAExC,2CAAwC;AACxC,+CAA4C;AAC5C,gDAAsD;AACtD;;;;;;;;;;GAUG;AACI,MAAM,mBAAmB,GAAwB,CACvD,GAAY,EACZ,IAAI,EACJ,GAAG,EACH,IAAI,EACG,EAAE;IACT,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,YAAY,uBAAS,CAAC,EAAE;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;KACjB;IACD,MAAM,IAAI,GAAG,IAAA,qBAAS,GAAE,CAAC;IACzB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;IAExB,MAAM,IAAI,GAAG;QACZ,IAAI;QACJ,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;KAChB,CAAC;IACF,IAAI,IAAI,CAAC,UAAU,EAAE;QACpB,0BAAgB,CAAC,GAAG,EAAE,CAAC;KACvB;IACD,SAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC;AAvBW,QAAA,mBAAmB,uBAuB9B"}
@@ -18,7 +18,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  const http_errors_1 = require("http-errors");
19
19
  const util_1 = require("./util");
20
20
  const validateBooleanMiddleware_1 = require("./validateBooleanMiddleware");
21
- describe('validaeBooleanMiddleware', () => {
21
+ describe('validateBooleanMiddleware', () => {
22
22
  (0, util_1.doesNotErrorWith)('no query params in path', {
23
23
  query: {},
24
24
  }, (0, validateBooleanMiddleware_1.validateBooleanMiddleware)([]));
@@ -1 +1 @@
1
- {"version":3,"file":"validateBooleanMiddleware.spec.js","sourceRoot":"","sources":["../../../../src/middleware/validate/validateBooleanMiddleware.spec.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;AAGxE,6CAAyC;AAEzC,iCAAsD;AACtD,2EAAwE;AAExE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACzC,IAAA,uBAAgB,EACf,yBAAyB,EACzB;QACC,KAAK,EAAE,EAAE;KACa,EACvB,IAAA,qDAAyB,EAAC,EAAE,CAAC,CAC7B,CAAC;IAEF,IAAA,uBAAgB,EACf,mCAAmC,EACnC;QACC,KAAK,EAAE;YACN,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,OAAO;SAClB;KACqB,EACvB,IAAA,qDAAyB,EAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CACrD,CAAC;IAEF,IAAA,uBAAgB,EACf,oCAAoC,EACpC;QACC,KAAK,EAAE;YACN,OAAO,EAAE,OAAO;SAChB;KACqB,EACvB,IAAA,qDAAyB,EAAC,EAAE,CAAC,CAC7B,CAAC;IAEF,IAAA,iBAAU,EACT,6BAA6B,EAC7B;QACC,KAAK,EAAE;YACN,SAAS,EAAE,OAAO;SAClB;KACqB,EACvB,IAAI,wBAAU,CACb,kEAAkE,CAClE,EACD,IAAA,qDAAyB,EAAC,CAAC,WAAW,CAAC,CAAC,CACxC,CAAC;IAEF,IAAA,iBAAU,EACT,8BAA8B,EAC9B;QACC,KAAK,EAAE;YACN,SAAS,EAAE,QAAQ;SACnB;KACqB,EACvB,IAAI,wBAAU,CACb,mEAAmE,CACnE,EACD,IAAA,qDAAyB,EAAC,CAAC,WAAW,CAAC,CAAC,CACxC,CAAC;IAEF,IAAA,iBAAU,EACT,+BAA+B,EAC/B;QACC,KAAK,EAAE;YACN,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,UAAU;SACrB;KACqB,EACvB,IAAI,wBAAU,CACb,0IAA0I,CAC1I,EACD,IAAA,qDAAyB,EAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CACrD,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"validateBooleanMiddleware.spec.js","sourceRoot":"","sources":["../../../../src/middleware/validate/validateBooleanMiddleware.spec.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;AAGxE,6CAAyC;AAEzC,iCAAsD;AACtD,2EAAwE;AAExE,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,IAAA,uBAAgB,EACf,yBAAyB,EACzB;QACC,KAAK,EAAE,EAAE;KACa,EACvB,IAAA,qDAAyB,EAAC,EAAE,CAAC,CAC7B,CAAC;IAEF,IAAA,uBAAgB,EACf,mCAAmC,EACnC;QACC,KAAK,EAAE;YACN,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,OAAO;SAClB;KACqB,EACvB,IAAA,qDAAyB,EAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CACrD,CAAC;IAEF,IAAA,uBAAgB,EACf,oCAAoC,EACpC;QACC,KAAK,EAAE;YACN,OAAO,EAAE,OAAO;SAChB;KACqB,EACvB,IAAA,qDAAyB,EAAC,EAAE,CAAC,CAC7B,CAAC;IAEF,IAAA,iBAAU,EACT,6BAA6B,EAC7B;QACC,KAAK,EAAE;YACN,SAAS,EAAE,OAAO;SAClB;KACqB,EACvB,IAAI,wBAAU,CACb,kEAAkE,CAClE,EACD,IAAA,qDAAyB,EAAC,CAAC,WAAW,CAAC,CAAC,CACxC,CAAC;IAEF,IAAA,iBAAU,EACT,8BAA8B,EAC9B;QACC,KAAK,EAAE;YACN,SAAS,EAAE,QAAQ;SACnB;KACqB,EACvB,IAAI,wBAAU,CACb,mEAAmE,CACnE,EACD,IAAA,qDAAyB,EAAC,CAAC,WAAW,CAAC,CAAC,CACxC,CAAC;IAEF,IAAA,iBAAU,EACT,+BAA+B,EAC/B;QACC,KAAK,EAAE;YACN,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,UAAU;SACrB;KACqB,EACvB,IAAI,wBAAU,CACb,0IAA0I,CAC1I,EACD,IAAA,qDAAyB,EAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CACrD,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -19,7 +19,19 @@ exports.parseArgs = void 0;
19
19
  const argparse_1 = require("argparse");
20
20
  const parseArgs = () => {
21
21
  const parser = new argparse_1.ArgumentParser();
22
- parser.add_argument('-v', '--version', { action: 'store_true' });
22
+ parser.add_argument('-v', '--version', {
23
+ action: 'store_true',
24
+ help: 'print substrate-api-sidecar version',
25
+ });
26
+ parser.add_argument('-p', '--prometheus', {
27
+ action: 'store_true',
28
+ help: 'enable the prometheus metrics endpoint',
29
+ });
30
+ parser.add_argument('-pp', '--prometheus-port', {
31
+ type: 'int',
32
+ default: 9100,
33
+ help: 'specify the port number on which the prometheus metrics are exposed [default: 9100]',
34
+ });
23
35
  return parser.parse_args();
24
36
  };
25
37
  exports.parseArgs = parseArgs;
@@ -1 +1 @@
1
- {"version":3,"file":"parseArgs.js","sourceRoot":"","sources":["../../src/parseArgs.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;AAExE,uCAAqD;AAE9C,MAAM,SAAS,GAAG,GAAc,EAAE;IACxC,MAAM,MAAM,GAAG,IAAI,yBAAc,EAAE,CAAC;IAEpC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAEjE,OAAO,MAAM,CAAC,UAAU,EAAe,CAAC;AACzC,CAAC,CAAC;AANW,QAAA,SAAS,aAMpB"}
1
+ {"version":3,"file":"parseArgs.js","sourceRoot":"","sources":["../../src/parseArgs.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;AAExE,uCAAqD;AAE9C,MAAM,SAAS,GAAG,GAAc,EAAE;IACxC,MAAM,MAAM,GAAG,IAAI,yBAAc,EAAE,CAAC;IAEpC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE;QACtC,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,qCAAqC;KAC3C,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE;QACzC,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,wCAAwC;KAC9C,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,mBAAmB,EAAE;QAC/C,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,qFAAqF;KAC3F,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,UAAU,EAAe,CAAC;AACzC,CAAC,CAAC;AAlBW,QAAA,SAAS,aAkBpB"}
@@ -0,0 +1,21 @@
1
+ import client from 'prom-client';
2
+ export declare const httpErrorCounter: client.Counter<string>;
3
+ interface IAppConfiguration {
4
+ port: number;
5
+ host: string;
6
+ }
7
+ export default class Metrics_App {
8
+ private app;
9
+ private readonly port;
10
+ private readonly host;
11
+ /**
12
+ * @param appConfig configuration for app.
13
+ */
14
+ constructor({ host }: IAppConfiguration);
15
+ listen(): void;
16
+ /**
17
+ * Mount the metrics endpoint.
18
+ */
19
+ private metricsEndpoint;
20
+ }
21
+ export {};
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.httpErrorCounter = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const prom_client_1 = __importDefault(require("prom-client"));
9
+ const Log_1 = require("../logging/Log");
10
+ const parseArgs_1 = require("../parseArgs");
11
+ exports.httpErrorCounter = new prom_client_1.default.Counter({
12
+ name: 'sas_http_errors',
13
+ help: 'Number of HTTP Errors',
14
+ });
15
+ class Metrics_App {
16
+ /**
17
+ * @param appConfig configuration for app.
18
+ */
19
+ constructor({ host }) {
20
+ const args = (0, parseArgs_1.parseArgs)();
21
+ this.port = Number(args.prometheus_port);
22
+ this.app = (0, express_1.default)();
23
+ this.host = host;
24
+ this.metricsEndpoint();
25
+ }
26
+ listen() {
27
+ const { logger } = Log_1.Log;
28
+ this.app.listen(this.port, this.host, () => {
29
+ logger.info(`Metrics Server started at http://${this.host}:${this.port}/`);
30
+ });
31
+ }
32
+ /**
33
+ * Mount the metrics endpoint.
34
+ */
35
+ metricsEndpoint() {
36
+ const register = new prom_client_1.default.Registry();
37
+ register.registerMetric(exports.httpErrorCounter);
38
+ prom_client_1.default.collectDefaultMetrics({ register, prefix: 'sas_' });
39
+ // Set up the metrics endpoint
40
+ this.app.get('/metrics', (_req, res) => {
41
+ void (async () => {
42
+ res.set('Content-Type', register.contentType);
43
+ res.send(await register.metrics());
44
+ })();
45
+ });
46
+ }
47
+ }
48
+ exports.default = Metrics_App;
49
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/util/metrics.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA8B;AAE9B,8DAAiC;AAEjC,wCAAqC;AACrC,4CAAyC;AAE5B,QAAA,gBAAgB,GAAG,IAAI,qBAAM,CAAC,OAAO,CAAC;IAClD,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE,uBAAuB;CAC7B,CAAC,CAAC;AAOH,MAAqB,WAAW;IAK/B;;OAEG;IACH,YAAY,EAAE,IAAI,EAAqB;QACtC,MAAM,IAAI,GAAG,IAAA,qBAAS,GAAE,CAAC;QAEzB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,eAAe,EAAE,CAAC;IACxB,CAAC;IAED,MAAM;QACL,MAAM,EAAE,MAAM,EAAE,GAAG,SAAG,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,IAAI,CACV,oCAAoC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe;QACtB,MAAM,QAAQ,GAAG,IAAI,qBAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,QAAQ,CAAC,cAAc,CAAC,wBAAgB,CAAC,CAAC;QAC1C,qBAAM,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,8BAA8B;QAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;YACzD,KAAK,CAAC,KAAK,IAAI,EAAE;gBAChB,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC9C,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,CAAC,CAAC,EAAE,CAAC;QACN,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AA1CD,8BA0CC"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "17.0.0",
2
+ "version": "17.1.0",
3
3
  "name": "@substrate/api-sidecar",
4
4
  "description": "REST service that makes it easy to interact with blockchain nodes built using Substrate's FRAME framework.",
5
5
  "homepage": "https://github.com/paritytech/substrate-api-sidecar#readme",
@@ -42,17 +42,17 @@
42
42
  "start:latest-e2e-scripts": "yarn build:scripts && node scripts/build/runLatestE2eTests.js",
43
43
  "start:historical-e2e-tests": "yarn build:e2e-tests && node ./e2e-tests/build/historical/historical.js --config=./e2e-tests/jest.config.js",
44
44
  "start:historical-e2e-scripts": "yarn build:scripts && node scripts/build/runHistoricalE2eTests.js",
45
- "test": "NODE_ENV=test substrate-exec-jest --detectOpenHandles",
45
+ "test": "NODE_ENV=test substrate-exec-jest",
46
46
  "test:watch": "NODE_ENV=test substrate-exec-jest --watch",
47
- "test:ci": "NODE_ENV=test substrate-exec-jest --runInBand",
47
+ "test:ci": "NODE_ENV=test substrate-exec-jest",
48
48
  "test:latest-e2e-tests": "yarn start:latest-e2e-scripts",
49
49
  "test:historical-e2e-tests": "yarn start:historical-e2e-scripts",
50
50
  "test:test-release": "yarn build:scripts && node scripts/build/runYarnPack.js"
51
51
  },
52
52
  "dependencies": {
53
- "@polkadot/api": "^10.7.2",
54
- "@polkadot/api-contract": "^10.7.2",
55
- "@polkadot/util-crypto": "^12.2.1",
53
+ "@polkadot/api": "^10.9.1",
54
+ "@polkadot/api-contract": "^10.9.1",
55
+ "@polkadot/util-crypto": "^12.3.2",
56
56
  "@substrate/calc": "^0.3.1",
57
57
  "argparse": "^2.0.1",
58
58
  "confmgr": "^1.0.10",
@@ -60,6 +60,7 @@
60
60
  "express-winston": "^4.2.0",
61
61
  "http-errors": "^2.0.0",
62
62
  "lru-cache": "^7.13.1",
63
+ "prom-client": "^14.2.0",
63
64
  "rxjs": "^7.5.6",
64
65
  "winston": "^3.8.1"
65
66
  },