@chainlink/external-adapter-framework 0.0.22 → 0.0.26

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/cache/factory.js CHANGED
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
@@ -7,6 +30,7 @@ exports.CacheFactory = void 0;
7
30
  const ioredis_1 = __importDefault(require("ioredis"));
8
31
  const util_1 = require("../util");
9
32
  const local_1 = require("./local");
33
+ const cacheMetrics = __importStar(require("./metrics"));
10
34
  const redis_1 = require("./redis");
11
35
  const logger = (0, util_1.makeLogger)('CacheFactory');
12
36
  class CacheFactory {
@@ -24,6 +48,9 @@ class CacheFactory {
24
48
  path: config.CACHE_REDIS_PATH,
25
49
  timeout: config.CACHE_REDIS_TIMEOUT,
26
50
  });
51
+ redis.on('connect', () => {
52
+ cacheMetrics.redisConnectionsOpen.inc();
53
+ });
27
54
  return new redis_1.RedisCache(redis);
28
55
  }
29
56
  }
package/cache/index.js CHANGED
@@ -10,12 +10,25 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
13
25
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
26
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
27
  };
16
28
  Object.defineProperty(exports, "__esModule", { value: true });
17
29
  exports.buildCacheMiddleware = exports.pollResponseFromCache = exports.calculateKey = exports.calculateFeedId = exports.calculateCacheKey = void 0;
18
30
  const util_1 = require("../util");
31
+ const cacheMetrics = __importStar(require("./metrics"));
19
32
  __exportStar(require("./local"), exports);
20
33
  __exportStar(require("./redis"), exports);
21
34
  __exportStar(require("./factory"), exports);
