Skip to content

Commit

Permalink
add more Indexer stats around funding indices (#861)
Browse files Browse the repository at this point in the history
  • Loading branch information
dydxwill authored Dec 8, 2023
1 parent 7b14139 commit e696ea6
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 2 deletions.
2 changes: 2 additions & 0 deletions indexer/packages/postgres/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import config from './config';
import AssetModel from './models/asset-model';
import AssetPositionModel from './models/asset-position-model';
import FillModel from './models/fill-model';
import FundingIndexUpdatesModel from './models/funding-index-updates-model';
import LiquidityTiersModel from './models/liquidity-tiers-model';
import MarketModel from './models/market-model';
import OraclePriceModel from './models/oracle-price-model';
Expand Down Expand Up @@ -89,6 +90,7 @@ export const SQL_TO_JSON_DEFINED_MODELS = [
AssetModel,
AssetPositionModel,
FillModel,
FundingIndexUpdatesModel,
LiquidityTiersModel,
MarketModel,
OraclePriceModel,
Expand Down
1 change: 1 addition & 0 deletions indexer/packages/postgres/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export { postgresConfigSchema } from './config';
export { default as AssetModel } from './models/asset-model';
export { default as AssetPositionModel } from './models/asset-position-model';
export { default as FillModel } from './models/fill-model';
export { default as FundingIndexUpdatesModel } from './models/funding-index-updates-model';
export { default as LiquidityTiersModel } from './models/liquidity-tiers-model';
export { default as MarketModel } from './models/market-model';
export { default as OraclePriceModel } from './models/oracle-price-model';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,25 @@ export default class FundingIndexUpdatesModel extends Model {
};
}

/**
* A mapping from column name to JSON conversion expected.
* See getSqlConversionForDydxModelTypes for valid conversions.
*
* TODO(IND-239): Ensure that jsonSchema() / sqlToJsonConversions() / model fields match.
*/
static get sqlToJsonConversions() {
return {
id: 'string',
perpetualId: 'string',
eventId: 'hex-string',
rate: 'string',
oraclePrice: 'string',
fundingIndex: 'string',
effectiveAt: 'date-time',
effectiveAtHeight: 'string',
};
}

id!: string;

perpetualId!: string;
Expand Down
10 changes: 10 additions & 0 deletions indexer/services/ender/__tests__/handlers/funding-handler.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { stats } from '@dydxprotocol-indexer/base';
import {
FundingEventV1,
FundingEventV1_Type,
Expand Down Expand Up @@ -45,6 +46,9 @@ describe('fundingHandler', () => {
beforeAll(async () => {
await dbHelpers.migrate();
await createPostgresFunctions();
jest.spyOn(stats, 'increment');
jest.spyOn(stats, 'timing');
jest.spyOn(stats, 'gauge');
});

beforeEach(async () => {
Expand Down Expand Up @@ -200,6 +204,8 @@ describe('fundingHandler', () => {
oraclePrice: '10000',
fundingIndex: '0.1',
}));
expect(stats.gauge).toHaveBeenCalledWith('ender.funding_index_update_event', 0.1, { ticker: 'BTC-USD' });
expect(stats.gauge).toHaveBeenCalledWith('ender.funding_index_update', 0.1, { ticker: 'BTC-USD' });
});

it('successfully processes and clears cache for multiple new funding rates', async () => {
Expand Down Expand Up @@ -297,6 +303,10 @@ describe('fundingHandler', () => {
// 1e2 * 1e-6 * 1e-6 / 1e-18 = 1e8
fundingIndex: '100000000',
}));
expect(stats.gauge).toHaveBeenCalledWith('ender.funding_index_update_event', 0.1, { ticker: 'BTC-USD' });
expect(stats.gauge).toHaveBeenCalledWith('ender.funding_index_update', 0.1, { ticker: 'BTC-USD' });
expect(stats.gauge).toHaveBeenCalledWith('ender.funding_index_update_event', 100000000, { ticker: 'ETH-USD' });
expect(stats.gauge).toHaveBeenCalledWith('ender.funding_index_update', 100000000, { ticker: 'ETH-USD' });
});
});

