@lidofinance/api-metrics 0.0.2

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 ADDED
@@ -0,0 +1,55 @@
1
+ # @lidofinance/api-metrics
2
+
3
+ Utils to work with common tracked metrics
4
+
5
+ ## Installation
6
+
7
+ 1. Authenticate to use GitHub registry as described in parent [README.md](../../../README.md).
8
+ 2. `yarn add @lidofinance/api-metrics`.
9
+
10
+ ## Getting started
11
+
12
+ ### collectStartupMetrics
13
+
14
+ Just call it in the same place where you call `collectDefaultMetrics`.
15
+
16
+ ```ts
17
+ import { Registry, collectDefaultMetrics } from 'prom-client';
18
+ import getConfig from 'next/config';
19
+ import { METRICS_PREFIX } from 'config';
20
+ import buildInfoJson from 'build-info.json';
21
+ import { collectStartupMetrics } from '@lidofinance/api-metrics';
22
+
23
+ const { publicRuntimeConfig } = getConfig();
24
+ const { defaultChain, supportedChains } = publicRuntimeConfig;
25
+
26
+ export const registry = new Registry();
27
+
28
+ if (process.env.NODE_ENV === 'production') {
29
+ collectStartupMetrics({
30
+ prefix: METRICS_PREFIX,
31
+ registry,
32
+ defaultChain,
33
+ supportedChains: supportedChains.split(','),
34
+ version: process.env.npm_package_version ?? 'unversioned',
35
+ commit: buildInfoJson.commit,
36
+ branch: buildInfoJson.branch,
37
+ });
38
+
39
+ collectDefaultMetrics({ prefix: METRICS_PREFIX, register: registry });
40
+ }
41
+ ```
42
+
43
+ ### rpcMetricsFactory
44
+
45
+ It's mostly internal util for [@lidofinance/api-rpc](../rpc/README.md)
46
+ and [@lidofinance/eth-api-providers](../../eth/api/providers/README.md), but you should use it if you use RPC requests
47
+ in some other way.
48
+
49
+ Take a look into the file itself to view exported metrics, it's quite simple.
50
+
51
+ ### rpcMetricsUtils
52
+
53
+ There is a list of utils, which helps to reduce [cardinality](https://www.robustperception.io/cardinality-is-key/),
54
+ e.g. you should collect '2xx' instead of '200', '201', ... and other HTTP response statuses, because in most cases it
55
+ doesn't matter.
package/dist/index.cjs ADDED
@@ -0,0 +1,147 @@
1
+ var $7tm02$promclient = require("prom-client");
2
+
3
+ function $parcel$exportWildcard(dest, source) {
4
+ Object.keys(source).forEach(function(key) {
5
+ if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {
6
+ return;
7
+ }
8
+
9
+ Object.defineProperty(dest, key, {
10
+ enumerable: true,
11
+ get: function get() {
12
+ return source[key];
13
+ }
14
+ });
15
+ });
16
+
17
+ return dest;
18
+ }
19
+ function $parcel$export(e, n, v, s) {
20
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
21
+ }
22
+ var $4773eaec24f907ac$exports = {};
23
+
24
+ $parcel$export($4773eaec24f907ac$exports, "chainConfigFactory", () => $4773eaec24f907ac$export$3912f78fe5436ec0);
25
+ $parcel$export($4773eaec24f907ac$exports, "buildInfoFactory", () => $4773eaec24f907ac$export$c71d26d8163583e2);
26
+ $parcel$export($4773eaec24f907ac$exports, "collectStartupMetrics", () => $4773eaec24f907ac$export$ee77f8ab9c4e7a05);
27
+
28
+ const $4773eaec24f907ac$export$3912f78fe5436ec0 = (prefix)=>new (0, $7tm02$promclient.Gauge)({
29
+ name: prefix + "chain_config_info",
30
+ help: "Default network and supported networks",
31
+ labelNames: [
32
+ "default_chain",
33
+ "supported_chains"
34
+ ],
35
+ registers: []
36
+ });
37
+ const $4773eaec24f907ac$export$c71d26d8163583e2 = (prefix)=>new (0, $7tm02$promclient.Gauge)({
38
+ name: prefix + "build_info",
39
+ help: "Version, branch and commit of the current build",
40
+ labelNames: [
41
+ "version",
42
+ "commit",
43
+ "branch"
44
+ ],
45
+ registers: []
46
+ });
47
+ const $4773eaec24f907ac$export$ee77f8ab9c4e7a05 = ({ prefix: prefix , registry: registry , defaultChain: defaultChain , supportedChains: supportedChains , version: version , commit: commit , branch: branch })=>{
48
+ const chainConfig = $4773eaec24f907ac$export$3912f78fe5436ec0(prefix);
49
+ registry.registerMetric(chainConfig);
50
+ chainConfig.labels({
51
+ default_chain: defaultChain
52
+ }).set(1);
53
+ supportedChains.forEach((chain)=>{
54
+ chainConfig.labels({
55
+ supported_chains: chain
56
+ }).set(1);
57
+ });
58
+ const buildInfo = $4773eaec24f907ac$export$c71d26d8163583e2(prefix);
59
+ registry.registerMetric(buildInfo);
60
+ buildInfo.labels(version, commit, branch).set(1);
61
+ };
62
+
63
+
64
+ var $c4da43e18c6d237f$exports = {};
65
+
66
+ $parcel$export($c4da43e18c6d237f$exports, "rpcRequestCountFactory", () => $c4da43e18c6d237f$export$ef58728a4fe523fc);
67
+ $parcel$export($c4da43e18c6d237f$exports, "rpcResponseTimeFactory", () => $c4da43e18c6d237f$export$43dc308e64f0b05d);
68
+ $parcel$export($c4da43e18c6d237f$exports, "rpcRequestMethodsFactory", () => $c4da43e18c6d237f$export$2178a8960eec76eb);
69
+ $parcel$export($c4da43e18c6d237f$exports, "rpcMetricsFactory", () => $c4da43e18c6d237f$export$d6ea70e849062acd);
70
+
71
+ const $c4da43e18c6d237f$export$ef58728a4fe523fc = (prefix)=>new (0, $7tm02$promclient.Counter)({
72
+ name: prefix + "rpc_service_request_count",
73
+ help: "RPC service request count",
74
+ labelNames: [
75
+ "chainId",
76
+ "provider"
77
+ ],
78
+ registers: []
79
+ });
80
+ const $c4da43e18c6d237f$export$43dc308e64f0b05d = (prefix)=>new (0, $7tm02$promclient.Histogram)({
81
+ name: prefix + "rpc_service_response_time",
82
+ help: "RPC service response time seconds",
83
+ buckets: [
84
+ 0.1,
85
+ 0.2,
86
+ 0.3,
87
+ 0.6,
88
+ 1,
89
+ 1.5,
90
+ 2,
91
+ 5
92
+ ],
93
+ labelNames: [
94
+ "chainId",
95
+ "provider",
96
+ "status"
97
+ ],
98
+ registers: []
99
+ });
100
+ const $c4da43e18c6d237f$export$2178a8960eec76eb = (prefix)=>new (0, $7tm02$promclient.Counter)({
101
+ name: prefix + "rpc_service_request_methods",
102
+ help: "RPC service request methods",
103
+ labelNames: [
104
+ "method"
105
+ ],
106
+ registers: []
107
+ });
108
+ let $c4da43e18c6d237f$var$cache = null;
109
+ const $c4da43e18c6d237f$export$d6ea70e849062acd = (prefix, registry)=>{
110
+ if ($c4da43e18c6d237f$var$cache == null) {
111
+ const rpcRequestCount = $c4da43e18c6d237f$export$ef58728a4fe523fc(prefix);
112
+ registry.registerMetric(rpcRequestCount);
113
+ const rpcRequestMethods = $c4da43e18c6d237f$export$2178a8960eec76eb(prefix);
114
+ registry.registerMetric(rpcRequestMethods);
115
+ const rpcResponseTime = $c4da43e18c6d237f$export$43dc308e64f0b05d(prefix);
116
+ registry.registerMetric(rpcResponseTime);
117
+ $c4da43e18c6d237f$var$cache = {
118
+ rpcRequestCount: rpcRequestCount,
119
+ rpcRequestMethods: rpcRequestMethods,
120
+ rpcResponseTime: rpcResponseTime
121
+ };
122
+ }
123
+ return $c4da43e18c6d237f$var$cache;
124
+ };
125
+
126
+
127
+ var $d7531565112499b5$exports = {};
128
+
129
+ $parcel$export($d7531565112499b5$exports, "getStatusLabel", () => $d7531565112499b5$export$489c297e3a119321);
130
+ $parcel$export($d7531565112499b5$exports, "getProviderLabel", () => $d7531565112499b5$export$f40021662990adcd);
131
+ const $d7531565112499b5$export$489c297e3a119321 = (status)=>{
132
+ if (status == null || status < 100 || status > 600) return "xxx";
133
+ const majorStatus = Math.trunc(status / 100);
134
+ return `${majorStatus}xx`;
135
+ };
136
+ const $d7531565112499b5$export$f40021662990adcd = (providerURL)=>{
137
+ const parsedUrl = new URL(providerURL);
138
+ return parsedUrl.hostname.split(".").slice(-2).join(".");
139
+ };
140
+
141
+
142
+ $parcel$exportWildcard(module.exports, $4773eaec24f907ac$exports);
143
+ $parcel$exportWildcard(module.exports, $c4da43e18c6d237f$exports);
144
+ $parcel$exportWildcard(module.exports, $d7531565112499b5$exports);
145
+
146
+
147
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;AAEO,MAAM,yCAAkB,GAAG,CAAC,MAAc,GAC/C,IAAI,CAAA,GAAA,uBAAK,CAAA,CAAC;QACR,IAAI,EAAE,MAAM,GAAG,mBAAmB;QAClC,IAAI,EAAE,wCAAwC;QAC9C,UAAU,EAAE;YAAC,eAAe;YAAE,kBAAkB;SAAC;QACjD,SAAS,EAAE,EAAE;KACd,CAAC;AAEG,MAAM,yCAAgB,GAAG,CAAC,MAAc,GAC7C,IAAI,CAAA,GAAA,uBAAK,CAAA,CAAC;QACR,IAAI,EAAE,MAAM,GAAG,YAAY;QAC3B,IAAI,EAAE,iDAAiD;QACvD,UAAU,EAAE;YAAC,SAAS;YAAE,QAAQ;YAAE,QAAQ;SAAC;QAC3C,SAAS,EAAE,EAAE;KACd,CAAC;AAWG,MAAM,yCAAqB,GAAG,CAAC,UACpC,MAAM,CAAA,YACN,QAAQ,CAAA,gBACR,YAAY,CAAA,mBACZ,eAAe,CAAA,WACf,OAAO,CAAA,UACP,MAAM,CAAA,UACN,MAAM,CAAA,EACwB,GAAK;IACnC,MAAM,WAAW,GAAG,yCAAkB,CAAC,MAAM,CAAC;IAC9C,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC;IACpC,WAAW,CAAC,MAAM,CAAC;QAAE,aAAa,EAAE,YAAY;KAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,GAAK;QACjC,WAAW,CAAC,MAAM,CAAC;YAAE,gBAAgB,EAAE,KAAK;SAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KACvD,CAAC;IAEF,MAAM,SAAS,GAAG,yCAAgB,CAAC,MAAM,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC;IAClC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACjD;;AD9CD;;;;;;;AEAA;AAEO,MAAM,yCAAsB,GAAG,CAAC,MAAc,GACnD,IAAI,CAAA,GAAA,yBAAO,CAAA,CAAC;QACV,IAAI,EAAE,MAAM,GAAG,2BAA2B;QAC1C,IAAI,EAAE,2BAA2B;QACjC,UAAU,EAAE;YAAC,SAAS;YAAE,UAAU;SAAC;QACnC,SAAS,EAAE,EAAE;KACd,CAAC;AAEG,MAAM,yCAAsB,GAAG,CAAC,MAAc,GACnD,IAAI,CAAA,GAAA,2BAAS,CAAA,CAAC;QACZ,IAAI,EAAE,MAAM,GAAG,2BAA2B;QAC1C,IAAI,EAAE,mCAAmC;QACzC,OAAO,EAAE;AAAC,eAAG;AAAE,eAAG;AAAE,eAAG;AAAE,eAAG;AAAE,aAAC;AAAE,eAAG;AAAE,aAAC;AAAE,aAAC;SAAC;QAC3C,UAAU,EAAE;YAAC,SAAS;YAAE,UAAU;YAAE,QAAQ;SAAC;QAC7C,SAAS,EAAE,EAAE;KACd,CAAC;AAEG,MAAM,yCAAwB,GAAG,CAAC,MAAc,GACrD,IAAI,CAAA,GAAA,yBAAO,CAAA,CAAC;QACV,IAAI,EAAE,MAAM,GAAG,6BAA6B;QAC5C,IAAI,EAAE,6BAA6B;QACnC,UAAU,EAAE;YAAC,QAAQ;SAAC;QACtB,SAAS,EAAE,EAAE;KACd,CAAC;AAEJ,IAAI,2BAAK,GAIE,IAAI;AAER,MAAM,yCAAiB,GAAG,CAAC,MAAc,EAAE,QAAkB,GAAK;IACvE,IAAI,2BAAK,IAAI,IAAI,EAAE;QACjB,MAAM,eAAe,GAAG,yCAAsB,CAAC,MAAM,CAAC;QACtD,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC;QAExC,MAAM,iBAAiB,GAAG,yCAAwB,CAAC,MAAM,CAAC;QAC1D,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC;QAE1C,MAAM,eAAe,GAAG,yCAAsB,CAAC,MAAM,CAAC;QACtD,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC;QAExC,2BAAK,GAAG;6BACN,eAAe;+BACf,iBAAiB;6BACjB,eAAe;SAChB;KACF;IAED,OAAO,2BAAK,CAAA;CACb;;;;;;;AC5CM,MAAM,yCAAc,GAAG,CAAC,MAA0B,GAAK;IAC5D,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,EAChD,OAAO,KAAK,CAAA;IAEd,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IAC5C,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAA;CAC1B;AAWM,MAAM,yCAAgB,GAAG,CAAC,WAAmB,GAAK;IACvD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC;IACtC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;CACzD;;","sources":["packages/api/metrics/src/index.ts","packages/api/metrics/src/collectStartupMetrics.ts","packages/api/metrics/src/rpcMetricsFactory.ts","packages/api/metrics/src/rpcMetricsUtils.ts"],"sourcesContent":["export * from './collectStartupMetrics'\nexport * from './rpcMetricsFactory'\nexport * from './rpcMetricsUtils'\n","import { Gauge, Registry } from 'prom-client'\n\nexport const chainConfigFactory = (prefix: string) =>\n new Gauge({\n name: prefix + 'chain_config_info',\n help: 'Default network and supported networks',\n labelNames: ['default_chain', 'supported_chains'],\n registers: [],\n })\n\nexport const buildInfoFactory = (prefix: string) =>\n new Gauge({\n name: prefix + 'build_info',\n help: 'Version, branch and commit of the current build',\n labelNames: ['version', 'commit', 'branch'],\n registers: [],\n })\n\nexport type TrackStartupMetricsParameters = {\n prefix: string\n registry: Registry\n defaultChain: string\n supportedChains: string[]\n version: string\n commit: string\n branch: string\n}\nexport const collectStartupMetrics = ({\n prefix,\n registry,\n defaultChain,\n supportedChains,\n version,\n commit,\n branch,\n}: TrackStartupMetricsParameters) => {\n const chainConfig = chainConfigFactory(prefix)\n registry.registerMetric(chainConfig)\n chainConfig.labels({ default_chain: defaultChain }).set(1)\n supportedChains.forEach((chain) => {\n chainConfig.labels({ supported_chains: chain }).set(1)\n })\n\n const buildInfo = buildInfoFactory(prefix)\n registry.registerMetric(buildInfo)\n buildInfo.labels(version, commit, branch).set(1)\n}\n","import { Counter, Histogram, Registry } from 'prom-client'\n\nexport const rpcRequestCountFactory = (prefix: string) =>\n new Counter({\n name: prefix + 'rpc_service_request_count',\n help: 'RPC service request count',\n labelNames: ['chainId', 'provider'],\n registers: [],\n })\n\nexport const rpcResponseTimeFactory = (prefix: string) =>\n new Histogram({\n name: prefix + 'rpc_service_response_time',\n help: 'RPC service response time seconds',\n buckets: [0.1, 0.2, 0.3, 0.6, 1, 1.5, 2, 5],\n labelNames: ['chainId', 'provider', 'status'],\n registers: [],\n })\n\nexport const rpcRequestMethodsFactory = (prefix: string) =>\n new Counter({\n name: prefix + 'rpc_service_request_methods',\n help: 'RPC service request methods',\n labelNames: ['method'],\n registers: [],\n })\n\nlet cache: {\n rpcRequestCount: ReturnType<typeof rpcRequestCountFactory>\n rpcRequestMethods: ReturnType<typeof rpcRequestMethodsFactory>\n rpcResponseTime: ReturnType<typeof rpcResponseTimeFactory>\n} | null = null\n\nexport const rpcMetricsFactory = (prefix: string, registry: Registry) => {\n if (cache == null) {\n const rpcRequestCount = rpcRequestCountFactory(prefix)\n registry.registerMetric(rpcRequestCount)\n\n const rpcRequestMethods = rpcRequestMethodsFactory(prefix)\n registry.registerMetric(rpcRequestMethods)\n\n const rpcResponseTime = rpcResponseTimeFactory(prefix)\n registry.registerMetric(rpcResponseTime)\n\n cache = {\n rpcRequestCount,\n rpcRequestMethods,\n rpcResponseTime,\n }\n }\n\n return cache\n}\n","/*\n * We need to limit how many statuses reported to prometheus, because of cardinality\n *\n * Examples:\n * getStatusLabel(200) => '2xx'\n * getStatusLabel(404) => '4xx'\n * getStatusLabel(undefined) => 'xxx'\n */\nexport const getStatusLabel = (status: number | undefined) => {\n if (status == null || status < 100 || status > 600) {\n return 'xxx'\n }\n const majorStatus = Math.trunc(status / 100)\n return `${majorStatus}xx`\n}\n\n/*\n * We also need to limit cardinality of provider labels reported to prometheus, but here\n * we don't need to check if provider is included in the list of available providers,\n * because we get provider from this list itself, but not from user.\n *\n * Examples:\n * getProviderLabel('https://eth-mainnet.alchemyapi.io/v2/...') => 'alchemyapi.io'\n * getProviderLabel('https://goerli.infura.io/v3/...') => 'infura.io'\n */\nexport const getProviderLabel = (providerURL: string) => {\n const parsedUrl = new URL(providerURL)\n return parsedUrl.hostname.split('.').slice(-2).join('.')\n}\n"],"names":[],"version":3,"file":"index.cjs.map","sourceRoot":"../../../../"}
@@ -0,0 +1,25 @@
1
+ import { Gauge, Registry, Counter, Histogram } from "prom-client";
2
+ export const chainConfigFactory: (prefix: string) => Gauge<"default_chain" | "supported_chains">;
3
+ export const buildInfoFactory: (prefix: string) => Gauge<"version" | "commit" | "branch">;
4
+ export type TrackStartupMetricsParameters = {
5
+ prefix: string;
6
+ registry: Registry;
7
+ defaultChain: string;
8
+ supportedChains: string[];
9
+ version: string;
10
+ commit: string;
11
+ branch: string;
12
+ };
13
+ export const collectStartupMetrics: ({ prefix, registry, defaultChain, supportedChains, version, commit, branch, }: TrackStartupMetricsParameters) => void;
14
+ export const rpcRequestCountFactory: (prefix: string) => Counter<"chainId" | "provider">;
15
+ export const rpcResponseTimeFactory: (prefix: string) => Histogram<"chainId" | "provider" | "status">;
16
+ export const rpcRequestMethodsFactory: (prefix: string) => Counter<"method">;
17
+ export const rpcMetricsFactory: (prefix: string, registry: Registry) => {
18
+ rpcRequestCount: ReturnType<typeof rpcRequestCountFactory>;
19
+ rpcRequestMethods: ReturnType<typeof rpcRequestMethodsFactory>;
20
+ rpcResponseTime: ReturnType<typeof rpcResponseTimeFactory>;
21
+ };
22
+ export const getStatusLabel: (status: number | undefined) => string;
23
+ export const getProviderLabel: (providerURL: string) => string;
24
+
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"mappings":";AAEA,OAAO,MAAM,6BAA8B,MAAM,gDAM7C,CAAA;AAEJ,OAAO,MAAM,2BAA4B,MAAM,2CAM3C,CAAA;AAEJ,4CAA4C;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AACD,OAAO,MAAM,uGAQV,6BAA6B,SAW/B,CAAA;AC5CD,OAAO,MAAM,iCAAkC,MAAM,oCAMjD,CAAA;AAEJ,OAAO,MAAM,iCAAkC,MAAM,iDAOjD,CAAA;AAEJ,OAAO,MAAM,mCAAoC,MAAM,sBAMnD,CAAA;AAQJ,OAAO,MAAM,4BAA6B,MAAM,YAAY,QAAQ;qBALjD,WAAW,6BAA6B,CAAC;uBACvC,WAAW,+BAA+B,CAAC;qBAC7C,WAAW,6BAA6B,CAAC;CAsB3D,CAAA;AC5CD,OAAO,MAAM,yBAA0B,MAAM,GAAG,SAAS,WAMxD,CAAA;AAWD,OAAO,MAAM,gCAAiC,MAAM,WAGnD,CAAA","sources":["packages/api/metrics/src/src/collectStartupMetrics.ts","packages/api/metrics/src/src/rpcMetricsFactory.ts","packages/api/metrics/src/src/rpcMetricsUtils.ts","packages/api/metrics/src/src/index.ts","packages/api/metrics/src/index.ts"],"sourcesContent":[null,null,null,null,"export * from './collectStartupMetrics'\nexport * from './rpcMetricsFactory'\nexport * from './rpcMetricsUtils'\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../../../../"}
package/dist/index.mjs ADDED
@@ -0,0 +1,129 @@
1
+ import {Gauge as $h0jCT$Gauge, Counter as $h0jCT$Counter, Histogram as $h0jCT$Histogram} from "prom-client";
2
+
3
+ function $parcel$export(e, n, v, s) {
4
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
5
+ }
6
+ var $47a0dd68c3055fb6$exports = {};
7
+
8
+ $parcel$export($47a0dd68c3055fb6$exports, "chainConfigFactory", () => $47a0dd68c3055fb6$export$3912f78fe5436ec0);
9
+ $parcel$export($47a0dd68c3055fb6$exports, "buildInfoFactory", () => $47a0dd68c3055fb6$export$c71d26d8163583e2);
10
+ $parcel$export($47a0dd68c3055fb6$exports, "collectStartupMetrics", () => $47a0dd68c3055fb6$export$ee77f8ab9c4e7a05);
11
+
12
+ const $47a0dd68c3055fb6$export$3912f78fe5436ec0 = (prefix)=>new (0, $h0jCT$Gauge)({
13
+ name: prefix + "chain_config_info",
14
+ help: "Default network and supported networks",
15
+ labelNames: [
16
+ "default_chain",
17
+ "supported_chains"
18
+ ],
19
+ registers: []
20
+ });
21
+ const $47a0dd68c3055fb6$export$c71d26d8163583e2 = (prefix)=>new (0, $h0jCT$Gauge)({
22
+ name: prefix + "build_info",
23
+ help: "Version, branch and commit of the current build",
24
+ labelNames: [
25
+ "version",
26
+ "commit",
27
+ "branch"
28
+ ],
29
+ registers: []
30
+ });
31
+ const $47a0dd68c3055fb6$export$ee77f8ab9c4e7a05 = ({ prefix: prefix , registry: registry , defaultChain: defaultChain , supportedChains: supportedChains , version: version , commit: commit , branch: branch })=>{
32
+ const chainConfig = $47a0dd68c3055fb6$export$3912f78fe5436ec0(prefix);
33
+ registry.registerMetric(chainConfig);
34
+ chainConfig.labels({
35
+ default_chain: defaultChain
36
+ }).set(1);
37
+ supportedChains.forEach((chain)=>{
38
+ chainConfig.labels({
39
+ supported_chains: chain
40
+ }).set(1);
41
+ });
42
+ const buildInfo = $47a0dd68c3055fb6$export$c71d26d8163583e2(prefix);
43
+ registry.registerMetric(buildInfo);
44
+ buildInfo.labels(version, commit, branch).set(1);
45
+ };
46
+
47
+
48
+ var $7dd20a662708807a$exports = {};
49
+
50
+ $parcel$export($7dd20a662708807a$exports, "rpcRequestCountFactory", () => $7dd20a662708807a$export$ef58728a4fe523fc);
51
+ $parcel$export($7dd20a662708807a$exports, "rpcResponseTimeFactory", () => $7dd20a662708807a$export$43dc308e64f0b05d);
52
+ $parcel$export($7dd20a662708807a$exports, "rpcRequestMethodsFactory", () => $7dd20a662708807a$export$2178a8960eec76eb);
53
+ $parcel$export($7dd20a662708807a$exports, "rpcMetricsFactory", () => $7dd20a662708807a$export$d6ea70e849062acd);
54
+
55
+ const $7dd20a662708807a$export$ef58728a4fe523fc = (prefix)=>new (0, $h0jCT$Counter)({
56
+ name: prefix + "rpc_service_request_count",
57
+ help: "RPC service request count",
58
+ labelNames: [
59
+ "chainId",
60
+ "provider"
61
+ ],
62
+ registers: []
63
+ });
64
+ const $7dd20a662708807a$export$43dc308e64f0b05d = (prefix)=>new (0, $h0jCT$Histogram)({
65
+ name: prefix + "rpc_service_response_time",
66
+ help: "RPC service response time seconds",
67
+ buckets: [
68
+ 0.1,
69
+ 0.2,
70
+ 0.3,
71
+ 0.6,
72
+ 1,
73
+ 1.5,
74
+ 2,
75
+ 5
76
+ ],
77
+ labelNames: [
78
+ "chainId",
79
+ "provider",
80
+ "status"
81
+ ],
82
+ registers: []
83
+ });
84
+ const $7dd20a662708807a$export$2178a8960eec76eb = (prefix)=>new (0, $h0jCT$Counter)({
85
+ name: prefix + "rpc_service_request_methods",
86
+ help: "RPC service request methods",
87
+ labelNames: [
88
+ "method"
89
+ ],
90
+ registers: []
91
+ });
92
+ let $7dd20a662708807a$var$cache = null;
93
+ const $7dd20a662708807a$export$d6ea70e849062acd = (prefix, registry)=>{
94
+ if ($7dd20a662708807a$var$cache == null) {
95
+ const rpcRequestCount = $7dd20a662708807a$export$ef58728a4fe523fc(prefix);
96
+ registry.registerMetric(rpcRequestCount);
97
+ const rpcRequestMethods = $7dd20a662708807a$export$2178a8960eec76eb(prefix);
98
+ registry.registerMetric(rpcRequestMethods);
99
+ const rpcResponseTime = $7dd20a662708807a$export$43dc308e64f0b05d(prefix);
100
+ registry.registerMetric(rpcResponseTime);
101
+ $7dd20a662708807a$var$cache = {
102
+ rpcRequestCount: rpcRequestCount,
103
+ rpcRequestMethods: rpcRequestMethods,
104
+ rpcResponseTime: rpcResponseTime
105
+ };
106
+ }
107
+ return $7dd20a662708807a$var$cache;
108
+ };
109
+
110
+
111
+ var $5ad633af864064eb$exports = {};
112
+
113
+ $parcel$export($5ad633af864064eb$exports, "getStatusLabel", () => $5ad633af864064eb$export$489c297e3a119321);
114
+ $parcel$export($5ad633af864064eb$exports, "getProviderLabel", () => $5ad633af864064eb$export$f40021662990adcd);
115
+ const $5ad633af864064eb$export$489c297e3a119321 = (status)=>{
116
+ if (status == null || status < 100 || status > 600) return "xxx";
117
+ const majorStatus = Math.trunc(status / 100);
118
+ return `${majorStatus}xx`;
119
+ };
120
+ const $5ad633af864064eb$export$f40021662990adcd = (providerURL)=>{
121
+ const parsedUrl = new URL(providerURL);
122
+ return parsedUrl.hostname.split(".").slice(-2).join(".");
123
+ };
124
+
125
+
126
+
127
+
128
+ export {$47a0dd68c3055fb6$export$3912f78fe5436ec0 as chainConfigFactory, $47a0dd68c3055fb6$export$c71d26d8163583e2 as buildInfoFactory, $47a0dd68c3055fb6$export$ee77f8ab9c4e7a05 as collectStartupMetrics, $7dd20a662708807a$export$ef58728a4fe523fc as rpcRequestCountFactory, $7dd20a662708807a$export$43dc308e64f0b05d as rpcResponseTimeFactory, $7dd20a662708807a$export$2178a8960eec76eb as rpcRequestMethodsFactory, $7dd20a662708807a$export$d6ea70e849062acd as rpcMetricsFactory, $5ad633af864064eb$export$489c297e3a119321 as getStatusLabel, $5ad633af864064eb$export$f40021662990adcd as getProviderLabel};
129
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["packages/api/metrics/src/index.ts","packages/api/metrics/src/collectStartupMetrics.ts","packages/api/metrics/src/rpcMetricsFactory.ts","packages/api/metrics/src/rpcMetricsUtils.ts"],"sourcesContent":["export * from './collectStartupMetrics'\nexport * from './rpcMetricsFactory'\nexport * from './rpcMetricsUtils'\n","import { Gauge, Registry } from 'prom-client'\n\nexport const chainConfigFactory = (prefix: string) =>\n new Gauge({\n name: prefix + 'chain_config_info',\n help: 'Default network and supported networks',\n labelNames: ['default_chain', 'supported_chains'],\n registers: [],\n })\n\nexport const buildInfoFactory = (prefix: string) =>\n new Gauge({\n name: prefix + 'build_info',\n help: 'Version, branch and commit of the current build',\n labelNames: ['version', 'commit', 'branch'],\n registers: [],\n })\n\nexport type TrackStartupMetricsParameters = {\n prefix: string\n registry: Registry\n defaultChain: string\n supportedChains: string[]\n version: string\n commit: string\n branch: string\n}\nexport const collectStartupMetrics = ({\n prefix,\n registry,\n defaultChain,\n supportedChains,\n version,\n commit,\n branch,\n}: TrackStartupMetricsParameters) => {\n const chainConfig = chainConfigFactory(prefix)\n registry.registerMetric(chainConfig)\n chainConfig.labels({ default_chain: defaultChain }).set(1)\n supportedChains.forEach((chain) => {\n chainConfig.labels({ supported_chains: chain }).set(1)\n })\n\n const buildInfo = buildInfoFactory(prefix)\n registry.registerMetric(buildInfo)\n buildInfo.labels(version, commit, branch).set(1)\n}\n","import { Counter, Histogram, Registry } from 'prom-client'\n\nexport const rpcRequestCountFactory = (prefix: string) =>\n new Counter({\n name: prefix + 'rpc_service_request_count',\n help: 'RPC service request count',\n labelNames: ['chainId', 'provider'],\n registers: [],\n })\n\nexport const rpcResponseTimeFactory = (prefix: string) =>\n new Histogram({\n name: prefix + 'rpc_service_response_time',\n help: 'RPC service response time seconds',\n buckets: [0.1, 0.2, 0.3, 0.6, 1, 1.5, 2, 5],\n labelNames: ['chainId', 'provider', 'status'],\n registers: [],\n })\n\nexport const rpcRequestMethodsFactory = (prefix: string) =>\n new Counter({\n name: prefix + 'rpc_service_request_methods',\n help: 'RPC service request methods',\n labelNames: ['method'],\n registers: [],\n })\n\nlet cache: {\n rpcRequestCount: ReturnType<typeof rpcRequestCountFactory>\n rpcRequestMethods: ReturnType<typeof rpcRequestMethodsFactory>\n rpcResponseTime: ReturnType<typeof rpcResponseTimeFactory>\n} | null = null\n\nexport const rpcMetricsFactory = (prefix: string, registry: Registry) => {\n if (cache == null) {\n const rpcRequestCount = rpcRequestCountFactory(prefix)\n registry.registerMetric(rpcRequestCount)\n\n const rpcRequestMethods = rpcRequestMethodsFactory(prefix)\n registry.registerMetric(rpcRequestMethods)\n\n const rpcResponseTime = rpcResponseTimeFactory(prefix)\n registry.registerMetric(rpcResponseTime)\n\n cache = {\n rpcRequestCount,\n rpcRequestMethods,\n rpcResponseTime,\n }\n }\n\n return cache\n}\n","/*\n * We need to limit how many statuses reported to prometheus, because of cardinality\n *\n * Examples:\n * getStatusLabel(200) => '2xx'\n * getStatusLabel(404) => '4xx'\n * getStatusLabel(undefined) => 'xxx'\n */\nexport const getStatusLabel = (status: number | undefined) => {\n if (status == null || status < 100 || status > 600) {\n return 'xxx'\n }\n const majorStatus = Math.trunc(status / 100)\n return `${majorStatus}xx`\n}\n\n/*\n * We also need to limit cardinality of provider labels reported to prometheus, but here\n * we don't need to check if provider is included in the list of available providers,\n * because we get provider from this list itself, but not from user.\n *\n * Examples:\n * getProviderLabel('https://eth-mainnet.alchemyapi.io/v2/...') => 'alchemyapi.io'\n * getProviderLabel('https://goerli.infura.io/v3/...') => 'infura.io'\n */\nexport const getProviderLabel = (providerURL: string) => {\n const parsedUrl = new URL(providerURL)\n return parsedUrl.hostname.split('.').slice(-2).join('.')\n}\n"],"names":[],"version":3,"file":"index.mjs.map","sourceRoot":"../../../../"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@lidofinance/api-metrics",
3
+ "description": "Common api metrics",
4
+ "repository": "git@github.com:lidofinance/lido-ui-blocks.git",
5
+ "license": "MIT",
6
+ "version": "0.0.2",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "engines": {
11
+ "node": ">= 16"
12
+ },
13
+ "source": "./src/index.ts",
14
+ "main": "dist/index.cjs",
15
+ "module": "dist/index.mjs",
16
+ "types": "dist/index.d.ts",
17
+ "scripts": {
18
+ "build": "parcel build",
19
+ "format": "prettier --check src",
20
+ "format:fix": "yarn format --write",
21
+ "types": "tsc --noEmit"
22
+ },
23
+ "peerDependencies": {
24
+ "prom-client": "^14.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@lidofinance/config-prettier": "0.0.1",
28
+ "prom-client": "^14.0.0"
29
+ }
30
+ }