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 }