feat: add React Query hooks for admin infrastructure endpoints
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
102
ui/src/api/queries/admin/opensearch.ts
Normal file
102
ui/src/api/queries/admin/opensearch.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
||||
import { adminFetch } from './admin-api';
|
||||
|
||||
export interface OpenSearchStatus {
|
||||
connected: boolean;
|
||||
clusterName: string;
|
||||
clusterHealth: string;
|
||||
version: string;
|
||||
numberOfNodes: number;
|
||||
host: string;
|
||||
}
|
||||
|
||||
export interface PipelineStats {
|
||||
queueDepth: number;
|
||||
maxQueueSize: number;
|
||||
totalIndexed: number;
|
||||
totalFailed: number;
|
||||
avgLatencyMs: number;
|
||||
}
|
||||
|
||||
export interface IndexInfo {
|
||||
name: string;
|
||||
health: string;
|
||||
status: string;
|
||||
docsCount: number;
|
||||
storeSize: string;
|
||||
primaryShards: number;
|
||||
replicas: number;
|
||||
}
|
||||
|
||||
export interface PerformanceStats {
|
||||
queryCacheHitRate: number;
|
||||
requestCacheHitRate: number;
|
||||
avgQueryLatencyMs: number;
|
||||
avgIndexLatencyMs: number;
|
||||
jvmHeapUsedPercent: number;
|
||||
jvmHeapUsedBytes: number;
|
||||
jvmHeapMaxBytes: number;
|
||||
}
|
||||
|
||||
export interface IndicesParams {
|
||||
search?: string;
|
||||
health?: string;
|
||||
sortBy?: string;
|
||||
sortDir?: 'asc' | 'desc';
|
||||
page?: number;
|
||||
size?: number;
|
||||
}
|
||||
|
||||
export function useOpenSearchStatus() {
|
||||
return useQuery({
|
||||
queryKey: ['admin', 'opensearch', 'status'],
|
||||
queryFn: () => adminFetch<OpenSearchStatus>('/opensearch/status'),
|
||||
});
|
||||
}
|
||||
|
||||
export function usePipelineStats() {
|
||||
return useQuery({
|
||||
queryKey: ['admin', 'opensearch', 'pipeline'],
|
||||
queryFn: () => adminFetch<PipelineStats>('/opensearch/pipeline'),
|
||||
refetchInterval: 15000,
|
||||
});
|
||||
}
|
||||
|
||||
export function useIndices(params: IndicesParams) {
|
||||
const query = new URLSearchParams();
|
||||
if (params.search) query.set('search', params.search);
|
||||
if (params.health) query.set('health', params.health);
|
||||
if (params.sortBy) query.set('sortBy', params.sortBy);
|
||||
if (params.sortDir) query.set('sortDir', params.sortDir);
|
||||
if (params.page !== undefined) query.set('page', String(params.page));
|
||||
if (params.size !== undefined) query.set('size', String(params.size));
|
||||
const qs = query.toString();
|
||||
|
||||
return useQuery({
|
||||
queryKey: ['admin', 'opensearch', 'indices', params],
|
||||
queryFn: () =>
|
||||
adminFetch<{ indices: IndexInfo[]; total: number }>(
|
||||
`/opensearch/indices${qs ? `?${qs}` : ''}`,
|
||||
),
|
||||
});
|
||||
}
|
||||
|
||||
export function usePerformanceStats() {
|
||||
return useQuery({
|
||||
queryKey: ['admin', 'opensearch', 'performance'],
|
||||
queryFn: () => adminFetch<PerformanceStats>('/opensearch/performance'),
|
||||
refetchInterval: 15000,
|
||||
});
|
||||
}
|
||||
|
||||
export function useDeleteIndex() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: async (indexName: string) => {
|
||||
await adminFetch<void>(`/opensearch/indices/${encodeURIComponent(indexName)}`, {
|
||||
method: 'DELETE',
|
||||
});
|
||||
},
|
||||
onSuccess: () => qc.invalidateQueries({ queryKey: ['admin', 'opensearch', 'indices'] }),
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user