@@ -144,8 +157,10 @@ const buildCacheMiddleware = (adapter) => async (req, res) => {
144
157
  if (response) {
145
158
  logger.debug('Found response from cache, sending that');
146
159
  if (adapter.config.METRICS_ENABLED && adapter.config.EXPERIMENTAL_METRICS_ENABLED) {
160
+ const label = cacheMetrics.cacheMetricsLabel(req.requestContext.cacheKey, req.requestContext.meta?.metrics?.feedId || 'N/A', adapter.config.CACHE_TYPE);
147
161
  // Record cache staleness and cache get count and value
148
- calculateStaleness(response.maxAge, adapter.config.CACHE_MAX_AGE);
162
+ const staleness = calculateStaleness(response.maxAge, adapter.config.CACHE_MAX_AGE);
163
+ cacheMetrics.cacheGet(label, response.result, staleness);
149
164
  req.requestContext.meta = {
150
165
  ...req.requestContext.meta,
151
166
  metrics: { ...req.requestContext.meta?.metrics, cacheHit: true },
package/cache/local.js CHANGED
@@ -1,7 +1,31 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.LocalCache = void 0;
4
27
  const util_1 = require("../util");
28
+ const cacheMetrics = __importStar(require("./metrics"));
5
29
  const logger = (0, util_1.makeLogger)('LocalCache');
6
30
  /**
7
31
  * Local implementation of a Cache. It uses a simple js Object, storing entries with both
@@ -45,6 +69,8 @@ class LocalCache {
45
69
  const feedId = value.meta?.metrics?.feedId;
46
70
  if (feedId) {
47
71
  // Record cache set count, max age, and staleness (set to 0 for cache set)
72
+ const label = cacheMetrics.cacheMetricsLabel(key, feedId, cacheMetrics.CacheTypes.Local);
73
+ cacheMetrics.cacheSet(label, ttl);
48
74
  }
49
75
  }
50
76
  async setMany(entries, ttl) {
package/cache/redis.js CHANGED
@@ -1,7 +1,31 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.RedisCache = void 0;
4
27
  const util_1 = require("../util");
28
+ const cacheMetrics = __importStar(require("./metrics"));
5
29
  const logger = (0, util_1.makeLogger)('RedisCache');
6
30
  /**
7
31
  * Redis implementation of a Cache. It uses a simple js Object, storing entries with both
@@ -16,6 +40,10 @@ class RedisCache {
16
40
  async get(key) {
17
41
  logger.trace(`Getting key ${key}`);
18
42
  const value = await this.client.get(key);
43
+ // Record get command sent to Redis
44
+ cacheMetrics.redisCommandsSentCount
45
+ .labels({ status: cacheMetrics.CMD_SENT_STATUS.SUCCESS, function_name: 'get' })
46
+ .inc();
19
47
  if (!value) {
20
48
  logger.debug(`No entry in redis cache for key "${key}", returning undefined`);
21
49
  return undefined;
@@ -25,6 +53,10 @@ class RedisCache {
25
53
  async delete(key) {
26
54
  logger.trace(`Deleting key ${key}`);
27
55
  await this.client.del(key);
56
+ // Record delete command sent to Redis
57
+ cacheMetrics.redisCommandsSentCount
58
+ .labels({ status: cacheMetrics.CMD_SENT_STATUS.SUCCESS, function_name: 'delete' })
59
+ .inc();
28
60
  }
29
61
  async set(key, value, ttl) {
30
62
  logger.trace(`Setting key ${key}`);
@@ -33,7 +65,13 @@ class RedisCache {
33
65
  const feedId = value.meta?.metrics?.feedId;
34
66
  if (feedId) {
35
67
  // Record cache set count, max age, and staleness (set to 0 for cache set)
68
+ const label = cacheMetrics.cacheMetricsLabel(key, feedId, cacheMetrics.CacheTypes.Redis);
69
+ cacheMetrics.cacheSet(label, ttl);
36
70
  }
71
+ // Record set command sent to Redis
72
+ cacheMetrics.redisCommandsSentCount
73
+ .labels({ status: cacheMetrics.CMD_SENT_STATUS.SUCCESS, function_name: 'set' })
74
+ .inc();
37
75
  }
38
76
  async setMany(entries, ttl) {
39
77
  logger.trace(`Setting a bunch of keys`);
@@ -48,8 +86,15 @@ class RedisCache {
48
86
  // Only record metrics if feed Id is present, otherwise assuming value is not adapter response to record
49
87
  const feedId = entry.value.meta?.metrics?.feedId;
50
88
  if (feedId) {
89
+ // Record cache set count, max age, and staleness (set to 0 for cache set)
90
+ const label = cacheMetrics.cacheMetricsLabel(entry.key, feedId, cacheMetrics.CacheTypes.Redis);
91
+ cacheMetrics.cacheSet(label, ttl);
51
92
  }
52
93
  }
94
+ // Record setMany command sent to Redis
95
+ cacheMetrics.redisCommandsSentCount
96
+ .labels({ status: cacheMetrics.CMD_SENT_STATUS.SUCCESS, function_name: 'exec' })
97
+ .inc();
53
98
  }
54
99
  }
55
100
  exports.RedisCache = RedisCache;
package/config/index.d.ts CHANGED
@@ -159,7 +159,7 @@ export declare const BaseSettings: {
159
159
  readonly description: "Maximum amount of characters that the common part of the cache key or feed ID can have";
160
160
  readonly type: "number";
161
161
  readonly default: 300;
162
- readonly validate: (value?: number) => "MAX_COMMON_KEY_SIZE must be a number between 150 and 500" | undefined;
162
+ readonly validate: (value?: number | undefined) => "MAX_COMMON_KEY_SIZE must be a number between 150 and 500" | undefined;
163
163
  };
164
164
  readonly REST_TRANSPORT_MAX_RATE_LIMIT_RETRIES: {
165
165
  readonly description: "Maximum amount of times the Rest Transport will attempt to set up a request when blocked by the rate limiter";
@@ -22,6 +22,6 @@ interface ResultEntry {
22
22
  value: number;
23
23
  params: AdapterRequestParams;
24
24
  }
25
- export declare const buildGlobalRequestBody: (apiKey?: string) => AxiosRequestConfig<never>;
25
+ export declare const buildGlobalRequestBody: (apiKey?: string | undefined) => AxiosRequestConfig<never>;
26
26
  export declare const constructEntry: (res: AxiosResponse<ProviderResponseBody>, requestPayload: AdapterRequestParams, resultPath: 'total_market_cap' | 'market_cap_percentage') => ResultEntry | undefined;
27
27
  export {};
@@ -1,4 +1,4 @@
1
1
  /// <reference types="node" />
2
2
  import { Adapter } from '../../../../src/adapter';
3
3
  export declare const adapter: Adapter<import("../../../config").SettingsMap>;
4
- export declare const server: () => Promise<import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault> | undefined>;
4
+ export declare const server: () => Promise<import("fastify").FastifyInstance<import("http").Server, import("http").IncomingMessage, import("http").ServerResponse, import("fastify").FastifyLoggerInstance> | undefined>;
package/index.d.ts CHANGED
@@ -8,4 +8,4 @@ import { Adapter, AdapterDependencies } from './adapter';
8
8
  * @param dependencies - an optional object with adapter dependencies to inject
9
9
  * @returns a Promise that resolves to the http.Server listening for connections
10
10
  */
11
- export declare const expose: (adapter: Adapter, dependencies?: Partial<AdapterDependencies>) => Promise<FastifyInstance | undefined>;
11
+ export declare const expose: (adapter: Adapter, dependencies?: Partial<AdapterDependencies> | undefined) => Promise<FastifyInstance | undefined>;
@@ -11,5 +11,5 @@ export declare const setupMetrics: (name: string, config: AdapterConfig) => void
11
11
  * @returns the cache middleware function
12
12
  */
13
13
  export declare const buildMetricsMiddleware: (req: AdapterRequest, res: FastifyReply, done: HookHandlerDoneFunction) => void;
14
- export declare const httpRequestsTotal: client.Counter<"type" | "method" | "status_code" | "retry" | "is_cache_warming" | "feed_id" | "provider_status_code">;
14
+ export declare const httpRequestsTotal: client.Counter<"type" | "method" | "feed_id" | "status_code" | "provider_status_code" | "retry" | "is_cache_warming">;
15
15
  export declare const httpRequestDurationSeconds: client.Histogram<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chainlink/external-adapter-framework",
3
- "version": "0.0.22",
3
+ "version": "0.0.26",
4
4
  "main": "dist/index.js",
5
5
  "license": "MIT",
6
6
  "dependencies": {
@@ -44,7 +44,7 @@
44
44
  "nock": "^13.2.4",
45
45
  "pino-pretty": "^7.6.0",
46
46
  "prettier": "^2.6.1",
47
- "ts-node-dev": "^2.0.0",
47
+ "ts-node-dev": "2.0.0",
48
48
  "typedoc": "^0.22.15"
49
49
  },
50
50
  "prettier": {
@@ -44,7 +44,7 @@ export interface BackgroundExecuteRateLimiter extends RateLimiter {
44
44
  * @param limits - the rate limit tier set for the adapter
45
45
  * @returns the most restrictive of the set options, in requests per second
46
46
  */
47
- export declare const consolidateTierLimits: (limits?: AdapterRateLimitTier) => number;
47
+ export declare const consolidateTierLimits: (limits?: AdapterRateLimitTier | undefined) => number;
48
48
  /**
49
49
  * Validates rate limiting tiers specified for the adapter, and returns the one to use.
50
50
  *
@@ -52,4 +52,4 @@ export declare const consolidateTierLimits: (limits?: AdapterRateLimitTier) => n
52
52
  * @param tiers - the adapter config listing the different available API tiers
53
53
  * @returns the specified API tier, or a default one if none are specified
54
54
  */
55
- export declare const getRateLimitingTier: (config: AdapterConfig, tiers?: Record<string, AdapterRateLimitTier>) => AdapterRateLimitTier | undefined;
55
+ export declare const getRateLimitingTier: (config: AdapterConfig, tiers?: Record<string, AdapterRateLimitTier> | undefined) => AdapterRateLimitTier | undefined;
@@ -1,9 +1,35 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.BatchWarmingTransport = void 0;
4
27
  const util_1 = require("../util");
5
28
  const _1 = require("./");
6
29
  const util_2 = require("./util");
30
+ const rateLimitMetrics = __importStar(require("../rate-limiting/metrics"));
31
+ const cacheMetrics = __importStar(require("../cache/metrics"));
32
+ const WARMUP_BATCH_REQUEST_ID = '9002';
7
33
  const logger = (0, util_1.makeLogger)('BatchWarmingTransport');
8
34
  /**
9
35
  * Transport implementation that takes incoming batches requests and keeps a warm cache of values.
@@ -43,12 +69,14 @@ class BatchWarmingTransport {
43
69
  logger.debug('No entries in batch warming set, skipping');
44
70
  if (this.WARMER_ACTIVE) {
45
71
  // Decrement count when warmer changed from having entries to having none
72
+ cacheMetrics.cacheWarmerCount.labels({ isBatched: 'true' }).dec();
46
73
  this.WARMER_ACTIVE = false;
47
74
  }
48
75
  return this.rateLimiter.msUntilNextExecution(context.adapterEndpoint.name);
49
76
  }
50
77
  else if (this.WARMER_ACTIVE === false) {
51
78
  // Increment count when warmer changed from having no entries to having some
79
+ cacheMetrics.cacheWarmerCount.labels({ isBatched: 'true' }).inc();
52
80
  this.WARMER_ACTIVE = true;
53
81
  }
54
82
  const request = this.config.prepareRequest(entries, context);
@@ -59,6 +87,14 @@ class BatchWarmingTransport {
59
87
  const adapterResponses = (0, _1.buildCacheEntriesFromResults)(results, context);
60
88
  logger.debug('Setting adapter responses in cache');
61
89
  await this.cache.setMany(adapterResponses, context.adapterConfig.CACHE_MAX_AGE);
90
+ // Record cost of data provider call
91
+ const cost = rateLimitMetrics.retrieveCost(providerResponse.data);
92
+ rateLimitMetrics.rateLimitCreditsSpentTotal
93
+ .labels({
94
+ feed_id: 'N/A',
95
+ participant_id: WARMUP_BATCH_REQUEST_ID,
96
+ })
97
+ .inc(cost);
62
98
  return this.rateLimiter.msUntilNextExecution(context.adapterEndpoint.name);
63
99
  }
64
100
  }
@@ -1,7 +1,7 @@
1
1
  import * as client from 'prom-client';
2
2
  import { AdapterContext } from '../adapter';
3
3
  import { SettingsMap } from '../config';
4
- export declare const dataProviderMetricsLabel: (providerStatusCode?: number, method?: string) => {
4
+ export declare const dataProviderMetricsLabel: (providerStatusCode?: number | undefined, method?: string) => {
5
5
  provider_status_code: number | undefined;
6
6
  method: string;
7
7
  };
@@ -1,9 +1,33 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.RestTransport = void 0;
4
27
  const util_1 = require("../util");
5
28
  const error_1 = require("../validation/error");
6
29
  const util_2 = require("./util");
30
+ const rateLimitMetrics = __importStar(require("../rate-limiting/metrics"));
7
31
  const IN_FLIGHT_PREFIX = 'InFlight';
8
32
  const logger = (0, util_1.makeLogger)('RestTransport');
9
33
  /**
@@ -90,6 +114,14 @@ class RestTransport {
90
114
  }
91
115
  logger.debug('Setting provider response in cache');
92
116
  await this.cache.set(req.requestContext.cacheKey, parsedResponse, config.CACHE_MAX_AGE);
117
+ // Record cost of data provider call
118
+ const cost = rateLimitMetrics.retrieveCost(providerResponse.data);
119
+ rateLimitMetrics.rateLimitCreditsSpentTotal
120
+ .labels({
121
+ feed_id: req.requestContext.meta?.metrics?.feedId || 'N/A',
122
+ participant_id: req.requestContext.cacheKey,
123
+ })
124
+ .inc(cost);
93
125
  // Update cacheHit flag in request meta for metrics use
94
126
  req.requestContext.meta = {
95
127
  ...req.requestContext.meta,
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
@@ -6,6 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.axiosRequest = void 0;
7
30
  const axios_1 = __importDefault(require("axios"));
8
31
  const error_1 = require("../validation/error");
32
+ const transportMetrics = __importStar(require("./metrics"));
9
33
  /**
10
34
  * Performs axios request along with metrics recording and error handling
11
35
  *
@@ -13,6 +37,7 @@ const error_1 = require("../validation/error");
13
37
  * @returns axios response for the request
14
38
  */
15
39
  async function axiosRequest(request, config) {
40
+ const responseTimer = transportMetrics.dataProviderRequestDurationSeconds.startTimer();
16
41
  let providerResponse;
17
42
  try {
18
43
  request.timeout = config.API_TIMEOUT;
@@ -37,6 +62,9 @@ async function axiosRequest(request, config) {
37
62
  providerStatusCode = 0; // 0 -> connection error
38
63
  }
39
64
  // Record count of failed data provider request
65
+ transportMetrics.dataProviderRequests
66
+ .labels(transportMetrics.dataProviderMetricsLabel(providerStatusCode, request.method))
67
+ .inc();
40
68
  adapterError.statusCode = 200;
41
69
  adapterError.providerStatusCode = providerStatusCode;
42
70
  adapterError.message = error?.message;
@@ -47,7 +75,12 @@ async function axiosRequest(request, config) {
47
75
  }
48
76
  finally {
49
77
  // Record time taken for data provider request for success or failure
78
+ responseTimer();
50
79
  }
80
+ // Record count of successful data provider requests
81
+ transportMetrics.dataProviderRequests
82
+ .labels(transportMetrics.dataProviderMetricsLabel(providerResponse.status, request.method))
83
+ .inc();
51
84
  return providerResponse;
52
85
  }
53
86
  exports.axiosRequest = axiosRequest;
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
@@ -7,6 +30,7 @@ exports.WebSocketTransport = exports.WebSocketClassProvider = void 0;
7
30
  const ws_1 = __importDefault(require("ws"));
8
31
  const util_1 = require("../util");
9
32
  const _1 = require("./");
33
+ const transportMetrics = __importStar(require("./metrics"));
10
34
  const logger = (0, util_1.makeLogger)('WebSocketTransport');
11
35
  class WebSocketClassProvider {
12
36
  static set(ctor) {
@@ -63,6 +87,7 @@ class WebSocketTransport {
63
87
  logger.debug('Successfully executed connection opened handler');
64
88
  // Record active ws connections by incrementing count on open
65
89
  // Using URL in label since connection_key is removed from v3
90
+ transportMetrics.wsConnectionActive.inc();
66
91
  resolve(true);
67
92
  });
68
93
  this.wsConnection.addEventListener('message', async (event) => {
@@ -78,11 +103,15 @@ class WebSocketTransport {
78
103
  });
79
104
  this.wsConnection.addEventListener('error', async (event) => {
80
105
  // Record connection error count
106
+ transportMetrics.wsConnectionErrors
107
+ .labels(transportMetrics.connectionErrorLabels(event.message))
108
+ .inc();
81
109
  });
82
110
  this.wsConnection.addEventListener('close', (event) => {
83
111
  logger.debug(`Closed websocket connection. Code: ${event.code} ; reason: ${event.reason?.toString()}`);
84
112
  // Record active ws connections by decrementing count on close
85
113
  // Using URL in label since connection_key is removed from v3
114
+ transportMetrics.wsConnectionActive.dec();
86
115
  });
87
116
  });
88
117
  }
@@ -126,6 +155,8 @@ class WebSocketTransport {
126
155
  logger.trace(`Sending message: ${JSON.stringify(message)}`);
127
156
  this.wsConnection.send(message);
128
157
  }
158
+ // Record WS message and subscription metrics
159
+ transportMetrics.recordWsMessageMetrics(context, subscribeParams, unsubscribeParams);
129
160
  logger.debug('Setting local state to cache value');
130
161
  this.localSubscriptions = desiredSubs;
131
162
  logger.debug('Background execute complete');
@@ -1,7 +0,0 @@
1
- import { AdapterEndpoint } from '../../adapter';
2
- interface AdapterRequestParams {
3
- base: string;
4
- quote: string;
5
- }
6
- export declare const batchEndpoint: AdapterEndpoint<AdapterRequestParams, unknown, import("../../config").SettingsMap>;
7
- export {};
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.batchEndpoint = void 0;
4
- const adapter_1 = require("../../adapter");
5
- const batch_warming_1 = require("../../transports/batch-warming");
6
- const DEFAULT_URL = 'https://pro-api.coingecko.com/api/v3';
7
- const inputParameters = {
8
- coinid: {
9
- description: 'The CoinGecko id or array of ids of the coin(s) to query (Note: because of current limitations to use a dummy base will need to be supplied)',
10
- required: false,
11
- },
12
- base: {
13
- aliases: ['from', 'coin'],
14
- description: 'The symbol or array of symbols of the currency to query',
15
- required: true,
16
- },
17
- quote: {
18
- aliases: ['to', 'market'],
19
- description: 'The symbol of the currency to convert to',
20
- required: true,
21
- },
22
- };
23
- const batchEndpointTransport = new batch_warming_1.BatchWarmingTransport({
24
- prepareRequest: (params, context) => {
25
- return {
26
- baseURL: DEFAULT_URL,
27
- url: '/simple/price',
28
- method: 'GET',
29
- params: {
30
- ids: [...new Set(params.map((p) => p.base))].join(','),
31
- vs_currencies: [...new Set(params.map((p) => p.quote))].join(','),
32
- x_cg_pro_api_key: context.adapterConfig.API_KEY,
33
- },
34
- };
35
- },
36
- parseResponse: (res) => {
37
- const entries = [];
38
- for (const [base, entry] of Object.entries(res.data)) {
39
- for (const [quote, price] of Object.entries(entry)) {
40
- entries.push({
41
- params: { base, quote },
42
- value: price,
43
- });
44
- }
45
- }
46
- return entries;
47
- },
48
- });
49
- exports.batchEndpoint = new adapter_1.AdapterEndpoint({
50
- name: 'batch',
51
- transport: batchEndpointTransport,
52
- inputParameters,
53
- });
@@ -1,2 +0,0 @@
1
- import { Adapter } from '../../adapter';
2
- export declare const adapter: Adapter<import("../../config").SettingsMap>;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.adapter = void 0;
4
- const adapter_1 = require("../../adapter");
5
- const batch_warming_1 = require("./batch-warming");
6
- const rest_1 = require("./rest");
7
- exports.adapter = new adapter_1.Adapter({
8
- name: 'coingecko',
9
- defaultEndpoint: 'batch',
10
- endpoints: [rest_1.restEndpoint, batch_warming_1.batchEndpoint],
11
- });
@@ -1,12 +0,0 @@
1
- import { AdapterEndpoint } from '../../adapter';
2
- interface AdapterRequestParams {
3
- base: string;
4
- quote: string;
5
- }
6
- interface ProviderResponseBody {
7
- [base: string]: {
8
- [quote: string]: number;
9
- };
10
- }
11
- export declare const restEndpoint: AdapterEndpoint<AdapterRequestParams, ProviderResponseBody, import("../../config").SettingsMap>;
12
- export {};