github.com/pyroscope-io/pyroscope@v0.37.3-0.20230725203016-5f6947968bd0/pkg/storage/tree/profile.proto (about)

     1  // Copyright 2016 Google Inc. All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // Profile is a common stacktrace profile format.
    16  //
    17  // Measurements represented with this format should follow the
    18  // following conventions:
    19  //
    20  // - Consumers should treat unset optional fields as if they had been
    21  //   set with their default value.
    22  //
    23  // - When possible, measurements should be stored in "unsampled" form
    24  //   that is most useful to humans.  There should be enough
    25  //   information present to determine the original sampled values.
    26  //
    27  // - On-disk, the serialized proto must be gzip-compressed.
    28  //
    29  // - The profile is represented as a set of samples, where each sample
    30  //   references a sequence of locations, and where each location belongs
    31  //   to a mapping.
    32  // - There is a N->1 relationship from sample.location_id entries to
    33  //   locations. For every sample.location_id entry there must be a
    34  //   unique Location with that id.
    35  // - There is an optional N->1 relationship from locations to
    36  //   mappings. For every nonzero Location.mapping_id there must be a
    37  //   unique Mapping with that id.
    38  
    39  syntax = "proto3";
    40  
    41  package perftools.profiles.tree;
    42  
    43  option go_package = "pkg/tree";
    44  
    45  message Profile {
    46    // A description of the samples associated with each Sample.value.
    47    // For a cpu profile this might be:
    48    //   [["cpu","nanoseconds"]] or [["wall","seconds"]] or [["syscall","count"]]
    49    // For a heap profile, this might be:
    50    //   [["allocations","count"], ["space","bytes"]],
    51    // If one of the values represents the number of events represented
    52    // by the sample, by convention it should be at index 0 and use
    53    // sample_type.unit == "count".
    54    repeated ValueType sample_type = 1;
    55    // The set of samples recorded in this profile.
    56    repeated Sample sample = 2;
    57    // Mapping from address ranges to the image/binary/library mapped
    58    // into that address range.  mapping[0] will be the main binary.
    59    repeated Mapping mapping = 3;
    60    // Useful program location
    61    repeated Location location = 4;
    62    // Functions referenced by locations
    63    repeated Function function = 5;
    64    // A common table for strings referenced by various messages.
    65    // string_table[0] must always be "".
    66    repeated string string_table = 6;
    67    // frames with Function.function_name fully matching the following
    68    // regexp will be dropped from the samples, along with their successors.
    69    int64 drop_frames = 7;   // Index into string table.
    70    // frames with Function.function_name fully matching the following
    71    // regexp will be kept, even if it matches drop_functions.
    72    int64 keep_frames = 8;  // Index into string table.
    73  
    74    // The following fields are informational, do not affect
    75    // interpretation of results.
    76  
    77    // Time of collection (UTC) represented as nanoseconds past the epoch.
    78    int64 time_nanos = 9;
    79    // Duration of the profile, if a duration makes sense.
    80    int64 duration_nanos = 10;
    81    // The kind of events between sampled ocurrences.
    82    // e.g [ "cpu","cycles" ] or [ "heap","bytes" ]
    83    ValueType period_type = 11;
    84    // The number of events between sampled occurrences.
    85    int64 period = 12;
    86    // Freeform text associated to the profile.
    87    repeated int64 comment = 13; // Indices into string table.
    88    // Index into the string table of the type of the preferred sample
    89    // value. If unset, clients should default to the last sample value.
    90    int64 default_sample_type = 14;
    91  }
    92  
    93  // ValueType describes the semantics and measurement units of a value.
    94  message ValueType {
    95    int64 type = 1; // Index into string table.
    96    int64 unit = 2; // Index into string table.
    97  }
    98  
    99  // Each Sample records values encountered in some program
   100  // context. The program context is typically a stack trace, perhaps
   101  // augmented with auxiliary information like the thread-id, some
   102  // indicator of a higher level request being handled etc.
   103  message Sample {
   104    // The ids recorded here correspond to a Profile.location.id.
   105    // The leaf is at location_id[0].
   106    repeated uint64 location_id = 1;
   107    // The type and unit of each value is defined by the corresponding
   108    // entry in Profile.sample_type. All samples must have the same
   109    // number of values, the same as the length of Profile.sample_type.
   110    // When aggregating multiple samples into a single sample, the
   111    // result has a list of values that is the element-wise sum of the
   112    // lists of the originals.
   113    repeated int64 value = 2;
   114    // label includes additional context for this sample. It can include
   115    // things like a thread id, allocation size, etc
   116    repeated Label label = 3;
   117  }
   118  
   119  message Label {
   120    int64 key = 1;   // Index into string table
   121  
   122    // At most one of the following must be present
   123    int64 str = 2;   // Index into string table
   124    int64 num = 3;
   125  
   126    // Should only be present when num is present.
   127    // Specifies the units of num.
   128    // Use arbitrary string (for example, "requests") as a custom count unit.
   129    // If no unit is specified, consumer may apply heuristic to deduce the unit.
   130    // Consumers may also  interpret units like "bytes" and "kilobytes" as memory
   131    // units and units like "seconds" and "nanoseconds" as time units,
   132    // and apply appropriate unit conversions to these.
   133    int64 num_unit = 4;  // Index into string table
   134  }
   135  
   136  message Mapping {
   137    // Unique nonzero id for the mapping.
   138    uint64 id = 1;
   139    // Address at which the binary (or DLL) is loaded into memory.
   140    uint64 memory_start = 2;
   141    // The limit of the address range occupied by this mapping.
   142    uint64 memory_limit = 3;
   143    // Offset in the binary that corresponds to the first mapped address.
   144    uint64 file_offset = 4;
   145    // The object this entry is loaded from.  This can be a filename on
   146    // disk for the main binary and shared libraries, or virtual
   147    // abstractions like "[vdso]".
   148    int64 filename = 5;  // Index into string table
   149    // A string that uniquely identifies a particular program version
   150    // with high probability. E.g., for binaries generated by GNU tools,
   151    // it could be the contents of the .note.gnu.build-id field.
   152    int64 build_id = 6;  // Index into string table
   153  
   154    // The following fields indicate the resolution of symbolic info.
   155    bool has_functions = 7;
   156    bool has_filenames = 8;
   157    bool has_line_numbers = 9;
   158    bool has_inline_frames = 10;
   159  }
   160  
   161  // Describes function and line table debug information.
   162  message Location {
   163    // Unique nonzero id for the location.  A profile could use
   164    // instruction addresses or any integer sequence as ids.
   165    uint64 id = 1;
   166    // The id of the corresponding profile.Mapping for this location.
   167    // It can be unset if the mapping is unknown or not applicable for
   168    // this profile type.
   169    uint64 mapping_id = 2;
   170    // The instruction address for this location, if available.  It
   171    // should be within [Mapping.memory_start...Mapping.memory_limit]
   172    // for the corresponding mapping. A non-leaf address may be in the
   173    // middle of a call instruction. It is up to display tools to find
   174    // the beginning of the instruction if necessary.
   175    uint64 address = 3;
   176    // Multiple line indicates this location has inlined functions,
   177    // where the last entry represents the caller into which the
   178    // preceding entries were inlined.
   179    //
   180    // E.g., if memcpy() is inlined into printf:
   181    //    line[0].function_name == "memcpy"
   182    //    line[1].function_name == "printf"
   183    repeated Line line = 4;
   184    // Provides an indication that multiple symbols map to this location's
   185    // address, for example due to identical code folding by the linker. In that
   186    // case the line information above represents one of the multiple
   187    // symbols. This field must be recomputed when the symbolization state of the
   188    // profile changes.
   189    bool is_folded = 5;
   190  }
   191  
   192  message Line {
   193    // The id of the corresponding profile.Function for this line.
   194    uint64 function_id = 1;
   195    // Line number in source code.
   196    int64 line = 2;
   197  }
   198  
   199  message Function {
   200    // Unique nonzero id for the function.
   201    uint64 id = 1;
   202    // Name of the function, in human-readable form if available.
   203    int64 name = 2; // Index into string table
   204    // Name of the function, as identified by the system.
   205    // For instance, it can be a C++ mangled name.
   206    int64 system_name = 3; // Index into string table
   207    // Source file containing the function.
   208    int64 filename = 4; // Index into string table
   209    // Line number in source file.
   210    int64 start_line = 5;
   211  }