@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 +21 -1
- package/build/package.json +7 -6
- package/build/src/chains-config/westendControllers.js +1 -0
- package/build/src/chains-config/westendControllers.js.map +1 -1
- package/build/src/main.js +10 -0
- package/build/src/main.js.map +1 -1
- package/build/src/middleware/error/httpErrorMiddleware.js +6 -0
- package/build/src/middleware/error/httpErrorMiddleware.js.map +1 -1
- package/build/src/middleware/validate/validateBooleanMiddleware.spec.js +1 -1
- package/build/src/middleware/validate/validateBooleanMiddleware.spec.js.map +1 -1
- package/build/src/parseArgs.js +13 -1
- package/build/src/parseArgs.js.map +1 -1
- package/build/src/util/metrics.d.ts +21 -0
- package/build/src/util/metrics.js +49 -0
- package/build/src/util/metrics.js.map +1 -0
- package/package.json +7 -6
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
|
|
package/build/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "17.
|
|
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
|
|
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
|
|
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.
|
|
54
|
-
"@polkadot/api-contract": "^10.
|
|
55
|
-
"@polkadot/util-crypto": "^12.2
|
|
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
|
},
|
|
@@ -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
|
package/build/src/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;AAEA,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,yCAAyC;AACzC,iCAA+B;AAE/B,uCAA2C;AAC3C,yDAAkE;AAElE,qCAA+B;AAE/B,mEAA0C;AAC1C,gDAAwB;AACxB,mDAAwD;AACxD,+DAA4D;AAC5D,uCAAoC;AACpC,yDAA2C;AAC3C,2CAAwC;AACxC,mDAAgD;
|
|
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;
|
|
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('
|
|
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,
|
|
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"}
|
package/build/src/parseArgs.js
CHANGED
|
@@ -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', {
|
|
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;
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
54
|
-
"@polkadot/api-contract": "^10.
|
|
55
|
-
"@polkadot/util-crypto": "^12.2
|
|
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
|
},
|