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>;