@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 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
- Take a look into the file itself to view exported metrics, it's quite simple.
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;
@@ -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;;;;;;;;;;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;AAEF,IAAI,8BAIO;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,8BAAQ;6BACN;+BACA;6BACA;QACF;IACF;IAEA,OAAO;AACT;;;;;;;ACpDA;;;;;;;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\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":"../../../../"}
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;
@@ -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;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":"../../../../"}
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
@@ -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;;;;;;;;;;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;AAEF,IAAI,8BAIO;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,8BAAQ;6BACN;+BACA;6BACA;QACF;IACF;IAEA,OAAO;AACT;;;;;;;ACpDA;;;;;;;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\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":"../../../../"}
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.58.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.58.0",
37
+ "@lidofinance/config-prettier": "~0.59.0",
38
38
  "prom-client": "^14.1.0"
39
39
  },
40
40
  "publishConfig": {