Expand Down
43 changes: 42 additions & 1 deletion indexer/services/ender/src/handlers/funding-handler.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { logger } from '@dydxprotocol-indexer/base';
import { logger, stats } from '@dydxprotocol-indexer/base';
import {
FundingIndexUpdatesTable,
PerpetualMarketFromDatabase,
TendermintEventTable,
protocolTranslations,
PerpetualMarketModel,
FundingIndexUpdatesFromDatabase,
FundingIndexUpdatesModel,
} from '@dydxprotocol-indexer/postgres';
import { NextFundingCache } from '@dydxprotocol-indexer/redis';
import { bytesToBigInt } from '@dydxprotocol-indexer/v4-proto-parser';
import {
FundingEventV1_Type,
FundingUpdateV1,
Expand All @@ -15,6 +18,7 @@ import Big from 'big.js';
import _ from 'lodash';
import * as pg from 'pg';

import config from '../config';
import { redisClient } from '../helpers/redis/redis-controller';
import { indexerTendermintEventToTransactionIndex } from '../lib/helper';
import { ConsolidatedKafkaEvent, FundingEventMessage } from '../lib/types';
Expand Down Expand Up @@ -56,6 +60,17 @@ export class FundingHandler extends Handler<FundingEventMessage> {
PerpetualMarketModel.fromJson(perpetualMarket as object) as PerpetualMarketFromDatabase,
);
}
const fundingIndices:
Map<string, FundingIndexUpdatesFromDatabase> = new
Map<string, FundingIndexUpdatesFromDatabase>();
for (const [key, fundingIndex] of Object.entries(resultRow.funding_index_updates)) {
fundingIndices.set(
key,
FundingIndexUpdatesModel.fromJson(
fundingIndex as object,
) as FundingIndexUpdatesFromDatabase,
);
}

const promises: Promise<number>[] = new Array<Promise<number>>(this.event.updates.length);

Expand All @@ -67,6 +82,7 @@ export class FundingHandler extends Handler<FundingEventMessage> {
message: resultRow.errors[i],
update,
});
stats.increment(`${config.SERVICE_NAME}.handle_funding_event.failure`, 1);
continue;
}

Expand All @@ -78,6 +94,7 @@ export class FundingHandler extends Handler<FundingEventMessage> {
message: 'Received FundingUpdate with unknown perpetualId.',
update,
});
stats.increment(`${config.SERVICE_NAME}.handle_funding_event.failure`, 1);
continue;
}

Expand All @@ -92,13 +109,37 @@ export class FundingHandler extends Handler<FundingEventMessage> {
case FundingEventV1_Type.TYPE_FUNDING_RATE_AND_INDEX:
// clear the cache for the predicted next funding rate
promises[i] = NextFundingCache.clearFundingSamples(perpetualMarket.ticker, redisClient);
stats.gauge(
`${config.SERVICE_NAME}.funding_index_update_event`,
Number(
protocolTranslations.fundingIndexToHumanFixedString(
bytesToBigInt(update.fundingIndex).toString(),
perpetualMarket,
),
),
{
ticker: perpetualMarket.ticker,
},
);
// eslint-disable-next-line no-case-declarations
const fundingIndexUpdate: FundingIndexUpdatesFromDatabase = fundingIndices.get(
update.perpetualId.toString(),
)!;
stats.gauge(
`${config.SERVICE_NAME}.funding_index_update`,
Number(fundingIndexUpdate.fundingIndex),
{
ticker: perpetualMarket.ticker,
},
);
break;
default:
logger.error({
at: 'FundingHandler#handle',
message: 'Received unknown FundingEvent type.',
event: this.event,
});
stats.increment(`${config.SERVICE_NAME}.handle_funding_event.failure`, 1);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ DECLARE

funding_update jsonb;
perpetual_markets_response jsonb = jsonb_build_object();
funding_update_response jsonb = jsonb_build_object();
errors_response jsonb[];
event_id bytea;
BEGIN
Expand Down Expand Up @@ -77,6 +78,8 @@ BEGIN
funding_index_updates_record."effectiveAtHeight" = block_height;

INSERT INTO funding_index_updates VALUES (funding_index_updates_record.*);
funding_update_response = jsonb_set(funding_update_response, ARRAY[(funding_index_updates_record."perpetualId")::text], dydx_to_jsonb(funding_index_updates_record));

ELSE
errors_response = array_append(errors_response, 'Received unknown FundingEvent type.');
CONTINUE;
Expand All @@ -88,8 +91,10 @@ BEGIN
RETURN jsonb_build_object(
'perpetual_markets',
perpetual_markets_response,
'funding_index_updates',
funding_update_response,
'errors',
to_jsonb(errors_response)
);
END;
$$ LANGUAGE plpgsql;
$$ LANGUAGE plpgsql;

0 comments on commit e696ea6

Please sign in to comment.