@lidofinance/api-metrics 0.58.0 → 0.59.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 +23 -12
- package/dist/index.cjs +15 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +16 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -13,16 +13,16 @@ Utils to work with common API metrics
|
|
|
13
13
|
Just call it in the same place where you call `collectDefaultMetrics`.
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
|
-
import { Registry, collectDefaultMetrics } from 'prom-client'
|
|
17
|
-
import getConfig from 'next/config'
|
|
18
|
-
import { METRICS_PREFIX } from 'config'
|
|
19
|
-
import buildInfoJson from 'build-info.json'
|
|
20
|
-
import { collectStartupMetrics } from '@lidofinance/api-metrics'
|
|
16
|
+
import { Registry, collectDefaultMetrics } from 'prom-client'
|
|
17
|
+
import getConfig from 'next/config'
|
|
18
|
+
import { METRICS_PREFIX } from 'config'
|
|
19
|
+
import buildInfoJson from 'build-info.json'
|
|
20
|
+
import { collectStartupMetrics } from '@lidofinance/api-metrics'
|
|
21
21
|
|
|
22
|
-
const { publicRuntimeConfig } = getConfig()
|
|
23
|
-
const { defaultChain, supportedChains } = publicRuntimeConfig
|
|
22
|
+
const { publicRuntimeConfig } = getConfig()
|
|
23
|
+
const { defaultChain, supportedChains } = publicRuntimeConfig
|
|
24
24
|
|
|
25
|
-
export const registry = new Registry()
|
|
25
|
+
export const registry = new Registry()
|
|
26
26
|
|
|
27
27
|
collectStartupMetrics({
|
|
28
28
|
prefix: METRICS_PREFIX,
|
|
@@ -32,9 +32,9 @@ collectStartupMetrics({
|
|
|
32
32
|
version: process.env.npm_package_version ?? 'unversioned',
|
|
33
33
|
commit: buildInfoJson.commit,
|
|
34
34
|
branch: buildInfoJson.branch,
|
|
35
|
-
})
|
|
35
|
+
})
|
|
36
36
|
|
|
37
|
-
collectDefaultMetrics({ prefix: METRICS_PREFIX, register: registry })
|
|
37
|
+
collectDefaultMetrics({ prefix: METRICS_PREFIX, register: registry })
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
### rpcMetricsFactory
|
|
@@ -43,10 +43,21 @@ It's mostly internal util for [@lidofinance/api-rpc](https://www.npmjs.com/packa
|
|
|
43
43
|
and [@lidofinance/eth-api-providers](https://www.npmjs.com/package/@lidofinance/eth-api-providers), but you should use
|
|
44
44
|
it if you use RPC requests in some other way.
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
Exported metrics:
|
|
47
|
+
|
|
48
|
+
- `rpc_service_request` (Counter) — labels `chainId`, `provider`. Incremented when a request starts.
|
|
49
|
+
- `rpc_service_request_methods` (Counter) — labels `method`. One increment per JSON-RPC method in the batch.
|
|
50
|
+
- `rpc_service_response` (Histogram) — labels `chainId`, `provider`, `status`. Observes response latency for every attempt, including thrown requests (recorded under `status='xxx'`).
|
|
51
|
+
- `rpc_service_response_result` (Counter) — labels `chainId`, `provider`, `result` (`'success' | 'failure'`). Use this for explicit success/failure rate queries without touching the histogram's label set.
|
|
52
|
+
|
|
53
|
+
Dashboard tips:
|
|
54
|
+
|
|
55
|
+
- For **latency** (p50/p95/p99), filter the histogram to successful responses so long timeouts don't skew the distribution: `histogram_quantile(0.95, sum by (le, provider) (rate(rpc_service_response_bucket{status!="xxx"}[5m])))`.
|
|
56
|
+
- For **availability** / success rate, use the result counter: `rate(rpc_service_response_result_total{result="success"}[5m]) / rate(rpc_service_response_result_total[5m])`.
|
|
57
|
+
- A thrown request (e.g. connect timeout) still observes the histogram under `status='xxx'` so failures stay visible, but including it in latency queries will push p99 toward the timeout duration.
|
|
47
58
|
|
|
48
59
|
### rpcMetricsUtils
|
|
49
60
|
|
|
50
61
|
There is a list of utils, which helps to reduce [cardinality](https://www.robustperception.io/cardinality-is-key/),
|
|
51
62
|
e.g. you should collect '2xx' instead of '200', '201', ... and other HTTP response statuses, because in most cases it
|
|
52
|
-
doesn't matter.
|
|
63
|
+
doesn't matter.
|
package/dist/index.cjs
CHANGED
|
@@ -66,6 +66,7 @@ var $c4da43e18c6d237f$exports = {};
|
|
|
66
66
|
$parcel$export($c4da43e18c6d237f$exports, "rpcRequestCountFactory", () => $c4da43e18c6d237f$export$ef58728a4fe523fc);
|
|
67
67
|
$parcel$export($c4da43e18c6d237f$exports, "rpcResponseTimeFactory", () => $c4da43e18c6d237f$export$43dc308e64f0b05d);
|
|
68
68
|
$parcel$export($c4da43e18c6d237f$exports, "rpcRequestMethodsFactory", () => $c4da43e18c6d237f$export$2178a8960eec76eb);
|
|
69
|
+
$parcel$export($c4da43e18c6d237f$exports, "rpcResponseResultCountFactory", () => $c4da43e18c6d237f$export$cd44bf8919125773);
|
|
69
70
|
$parcel$export($c4da43e18c6d237f$exports, "rpcMetricsFactory", () => $c4da43e18c6d237f$export$d6ea70e849062acd);
|
|
70
71
|
|
|
71
72
|
const $c4da43e18c6d237f$export$ef58728a4fe523fc = (prefix)=>new (0, $7tm02$promclient.Counter)({
|
|
@@ -105,6 +106,16 @@ const $c4da43e18c6d237f$export$2178a8960eec76eb = (prefix)=>new (0, $7tm02$promc
|
|
|
105
106
|
],
|
|
106
107
|
registers: []
|
|
107
108
|
});
|
|
109
|
+
const $c4da43e18c6d237f$export$cd44bf8919125773 = (prefix)=>new (0, $7tm02$promclient.Counter)({
|
|
110
|
+
name: prefix + "rpc_service_response_result",
|
|
111
|
+
help: "RPC service response result (success/failure) count",
|
|
112
|
+
labelNames: [
|
|
113
|
+
"chainId",
|
|
114
|
+
"provider",
|
|
115
|
+
"result"
|
|
116
|
+
],
|
|
117
|
+
registers: []
|
|
118
|
+
});
|
|
108
119
|
let $c4da43e18c6d237f$var$cache = null;
|
|
109
120
|
const $c4da43e18c6d237f$export$d6ea70e849062acd = (prefix, registry)=>{
|
|
110
121
|
if ($c4da43e18c6d237f$var$cache == null) {
|
|
@@ -114,10 +125,13 @@ const $c4da43e18c6d237f$export$d6ea70e849062acd = (prefix, registry)=>{
|
|
|
114
125
|
registry.registerMetric(rpcRequestMethods);
|
|
115
126
|
const rpcResponseTime = $c4da43e18c6d237f$export$43dc308e64f0b05d(prefix);
|
|
116
127
|
registry.registerMetric(rpcResponseTime);
|
|
128
|
+
const rpcResponseResultCount = $c4da43e18c6d237f$export$cd44bf8919125773(prefix);
|
|
129
|
+
registry.registerMetric(rpcResponseResultCount);
|
|
117
130
|
$c4da43e18c6d237f$var$cache = {
|
|
118
131
|
rpcRequestCount: rpcRequestCount,
|
|
119
132
|
rpcRequestMethods: rpcRequestMethods,
|
|
120
|
-
rpcResponseTime: rpcResponseTime
|
|
133
|
+
rpcResponseTime: rpcResponseTime,
|
|
134
|
+
rpcResponseResultCount: rpcResponseResultCount
|
|
121
135
|
};
|
|
122
136
|
}
|
|
123
137
|
return $c4da43e18c6d237f$var$cache;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;ACEO,MAAM,4CAAqB,CAAC,SACjC,IAAI,CAAA,GAAA,uBAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAiB;SAAmB;QACjD,WAAW,EAAE;IACf;AAEK,MAAM,4CAAmB,CAAC,SAC/B,IAAI,CAAA,GAAA,uBAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;YAAU;SAAS;QAC3C,WAAW,EAAE;IACf;AAWK,MAAM,4CAAwB,CAAC,UACpC,MAAM,YACN,QAAQ,gBACR,YAAY,mBACZ,eAAe,WACf,OAAO,UACP,MAAM,UACN,MAAM,EACwB;IAC9B,MAAM,cAAc,0CAAmB;IACvC,SAAS,eAAe;IACxB,YAAY,OAAO;QAAE,eAAe;IAAa,GAAG,IAAI;IACxD,gBAAgB,QAAQ,CAAC;QACvB,YAAY,OAAO;YAAE,kBAAkB;QAAM,GAAG,IAAI;IACtD;IAEA,MAAM,YAAY,0CAAiB;IACnC,SAAS,eAAe;IACxB,UAAU,OAAO,SAAS,QAAQ,QAAQ,IAAI;AAChD
|
|
1
|
+
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;ACEO,MAAM,4CAAqB,CAAC,SACjC,IAAI,CAAA,GAAA,uBAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAiB;SAAmB;QACjD,WAAW,EAAE;IACf;AAEK,MAAM,4CAAmB,CAAC,SAC/B,IAAI,CAAA,GAAA,uBAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;YAAU;SAAS;QAC3C,WAAW,EAAE;IACf;AAWK,MAAM,4CAAwB,CAAC,UACpC,MAAM,YACN,QAAQ,gBACR,YAAY,mBACZ,eAAe,WACf,OAAO,UACP,MAAM,UACN,MAAM,EACwB;IAC9B,MAAM,cAAc,0CAAmB;IACvC,SAAS,eAAe;IACxB,YAAY,OAAO;QAAE,eAAe;IAAa,GAAG,IAAI;IACxD,gBAAgB,QAAQ,CAAC;QACvB,YAAY,OAAO;YAAE,kBAAkB;QAAM,GAAG,IAAI;IACtD;IAEA,MAAM,YAAY,0CAAiB;IACnC,SAAS,eAAe;IACxB,UAAU,OAAO,SAAS,QAAQ,QAAQ,IAAI;AAChD;;;;;;;;;;;AC5CO,MAAM,4CAAyB,CAAC,SACrC,IAAI,CAAA,GAAA,yBAAM,EAAE;QACV,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;SAAW;QACnC,WAAW,EAAE;IACf;AAEK,MAAM,4CAAyB,CAAC,SACrC,IAAI,CAAA,GAAA,2BAAQ,EAAE;QACZ,MAAM,SAAS;QACf,MAAM;QACN,SAAS;YAAC;YAAK;YAAK;YAAK;YAAK;YAAG;YAAK;YAAG;SAAE;QAC3C,YAAY;YAAC;YAAW;YAAY;SAAS;QAC7C,WAAW,EAAE;IACf;AAEK,MAAM,4CAA2B,CAAC,SACvC,IAAI,CAAA,GAAA,yBAAM,EAAE;QACV,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;SAAS;QACtB,WAAW,EAAE;IACf;AAEK,MAAM,4CAAgC,CAAC,SAC5C,IAAI,CAAA,GAAA,yBAAM,EAAE;QACV,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;YAAY;SAAS;QAC7C,WAAW,EAAE;IACf;AAEF,IAAI,8BAKO;AAEJ,MAAM,4CAAoB,CAAC,QAAgB;IAChD,IAAI,+BAAS,MAAM;QACjB,MAAM,kBAAkB,0CAAuB;QAC/C,SAAS,eAAe;QAExB,MAAM,oBAAoB,0CAAyB;QACnD,SAAS,eAAe;QAExB,MAAM,kBAAkB,0CAAuB;QAC/C,SAAS,eAAe;QAExB,MAAM,yBAAyB,0CAA8B;QAC7D,SAAS,eAAe;QAExB,8BAAQ;6BACN;+BACA;6BACA;oCACA;QACF;IACF;IAEA,OAAO;AACT;;;;;;;ACjEA;;;;;;;CAOC,GACM,MAAM,4CAAiB,CAAC;IAC7B,IAAI,UAAU,QAAQ,SAAS,OAAO,SAAS,KAC7C,OAAO;IAET,MAAM,cAAc,KAAK,MAAM,SAAS;IACxC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;AAC3B;AAWO,MAAM,4CAAmB,CAAC;IAC/B,MAAM,YAAY,IAAI,IAAI;IAC1B,OAAO,UAAU,SAAS,MAAM,KAAK,MAAM,IAAI,KAAK;AACtD;","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',\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',\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\nexport const rpcResponseResultCountFactory = (prefix: string) =>\n new Counter({\n name: prefix + 'rpc_service_response_result',\n help: 'RPC service response result (success/failure) count',\n labelNames: ['chainId', 'provider', 'result'],\n registers: [],\n })\n\nlet cache: {\n rpcRequestCount: ReturnType<typeof rpcRequestCountFactory>\n rpcRequestMethods: ReturnType<typeof rpcRequestMethodsFactory>\n rpcResponseTime: ReturnType<typeof rpcResponseTimeFactory>\n rpcResponseResultCount: ReturnType<typeof rpcResponseResultCountFactory>\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 const rpcResponseResultCount = rpcResponseResultCountFactory(prefix)\n registry.registerMetric(rpcResponseResultCount)\n\n cache = {\n rpcRequestCount,\n rpcRequestMethods,\n rpcResponseTime,\n rpcResponseResultCount,\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":"../../../../"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,10 +14,12 @@ export const collectStartupMetrics: ({ prefix, registry, defaultChain, supported
|
|
|
14
14
|
export const rpcRequestCountFactory: (prefix: string) => Counter<"chainId" | "provider">;
|
|
15
15
|
export const rpcResponseTimeFactory: (prefix: string) => Histogram<"chainId" | "provider" | "status">;
|
|
16
16
|
export const rpcRequestMethodsFactory: (prefix: string) => Counter<"method">;
|
|
17
|
+
export const rpcResponseResultCountFactory: (prefix: string) => Counter<"chainId" | "provider" | "result">;
|
|
17
18
|
export const rpcMetricsFactory: (prefix: string, registry: Registry) => {
|
|
18
19
|
rpcRequestCount: ReturnType<typeof rpcRequestCountFactory>;
|
|
19
20
|
rpcRequestMethods: ReturnType<typeof rpcRequestMethodsFactory>;
|
|
20
21
|
rpcResponseTime: ReturnType<typeof rpcResponseTimeFactory>;
|
|
22
|
+
rpcResponseResultCount: ReturnType<typeof rpcResponseResultCountFactory>;
|
|
21
23
|
};
|
|
22
24
|
export const getStatusLabel: (status: number | undefined) => string;
|
|
23
25
|
export const getProviderLabel: (providerURL: string) => string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAEJ,OAAO,MAAM,wCAAyC,MAAM,+CAMxD,CAAA;AASJ,OAAO,MAAM,4BAA6B,MAAM,YAAY,QAAQ;qBANjD,WAAW,6BAA6B,CAAC;uBACvC,WAAW,+BAA+B,CAAC;qBAC7C,WAAW,6BAA6B,CAAC;4BAClC,WAAW,oCAAoC,CAAC;CA0BzE,CAAA;ACzDD,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
CHANGED
|
@@ -50,6 +50,7 @@ var $7dd20a662708807a$exports = {};
|
|
|
50
50
|
$parcel$export($7dd20a662708807a$exports, "rpcRequestCountFactory", () => $7dd20a662708807a$export$ef58728a4fe523fc);
|
|
51
51
|
$parcel$export($7dd20a662708807a$exports, "rpcResponseTimeFactory", () => $7dd20a662708807a$export$43dc308e64f0b05d);
|
|
52
52
|
$parcel$export($7dd20a662708807a$exports, "rpcRequestMethodsFactory", () => $7dd20a662708807a$export$2178a8960eec76eb);
|
|
53
|
+
$parcel$export($7dd20a662708807a$exports, "rpcResponseResultCountFactory", () => $7dd20a662708807a$export$cd44bf8919125773);
|
|
53
54
|
$parcel$export($7dd20a662708807a$exports, "rpcMetricsFactory", () => $7dd20a662708807a$export$d6ea70e849062acd);
|
|
54
55
|
|
|
55
56
|
const $7dd20a662708807a$export$ef58728a4fe523fc = (prefix)=>new (0, $h0jCT$Counter)({
|
|
@@ -89,6 +90,16 @@ const $7dd20a662708807a$export$2178a8960eec76eb = (prefix)=>new (0, $h0jCT$Count
|
|
|
89
90
|
],
|
|
90
91
|
registers: []
|
|
91
92
|
});
|
|
93
|
+
const $7dd20a662708807a$export$cd44bf8919125773 = (prefix)=>new (0, $h0jCT$Counter)({
|
|
94
|
+
name: prefix + "rpc_service_response_result",
|
|
95
|
+
help: "RPC service response result (success/failure) count",
|
|
96
|
+
labelNames: [
|
|
97
|
+
"chainId",
|
|
98
|
+
"provider",
|
|
99
|
+
"result"
|
|
100
|
+
],
|
|
101
|
+
registers: []
|
|
102
|
+
});
|
|
92
103
|
let $7dd20a662708807a$var$cache = null;
|
|
93
104
|
const $7dd20a662708807a$export$d6ea70e849062acd = (prefix, registry)=>{
|
|
94
105
|
if ($7dd20a662708807a$var$cache == null) {
|
|
@@ -98,10 +109,13 @@ const $7dd20a662708807a$export$d6ea70e849062acd = (prefix, registry)=>{
|
|
|
98
109
|
registry.registerMetric(rpcRequestMethods);
|
|
99
110
|
const rpcResponseTime = $7dd20a662708807a$export$43dc308e64f0b05d(prefix);
|
|
100
111
|
registry.registerMetric(rpcResponseTime);
|
|
112
|
+
const rpcResponseResultCount = $7dd20a662708807a$export$cd44bf8919125773(prefix);
|
|
113
|
+
registry.registerMetric(rpcResponseResultCount);
|
|
101
114
|
$7dd20a662708807a$var$cache = {
|
|
102
115
|
rpcRequestCount: rpcRequestCount,
|
|
103
116
|
rpcRequestMethods: rpcRequestMethods,
|
|
104
|
-
rpcResponseTime: rpcResponseTime
|
|
117
|
+
rpcResponseTime: rpcResponseTime,
|
|
118
|
+
rpcResponseResultCount: rpcResponseResultCount
|
|
105
119
|
};
|
|
106
120
|
}
|
|
107
121
|
return $7dd20a662708807a$var$cache;
|
|
@@ -132,5 +146,5 @@ const $5ad633af864064eb$export$f40021662990adcd = (providerURL)=>{
|
|
|
132
146
|
|
|
133
147
|
|
|
134
148
|
|
|
135
|
-
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};
|
|
149
|
+
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$cd44bf8919125773 as rpcResponseResultCountFactory, $7dd20a662708807a$export$d6ea70e849062acd as rpcMetricsFactory, $5ad633af864064eb$export$489c297e3a119321 as getStatusLabel, $5ad633af864064eb$export$f40021662990adcd as getProviderLabel};
|
|
136
150
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;;ACEO,MAAM,4CAAqB,CAAC,SACjC,IAAI,CAAA,GAAA,YAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAiB;SAAmB;QACjD,WAAW,EAAE;IACf;AAEK,MAAM,4CAAmB,CAAC,SAC/B,IAAI,CAAA,GAAA,YAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;YAAU;SAAS;QAC3C,WAAW,EAAE;IACf;AAWK,MAAM,4CAAwB,CAAC,UACpC,MAAM,YACN,QAAQ,gBACR,YAAY,mBACZ,eAAe,WACf,OAAO,UACP,MAAM,UACN,MAAM,EACwB;IAC9B,MAAM,cAAc,0CAAmB;IACvC,SAAS,eAAe;IACxB,YAAY,OAAO;QAAE,eAAe;IAAa,GAAG,IAAI;IACxD,gBAAgB,QAAQ,CAAC;QACvB,YAAY,OAAO;YAAE,kBAAkB;QAAM,GAAG,IAAI;IACtD;IAEA,MAAM,YAAY,0CAAiB;IACnC,SAAS,eAAe;IACxB,UAAU,OAAO,SAAS,QAAQ,QAAQ,IAAI;AAChD
|
|
1
|
+
{"mappings":";;;;;;;;;;;ACEO,MAAM,4CAAqB,CAAC,SACjC,IAAI,CAAA,GAAA,YAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAiB;SAAmB;QACjD,WAAW,EAAE;IACf;AAEK,MAAM,4CAAmB,CAAC,SAC/B,IAAI,CAAA,GAAA,YAAI,EAAE;QACR,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;YAAU;SAAS;QAC3C,WAAW,EAAE;IACf;AAWK,MAAM,4CAAwB,CAAC,UACpC,MAAM,YACN,QAAQ,gBACR,YAAY,mBACZ,eAAe,WACf,OAAO,UACP,MAAM,UACN,MAAM,EACwB;IAC9B,MAAM,cAAc,0CAAmB;IACvC,SAAS,eAAe;IACxB,YAAY,OAAO;QAAE,eAAe;IAAa,GAAG,IAAI;IACxD,gBAAgB,QAAQ,CAAC;QACvB,YAAY,OAAO;YAAE,kBAAkB;QAAM,GAAG,IAAI;IACtD;IAEA,MAAM,YAAY,0CAAiB;IACnC,SAAS,eAAe;IACxB,UAAU,OAAO,SAAS,QAAQ,QAAQ,IAAI;AAChD;;;;;;;;;;;AC5CO,MAAM,4CAAyB,CAAC,SACrC,IAAI,CAAA,GAAA,cAAM,EAAE;QACV,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;SAAW;QACnC,WAAW,EAAE;IACf;AAEK,MAAM,4CAAyB,CAAC,SACrC,IAAI,CAAA,GAAA,gBAAQ,EAAE;QACZ,MAAM,SAAS;QACf,MAAM;QACN,SAAS;YAAC;YAAK;YAAK;YAAK;YAAK;YAAG;YAAK;YAAG;SAAE;QAC3C,YAAY;YAAC;YAAW;YAAY;SAAS;QAC7C,WAAW,EAAE;IACf;AAEK,MAAM,4CAA2B,CAAC,SACvC,IAAI,CAAA,GAAA,cAAM,EAAE;QACV,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;SAAS;QACtB,WAAW,EAAE;IACf;AAEK,MAAM,4CAAgC,CAAC,SAC5C,IAAI,CAAA,GAAA,cAAM,EAAE;QACV,MAAM,SAAS;QACf,MAAM;QACN,YAAY;YAAC;YAAW;YAAY;SAAS;QAC7C,WAAW,EAAE;IACf;AAEF,IAAI,8BAKO;AAEJ,MAAM,4CAAoB,CAAC,QAAgB;IAChD,IAAI,+BAAS,MAAM;QACjB,MAAM,kBAAkB,0CAAuB;QAC/C,SAAS,eAAe;QAExB,MAAM,oBAAoB,0CAAyB;QACnD,SAAS,eAAe;QAExB,MAAM,kBAAkB,0CAAuB;QAC/C,SAAS,eAAe;QAExB,MAAM,yBAAyB,0CAA8B;QAC7D,SAAS,eAAe;QAExB,8BAAQ;6BACN;+BACA;6BACA;oCACA;QACF;IACF;IAEA,OAAO;AACT;;;;;;;ACjEA;;;;;;;CAOC,GACM,MAAM,4CAAiB,CAAC;IAC7B,IAAI,UAAU,QAAQ,SAAS,OAAO,SAAS,KAC7C,OAAO;IAET,MAAM,cAAc,KAAK,MAAM,SAAS;IACxC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;AAC3B;AAWO,MAAM,4CAAmB,CAAC;IAC/B,MAAM,YAAY,IAAI,IAAI;IAC1B,OAAO,UAAU,SAAS,MAAM,KAAK,MAAM,IAAI,KAAK;AACtD;","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',\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',\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\nexport const rpcResponseResultCountFactory = (prefix: string) =>\n new Counter({\n name: prefix + 'rpc_service_response_result',\n help: 'RPC service response result (success/failure) count',\n labelNames: ['chainId', 'provider', 'result'],\n registers: [],\n })\n\nlet cache: {\n rpcRequestCount: ReturnType<typeof rpcRequestCountFactory>\n rpcRequestMethods: ReturnType<typeof rpcRequestMethodsFactory>\n rpcResponseTime: ReturnType<typeof rpcResponseTimeFactory>\n rpcResponseResultCount: ReturnType<typeof rpcResponseResultCountFactory>\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 const rpcResponseResultCount = rpcResponseResultCountFactory(prefix)\n registry.registerMetric(rpcResponseResultCount)\n\n cache = {\n rpcRequestCount,\n rpcRequestMethods,\n rpcResponseTime,\n rpcResponseResultCount,\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
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"url": "https://github.com/lidofinance/warehouse/issues"
|
|
8
8
|
},
|
|
9
9
|
"license": "MIT",
|
|
10
|
-
"version": "0.
|
|
10
|
+
"version": "0.59.0",
|
|
11
11
|
"files": [
|
|
12
12
|
"dist"
|
|
13
13
|
],
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"prom-client": "^14.0.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@lidofinance/config-prettier": "~0.
|
|
37
|
+
"@lidofinance/config-prettier": "~0.59.0",
|
|
38
38
|
"prom-client": "^14.1.0"
|
|
39
39
|
},
|
|
40
40
|
"publishConfig": {
|