123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 |
- // Copyright 2023, OpenTelemetry Authors
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
- // This file includes work covered by the following copyright and permission notices:
- //
- // Copyright 2016 Google Inc. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- syntax = "proto3";
- package opentelemetry.proto.profiles.v1development;
- import "opentelemetry/proto/common/v1/common.proto";
- import "opentelemetry/proto/resource/v1/resource.proto";
- option csharp_namespace = "OpenTelemetry.Proto.Profiles.V1Development";
- option java_multiple_files = true;
- option java_package = "io.opentelemetry.proto.profiles.v1development";
- option java_outer_classname = "ProfilesProto";
- option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1development";
- // Relationships Diagram
- //
- // ┌──────────────────┐ LEGEND
- // │ ProfilesData │
- // └──────────────────┘ ─────▶ embedded
- // │
- // │ 1-n ─────▷ referenced by index
- // ▼
- // ┌──────────────────┐
- // │ ResourceProfiles │
- // └──────────────────┘
- // │
- // │ 1-n
- // ▼
- // ┌──────────────────┐
- // │ ScopeProfiles │
- // └──────────────────┘
- // │
- // │ 1-1
- // ▼
- // ┌──────────────────┐
- // │ Profile │
- // └──────────────────┘
- // │ n-1
- // │ 1-n ┌───────────────────────────────────────┐
- // ▼ │ ▽
- // ┌──────────────────┐ 1-n ┌──────────────┐ ┌──────────┐
- // │ Sample │ ──────▷ │ KeyValue │ │ Link │
- // └──────────────────┘ └──────────────┘ └──────────┘
- // │ 1-n △ △
- // │ 1-n ┌─────────────────┘ │ 1-n
- // ▽ │ │
- // ┌──────────────────┐ n-1 ┌──────────────┐
- // │ Location │ ──────▷ │ Mapping │
- // └──────────────────┘ └──────────────┘
- // │
- // │ 1-n
- // ▼
- // ┌──────────────────┐
- // │ Line │
- // └──────────────────┘
- // │
- // │ 1-1
- // ▽
- // ┌──────────────────┐
- // │ Function │
- // └──────────────────┘
- //
- // ProfilesData represents the profiles data that can be stored in persistent storage,
- // OR can be embedded by other protocols that transfer OTLP profiles data but do not
- // implement the OTLP protocol.
- //
- // The main difference between this message and collector protocol is that
- // in this message there will not be any "control" or "metadata" specific to
- // OTLP protocol.
- //
- // When new fields are added into this message, the OTLP request MUST be updated
- // as well.
- message ProfilesData {
- // An array of ResourceProfiles.
- // For data coming from a single resource this array will typically contain
- // one element. Intermediary nodes that receive data from multiple origins
- // typically batch the data before forwarding further and in that case this
- // array will contain multiple elements.
- repeated ResourceProfiles resource_profiles = 1;
- }
- // A collection of ScopeProfiles from a Resource.
- message ResourceProfiles {
- reserved 1000;
- // The resource for the profiles in this message.
- // If this field is not set then no resource info is known.
- opentelemetry.proto.resource.v1.Resource resource = 1;
- // A list of ScopeProfiles that originate from a resource.
- repeated ScopeProfiles scope_profiles = 2;
- // The Schema URL, if known. This is the identifier of the Schema that the resource data
- // is recorded in. Notably, the last part of the URL path is the version number of the
- // schema: http[s]://server[:port]/path/<version>. To learn more about Schema URL see
- // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url
- // This schema_url applies to the data in the "resource" field. It does not apply
- // to the data in the "scope_profiles" field which have their own schema_url field.
- string schema_url = 3;
- }
- // A collection of Profiles produced by an InstrumentationScope.
- message ScopeProfiles {
- // The instrumentation scope information for the profiles in this message.
- // Semantically when InstrumentationScope isn't set, it is equivalent with
- // an empty instrumentation scope name (unknown).
- opentelemetry.proto.common.v1.InstrumentationScope scope = 1;
- // A list of Profiles that originate from an instrumentation scope.
- repeated Profile profiles = 2;
- // The Schema URL, if known. This is the identifier of the Schema that the profile data
- // is recorded in. Notably, the last part of the URL path is the version number of the
- // schema: http[s]://server[:port]/path/<version>. To learn more about Schema URL see
- // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url
- // This schema_url applies to all profiles in the "profiles" field.
- string schema_url = 3;
- }
- // Profile is a common stacktrace profile format.
- //
- // Measurements represented with this format should follow the
- // following conventions:
- //
- // - Consumers should treat unset optional fields as if they had been
- // set with their default value.
- //
- // - When possible, measurements should be stored in "unsampled" form
- // that is most useful to humans. There should be enough
- // information present to determine the original sampled values.
- //
- // - On-disk, the serialized proto must be gzip-compressed.
- //
- // - The profile is represented as a set of samples, where each sample
- // references a sequence of locations, and where each location belongs
- // to a mapping.
- // - There is a N->1 relationship from sample.location_id entries to
- // locations. For every sample.location_id entry there must be a
- // unique Location with that index.
- // - There is an optional N->1 relationship from locations to
- // mappings. For every nonzero Location.mapping_id there must be a
- // unique Mapping with that index.
- // Represents a complete profile, including sample types, samples,
- // mappings to binaries, locations, functions, string table, and additional metadata.
- // It modifies and annotates pprof Profile with OpenTelemetry specific fields.
- //
- // Note that whilst fields in this message retain the name and field id from pprof in most cases
- // for ease of understanding data migration, it is not intended that pprof:Profile and
- // OpenTelemetry:Profile encoding be wire compatible.
- message Profile {
- // A description of the samples associated with each Sample.value.
- // For a cpu profile this might be:
- // [["cpu","nanoseconds"]] or [["wall","seconds"]] or [["syscall","count"]]
- // For a heap profile, this might be:
- // [["allocations","count"], ["space","bytes"]],
- // If one of the values represents the number of events represented
- // by the sample, by convention it should be at index 0 and use
- // sample_type.unit == "count".
- repeated ValueType sample_type = 1;
- // The set of samples recorded in this profile.
- repeated Sample sample = 2;
- // Mapping from address ranges to the image/binary/library mapped
- // into that address range. mapping[0] will be the main binary.
- // If multiple binaries contribute to the Profile and no main
- // binary can be identified, mapping[0] has no special meaning.
- repeated Mapping mapping_table = 3;
- // Locations referenced by samples via location_indices.
- repeated Location location_table = 4;
- // Array of locations referenced by samples.
- repeated int32 location_indices = 5;
- // Functions referenced by locations.
- repeated Function function_table = 6;
- // Lookup table for attributes.
- repeated opentelemetry.proto.common.v1.KeyValue attribute_table = 7;
- // Represents a mapping between Attribute Keys and Units.
- repeated AttributeUnit attribute_units = 8;
- // Lookup table for links.
- repeated Link link_table = 9;
- // A common table for strings referenced by various messages.
- // string_table[0] must always be "".
- repeated string string_table = 10;
- // The following fields 9-14 are informational, do not affect
- // interpretation of results.
- // Time of collection (UTC) represented as nanoseconds past the epoch.
- int64 time_nanos = 11;
- // Duration of the profile, if a duration makes sense.
- int64 duration_nanos = 12;
- // The kind of events between sampled occurrences.
- // e.g [ "cpu","cycles" ] or [ "heap","bytes" ]
- ValueType period_type = 13;
- // The number of events between sampled occurrences.
- int64 period = 14;
- // Free-form text associated with the profile. The text is displayed as is
- // to the user by the tools that read profiles (e.g. by pprof). This field
- // should not be used to store any machine-readable information, it is only
- // for human-friendly content. The profile must stay functional if this field
- // is cleaned.
- repeated int32 comment_strindices = 15; // Indices into string table.
- // Index into the string table of the type of the preferred sample
- // value. If unset, clients should default to the last sample value.
- int32 default_sample_type_strindex = 16;
- // A globally unique identifier for a profile. The ID is a 16-byte array. An ID with
- // all zeroes is considered invalid.
- //
- // This field is required.
- bytes profile_id = 17;
- // dropped_attributes_count is the number of attributes that were discarded. Attributes
- // can be discarded because their keys are too long or because there are too many
- // attributes. If this value is 0, then no attributes were dropped.
- uint32 dropped_attributes_count = 19;
- // Specifies format of the original payload. Common values are defined in semantic conventions. [required if original_payload is present]
- string original_payload_format = 20;
- // Original payload can be stored in this field. This can be useful for users who want to get the original payload.
- // Formats such as JFR are highly extensible and can contain more information than what is defined in this spec.
- // Inclusion of original payload should be configurable by the user. Default behavior should be to not include the original payload.
- // If the original payload is in pprof format, it SHOULD not be included in this field.
- // The field is optional, however if it is present then equivalent converted data should be populated in other fields
- // of this message as far as is practicable.
- bytes original_payload = 21;
- // References to attributes in attribute_table. [optional]
- // It is a collection of key/value pairs. Note, global attributes
- // like server name can be set using the resource API. Examples of attributes:
- //
- // "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
- // "/http/server_latency": 300
- // "abc.com/myattribute": true
- // "abc.com/score": 10.239
- //
- // The OpenTelemetry API specification further restricts the allowed value types:
- // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/README.md#attribute
- // Attribute keys MUST be unique (it is not allowed to have more than one
- // attribute with the same key).
- repeated int32 attribute_indices = 22;
- }
- // Represents a mapping between Attribute Keys and Units.
- message AttributeUnit {
- // Index into string table.
- int32 attribute_key_strindex = 1;
- // Index into string table.
- int32 unit_strindex = 2;
- }
- // A pointer from a profile Sample to a trace Span.
- // Connects a profile sample to a trace span, identified by unique trace and span IDs.
- message Link {
- // A unique identifier of a trace that this linked span is part of. The ID is a
- // 16-byte array.
- bytes trace_id = 1;
- // A unique identifier for the linked span. The ID is an 8-byte array.
- bytes span_id = 2;
- }
- // Specifies the method of aggregating metric values, either DELTA (change since last report)
- // or CUMULATIVE (total since a fixed start time).
- enum AggregationTemporality {
- /* UNSPECIFIED is the default AggregationTemporality, it MUST not be used. */
- AGGREGATION_TEMPORALITY_UNSPECIFIED = 0;
- /** DELTA is an AggregationTemporality for a profiler which reports
- changes since last report time. Successive metrics contain aggregation of
- values from continuous and non-overlapping intervals.
- The values for a DELTA metric are based only on the time interval
- associated with one measurement cycle. There is no dependency on
- previous measurements like is the case for CUMULATIVE metrics.
- For example, consider a system measuring the number of requests that
- it receives and reports the sum of these requests every second as a
- DELTA metric:
- 1. The system starts receiving at time=t_0.
- 2. A request is received, the system measures 1 request.
- 3. A request is received, the system measures 1 request.
- 4. A request is received, the system measures 1 request.
- 5. The 1 second collection cycle ends. A metric is exported for the
- number of requests received over the interval of time t_0 to
- t_0+1 with a value of 3.
- 6. A request is received, the system measures 1 request.
- 7. A request is received, the system measures 1 request.
- 8. The 1 second collection cycle ends. A metric is exported for the
- number of requests received over the interval of time t_0+1 to
- t_0+2 with a value of 2. */
- AGGREGATION_TEMPORALITY_DELTA = 1;
- /** CUMULATIVE is an AggregationTemporality for a profiler which
- reports changes since a fixed start time. This means that current values
- of a CUMULATIVE metric depend on all previous measurements since the
- start time. Because of this, the sender is required to retain this state
- in some form. If this state is lost or invalidated, the CUMULATIVE metric
- values MUST be reset and a new fixed start time following the last
- reported measurement time sent MUST be used.
- For example, consider a system measuring the number of requests that
- it receives and reports the sum of these requests every second as a
- CUMULATIVE metric:
- 1. The system starts receiving at time=t_0.
- 2. A request is received, the system measures 1 request.
- 3. A request is received, the system measures 1 request.
- 4. A request is received, the system measures 1 request.
- 5. The 1 second collection cycle ends. A metric is exported for the
- number of requests received over the interval of time t_0 to
- t_0+1 with a value of 3.
- 6. A request is received, the system measures 1 request.
- 7. A request is received, the system measures 1 request.
- 8. The 1 second collection cycle ends. A metric is exported for the
- number of requests received over the interval of time t_0 to
- t_0+2 with a value of 5.
- 9. The system experiences a fault and loses state.
- 10. The system recovers and resumes receiving at time=t_1.
- 11. A request is received, the system measures 1 request.
- 12. The 1 second collection cycle ends. A metric is exported for the
- number of requests received over the interval of time t_1 to
- t_1+1 with a value of 1.
- Note: Even though, when reporting changes since last report time, using
- CUMULATIVE is valid, it is not recommended. */
- AGGREGATION_TEMPORALITY_CUMULATIVE = 2;
- }
- // ValueType describes the type and units of a value, with an optional aggregation temporality.
- message ValueType {
- int32 type_strindex = 1; // Index into string table.
- int32 unit_strindex = 2; // Index into string table.
- AggregationTemporality aggregation_temporality = 3;
- }
- // Each Sample records values encountered in some program
- // context. The program context is typically a stack trace, perhaps
- // augmented with auxiliary information like the thread-id, some
- // indicator of a higher level request being handled etc.
- message Sample {
- // locations_start_index along with locations_length refers to to a slice of locations in Profile.location_indices.
- int32 locations_start_index = 1;
- // locations_length along with locations_start_index refers to a slice of locations in Profile.location_indices.
- // Supersedes location_index.
- int32 locations_length = 2;
- // The type and unit of each value is defined by the corresponding
- // entry in Profile.sample_type. All samples must have the same
- // number of values, the same as the length of Profile.sample_type.
- // When aggregating multiple samples into a single sample, the
- // result has a list of values that is the element-wise sum of the
- // lists of the originals.
- repeated int64 value = 3;
- // References to attributes in Profile.attribute_table. [optional]
- repeated int32 attribute_indices = 4;
- // Reference to link in Profile.link_table. [optional]
- optional int32 link_index = 5;
- // Timestamps associated with Sample represented in nanoseconds. These timestamps are expected
- // to fall within the Profile's time range. [optional]
- repeated uint64 timestamps_unix_nano = 6;
- }
- // Describes the mapping of a binary in memory, including its address range,
- // file offset, and metadata like build ID
- message Mapping {
- // Address at which the binary (or DLL) is loaded into memory.
- uint64 memory_start = 1;
- // The limit of the address range occupied by this mapping.
- uint64 memory_limit = 2;
- // Offset in the binary that corresponds to the first mapped address.
- uint64 file_offset = 3;
- // The object this entry is loaded from. This can be a filename on
- // disk for the main binary and shared libraries, or virtual
- // abstractions like "[vdso]".
- int32 filename_strindex = 4; // Index into string table
- // References to attributes in Profile.attribute_table. [optional]
- repeated int32 attribute_indices = 5;
- // The following fields indicate the resolution of symbolic info.
- bool has_functions = 6;
- bool has_filenames = 7;
- bool has_line_numbers = 8;
- bool has_inline_frames = 9;
- }
- // Describes function and line table debug information.
- message Location {
- // Reference to mapping in Profile.mapping_table.
- // It can be unset if the mapping is unknown or not applicable for
- // this profile type.
- optional int32 mapping_index = 1;
- // The instruction address for this location, if available. It
- // should be within [Mapping.memory_start...Mapping.memory_limit]
- // for the corresponding mapping. A non-leaf address may be in the
- // middle of a call instruction. It is up to display tools to find
- // the beginning of the instruction if necessary.
- uint64 address = 2;
- // Multiple line indicates this location has inlined functions,
- // where the last entry represents the caller into which the
- // preceding entries were inlined.
- //
- // E.g., if memcpy() is inlined into printf:
- // line[0].function_name == "memcpy"
- // line[1].function_name == "printf"
- repeated Line line = 3;
- // Provides an indication that multiple symbols map to this location's
- // address, for example due to identical code folding by the linker. In that
- // case the line information above represents one of the multiple
- // symbols. This field must be recomputed when the symbolization state of the
- // profile changes.
- bool is_folded = 4;
- // References to attributes in Profile.attribute_table. [optional]
- repeated int32 attribute_indices = 5;
- }
- // Details a specific line in a source code, linked to a function.
- message Line {
- // Reference to function in Profile.function_table.
- int32 function_index = 1;
- // Line number in source code.
- int64 line = 2;
- // Column number in source code.
- int64 column = 3;
- }
- // Describes a function, including its human-readable name, system name,
- // source file, and starting line number in the source.
- message Function {
- // Name of the function, in human-readable form if available.
- int32 name_strindex = 1; // Index into string table
- // Name of the function, as identified by the system.
- // For instance, it can be a C++ mangled name.
- int32 system_name_strindex = 2; // Index into string table
- // Source file containing the function.
- int32 filename_strindex = 3; // Index into string table
- // Line number in source file.
- int64 start_line = 4;
- }
|