github.com/pyroscope-io/pyroscope@v0.37.3-0.20230725203016-5f6947968bd0/packages/pyroscope-models/src/profile.ts (about) 1 import { z } from 'zod'; 2 import { SpyNameSchema } from './spyName'; 3 import { UnitsSchema } from './units'; 4 5 export const FlamebearerSchema = z.object({ 6 names: z.array( 7 z.preprocess((n) => { 8 if (!n) { 9 return 'unknown'; 10 } 11 12 return n; 13 }, z.string().min(1)) 14 ), 15 levels: z.array(z.array(z.number())), 16 numTicks: z.number(), 17 maxSelf: z.number(), 18 }); 19 20 export const MetadataSchema = z.object({ 21 // Optional fields since adhoc may be missing them 22 // they are added on /render and /render-diff response 23 // https://github.com/pyroscope-io/pyroscope/blob/main/pkg/server/render.go#L114-L131 24 appName: z.string().optional(), 25 name: z.string().optional(), 26 startTime: z.number().optional(), 27 endTime: z.number().optional(), 28 query: z.string().optional(), 29 maxNodes: z.number().optional(), 30 31 format: z.enum(['single', 'double']), 32 sampleRate: z.number(), 33 spyName: SpyNameSchema, 34 35 units: UnitsSchema, 36 }); 37 38 export const FlamebearerProfileSchema = z.object({ 39 version: z.number().min(1).max(1).default(1), 40 flamebearer: FlamebearerSchema, 41 metadata: MetadataSchema, 42 43 // TODO make thee dependent on format === 'double' 44 leftTicks: z.number().optional(), 45 rightTicks: z.number().optional(), 46 }); 47 48 export type Profile = z.infer<typeof FlamebearerProfileSchema>;