diff --git a/src/shadowbox/server/manager_metrics.spec.ts b/src/shadowbox/server/manager_metrics.spec.ts index 0fd0ef3c..59092bcc 100644 --- a/src/shadowbox/server/manager_metrics.spec.ts +++ b/src/shadowbox/server/manager_metrics.spec.ts @@ -33,12 +33,13 @@ describe('PrometheusManagerMetrics', () => { it('getTunnelTimeByLocation', async (done) => { const managerMetrics = new PrometheusManagerMetrics( - new FakeTunnelTimePrometheusClient({US: 1000, CA: 2000}) + new FakeTunnelTimePrometheusClient({US: {1: 1000, 2: 1000}, CA: {3: 2000}}) ); const tunnelTime = await managerMetrics.getTunnelTimeByLocation({time_window: {seconds: 0}}); expect(tunnelTime).toEqual([ - {location: 'US', asn: undefined, as_org: undefined, tunnel_time: {seconds: 1000}}, - {location: 'CA', asn: undefined, as_org: undefined, tunnel_time: {seconds: 2000}}, + {location: 'US', asn: 1, as_org: undefined, tunnel_time: {seconds: 1000}}, + {location: 'US', asn: 2, as_org: undefined, tunnel_time: {seconds: 1000}}, + {location: 'CA', asn: 3, as_org: undefined, tunnel_time: {seconds: 2000}}, ]); done(); }); diff --git a/src/shadowbox/server/manager_metrics.ts b/src/shadowbox/server/manager_metrics.ts index 01345ce5..89b1fba1 100644 --- a/src/shadowbox/server/manager_metrics.ts +++ b/src/shadowbox/server/manager_metrics.ts @@ -71,7 +71,7 @@ export class PrometheusManagerMetrics implements ManagerMetrics { asn: entry.metric['asn'] !== undefined ? parseInt(entry.metric['asn'], 10) : undefined, as_org: entry.metric['asorg'], tunnel_time: { - seconds: Math.round(parseFloat(entry.value[1])), + seconds: parseFloat(entry.value[1]), }, })); } diff --git a/src/shadowbox/server/mocks/mocks.ts b/src/shadowbox/server/mocks/mocks.ts index 3c913efe..6cbd8345 100644 --- a/src/shadowbox/server/mocks/mocks.ts +++ b/src/shadowbox/server/mocks/mocks.ts @@ -67,18 +67,23 @@ export class FakeDataBytesTransferredPrometheusClient extends PrometheusClient { } export class FakeTunnelTimePrometheusClient extends PrometheusClient { - constructor(public tunnelTimeByLocation: {[location: string]: number}) { + constructor(public tunnelTimeByLocation: {[location: string]: {[as: number]: number}}) { super(''); } async query(_query: string): Promise { const queryResultData = {result: []} as QueryResultData; for (const location of Object.keys(this.tunnelTimeByLocation)) { - const tunnelTime = this.tunnelTimeByLocation[location] || 0; - queryResultData.result.push({ - metric: {location}, - value: [tunnelTime, `${tunnelTime}`], - }); + const tunnelTimeByAsn = this.tunnelTimeByLocation[location] || {}; + + for (const asn of Object.keys(tunnelTimeByAsn)) { + const tunnelTime = tunnelTimeByAsn[asn] || 0; + + queryResultData.result.push({ + metric: {location, asn}, + value: [tunnelTime, `${tunnelTime}`], + }); + } } return queryResultData; }