import {z} from 'zod' export type ListTracesRequestQueryType = 'TRACE_IDS' | 'SERVICE_OPERATION'; export type NumericFilterComparisonType = 'EQUAL' | 'NOT_EQUAL' | 'GREATER_THAN' | 'GREATER_THAN_OR_EQUAL' | 'LESS_THAN' | 'LESS_THAN_OR_EQUAL'; export type TagFilterNumericFilter = {comparison?: NumericFilterComparisonType | undefined, value?: number | undefined}; export type StringFilterStringFilterMatchType = 'EXACT' | 'REGEX' | 'EXACT_NEGATION' | 'REGEX_NEGATION' | 'IN' | 'NOT_IN'; export type TagFilterStringFilter = {in_values?: Array | undefined, match?: StringFilterStringFilterMatchType | undefined, value?: string | undefined}; export type ListTracesRequestTagFilter = {key?: string | undefined, numeric_value?: TagFilterNumericFilter | undefined, value?: TagFilterStringFilter | undefined}; export type Datav1ListTracesRequest = {end_time?: string | undefined, operation?: string | undefined, query_type?: ListTracesRequestQueryType | undefined, service?: string | undefined, start_time?: string | undefined, tag_filters?: Array | undefined, trace_ids?: Array | undefined}; export type CreateApiApiV1DataTracesArgs = {body: Datav1ListTracesRequest}; export type CreateApiApiV1DataTracesOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const v1ArrayValue = z.object({values: z.array(z.lazy(() => v1AnyValue)).optional()}); export const v1KeyValueList = z.object({values: z.array(z.lazy(() => v1KeyValue)).optional()}); export const v1AnyValue: z.ZodType = z.object({array_value: v1ArrayValue.optional(), bool_value: z.boolean().optional(), bytes_value: z.string().optional(), double_value: z.number().optional(), int_value: z.string().optional(), kvlist_value: v1KeyValueList.optional(), string_value: z.string().optional()}); export const v1KeyValue: z.ZodType = z.object({key: z.string().optional(), value: v1AnyValue.optional()}); export const v1EntityRef = z.object({description_keys: z.array(z.string()).optional(), id_keys: z.array(z.string()).optional(), schema_url: z.string().optional(), type: z.string().optional()}); export const v1Resource = z.object({attributes: z.array(v1KeyValue).optional(), dropped_attributes_count: z.number().int().optional(), entity_refs: z.array(v1EntityRef).optional()}); export const v1InstrumentationScope = z.object({attributes: z.array(v1KeyValue).optional(), dropped_attributes_count: z.number().int().optional(), name: z.string().optional(), version: z.string().optional()}); export const v1SpanEvent = z.object({attributes: z.array(v1KeyValue).optional(), dropped_attributes_count: z.number().int().optional(), name: z.string().optional(), time_unix_nano: z.string().optional()}); export const spanSpanKind = z.enum(["SPAN_KIND_INTERNAL", "SPAN_KIND_SERVER", "SPAN_KIND_CLIENT", "SPAN_KIND_PRODUCER", "SPAN_KIND_CONSUMER"]); export const spanLink = z.object({attributes: z.array(v1KeyValue).optional(), dropped_attributes_count: z.number().int().optional(), flags: z.number().int().optional(), span_id: z.string().optional(), trace_id: z.string().optional(), trace_state: z.string().optional()}); export const statusStatusCode = z.enum(["STATUS_CODE_OK", "STATUS_CODE_ERROR"]); export const tracev1Status = z.object({code: statusStatusCode.optional(), message: z.string().optional()}); export const v1Span = z.object({attributes: z.array(v1KeyValue).optional(), dropped_attributes_count: z.number().int().optional(), dropped_events_count: z.number().int().optional(), dropped_links_count: z.number().int().optional(), end_time_unix_nano: z.string().optional(), events: z.array(v1SpanEvent).optional(), flags: z.number().int().optional(), kind: spanSpanKind.optional(), links: z.array(spanLink).optional(), name: z.string().optional(), parent_span_id: z.string().optional(), span_id: z.string().optional(), start_time_unix_nano: z.string().optional(), status: tracev1Status.optional(), trace_id: z.string().optional(), trace_state: z.string().optional()}); export const v1ScopeSpans = z.object({schema_url: z.string().optional(), scope: v1InstrumentationScope.optional(), spans: z.array(v1Span).optional()}); export const v1ResourceSpans = z.object({resource: v1Resource.optional(), schema_url: z.string().optional(), scope_spans: z.array(v1ScopeSpans).optional()}); export const v1TracesData = z.object({resource_spans: z.array(v1ResourceSpans).optional()}); export const datav1ListTracesResponse = z.object({traces: z.array(v1TracesData).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 }; /** * Tracing * * POST /api/v1/data/traces */ export const createApiApiV1DataTraces = async (args: CreateApiApiV1DataTracesArgs, options?: CreateApiApiV1DataTracesOptions) => { const {baseUrl = "https://tenant.chronosphere.io", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (ApiKeyAuth !== undefined) headers.set("API-Token", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/data/traces${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(datav1ListTracesResponse, await res.json()) };