diff --git a/projects/observability/src/public-api.ts b/projects/observability/src/public-api.ts index 5b746d229..19487cd12 100644 --- a/projects/observability/src/public-api.ts +++ b/projects/observability/src/public-api.ts @@ -382,3 +382,6 @@ export * from './shared/components/label-detail/label-detail.module'; // Bar Gauge export * from './shared/components/bar-gauge/bar-gauge.component'; export * from './shared/components/bar-gauge/bar-gauge.module'; + +// Time Range utils +export * from './shared/utils/time-range'; diff --git a/projects/observability/src/shared/graphql/model/schema/timerange/graphql-time-range.ts b/projects/observability/src/shared/graphql/model/schema/timerange/graphql-time-range.ts index ae798a220..10469f7d1 100644 --- a/projects/observability/src/shared/graphql/model/schema/timerange/graphql-time-range.ts +++ b/projects/observability/src/shared/graphql/model/schema/timerange/graphql-time-range.ts @@ -1,4 +1,4 @@ -import { TimeRange } from '@hypertrace/common'; +import { TimeDuration, TimeRange, TimeUnit } from '@hypertrace/common'; export class GraphQlTimeRange { public static fromTimeRange(timeRange: Pick): GraphQlTimeRange { @@ -13,4 +13,11 @@ export class GraphQlTimeRange { endTime: typeof this.to === 'number' ? new Date(this.to) : this.to }; } + + public asTimeDuration(): TimeDuration { + return new TimeDuration( + this.asArgumentObject().endTime.getTime() - this.asArgumentObject().startTime.getTime(), + TimeUnit.Millisecond + ); + } } diff --git a/projects/observability/src/shared/utils/time-range.test.ts b/projects/observability/src/shared/utils/time-range.test.ts new file mode 100644 index 000000000..059940077 --- /dev/null +++ b/projects/observability/src/shared/utils/time-range.test.ts @@ -0,0 +1,11 @@ +import { GraphQlTimeRange } from '../graphql/model/schema/timerange/graphql-time-range'; +import { getPreviousTimeRange } from './time-range'; + +describe('Time Range Util', () => { + const oneHourRange = new GraphQlTimeRange(new Date(1637298000000), new Date(1637301600000)); + test('computes previous time window as expected', () => { + const previousTimeRange = getPreviousTimeRange(oneHourRange); + expect(new Date(previousTimeRange.from).getTime()).toEqual(1637294400000); + expect(new Date(previousTimeRange.to).getTime()).toEqual(1637298000000); + }); +}); diff --git a/projects/observability/src/shared/utils/time-range.ts b/projects/observability/src/shared/utils/time-range.ts new file mode 100644 index 000000000..edf296f8e --- /dev/null +++ b/projects/observability/src/shared/utils/time-range.ts @@ -0,0 +1,11 @@ +import { TimeDuration, TimeUnit } from '@hypertrace/common'; +import { GraphQlTimeRange } from '../graphql/model/schema/timerange/graphql-time-range'; + +export const getPreviousTimeRange = (timeRange: GraphQlTimeRange): GraphQlTimeRange => { + const requiredDuration: TimeDuration = timeRange.asTimeDuration(); + + return new GraphQlTimeRange( + timeRange.asArgumentObject().startTime.getTime() - requiredDuration.getAmountForUnit(TimeUnit.Millisecond), + timeRange.asArgumentObject().startTime.getTime() + ); +};