import {z} from 'zod' export type ModelAggregationMethod = 'sum' | 'min' | 'max' | 'avg' | 'median' | 'percentage'; export type ModelMetricsAggregation = {aggregation?: ModelAggregationMethod | undefined, group_by?: (Array<'dimension' | 'instance' | 'percentage-of-instance' | 'label' | 'node' | 'context' | 'units' | 'selected'>) | undefined, group_by_label?: Array | undefined}; export type ModelTimeAggregation = {time_group?: ('min' | 'max' | 'avg' | 'average' | 'median' | 'stddev' | 'sum' | 'incremental-sum' | 'ses' | 'des' | 'cv' | 'countif' | 'percentile' | 'percentile25' | 'percentile50' | 'percentile75' | 'percentile80' | 'percentile90' | 'percentile95' | 'percentile97' | 'percentile98' | 'percentile99' | 'trimmed-mean' | 'trimmed-mean1' | 'trimmed-mean2' | 'trimmed-mean3' | 'trimmed-mean5' | 'trimmed-mean10' | 'trimmed-mean15' | 'trimmed-mean20' | 'trimmed-mean25' | 'trimmed-median' | 'trimmed-median1' | 'trimmed-median2' | 'trimmed-median3' | 'trimmed-median5' | 'trimmed-median10' | 'trimmed-median15' | 'trimmed-median20' | 'trimmed-median25') | undefined, time_group_options?: ('countif' | 'trimmed-mean' | 'trimmed-median' | 'percentile') | undefined, time_resampling?: number | undefined}; export type ModelAggregations = {metrics?: Array | undefined, time?: ModelTimeAggregation | undefined}; export type ModelScope = {contexts?: Array | undefined, dimensions?: Array | undefined, instances?: Array | undefined, labels?: Array | undefined, nodes?: Array | undefined}; export type ModelSelectors = {alerts?: Array | undefined, contexts?: Array | undefined, dimensions?: Array | undefined, instances?: Array | undefined, labels?: Array | undefined, nodes?: Array | undefined}; export type ModelWindowSpan = {after?: number | undefined, before?: number | undefined, duration?: number | undefined, points?: number | undefined}; export type ModelWindow = {after?: number | undefined, baseline?: ModelWindowSpan | undefined, before?: number | undefined, duration?: number | undefined, points?: number | undefined, tier?: number | undefined}; export type ModelScopeDataRequest = {aggregations?: ModelAggregations | undefined, format?: 'json2' | undefined, options?: (Array<'jsonwrap' | 'raw' | 'minify' | 'debug' | 'nonzero' | 'null2zero' | 'abs' | 'absolute' | 'display-absolute' | 'flip' | 'reversed' | 'min2max' | 'percentage' | 'seconds' | 'ms' | 'milliseconds' | 'unaligned' | 'match-ids' | 'match-names' | 'anomaly-bit' | 'jw-anomaly-rates' | 'details' | 'group-by-labels' | 'natural-points' | 'virtual-points' | 'selected-tier' | 'all-dimensions' | 'label-quotes' | 'objectrows' | 'google_json'>) | undefined, scope?: ModelScope | undefined, selectors?: ModelSelectors | undefined, timeout?: number | undefined, window?: ModelWindow | undefined}; export type CreateApiApiV3SpacesSpaceIDRoomsRoomIDDataArgs = {spaceID: string, roomID: string, body: ModelScopeDataRequest}; export type CreateApiApiV3SpacesSpaceIDRoomsRoomIDDataOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const modelTimings = z.object({adc_ms: z.number().optional(), adc_queue_wait_ms: z.number().optional(), cloud_ms: z.number().optional(), node_max_ms: z.number().optional(), output_ms: z.number().optional(), prep_ms: z.number().optional(), query_ms: z.number().optional(), routing_ms: z.number().optional(), total_ms: z.number().optional()}); export const modelAgentSummary = z.object({ai: z.number().int().optional(), claim_id: z.string().optional(), mg: z.string().optional(), nd: z.string().optional(), nm: z.string().optional(), timings: modelTimings.optional()}); export const modelStatsArray = z.object({arc: z.array(z.number()).optional(), arp: z.array(z.number()).optional(), avg: z.array(z.number()).optional(), cnt: z.array(z.number()).optional(), con: z.array(z.number()).optional(), max: z.array(z.number()).optional(), min: z.array(z.number()).optional(), sum: z.array(z.number()).optional(), vol: z.array(z.number()).optional()}); export const modelDBDimensions = z.object({ids: z.array(z.string()).optional(), sts: modelStatsArray.optional(), units: z.array(z.string()).optional()}); export const modelTier = z.object({first_entry: z.number().int().optional(), last_entry: z.number().int().optional(), points: z.number().int().optional(), queries: z.number().int().optional(), tier: z.number().int().optional(), update_every: z.number().int().optional()}); export const modelDB = z.object({dimensions: modelDBDimensions.optional(), first_entry: z.number().int().optional(), last_entry: z.number().int().optional(), per_tier: z.array(modelTier).optional(), tiers: z.number().int().optional(), units: z.array(z.number().int()).optional(), update_every: z.number().int().optional()}); export const modelResult = z.object({data: z.array(z.array(z.unknown())).optional(), labels: z.array(z.string()).optional(), point: z.record(z.string(), z.number().int()).optional()}); export const modelAlertSummary = z.object({cl: z.number().int().optional(), cr: z.number().int().optional(), nm: z.string().optional(), ot: z.number().int().optional(), wr: z.number().int().optional()}); export const modelItemsCount = z.object({ex: z.number().int().optional(), fl: z.number().int().optional(), qr: z.number().int().optional(), sl: z.number().int().optional()}); export const modelContextSummary = z.object({al: modelAlertSummary.optional(), ds: modelItemsCount.optional(), id: z.string().optional(), is: modelItemsCount.optional(), sts: z.array(z.number().int()).optional()}); export const modelDimensionSummary = z.object({ds: modelItemsCount.optional(), id: z.string().optional(), nm: z.string().optional(), pri: z.number().int().optional(), sts: z.array(z.number().int()).optional()}); export const modelGlobalSummary = z.object({sts: z.array(z.number().int()).optional()}); export const modelInstanceSummary = z.object({al: modelAlertSummary.optional(), ds: modelItemsCount.optional(), id: z.string().optional(), ni: z.number().int().optional(), nm: z.string().optional(), sts: z.array(z.number().int()).optional()}); export const modelLabelValueSummary = z.object({ds: modelItemsCount.optional(), id: z.string().optional(), sts: z.array(z.number().int()).optional()}); export const modelLabelSummary = z.object({ds: modelItemsCount.optional(), id: z.string().optional(), sts: z.array(z.number().int()).optional(), vl: z.array(modelLabelValueSummary).optional()}); export const modelNodeStatus = z.object({ai: z.number().int().optional(), code: z.number().int().optional(), ms: z.number().optional(), msg: z.string().optional()}); export const modelNodeSummary = z.object({al: modelAlertSummary.optional(), ds: modelItemsCount.optional(), is: modelItemsCount.optional(), mg: z.string().optional(), nd: z.string().optional(), ni: z.number().int().optional(), nm: z.string().optional(), st: modelNodeStatus.optional(), sts: z.array(z.number().int()).optional()}); export const modelSummary = z.object({alerts: z.array(modelAlertSummary).optional(), contexts: z.array(modelContextSummary).optional(), dimensions: z.array(modelDimensionSummary).optional(), globals: modelGlobalSummary.optional(), instances: z.array(modelInstanceSummary).optional(), labels: z.array(modelLabelSummary).optional(), nodes: z.array(modelNodeSummary).optional()}); export const modelTotals = z.object({contexts: modelItemsCount.optional(), dimensions: modelItemsCount.optional(), instances: modelItemsCount.optional(), label_key_values: modelItemsCount.optional(), label_keys: modelItemsCount.optional(), nodes: modelItemsCount.optional()}); export const modelVersions = z.object({alerts_hard_hash: z.number().int().optional(), alerts_soft_hash: z.number().int().optional(), contexts_hard_hash: z.number().int().optional(), contexts_soft_hash: z.number().int().optional(), nodes_hard_hash: z.number().int().optional(), routing_hard_hash: z.number().int().optional()}); export const modelViewCardinality = z.object({cut: z.number().optional(), folded: z.number().int().optional()}); export const modelViewDimensions = z.object({aggregated: z.array(z.number().int()).optional(), grouped_by: z.array(z.string()).optional(), ids: z.array(z.string()).optional(), labels: z.record(z.string(), z.array(z.array(z.string()))).optional(), names: z.array(z.string()).optional(), priorities: z.array(z.number().int()).optional(), sts: modelStatsArray.optional(), units: z.array(z.string()).optional()}); export const modelPartialDataTrimming = z.object({expected_after: z.number().int().optional(), max_update_every: z.number().int().optional(), trimmed_after: z.number().int().optional()}); export const modelView = z.object({after: z.number().int().optional(), before: z.number().int().optional(), cardinality: modelViewCardinality.optional(), chart_type: z.string().optional(), dimensions: modelViewDimensions.optional(), max: z.number().optional(), min: z.number().optional(), partial_data_trimming: modelPartialDataTrimming.optional(), points: z.number().int().optional(), title: z.string().optional(), units: z.array(z.number().int()).optional(), update_every: z.number().int().optional()}); export const modelScopeDataResponse = z.object({agents: z.array(modelAgentSummary).optional(), api: z.number().int().optional(), db: modelDB.optional(), functions: z.array(z.string()).optional(), result: modelResult.optional(), summary: modelSummary.optional(), timings: modelTimings.optional(), totals: modelTotals.optional(), versions: modelVersions.optional(), view: modelView.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Time series data queries * * POST /api/v3/spaces/{spaceID}/rooms/{roomID}/data */ export const createApiApiV3SpacesSpaceIDRoomsRoomIDData = async (args: CreateApiApiV3SpacesSpaceIDRoomsRoomIDDataArgs, options: CreateApiApiV3SpacesSpaceIDRoomsRoomIDDataOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/api/v3/spaces/${encodeURIComponent(String(args.spaceID))}/rooms/${encodeURIComponent(String(args.roomID))}/data${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(modelScopeDataResponse, await res.json()) };