Skip to content

Commit a03208d

Browse files
committed
HasProfileData endpoint usage fixes and time range for ProfileTypes query
1 parent 0b36abe commit a03208d

File tree

3 files changed

+39
-26
lines changed

3 files changed

+39
-26
lines changed

pkg/parcacol/querier.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ func (q *Querier) ProfileTypes(
882882
}
883883

884884
func (q *Querier) HasProfileData(ctx context.Context) (bool, error) {
885-
types, err := q.ProfileTypes(ctx, time.Time{}, time.Time{})
885+
types, err := q.ProfileTypes(ctx, time.UnixMilli(0), time.UnixMilli(0))
886886
if err != nil {
887887
return false, err
888888
}

ui/packages/shared/profile/src/ProfileSelector/index.tsx

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {Dispatch, SetStateAction, useEffect, useMemo, useRef, useState} from 're
1515

1616
import {RpcError} from '@protobuf-ts/runtime-rpc';
1717

18-
import {ProfileTypesResponse, QueryServiceClient} from '@parca/client';
18+
import { ProfileTypesRequest, ProfileTypesResponse, QueryServiceClient } from '@parca/client';
1919
import {
2020
DateTimeRange,
2121
IconButton,
@@ -26,7 +26,7 @@ import {
2626
import {CloseIcon} from '@parca/icons';
2727
import {Query} from '@parca/parser';
2828
import {TEST_IDS, testId} from '@parca/test-utils';
29-
import {type NavigateFunction} from '@parca/utilities';
29+
import { millisToProtoTimestamp, type NavigateFunction } from '@parca/utilities';
3030

3131
import {ProfileSelection} from '..';
3232
import {useLabelNames} from '../MatchersInput/index';
@@ -36,6 +36,7 @@ import {useDefaultSumBy, useSumBySelection} from '../useSumBy';
3636
import {MetricsGraphSection} from './MetricsGraphSection';
3737
import {QueryControls} from './QueryControls';
3838
import {useAutoQuerySelector} from './useAutoQuerySelector';
39+
import useGrpcQuery from '../useGrpcQuery';
3940

4041
export interface QuerySelection {
4142
expression: string;
@@ -104,24 +105,30 @@ export interface IProfileTypesResult {
104105
error?: RpcError;
105106
}
106107

107-
export const useProfileTypes = (client: QueryServiceClient): IProfileTypesResult => {
108-
const [result, setResult] = useState<ProfileTypesResponse | undefined>(undefined);
109-
const [error, setError] = useState<RpcError | undefined>(undefined);
110-
const [loading, setLoading] = useState(true);
108+
export const useProfileTypes = (client:
109+
QueryServiceClient, start?: number, end?: number):
110+
IProfileTypesResult => {
111111
const metadata = useGrpcMetadata();
112+
const metadataString = useMemo(() => JSON.stringify(metadata), [metadata]);
113+
const request: ProfileTypesRequest = {};
114+
115+
if (start != null && end != null) {
116+
request.start = millisToProtoTimestamp(start);
117+
request.end = millisToProtoTimestamp(end);
118+
}
119+
120+
const { isLoading, data, error } = useGrpcQuery({
121+
key: ['profileTypes', metadataString, start, end],
122+
queryFn: async (abort) => {
123+
const { response } = await client.profileTypes(request, {
124+
meta: metadata,
125+
abort,
126+
});
127+
return response;
128+
},
129+
});
112130

113-
useEffect(() => {
114-
if (!loading) {
115-
return;
116-
}
117-
const call = client.profileTypes({}, {meta: metadata});
118-
call.response
119-
.then(response => setResult(response))
120-
.catch(error => setError(error))
121-
.finally(() => setLoading(false));
122-
}, [client, metadata, loading]);
123-
124-
return {loading, data: result, error};
131+
return { loading: isLoading, data, error: error as RpcError };
125132
};
126133

127134
const ProfileSelector = ({
@@ -144,11 +151,6 @@ const ProfileSelector = ({
144151
utilizationLabels,
145152
onUtilizationSeriesSelect,
146153
}: ProfileSelectorProps): JSX.Element => {
147-
const {
148-
loading: profileTypesLoading,
149-
data: profileTypesData,
150-
error,
151-
} = useProfileTypes(queryClient);
152154
const {heightStyle} = useMetricsGraphDimensions(comparing, utilizationMetrics != null);
153155
const {viewComponent} = useParcaContext();
154156
const [queryBrowserMode, setQueryBrowserMode] = useURLState('query_browser_mode');
@@ -174,6 +176,12 @@ const ProfileSelector = ({
174176
const from = timeRangeSelection.getFromMs();
175177
const to = timeRangeSelection.getToMs();
176178

179+
const {
180+
loading: profileTypesLoading,
181+
data: profileTypesData,
182+
error,
183+
} = useProfileTypes(queryClient, from, to);
184+
177185
const {loading: labelNamesLoading, result} = useLabelNames(
178186
queryClient,
179187
profileType.toString(),

ui/packages/shared/profile/src/useHasProfileData.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@
1414
import {HasProfileDataResponse, QueryServiceClient} from '@parca/client';
1515

1616
import useGrpcQuery from './useGrpcQuery';
17+
import { useGrpcMetadata } from '@parca/components';
18+
import { useMemo } from 'react';
1719

1820
export const useHasProfileData = (
1921
client: QueryServiceClient
2022
): {loading: boolean; data: boolean; error: Error | any} => {
23+
const metadata = useGrpcMetadata();
24+
const metadataString = useMemo(() => JSON.stringify(metadata), [metadata]);
25+
2126
const {data, isLoading, error} = useGrpcQuery<HasProfileDataResponse>({
22-
key: ['hasProfileData'],
27+
key: ['hasProfileData', metadataString],
2328
queryFn: async signal => {
24-
const {response} = await client.hasProfileData({}, {abort: signal});
29+
const {response} = await client.hasProfileData({}, {abort: signal, meta: metadata});
2530
return response;
2631
},
2732
});

0 commit comments

Comments
 (0)