From 31417c8d1a7937e24c44b92185d298594809ff8d Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Wed, 25 Oct 2023 17:38:48 -0700 Subject: [PATCH 01/34] new otep version --- text/profiles/0000-profiles-data-model.md | 1067 +++++++++++++++++ .../images/otep0000/profiles-data-model.png | Bin 0 -> 86711 bytes 2 files changed, 1067 insertions(+) create mode 100644 text/profiles/0000-profiles-data-model.md create mode 100644 text/profiles/images/otep0000/profiles-data-model.png diff --git a/text/profiles/0000-profiles-data-model.md b/text/profiles/0000-profiles-data-model.md new file mode 100644 index 000000000..fbbf46b0e --- /dev/null +++ b/text/profiles/0000-profiles-data-model.md @@ -0,0 +1,1067 @@ +# Profiles Data Format + +Introduces Data Model for Profiles signal to OpenTelemetry. + + +* [Motivation](#motivation) +* [Design Notes](#design-notes) + * [Design Goals](#design-goals) +* [Data Model](#data-model) + * [Relationships Diagram](#relationships-diagram) + * [Relationships With Other Signals](#relationships-with-other-signals) + * [From profiles to other signals](#from-profiles-to-other-signals) + * [From other signals to profiles](#from-other-signals-to-profiles) + * [Proto Definition](#proto-definition) + * [Message Descriptions](#message-descriptions) + * [Message `ProfilesData`](#message-profilesdata) + * [Message `ResourceProfiles`](#message-resourceprofiles) + * [Message `ScopeProfiles`](#message-scopeprofiles) + * [Message `Profile`](#message-profile) + * [Message `ProfileType`](#message-profiletype) + * [`Sample` structure](#sample-structure) + * [Message `Stacktrace`](#message-stacktrace) + * [Message `AttributeSet`](#message-attributeset) + * [Message `Link`](#message-link) + * [Message `Location`](#message-location) + * [Message `Mapping`](#message-mapping) + * [Message `Function`](#message-function) + * [Example Payloads](#example-payloads) + * [Simple example](#simple-example) + * [Notable differences compared to other signals](#notable-differences-compared-to-other-signals) + * [Relationships between messages](#relationships-between-messages) + * [Arrays of Integers vs Arrays of Structures](#arrays-of-integers-vs-arrays-of-structures) +* [Trade-offs and mitigations](#trade-offs-and-mitigations) +* [Prior art and alternatives](#prior-art-and-alternatives) + * [pprof](#pprof) + * [Divergence of Objectives](#divergence-of-objectives) + * [Technical Reasons](#technical-reasons) + * [Non-Technical Reasons](#non-technical-reasons) + * [Additional Considerations](#additional-considerations) + * [Interoperability between OTLP and pprof](#interoperability-between-otlp-and-pprof) + * [Performance implications in Go ecosystem](#performance-implications-in-go-ecosystem) + * [Benchmarking](#benchmarking) + * [Average profile](#average-profile) + * [Average profile with timestamps added to each sample](#average-profile-with-timestamps-added-to-each-sample) + * [Ruby profile with very deep stacktraces](#ruby-profile-with-very-deep-stacktraces) + * [Large profile](#large-profile) + * [Semantic Conventions](#semantic-conventions) + * [Profile Types](#profile-types) + * [Profile Units](#profile-units) + * [Decision Log](#decision-log) +* [Open questions](#open-questions) +* [Future possibilities](#future-possibilities) + + +## Motivation + +This is a proposal of a data model and semantic conventions that allow to represent profiles coming from a variety of different applications or systems. Existing profiling formats can be unambiguously mapped to this data model. Reverse mapping from this data model is also possible to the extent that the target profiling format has equivalent capabilities. + +The purpose of the data model is to have a common understanding of what a profile is, what data needs to be recorded, transferred, stored and interpreted by a profiling system. + +## Design Notes + +### Design Goals + +These goals are based on the vision set out in [Profiling Vision OTEP](./0212-profiling-vision.md): + +* Make profiling compatible with other signals +* Standardize profiling data model for industry-wide sharing and reuse +* Profilers must be able to be implementable with low overhead and conforming to OpenTelemetry-wide runtime overhead / intrusiveness and wire data size requirements. + +The last point is particularly important in the context of profiling. Profilers generate large amounts of data, and users of profiling technology are very sensitive to the overhead that profiling introduces. In the past high overhead has been a blocker for wider adoption of continuous profiling and was one of the reasons why profiling was not used in production environments. Therefore it is important to make sure that the overhead of handling the profiling data on the client side as well as in intermediaries (e.g collector) is minimal. + +## Data Model + +This section describes various protobuf messages that are used to represent profiles data. + +### Relationships Diagram + +The following diagram shows the relationships between the messages. Relationships between messages are represented by either embedding one message in another (red arrows), or by referencing a message by index in a lookup table (blue arrows). More on that in [Relationships between messages](#relationships-between-messages) section below. + +In addition to that, relationship between `stacktraces`, `attribute_sets` and `links` is implicit and based on the order of references to these objects in corresponding reference lists within a `ProfileType` message. The relationship between these messages creates an ephemeral structure called "Sample". More on that in [Arrays of Integers vs Arrays of Structures](#arrays-of-integers-vs-arrays-of-structures) section below. + +![diagram of data relationships](./images/otep0000/profiles-data-model.png) + +### Relationships With Other Signals + +There are two types of relationships between profiles and other signals: + +* from other signals to profiles (e.g from log records, exemplars or trace spans) +* from profiles to other signals + +#### From profiles to other signals + +[Link](#message-link) is a message that is used to represent connections between profile [Samples](#sample-structure) and trace spans. It uses `trace_id` and `span_id` as identifiers. + +For other signals, such as logs or metrics, because other signals use the same way of linking between such signals and traces (`trace_id` and `span_id`), it is possible to correlate profiles with other signals using this same information. + +#### From other signals to profiles + +Other signals can use `profile_id` to reference a profile. For example, a log record can reference a profile that was collected at the time when the log record was generated by using `profile_id` as one of the attributes. This allows to correlate logs with profiles. + +Additionally, `trace_id`, `span_id` can be used to reference specific [Samples](#sample-structure) in a Profile, since [Samples](#sample-structure) are linked to traces with these same identifiers using [Links](#message-link). + +The exact details of such linking are out of scope for this OTEP. It is expected that other OTEPs will define how such linking is done. + +### Proto Definition + + + +```proto +// 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. + +syntax = "proto3"; + +package opentelemetry.proto.profiles.v1; + +import "opentelemetry/proto/common/v1/common.proto"; +import "opentelemetry/proto/resource/v1/resource.proto"; + +option csharp_namespace = "OpenTelemetry.Proto.Profiles.V1"; +option java_multiple_files = true; +option java_package = "io.opentelemetry.proto.profiles.v1"; +option java_outer_classname = "ProfilesProto"; +option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1"; + +// ProfilesData represents the profiles data that can be stored in a 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; + + // 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; + + // This schema_url applies to all profiles and profile events in the "profiles" field. + string schema_url = 3; +} + +// A Profile represents a single profile generated by a profiler. It has an ID and it has a start time and end time. Profile contains lookup tables for Stacktraces, Mappings, Locations, Functions, Links, AttributeSets, and strings. + +// Profile embeds one or more ProfileType messages — this allows to represent multiple profile types (e.g allocated objects and allocated bytes) in a single Profile message. +message Profile { + // A unique identifier for a profile. The ID is a 16-byte array. An ID with + // all zeroes is considered invalid. Profile ID can be used by other signals to uniquely identify a profile. + // + // This field is required. + bytes profile_id = 1; + + // start_time_unix_nano is the start time of the profile. + // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + // + // This field is semantically required and it is expected that end_time >= start_time. + fixed64 start_time_unix_nano = 2; + + // end_time_unix_nano is the end time of the profile. + // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + // + // This field is semantically required and it is expected that end_time >= start_time. + fixed64 end_time_unix_nano = 3; + + // attributes is a collection of key/value pairs. Attributes that are not specific to a particular profile (like server name) MUST be specified in Resource attributes instead. 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 opentelemetry.proto.common.v1.KeyValue attributes = 4; + + // 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 = 5; + + // This is the original profile as retrieved from the profiler. For example, this can be a pprof or jfr encoded profile. The reason users might want to include these is because some formats are very generic and can not be easily converted to a more structured format. + // TODO: add a field that indicates the format of the original payload? + bytes original_payload = 6; + + // A lookup table of Stacktraces. Other messages refer to Stacktraces in this table by index. + repeated Stacktrace stacktraces = 7; + + // A lookup table of Mappings. Other messages refer to Mappings in this table by index. + repeated Mapping mappings = 8; + + // A lookup table of Locations. Other messages refer to Locations in this table by index. + repeated Location locations = 9; + + // A lookup table of Functions. Other messages refer to Functions in this table by index. + repeated Function functions = 10; + + // A lookup table of Links to trace spans associated with this profile. Other messages refer to Links in this table by index. The first message must be an empty Link — this represents a null Link. + repeated Link links = 11; + + // A lookup table of AttributeSets. Other messages refer to AttributeSets in this table by index. The first message must be an empty AttributeSet — this represents a null AttributeSet. + repeated AttributeSet attribute_sets = 12; + + // A lookup table of strings. Other messages refer to strings in this table by index. + // The 0-th element must be an empty string (""). + repeated string string_table = 13; + + // List of profile types included in this profile. The first item in the list is considered to be the "default" profile type. Example profile types are allocated objects or allocated bytes. + repeated ProfileType profile_types = 14; +} + +// Represents a relationship between a Sample (ephemeral structure represented by references to a Stacktrace, AttributeSet, Link + value and a timestamp) and a trace span. This allows for linking between specific Samples within a profile and traces. +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; +} + +// AttributeSet represents a set of attributes. Multiple Samples, Locations and Mappings may have the same attributes and that's why this is a separate message. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +message AttributeSet { + // Attributes associated with a specific Sample, Location or a Mapping. + // attributes 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 opentelemetry.proto.common.v1.KeyValue attributes = 1; + + // 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 = 2; +} + +// A stacktrace is a sequence of locations. Order of locations goes from callers to callees. Many stacktraces will point to the same locations. The link between stacktraces, attribute sets, links, values and timestamps is implicit and is based on the order of the elements in the corresponding tables in ProfileType message. +message Stacktrace { + repeated uint32 location_indices = 1; +} + +// AggregationTemporality defines how a profile aggregator reports aggregated +// values. It describes how those values relate to the time interval over +// which they are aggregated. +enum AggregationTemporality { + AGGREGATION_TEMPORALITY_UNSPECIFIED = 0; // Temporality unspecified. + AGGREGATION_TEMPORALITY_DELTA = 1; // Delta aggregation over time. + AGGREGATION_TEMPORALITY_CUMULATIVE = 2; // Cumulative aggregation over time. +} + +// Represents a single profile type. It implicitly creates a connection between Stacktraces, Links, AttributeSets, values and timestamps. The connection is based on the order of the elements in the corresponding lists. This implicit connection creates an ephemeral structure called Sample. The length of reference lists must be the same. It is acceptable however for timestamps, links and attribute set lists to be empty. It is not acceptable for stacktrace or values lists to be empty. +message ProfileType { + // aggregation_temporality describes if the aggregator reports delta changes + // since last report time, or cumulative changes since a fixed start time. + AggregationTemporality aggregation_temporality = 1; + + // Profiler sample rate in Hz. This parameter indicates the frequency at which samples are collected, specifically for CPU profiles. Common values are 99 or 100. [Optional]. + uint64 sample_rate = 2; + + // Index into the string table for the type of the sample. Example values are "cpu", "alloc_objects", "alloc_bytes", "block_contentions". Full list is defined in https://github.com/open-telemetry/semantic-conventions + uint32 type_index = 3; + + // Index into the string table for the unit of the sample. Example values are "ms", "ns", "samples", "bytes". Full list is defined in https://github.com/open-telemetry/semantic-conventions + uint32 unit_index = 4; + + // List of indices referring to Stacktraces in the Profile's stacktrace table. + repeated uint32 stacktrace_indices = 10; + + // List of indices referring to Links in the Profile's link table. Each link corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] + repeated uint32 link_indices = 11; + + // List of indices referring to AttributeSets in the Profile's attribute set table. Each attribute set corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] + repeated uint32 attribute_set_indices = 12; + + // List of values. Each value corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. + repeated int64 values = 13; + + // List of timestamps. Each timestamp corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. + repeated uint64 timestamps = 14; +} + +// SymbolFidelity enumerates the level of fidelity for symbol information in a profile. +enum SymbolFidelity { + SYMBOL_FIDELITY_UNSPECIFIED = 0; // The symbol fidelity level is unspecified. + SYMBOL_FIDELITY_FULL = 1; // The symbol fidelity is at its fullest level of detail. +} + +// Describes the mapping from a binary to its original source code. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +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]". Index into string table + uint32 filename_index = 4; + // A string that uniquely identifies a particular program version + // with high probability. E.g., for binaries generated by GNU tools, + // it could be the contents of the .note.gnu.build-id field. Index into string table + uint32 build_id_index = 5; + + SymbolFidelity symbolic_info = 6; + + // Reference to an attribute set from the Profile's attribute set table. + uint32 attribute_set_index = 7; +} + +// Describes function and line table debug information. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +message Location { + // The id of the corresponding profile.Mapping for this location. + // It can be unset if the mapping is unknown or not applicable for + // this profile type. + uint32 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; + + // Reference to an attribute set from the Profile's attribute set table. + uint32 attribute_set_index = 4; +} + +// Represents a line in a source file. These are embedded within a Location message. +message Line { + // The id of the corresponding profile.Function for this line. + uint32 function_index = 1; + // Line number in source code. + uint32 line = 2; +} + +// Represents a function in a source file. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +message Function { + // Name of the function, in human-readable form if available. Index into string table + uint32 name_index = 1; + // Name of the function, as identified by the system. + // For instance, it can be a C++ mangled name. Index into string table + uint32 system_name_index = 2; + // Source file containing the function. Index into string table + uint32 filename_index = 3; + // Line number in source file. + uint32 start_line = 4; +} +``` + + + +### Message Descriptions + +These are detailed descriptions of protobuf messages that are used to represent profiling data. + + +#### Message `ProfilesData` + +ProfilesData represents the profiles data that can be stored in a 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 `ResourceProfiles` + +A collection of ScopeProfiles from a Resource. + +
+Field Descriptions + +##### Field `resource` + +The resource for the profiles in this message. +If this field is not set then no resource info is known. + +##### Field `scope_profiles` + +A list of ScopeProfiles that originate from a resource. + +##### Field `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. +
+ +#### Message `ScopeProfiles` + +A collection of Profiles produced by an InstrumentationScope. + +
+Field Descriptions + +##### Field `scope` + +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). + +##### Field `profiles` + +A list of Profiles that originate from an instrumentation scope. + +##### Field `schema_url` + +This schema_url applies to all profiles and profile events in the "profiles" field. +
+ +#### Message `Profile` + +A Profile represents a single profile generated by a profiler. It has an ID and it has a start time and end time. Profile contains lookup tables for Stacktraces, Mappings, Locations, Functions, Links, AttributeSets, and strings. + +Profile embeds one or more ProfileType messages — this allows to represent multiple profile types (e.g allocated objects and allocated bytes) in a single Profile message. + +
+Field Descriptions + +##### Field `profile_id` + +A unique identifier for a profile. The ID is a 16-byte array. An ID with +all zeroes is considered invalid. Profile ID can be used by other signals to uniquely identify a profile. +This field is required. + +##### Field `start_time_unix_nano` + +start_time_unix_nano is the start time of the profile. +Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. +This field is semantically required and it is expected that end_time >= start_time. + +##### Field `end_time_unix_nano` + +end_time_unix_nano is the end time of the profile. +Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. +This field is semantically required and it is expected that end_time >= start_time. + +##### Field `attributes` + +attributes is a collection of key/value pairs. Attributes that are not specific to a particular profile (like server name) MUST be specified in Resource attributes instead. + +##### Field `dropped_attributes_count` + +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. + +##### Field `original_payload` + +This is the original profile as retrieved from the profiler. For example, this can be a pprof or jfr encoded profile. The reason users might want to include these is because some formats are very generic and can not be easily converted to a more structured format. +TODO: add a field that indicates the format of the original payload? + +##### Field `stacktraces` + +A lookup table of Stacktraces. Other messages refer to Stacktraces in this table by index. + +##### Field `mappings` + +A lookup table of Mappings. Other messages refer to Mappings in this table by index. + +##### Field `locations` + +A lookup table of Locations. Other messages refer to Locations in this table by index. + +##### Field `functions` + +A lookup table of Functions. Other messages refer to Functions in this table by index. + +##### Field `links` + +A lookup table of Links to trace spans associated with this profile. Other messages refer to Links in this table by index. The first message must be an empty Link — this represents a null Link. + +##### Field `attribute_sets` + +A lookup table of AttributeSets. Other messages refer to AttributeSets in this table by index. The first message must be an empty AttributeSet — this represents a null AttributeSet. + +##### Field `string_table` + +A lookup table of strings. Other messages refer to strings in this table by index. +The 0-th element must be an empty string (""). + +##### Field `profile_types` + +List of profile types included in this profile. The first item in the list is considered to be the "default" profile type. Example profile types are allocated objects or allocated bytes. +
+ +#### Message `ProfileType` + +Represents a single profile type. It implicitly creates a connection between Stacktraces, Links, AttributeSets, values and timestamps. The connection is based on the order of the elements in the corresponding lists. This implicit connection creates an ephemeral structure called Sample. The length of reference lists must be the same. It is acceptable however for timestamps, links and attribute set lists to be empty. It is not acceptable for stacktrace or values lists to be empty. + +
+Field Descriptions + +##### Field `aggregation_temporality` + +aggregation_temporality describes if the aggregator reports delta changes +since last report time, or cumulative changes since a fixed start time. + +##### Field `sample_rate` + +Profiler sample rate in Hz. This parameter indicates the frequency at which samples are collected, specifically for CPU profiles. Common values are 99 or 100. [Optional]. + +##### Field `type_index` + +Index into the string table for the type of the sample. Example values are "cpu", "alloc_objects", "alloc_bytes", "block_contentions". Full list is defined in [semantic-conventions](https://github.com/open-telemetry/semantic-conventions) + +##### Field `unit_index` + +Index into the string table for the unit of the sample. Example values are "ms", "ns", "samples", "bytes". Full list is defined in [semantic-conventions](https://github.com/open-telemetry/semantic-conventions) + +##### Field `stacktrace_indices` + +List of indices referring to Stacktraces in the Profile's stacktrace table. + +##### Field `link_indices` + +List of indices referring to Links in the Profile's link table. Each link corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] + +##### Field `attribute_set_indices` + +List of indices referring to AttributeSets in the Profile's attribute set table. Each attribute set corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] + +##### Field `values` + +List of values. Each value corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. + +##### Field `timestamps` + +List of timestamps. Each timestamp corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. +
+ +#### `Sample` structure + +Sample is an ephemeral structure. It is not explicitly represented as a protobuf message, instead it is represented by stacktraces, links, attribute sets, values and timestamps tables in `ProfileType` message. The connection is based on the order of the elements in the corresponding tables. For example, AttributeSet with index 1 corresponds to a Stacktrace located at index 1 in stacktraces table, and a Value located at index 1 in values table. Together they form a Sample. + +#### Message `Stacktrace` + +A stacktrace is a sequence of locations. Order of locations goes from callers to callees. Many stacktraces will point to the same locations. The link between stacktraces, attribute sets, links, values and timestamps is implicit and is based on the order of the elements in the corresponding tables in ProfileType message. + +#### Message `AttributeSet` + +AttributeSet represents a set of attributes. Multiple Samples, Locations and Mappings may have the same attributes and that's why this is a separate message. These are stored in a lookup table in a Profile. These are referenced by index from other messages. + +
+Field Descriptions + +##### Field `attributes` + +Attributes associated with a specific Sample, Location or a Mapping. +attributes is a collection of key/value pairs. Note, global attributes +like server name can be set using the resource API. + +##### Field `dropped_attributes_count` + +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. +
+ +#### Message `Link` + +Represents a relationship between a Sample (ephemeral structure represented by references to a Stacktrace, AttributeSet, Link + value and a timestamp) and a trace span. This allows for linking between specific Samples within a profile and traces. + +
+Field Descriptions + +##### Field `trace_id` + +A unique identifier of a trace that this linked span is part of. The ID is a +16-byte array. + +##### Field `span_id` + +A unique identifier for the linked span. The ID is an 8-byte array. +
+ +#### Message `Location` + +Describes function and line table debug information. These are stored in a lookup table in a Profile. These are referenced by index from other messages. + +
+Field Descriptions + +##### Field `mapping_index` + +The id of the corresponding profile.Mapping for this location. +It can be unset if the mapping is unknown or not applicable for +this profile type. + +##### Field `address` + +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. + +##### Field `line` + +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" + +##### Field `attribute_set_index` + +Reference to an attribute set from the Profile's attribute set table. +
+ +#### Message `Mapping` + +Describes the mapping from a binary to its original source code. These are stored in a lookup table in a Profile. These are referenced by index from other messages. + +
+Field Descriptions + +##### Field `memory_start` + +Address at which the binary (or DLL) is loaded into memory. + +##### Field `memory_limit` + +The limit of the address range occupied by this mapping. + +##### Field `file_offset` + +Offset in the binary that corresponds to the first mapped address. + +##### Field `filename_index` + +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]". Index into string table + +##### Field `build_id_index` + +A string that uniquely identifies a particular program version +with high probability. E.g., for binaries generated by GNU tools, +it could be the contents of the .note.gnu.build-id field. Index into string table + +##### Field `attribute_set_index` + +Reference to an attribute set from the Profile's attribute set table. +
+ +#### Message `Function` + +Represents a function in a source file. These are stored in a lookup table in a Profile. These are referenced by index from other messages. + +
+Field Descriptions + +##### Field `name_index` + +Name of the function, in human-readable form if available. Index into string table + +##### Field `system_name_index` + +Name of the function, as identified by the system. +For instance, it can be a C++ mangled name. Index into string table + +##### Field `filename_index` + +Source file containing the function. Index into string table + +##### Field `start_line` + +Line number in source file. +
+ + + +### Example Payloads + +#### Simple example + +Considering the following example presented in a modified collapsed format: + +``` +foo;bar;baz 100 region=us,trace_id=0x01020304010203040102030401020304,span_id=0x9999999999999999 1687841528000000 +foo;bar 200 region=us +``` + +It represents 2 samples: + +* one for stacktrace `foo;bar;baz` with value `100`, attributes `region=us`, linked to trace `0x01020304010203040102030401020304` and span `0x9999999999999999`, and timestamp `1687841528000000` +* one for stacktrace `foo;bar` with value `200`, attributes `region=us`, no link, no timestamp + +The resulting profile in OTLP format would look like this (in YAML format): + +```yaml +resource_profiles: + - resource: + attributes: null + schema_url: todo + scope_profiles: + - profiles: + - attribute_sets: + - attributes: null + - attributes: + - key: region + value: + Value: + string_value: us + functions: + - name_index: 1 + - name_index: 2 + - name_index: 3 + links: + - span_id: "" + trace_id: "" + - span_id: "9999999999999999" + trace_id: "01020304010203040102030401020304" + locations: + - line: + - {} + - line: + - function_index: 1 + - line: + - function_index: 2 + profile_types: + - aggregation_temporality: 1 + sample_rate: 100 + type_index: 4 + unit_index: 5 + attribute_set_indices: + - 1 + - 1 + link_indices: + - 1 + - 0 + stacktrace_indices: + - 0 + - 1 + timestamps: + - 1.687841528e+15 + - 0 + values: + - 100 + - 200 + stacktraces: + - location_indices: + - 0 + - 1 + - 2 + - location_indices: + - 0 + - 1 + string_table: + - "" + - foo + - bar + - baz + - cpu + - samples + attributes: null + profile_id: 0102030405060708090a0b0c0d0e0f10 + scope: + attributes: null +``` + +### Notable differences compared to other signals + +Due to the increased performance requirements associated with profiles signal, here are some notable differences between profiles signal and other signals. + +#### Relationships between messages + +There are two main ways relationships between messages are represented: + +* by embedding a message into another message (standard protobuf way) +* by referencing a message by index (similar to how it's done in pprof) + +Profiling signal is different from most other ones in that we use the referencing technique a lot to represent relationships between messages where there is a lot of duplication happening. This allows to reduce the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. + +This pseudocode illustrates the conceptual difference between the two approaches. Note that this example is simplified for the sake of clarity: + +```json +// denormalized +"samples": [ + { + "stacktrace": ["foo", "bar"], + "value": 100, + "attribute_set": { + "endpoint": "/v1/users" + } + }, { + "stacktrace": ["foo", "bar", "baz"], + "value": 200, + "attribute_set": { + "endpoint": "/v1/users" + } + } +], + +// normalized +"attribute_sets": [ + { + "endpoint": "/v1/users" + } +], +"samples": [ + { + "stacktrace": ["foo", "bar"], + "value": 100, + "attribute_set_index": 0 + }, { + "stacktrace": ["foo", "bar", "baz"], + "value": 200, + "attribute_set_index": 0 + } +], +``` + +Explanation: because multiple samples have the same attributes, we can store them in a separate table and reference them by index. This reduces the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. + +Benchmarking shows that this approach is significantly more efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. See [Prior art and alternatives](#prior-art-and-alternatives) for more details. + +#### Arrays of Integers vs Arrays of Structures + +Another optimization technique that we use to reduce the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload is using arrays of integers instead of arrays of structures to represent messages. This technique is used in conjunction with the referencing technique described above. Here's pseudocode that illustrates the approach. Note that this example is simplified for the sake of clarity: + +```json +// normalized +"samples": [ + { + "stacktrace_index": 1, + "value": 100 + }, { + "stacktrace_index": 2, + "value": 200 + } +], + +// arrays +"stacktrace_indices": [1, 2], +"values": [100, 200] +``` + +Explanation: in `normalized` representation samples are a collection of references to other messages plus a value. The standard way of representing those is to put each [Samples](#sample-structure) into a separate message, and link from [Samples](#sample-structure) to other messages. Parsing / generating such payloads creates many individual objects that runtime has to track. The second `arrays` representation puts values of the same kind into separate arrays. This reduces the size of the resulting protobuf payload and the number of objects that need to be allocated to parse / generate such payload. + +Benchmarking shows that this approach is significantly more efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. See [Prior art and alternatives](#prior-art-and-alternatives) for more details. + +## Trade-offs and mitigations + +The biggest trade-off was made between the performance characteristics of the format and it's simplicity. The emphasis was made on the performance characteristics, which resulted in a cognitively more complex format. + +Authors feel like the complexity is justified for the following reasons: + +* as presented in [Design Goals](#design-goals) section, the performance characteristics of the format are very important for the profiling signal +* the format is not intended to be used directly by the end users, but rather by the developers of profiling systems that are used to and are expected to be able to handle the complexity. It is not more complex than other existing formats + +Alternative formats that are simpler to understand were considered, but they were not as efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. See [next chapter, Prior art and alternatives](#prior-art-and-alternatives) for more details. + +## Prior art and alternatives + +The specification presented here was heavily inspired by pprof. Multiple alternative representations were considered, including: + +* `denormalized` representation, where all messages are embedded and no references by index are used. This is the simplest representation, but it is also the least efficient (by a huge margin) in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. +* `normalized` representation, where messages that repeat often are stored in separate tables and are referenced by indices. See [this chapter](#relationships-between-messages) for more details. This technique reduces the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. +* `arrays` representation, which is based on `normalized` representation, but uses arrays of integers instead of arrays of structures to represent messages. See [this chapter](#arrays-of-integers-vs-arrays-of-structures) for more details. It further reduces the number of allocations, and the size of the resulting protobuf payload. +* `pprof` itself. More on that in the next section + +### pprof + +pprof itself was also considered as one of the options. It is a very efficient and very popular format, but it is not a good fit for OTLP for the combination of technical and non-technical reasons: + +#### Divergence of Objectives + +Before we dive into the actual reasons, it's important to recognize the differing objectives between the pprof format and the proposed OTLP profiles format: + +* The pprof format, well-established in the Go ecosystem, primarily serves as a means to visualize and analyze profiling data. Users often share pprof files and use various tools for visualization. Interoperability is a key feature, given the extensive ecosystem that produces and consumes pprof files. + +* On the other hand, OpenTelemetry has a broader mission, encompassing the collection and management of telemetry data across various languages and platforms. This mission emphasizes cross-linking between various signals (traces, metrics, logs, profiles), vendor-neutrality, and extensibility. OpenTelemetry aims to provide not only the wire format and a reference implementation for one runtime but also comprehensive tooling for various languages and runtimes, including client SDKs and collectors. + +* It's important to note that pprof primarily serves as a file format, with users directly interacting with pprof files. In contrast, OTLP serves as a wire format, and users don't interact directly with OTLP data. Moreover, OTLP format may evolve over time without affecting user experience. + +* OTLP profiles are not intended to replace pprof. Instead, they serve as a means to transport profiling data, linked to other signals, across the wire. + +#### Technical Reasons + +**Support for Linking Between Signals**: While it is possible to express links between signals in pprof using labels, the format is not optimized for this use-case within the broader telemetry ecosystem. + +**Support for Timestamps**: Similar to the previous point, pprof can handle timestamps, but doing so efficiently would require representing each timestamp as a separate Sample, which is inefficient due to the format's lack of optimization for this use-case. For more context, see [this PR from @felixge](https://github.com/google/pprof/pull/728). + +**Miscellaneous Improvements**: The OTLP profiles format introduces several improvements, such as the use of arrays-of-integers instead of arrays-of-structs representation (which reduces memory allocations), the use of indices instead of IDs to refer to structs (eliminating confusion and reducing payload size), and the use of semantic conventions to define profile types and units, among others. + +#### Non-Technical Reasons + +There are also non-technical considerations at play: + +**Interoperability and Backwards Compatibility**: Interoperability is a key strength of pprof. Tools that read pprof files from a decade ago still work with files generated today and vice versa. Introducing changes to pprof to align with OTLP's objectives could disrupt this longstanding interoperability. + +**Ability to Make Changes to the Format**: While using the same format would be ideal, the divergence in objectives between pprof and OTLP profiles could hinder effective collaboration and progress in introducing profiling support to OpenTelemetry. + +#### Additional Considerations + +##### Interoperability between OTLP and pprof + +One of the stated requirements in this OTEP is that existing profiling formats (pprof) can be unambiguously mapped to this data model. This means that existing tools that generate pprof files are automatically compatible with any OTLP backend. + +It works in the opposite direction as well — any OTLP backend should be able to generate pprof files, albeit some functionality (like timestamps support) may be limited. This is important because it allows users to use existing tools to visualize profiles generated by OpenTelemetry. + +##### Performance implications in Go ecosystem + +There are concerns that using OTLP profiles will have a negative impact on performance in the Go ecosystem. We discussed this with Go runtime team in one of the meetings and the direction we landed on is that the Go runtime could provide lower level APIs that would allow us to avoid the overhead of parsing pprof and encoding it into OTLP. FWIW There's already APIs like that for memory profiles. + +### Benchmarking + +[Benchmarking results](https://docs.google.com/spreadsheets/d/1Q-6MlegV8xLYdz5WD5iPxQU2tsfodX1-CDV1WeGzyQ0/edit#gid=0) showed that `arrays` representation is the most efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. Some notable benchmark results are showcased below: + +#### Average profile + +The source for this test is a single 10 second pprof profile collected from a simple go program. It represents a typical profile that is collected from a running application. You can see that the `arrays` representation is the most efficient in terms of memory allocations and size of the resulting protobuf payload. + +|name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| +|---|---|---|---|---|---|---| +|BenchmarkAveragePprof-10|8,030|3,834|n/a|1|n/a|n/a| +|BenchmarkAverageDenormalized-10|83,187|3,829|3,167|1|1,027,424|3,191| +|BenchmarkAverageNormalized-10|7,955|3,416|706|1|867,488|1,037| +|BenchmarkAverageArrays-10|7,742|3,311|584|1|869,648|880| + +#### Average profile with timestamps added to each sample + +The source is the same as in the previous example, but this time there were timestamps added to each sample in the profile. `arrays` representation remains the most efficient one. + +|name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| +|---|---|---|---|---|---|---| +|BenchmarkAverageTimestampsPprof-10|9,478|3,865|n/a|1|n/a|n/a| +|BenchmarkAverageTimestampsDenormalized-10|119,526|4,154|4,482|1|1,125,320|4,893| +|BenchmarkAverageTimestampsNormalized-10|9,637|3,549|941|1|890,192|1,873| +|BenchmarkAverageTimestampsArrays-10|9,560|3,381|684|1|894,472|1,680| + +#### Ruby profile with very deep stacktraces + +The source for this test is an aggregated pprof profile collected from a Ruby application that has very deep stacktraces. You can see that the `arrays` representation is the most efficient in terms of memory allocations and size of the resulting protobuf payload. + +|name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| +|---|---|---|---|---|---|---| +|BenchmarkRuby1Pprof-10|1,869,563|115,323|n/a|1|n/a|n/a| +|BenchmarkRuby1Denormalized-10|163,107,484|4,716,442|3,840,093|1|319,473,752|3,844,625| +|BenchmarkRuby1Normalized-10|1,931,905|130,556|41,457|1|18,982,328|78,242| +|BenchmarkRuby1Arrays-10|1,886,964|120,382|23,481|1|18,365,800|42,284| + +#### Large profile + +The source for this test is an aggregated pprof profile collected from a Go application over a large period of time. This one shows that the `arrays` representation remains the most efficient, however, the `gzipped_bytes` number is a little bit larger. + +|name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| +|---|---|---|---|---|---|---| +|BenchmarkLargePprof-10|16,767,419|4,625,632|n/a|163|n/a|n/a| +|BenchmarkLargeDenormalized-10|969,446,655|71,246,645|24,036,740|163|2,140,322,432|24,429,954| +|BenchmarkLargeNormalized-10|17,813,931|4,874,456|2,068,600|163|208,793,736|4,217,313| +|BenchmarkLargeArrays-10|16,980,323|5,779,036|964,989|163|218,418,624|3,396,515| + +### Semantic Conventions + +We plan to leverage OTEL Semantic Conventions for various enums such as profile types or units. Here's a non-exhaustive list of semantic conventions that are used in data model. It is expected to be extended in the future. + +#### Profile Types + +Here's a list of possible profile types. It is not exhaustive, and it is expected that more profile types will be added in the future: + +* `cpu` +* `wall` +* `goroutines` +* `alloc_objects` +* `alloc_space` +* `inuse_objects` +* `inuse_space` +* `mutex_contentions` +* `mutex_delay` +* `block_contentions` +* `block_delay` + +#### Profile Units + +Here's a list of possible profile units. It is not exhaustive, and it is expected that more units will be added in the future: + +* `bytes` +* `samples` +* `nanoseconds` +* `milliseconds` +* `count` + +### Decision Log + +There were many other alternatives considered during the design process. See [Decision Log](https://github.com/open-telemetry/opentelemetry-proto-profile/blob/54bba7a86d839b9d29488de8e22d8c567d283e7b/opentelemetry/proto/profiles/v1/decision-log.md#L0-L1) for more information about various decisions that were made during the design process. + +## Open questions + +Client implementations are out of scope for this OTEP. At the time of writing this we do have a reference implementation in Go, as well as a working backend and collector, but they are not yet ready for production use. We are also working on a reference implementation in Java. We are looking for contributors to help us with other languages. + +## Future possibilities + +This OTEP enables us to start working on various parts of [OTEL Specification](https://github.com/open-telemetry/opentelemetry-specification): + +* Profiles Data Model +* Profiles API +* Profiles SDK + +That in turn would enable us to start working on: + +* [OTEL Collector](https://github.com/open-telemetry/opentelemetry-collector) +* Client SDK implementations in various languages (e.g Go and Java) diff --git a/text/profiles/images/otep0000/profiles-data-model.png b/text/profiles/images/otep0000/profiles-data-model.png new file mode 100644 index 0000000000000000000000000000000000000000..1e000b4e73a16f370b1fc1584c86ceef3cd5a613 GIT binary patch literal 86711 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 Date: Tue, 31 Oct 2023 00:01:14 -0700 Subject: [PATCH 02/34] more changes to the OTEP --- text/profiles/0000-profiles-data-model.md | 1279 +++++++++++------ .../images/otep0000/profiles-data-model.png | Bin 86711 -> 70246 bytes 2 files changed, 834 insertions(+), 445 deletions(-) diff --git a/text/profiles/0000-profiles-data-model.md b/text/profiles/0000-profiles-data-model.md index fbbf46b0e..d04fda58e 100644 --- a/text/profiles/0000-profiles-data-model.md +++ b/text/profiles/0000-profiles-data-model.md @@ -16,35 +16,35 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Message `ProfilesData`](#message-profilesdata) * [Message `ResourceProfiles`](#message-resourceprofiles) * [Message `ScopeProfiles`](#message-scopeprofiles) + * [Message `ProfileContainer`](#message-profilecontainer) * [Message `Profile`](#message-profile) - * [Message `ProfileType`](#message-profiletype) - * [`Sample` structure](#sample-structure) - * [Message `Stacktrace`](#message-stacktrace) - * [Message `AttributeSet`](#message-attributeset) - * [Message `Link`](#message-link) + * [Message `ValueType`](#message-valuetype) + * [Message `Sample`](#message-sample) * [Message `Location`](#message-location) + * [Message `Line`](#message-line) * [Message `Mapping`](#message-mapping) * [Message `Function`](#message-function) * [Example Payloads](#example-payloads) * [Simple example](#simple-example) * [Notable differences compared to other signals](#notable-differences-compared-to-other-signals) - * [Relationships between messages](#relationships-between-messages) - * [Arrays of Integers vs Arrays of Structures](#arrays-of-integers-vs-arrays-of-structures) -* [Trade-offs and mitigations](#trade-offs-and-mitigations) -* [Prior art and alternatives](#prior-art-and-alternatives) - * [pprof](#pprof) - * [Divergence of Objectives](#divergence-of-objectives) - * [Technical Reasons](#technical-reasons) - * [Non-Technical Reasons](#non-technical-reasons) - * [Additional Considerations](#additional-considerations) - * [Interoperability between OTLP and pprof](#interoperability-between-otlp-and-pprof) - * [Performance implications in Go ecosystem](#performance-implications-in-go-ecosystem) + * [Relationships Between Messages](#relationships-between-messages) + * [Relationship Between Samples and Locations](#relationship-between-samples-and-locations) +* [Trade-offs and Mitigations](#trade-offs-and-mitigations) +* [Prior Art and Alternatives](#prior-art-and-alternatives) + * [Other Popular Formats](#other-popular-formats) + * [Folded Stacks](#folded-stacks) + * [Chromium's Trace Event Format](#chromiums-trace-event-format) + * [Linux perf.data](#linux-perfdata) + * [Java Flight Recorder (JFR)](#java-flight-recorder-jfr) + * [Alternative Representations](#alternative-representations) * [Benchmarking](#benchmarking) - * [Average profile](#average-profile) - * [Average profile with timestamps added to each sample](#average-profile-with-timestamps-added-to-each-sample) - * [Ruby profile with very deep stacktraces](#ruby-profile-with-very-deep-stacktraces) - * [Large profile](#large-profile) + * ["average" profile](#average-profile) + * ["average" profile with timestamps added to each sample](#average-profile-with-timestamps-added-to-each-sample) + * ["ruby" profile with very deep stacktraces](#ruby-profile-with-very-deep-stacktraces) + * ["large" profile](#large-profile) + * [Conclusions](#conclusions) * [Semantic Conventions](#semantic-conventions) + * [Attributes](#attributes) * [Profile Types](#profile-types) * [Profile Units](#profile-units) * [Decision Log](#decision-log) @@ -76,9 +76,9 @@ This section describes various protobuf messages that are used to represent prof ### Relationships Diagram -The following diagram shows the relationships between the messages. Relationships between messages are represented by either embedding one message in another (red arrows), or by referencing a message by index in a lookup table (blue arrows). More on that in [Relationships between messages](#relationships-between-messages) section below. +The following diagram shows the relationships between the messages. Relationships between messages are represented by either embedding one message in another (red arrows), or by referencing a message by index in a lookup table (blue arrows). More on that in [Relationships Between Messages](#relationships-between-messages) section below. -In addition to that, relationship between `stacktraces`, `attribute_sets` and `links` is implicit and based on the order of references to these objects in corresponding reference lists within a `ProfileType` message. The relationship between these messages creates an ephemeral structure called "Sample". More on that in [Arrays of Integers vs Arrays of Structures](#arrays-of-integers-vs-arrays-of-structures) section below. +In addition to that, relationship between `samples` and `locations` is further optimized for better performance. More on that in [Relationship Between Samples and Locations](#relationship-between-samples-and-locations) section below. ![diagram of data relationships](./images/otep0000/profiles-data-model.png) @@ -91,7 +91,7 @@ There are two types of relationships between profiles and other signals: #### From profiles to other signals -[Link](#message-link) is a message that is used to represent connections between profile [Samples](#sample-structure) and trace spans. It uses `trace_id` and `span_id` as identifiers. +`trace_id` and `span_id` (semantic convention) attributes attached to a Sample are used to represent connections between profile [Samples](#message-sample) and trace spans. For other signals, such as logs or metrics, because other signals use the same way of linking between such signals and traces (`trace_id` and `span_id`), it is possible to correlate profiles with other signals using this same information. @@ -99,29 +99,34 @@ For other signals, such as logs or metrics, because other signals use the same w Other signals can use `profile_id` to reference a profile. For example, a log record can reference a profile that was collected at the time when the log record was generated by using `profile_id` as one of the attributes. This allows to correlate logs with profiles. -Additionally, `trace_id`, `span_id` can be used to reference specific [Samples](#sample-structure) in a Profile, since [Samples](#sample-structure) are linked to traces with these same identifiers using [Links](#message-link). +Additionally, `trace_id`, `span_id` can be used to reference specific [Samples](#message-sample) in a Profile, since [Samples](#message-sample) are linked to traces with these same identifiers. -The exact details of such linking are out of scope for this OTEP. It is expected that other OTEPs will define how such linking is done. +The exact details of such linking are out of scope for this OTEP. It is expected that the exact details will be defined in Profiles part of [opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification). ### Proto Definition - +Proto definition is based on [pprof format](https://github.com/google/pprof/blob/main/proto/profile.proto). -```proto -// 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. +In the landscape of performance profiling tools, pprof's data format stands as a clear industry standard. Its evolution and enduring relevance are a reflection of its effectiveness in addressing diverse and complex performance profiling needs. Major technology firms and open-source projects alike routinely employ pprof, underscoring its universal applicability and reliability. + +According to the [data from Profilerpedia](https://docs.google.com/spreadsheets/d/1UM-WFQhNf4GcyXmluSUGnMbOenvN-TqP2HQC9-Y50Lc/edit?usp=sharing), it's one of the most widely used formats. Compared to other formats it has the highest number of profilers, UIs, formats it can be converted to and from. + +The original pprof data model underwent enhancements to more effectively manage profiling data within the scope of OpenTelemetry, and certain upgrades were implemented to overcome a few of the original format's constraints. + +Here's a [link to a diff between original pprof and modified pprof](https://github.com/open-telemetry/opentelemetry-proto-profile/compare/2cf711b3cfcc1edd4e46f9b82d19d016d6d0aa2a...petethepig:opentelemetry-proto:pprof-experiments#diff-9cb689ea05ecfd2edffc39869eca3282a3f2f45a8e1aa21624b452fa5362d1d2) and here's a list of main differences between pprof and OTLP profiles: + +* Sharing of the call stacks between samples. +* Sharing of labels (now called attributes) between samples. +* Reuse of OpenTelemetry conventions and message types. +* Semantic conventions for linking to other signals via `trace_id`s and `span_id`s. +* First-class timestamp support. + +Below you will find the proto for the new Profiles signal. It is split into two parts: the first part is the OpenTelemetry specific part, and the second part is the modified pprof proto. Intention here is to make it easier to compare modified pprof proto to the original pprof proto. + +OpenTelemetry specific part: + +```proto syntax = "proto3"; package opentelemetry.proto.profiles.v1; @@ -135,6 +140,61 @@ option java_package = "io.opentelemetry.proto.profiles.v1"; option java_outer_classname = "ProfilesProto"; option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1"; +// Relationships Diagram +// +// ┌──────────────────┐ LEGEND +// │ ProfilesData │ +// └──────────────────┘ ─────▶ embedded +// │ +// │ 1-n ─────▷ referenced by index +// ▼ +// ┌──────────────────┐ +// │ ResourceProfiles │ +// └──────────────────┘ +// │ +// │ 1-n +// ▼ +// ┌──────────────────┐ +// │ ScopeProfiles │ +// └──────────────────┘ +// │ +// │ 1-n +// ▼ +// ┌──────────────────┐ +// │ ProfileContainer │ +// └──────────────────┘ +// │ +// │ 1-1 +// ▼ +// ┌──────────────────┐ +// │ Profile │ +// └──────────────────┘ +// │ +// │ 1-n +// ▼ +// ┌──────────────────┐ 1-n ┌──────────────┐ +// │ Sample │ ──────▷ │ KeyValue │ +// └──────────────────┘ └──────────────┘ +// │ 1-n △ △ +// │ 1-n ┌─────────────────┘ │ 1-n +// ▽ │ │ +// ┌──────────────────┐ 1-1 ┌──────────────┐ +// │ Location │ ──────▷ │ Mapping │ +// └──────────────────┘ └──────────────┘ +// │ +// │ 1-n +// ▼ +// ┌──────────────────┐ +// │ Line │ +// └──────────────────┘ +// │ +// │ 1-1 +// ▽ +// ┌──────────────────┐ +// │ Function │ +// └──────────────────┘ +// + // ProfilesData represents the profiles data that can be stored in a persistent storage, // OR can be embedded by other protocols that transfer OTLP profiles data but do not // implement the OTLP protocol. @@ -177,19 +237,17 @@ message ScopeProfiles { // 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; + // A list of ProfileContainers that originate from an instrumentation scope. + repeated ProfileContainer profiles = 2; // This schema_url applies to all profiles and profile events in the "profiles" field. string schema_url = 3; } -// A Profile represents a single profile generated by a profiler. It has an ID and it has a start time and end time. Profile contains lookup tables for Stacktraces, Mappings, Locations, Functions, Links, AttributeSets, and strings. - -// Profile embeds one or more ProfileType messages — this allows to represent multiple profile types (e.g allocated objects and allocated bytes) in a single Profile message. -message Profile { +// A ProfileContainer represents a single profile. It wraps pprof profile with OpenTelemetry specific metadata. +message ProfileContainer { // A unique identifier for a profile. The ID is a 16-byte array. An ID with - // all zeroes is considered invalid. Profile ID can be used by other signals to uniquely identify a profile. + // all zeroes is considered invalid. // // This field is required. bytes profile_id = 1; @@ -206,7 +264,8 @@ message Profile { // This field is semantically required and it is expected that end_time >= start_time. fixed64 end_time_unix_nano = 3; - // attributes is a collection of key/value pairs. Attributes that are not specific to a particular profile (like server name) MUST be specified in Resource attributes instead. Examples of attributes: + // attributes 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 @@ -224,154 +283,294 @@ message Profile { // attributes. If this value is 0, then no attributes were dropped. uint32 dropped_attributes_count = 5; - // This is the original profile as retrieved from the profiler. For example, this can be a pprof or jfr encoded profile. The reason users might want to include these is because some formats are very generic and can not be easily converted to a more structured format. - // TODO: add a field that indicates the format of the original payload? - bytes original_payload = 6; - - // A lookup table of Stacktraces. Other messages refer to Stacktraces in this table by index. - repeated Stacktrace stacktraces = 7; + // Specifies format of the original payload. Common values are defined in semantic conventions. [required if original_payload is present] + string original_payload_format = 6; - // A lookup table of Mappings. Other messages refer to Mappings in this table by index. - repeated Mapping mappings = 8; + // 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 `profile` MUST be present and contain the same profiling information. + bytes original_payload = 7; - // A lookup table of Locations. Other messages refer to Locations in this table by index. - repeated Location locations = 9; + // This is a reference to a pprof profile. Required, even when original_payload is present. + opentelemetry.proto.profiles.v1.alternatives.pprofextended.Profile profile = 8; +} +``` - // A lookup table of Functions. Other messages refer to Functions in this table by index. - repeated Function functions = 10; + - // A lookup table of Links to trace spans associated with this profile. Other messages refer to Links in this table by index. The first message must be an empty Link — this represents a null Link. - repeated Link links = 11; +Modified pprof: - // A lookup table of AttributeSets. Other messages refer to AttributeSets in this table by index. The first message must be an empty AttributeSet — this represents a null AttributeSet. - repeated AttributeSet attribute_sets = 12; + - // A lookup table of strings. Other messages refer to strings in this table by index. - // The 0-th element must be an empty string (""). - repeated string string_table = 13; +```proto +// 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 id. +// - 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 id. - // List of profile types included in this profile. The first item in the list is considered to be the "default" profile type. Example profile types are allocated objects or allocated bytes. - repeated ProfileType profile_types = 14; -} +syntax = "proto3"; -// Represents a relationship between a Sample (ephemeral structure represented by references to a Stacktrace, AttributeSet, Link + value and a timestamp) and a trace span. This allows for linking between specific Samples within a profile and traces. -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; -} +package opentelemetry.proto.profiles.v1.alternatives.pprofextended; -// AttributeSet represents a set of attributes. Multiple Samples, Locations and Mappings may have the same attributes and that's why this is a separate message. These are stored in a lookup table in a Profile. These are referenced by index from other messages. -message AttributeSet { - // Attributes associated with a specific Sample, Location or a Mapping. - // attributes 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 opentelemetry.proto.common.v1.KeyValue attributes = 1; +import "opentelemetry/proto/common/v1/common.proto"; - // 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 = 2; -} +option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1/alternatives/pprofextended"; -// A stacktrace is a sequence of locations. Order of locations goes from callers to callees. Many stacktraces will point to the same locations. The link between stacktraces, attribute sets, links, values and timestamps is implicit and is based on the order of the elements in the corresponding tables in ProfileType message. -message Stacktrace { - repeated uint32 location_indices = 1; +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. + repeated Mapping mapping = 3; + // Locations referenced by samples via location_indices. + repeated Location location = 4; + // Functions referenced by locations. + repeated Function function = 5; + // A common table for strings referenced by various messages. + // string_table[0] must always be "". + repeated string string_table = 6; + // frames with Function.function_name fully matching the following + // regexp will be dropped from the samples, along with their successors. + int64 drop_frames = 7; // Index into string table. + // frames with Function.function_name fully matching the following + // regexp will be kept, even if it matches drop_frames. + int64 keep_frames = 8; // Index into string table. + + // The following fields are informational, do not affect + // interpretation of results. + + // Time of collection (UTC) represented as nanoseconds past the epoch. + int64 time_nanos = 9; + // Duration of the profile, if a duration makes sense. + int64 duration_nanos = 10; + // The kind of events between sampled occurrences. + // e.g [ "cpu","cycles" ] or [ "heap","bytes" ] + ValueType period_type = 11; + // The number of events between sampled occurrences. + int64 period = 12; + // 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 int64 comment = 13; // 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. + int64 default_sample_type = 14; + // Array of locations referenced by samples. + repeated int64 location_indices = 15; + // Lookup table for attributes. + repeated opentelemetry.proto.common.v1.KeyValue attribute_table = 16; } -// AggregationTemporality defines how a profile aggregator reports aggregated -// values. It describes how those values relate to the time interval over -// which they are aggregated. enum AggregationTemporality { - AGGREGATION_TEMPORALITY_UNSPECIFIED = 0; // Temporality unspecified. - AGGREGATION_TEMPORALITY_DELTA = 1; // Delta aggregation over time. - AGGREGATION_TEMPORALITY_CUMULATIVE = 2; // Cumulative aggregation over time. + /* 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_0+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; } -// Represents a single profile type. It implicitly creates a connection between Stacktraces, Links, AttributeSets, values and timestamps. The connection is based on the order of the elements in the corresponding lists. This implicit connection creates an ephemeral structure called Sample. The length of reference lists must be the same. It is acceptable however for timestamps, links and attribute set lists to be empty. It is not acceptable for stacktrace or values lists to be empty. -message ProfileType { - // aggregation_temporality describes if the aggregator reports delta changes - // since last report time, or cumulative changes since a fixed start time. - AggregationTemporality aggregation_temporality = 1; - - // Profiler sample rate in Hz. This parameter indicates the frequency at which samples are collected, specifically for CPU profiles. Common values are 99 or 100. [Optional]. - uint64 sample_rate = 2; - - // Index into the string table for the type of the sample. Example values are "cpu", "alloc_objects", "alloc_bytes", "block_contentions". Full list is defined in https://github.com/open-telemetry/semantic-conventions - uint32 type_index = 3; +// ValueType describes the semantics and measurement units of a value. +message ValueType { + int64 type = 1; // Index into string table. + int64 unit = 2; // Index into string table. - // Index into the string table for the unit of the sample. Example values are "ms", "ns", "samples", "bytes". Full list is defined in https://github.com/open-telemetry/semantic-conventions - uint32 unit_index = 4; + AggregationTemporality aggregation_temporality = 3; +} - // List of indices referring to Stacktraces in the Profile's stacktrace table. - repeated uint32 stacktrace_indices = 10; +// 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 { + // The indices recorded here correspond to locations in Profile.location. + // The leaf is at location_index[0]. [deprecated] + repeated uint64 location_index = 1; + // 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 = 2; + // label includes additional context for this sample. It can include + // things like a thread id, allocation size, etc. + // + // NOTE: While possible, having multiple values for the same label key is + // strongly discouraged and should never be used. Most tools (e.g. pprof) do + // not have good (or any) support for multi-value labels. And an even more + // discouraged case is having a string label and a numeric label of the same + // name on a sample. Again, possible to express, but should not be used. + // [deprecated, superseded by attributes] + repeated Label label = 3; - // List of indices referring to Links in the Profile's link table. Each link corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] - repeated uint32 link_indices = 11; + // locations_start_index along with locations_length refers to to a slice of locations in Profile.location. Supersedes location_index. + uint64 locations_start_index = 4; - // List of indices referring to AttributeSets in the Profile's attribute set table. Each attribute set corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] - repeated uint32 attribute_set_indices = 12; + // locations_length along with locations_start_index refers to a slice of locations in Profile.location. Supersedes location_index. + uint64 locations_length = 5; - // List of values. Each value corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. - repeated int64 values = 13; + // Timestamps associated with Sample represented in ms. These timestamps are expected to fall within the Profile's time range. [optional] + repeated uint64 timestamps = 6; - // List of timestamps. Each timestamp corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. - repeated uint64 timestamps = 14; + // References to attributes in Profile.attribute_table. [optional] + repeated uint64 attributes = 7; } -// SymbolFidelity enumerates the level of fidelity for symbol information in a profile. -enum SymbolFidelity { - SYMBOL_FIDELITY_UNSPECIFIED = 0; // The symbol fidelity level is unspecified. - SYMBOL_FIDELITY_FULL = 1; // The symbol fidelity is at its fullest level of detail. +message Label { + int64 key = 1; // Index into string table + + // At most one of the following must be present + int64 str = 2; // Index into string table + int64 num = 3; + + // Should only be present when num is present. + // Specifies the units of num. + // Use arbitrary string (for example, "requests") as a custom count unit. + // If no unit is specified, consumer may apply heuristic to deduce the unit. + // Consumers may also interpret units like "bytes" and "kilobytes" as memory + // units and units like "seconds" and "nanoseconds" as time units, + // and apply appropriate unit conversions to these. + int64 num_unit = 4; // Index into string table } -// Describes the mapping from a binary to its original source code. These are stored in a lookup table in a Profile. These are referenced by index from other messages. message Mapping { + // Unique nonzero id for the mapping. [deprecated] + uint64 id = 1; // Address at which the binary (or DLL) is loaded into memory. - uint64 memory_start = 1; + uint64 memory_start = 2; // The limit of the address range occupied by this mapping. - uint64 memory_limit = 2; + uint64 memory_limit = 3; // Offset in the binary that corresponds to the first mapped address. - uint64 file_offset = 3; + uint64 file_offset = 4; // 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]". Index into string table - uint32 filename_index = 4; + // abstractions like "[vdso]". + int64 filename = 5; // Index into string table // A string that uniquely identifies a particular program version // with high probability. E.g., for binaries generated by GNU tools, - // it could be the contents of the .note.gnu.build-id field. Index into string table - uint32 build_id_index = 5; - - SymbolFidelity symbolic_info = 6; - - // Reference to an attribute set from the Profile's attribute set table. - uint32 attribute_set_index = 7; + // it could be the contents of the .note.gnu.build-id field. + int64 build_id = 6; // Index into string table + + // The following fields indicate the resolution of symbolic info. + bool has_functions = 7; + bool has_filenames = 8; + bool has_line_numbers = 9; + bool has_inline_frames = 10; + + // A string that uniquely identifies a particular binary with high probability. + // It is meant to work around deficiencies in the GNU Build ID that may compromise + // uniqueness / correlatability. Index into string table. + uint32 file_id_index = 11; + + // References to attributes in Profile.attribute_table. [optional] + repeated uint64 attributes = 12; } -// Describes function and line table debug information. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +// Describes function and line table debug information. message Location { - // The id of the corresponding profile.Mapping for this location. + // Unique nonzero id for the location. A profile could use + // instruction addresses or any integer sequence as ids. [deprecated] + uint64 id = 1; + // The index of the corresponding profile.Mapping for this location. // It can be unset if the mapping is unknown or not applicable for // this profile type. - uint32 mapping_index = 1; + uint64 mapping_index = 2; // 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; + uint64 address = 3; // Multiple line indicates this location has inlined functions, // where the last entry represents the caller into which the // preceding entries were inlined. @@ -379,35 +578,44 @@ message Location { // E.g., if memcpy() is inlined into printf: // line[0].function_name == "memcpy" // line[1].function_name == "printf" - repeated Line line = 3; - - // Reference to an attribute set from the Profile's attribute set table. - uint32 attribute_set_index = 4; + repeated Line line = 4; + // 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 = 5; + + // Type of frame (e.g. kernel, native, python, hotspot, php). Index into string table. + uint32 type_index = 6; + + // References to attributes in Profile.attribute_table. [optional] + repeated uint64 attributes = 7; } -// Represents a line in a source file. These are embedded within a Location message. message Line { - // The id of the corresponding profile.Function for this line. - uint32 function_index = 1; + // The index of the corresponding profile.Function for this line. + uint64 function_index = 1; // Line number in source code. - uint32 line = 2; + int64 line = 2; } -// Represents a function in a source file. These are stored in a lookup table in a Profile. These are referenced by index from other messages. message Function { - // Name of the function, in human-readable form if available. Index into string table - uint32 name_index = 1; + // Unique nonzero id for the function. [deprecated] + uint64 id = 1; + // Name of the function, in human-readable form if available. + int64 name = 2; // Index into string table // Name of the function, as identified by the system. - // For instance, it can be a C++ mangled name. Index into string table - uint32 system_name_index = 2; - // Source file containing the function. Index into string table - uint32 filename_index = 3; + // For instance, it can be a C++ mangled name. + int64 system_name = 3; // Index into string table + // Source file containing the function. + int64 filename = 4; // Index into string table // Line number in source file. - uint32 start_line = 4; + int64 start_line = 5; } ``` - + ### Message Descriptions @@ -462,18 +670,16 @@ an empty instrumentation scope name (unknown). ##### Field `profiles` -A list of Profiles that originate from an instrumentation scope. +A list of ProfileContainers that originate from an instrumentation scope. ##### Field `schema_url` This schema_url applies to all profiles and profile events in the "profiles" field. -#### Message `Profile` +#### Message `ProfileContainer` -A Profile represents a single profile generated by a profiler. It has an ID and it has a start time and end time. Profile contains lookup tables for Stacktraces, Mappings, Locations, Functions, Links, AttributeSets, and strings. - -Profile embeds one or more ProfileType messages — this allows to represent multiple profile types (e.g allocated objects and allocated bytes) in a single Profile message. +A ProfileContainer represents a single profile. It wraps pprof profile with OpenTelemetry specific metadata.
Field Descriptions @@ -481,7 +687,7 @@ Profile embeds one or more ProfileType messages — this allows to represent mul ##### Field `profile_id` A unique identifier for a profile. The ID is a 16-byte array. An ID with -all zeroes is considered invalid. Profile ID can be used by other signals to uniquely identify a profile. +all zeroes is considered invalid. This field is required. ##### Field `start_time_unix_nano` @@ -498,7 +704,8 @@ This field is semantically required and it is expected that end_time >= start_ti ##### Field `attributes` -attributes is a collection of key/value pairs. Attributes that are not specific to a particular profile (like server name) MUST be specified in Resource attributes instead. +attributes is a collection of key/value pairs. Note, global attributes +like server name can be set using the resource API. ##### Field `dropped_attributes_count` @@ -506,145 +713,218 @@ dropped_attributes_count is the number of attributes that were discarded. Attrib 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. +##### Field `original_payload_format` + +Specifies format of the original payload. Common values are defined in semantic conventions. [required if original_payload is present] + ##### Field `original_payload` -This is the original profile as retrieved from the profiler. For example, this can be a pprof or jfr encoded profile. The reason users might want to include these is because some formats are very generic and can not be easily converted to a more structured format. -TODO: add a field that indicates the format of the original payload? +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 `profile` MUST be present and contain the same profiling information. -##### Field `stacktraces` +##### Field `profile` -A lookup table of Stacktraces. Other messages refer to Stacktraces in this table by index. +This is a reference to a pprof profile. Required, even when original_payload is present. +
-##### Field `mappings` +#### Message `Profile` -A lookup table of Mappings. Other messages refer to Mappings in this table by index. +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 id. +- 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 id. -##### Field `locations` +
+Field Descriptions -A lookup table of Locations. Other messages refer to Locations in this table by index. +##### Field `sample_type` -##### Field `functions` +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". -A lookup table of Functions. Other messages refer to Functions in this table by index. +##### Field `sample` -##### Field `links` +The set of samples recorded in this profile. -A lookup table of Links to trace spans associated with this profile. Other messages refer to Links in this table by index. The first message must be an empty Link — this represents a null Link. +##### Field `mapping` -##### Field `attribute_sets` +Mapping from address ranges to the image/binary/library mapped +into that address range. mapping[0] will be the main binary. -A lookup table of AttributeSets. Other messages refer to AttributeSets in this table by index. The first message must be an empty AttributeSet — this represents a null AttributeSet. +##### Field `location` -##### Field `string_table` +Locations referenced by samples via location_indices. -A lookup table of strings. Other messages refer to strings in this table by index. -The 0-th element must be an empty string (""). +##### Field `function` -##### Field `profile_types` +Functions referenced by locations. -List of profile types included in this profile. The first item in the list is considered to be the "default" profile type. Example profile types are allocated objects or allocated bytes. -
+##### Field `string_table` -#### Message `ProfileType` +A common table for strings referenced by various messages. +string_table[0] must always be "". -Represents a single profile type. It implicitly creates a connection between Stacktraces, Links, AttributeSets, values and timestamps. The connection is based on the order of the elements in the corresponding lists. This implicit connection creates an ephemeral structure called Sample. The length of reference lists must be the same. It is acceptable however for timestamps, links and attribute set lists to be empty. It is not acceptable for stacktrace or values lists to be empty. +##### Field `drop_frames` -
-Field Descriptions +frames with Function.function_name fully matching the following +regexp will be dropped from the samples, along with their successors. -##### Field `aggregation_temporality` +##### Field `keep_frames` -aggregation_temporality describes if the aggregator reports delta changes -since last report time, or cumulative changes since a fixed start time. +Index into string table. +frames with Function.function_name fully matching the following +regexp will be kept, even if it matches drop_frames. -##### Field `sample_rate` +##### Field `time_nanos` -Profiler sample rate in Hz. This parameter indicates the frequency at which samples are collected, specifically for CPU profiles. Common values are 99 or 100. [Optional]. +Index into string table. +The following fields are informational, do not affect +interpretation of results. +Time of collection (UTC) represented as nanoseconds past the epoch. -##### Field `type_index` +##### Field `duration_nanos` -Index into the string table for the type of the sample. Example values are "cpu", "alloc_objects", "alloc_bytes", "block_contentions". Full list is defined in [semantic-conventions](https://github.com/open-telemetry/semantic-conventions) +Duration of the profile, if a duration makes sense. -##### Field `unit_index` +##### Field `period_type` -Index into the string table for the unit of the sample. Example values are "ms", "ns", "samples", "bytes". Full list is defined in [semantic-conventions](https://github.com/open-telemetry/semantic-conventions) +The kind of events between sampled occurrences. +e.g [ "cpu","cycles" ] or [ "heap","bytes" ] -##### Field `stacktrace_indices` +##### Field `period` -List of indices referring to Stacktraces in the Profile's stacktrace table. +The number of events between sampled occurrences. -##### Field `link_indices` +##### Field `comment` -List of indices referring to Links in the Profile's link table. Each link corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] +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. -##### Field `attribute_set_indices` +##### Field `default_sample_type` -List of indices referring to AttributeSets in the Profile's attribute set table. Each attribute set corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. [Optional] +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. -##### Field `values` +##### Field `location_indices` -List of values. Each value corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. +Array of locations referenced by samples. -##### Field `timestamps` +##### Field `attribute_table` -List of timestamps. Each timestamp corresponds to a Stacktrace in stacktrace_indices list. Length must match stacktrace_indices length. +Lookup table for attributes.
-#### `Sample` structure +#### Message `ValueType` -Sample is an ephemeral structure. It is not explicitly represented as a protobuf message, instead it is represented by stacktraces, links, attribute sets, values and timestamps tables in `ProfileType` message. The connection is based on the order of the elements in the corresponding tables. For example, AttributeSet with index 1 corresponds to a Stacktrace located at index 1 in stacktraces table, and a Value located at index 1 in values table. Together they form a Sample. +ValueType describes the semantics and measurement units of a value. -#### Message `Stacktrace` +
+Field Descriptions + +##### Field `unit` + +Index into string table. + +##### Field `aggregation_temporality` -A stacktrace is a sequence of locations. Order of locations goes from callers to callees. Many stacktraces will point to the same locations. The link between stacktraces, attribute sets, links, values and timestamps is implicit and is based on the order of the elements in the corresponding tables in ProfileType message. +Index into string table. +
-#### Message `AttributeSet` +#### Message `Sample` -AttributeSet represents a set of attributes. Multiple Samples, Locations and Mappings may have the same attributes and that's why this is a separate message. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +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.
Field Descriptions -##### Field `attributes` +##### Field `location_index` -Attributes associated with a specific Sample, Location or a Mapping. -attributes is a collection of key/value pairs. Note, global attributes -like server name can be set using the resource API. +The indices recorded here correspond to locations in Profile.location. +The leaf is at location_index[0]. [deprecated] -##### Field `dropped_attributes_count` +##### Field `value` -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. -
+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. -#### Message `Link` +##### Field `label` -Represents a relationship between a Sample (ephemeral structure represented by references to a Stacktrace, AttributeSet, Link + value and a timestamp) and a trace span. This allows for linking between specific Samples within a profile and traces. +label includes additional context for this sample. It can include +things like a thread id, allocation size, etc. +NOTE: While possible, having multiple values for the same label key is +strongly discouraged and should never be used. Most tools (e.g. pprof) do +not have good (or any) support for multi-value labels. And an even more +discouraged case is having a string label and a numeric label of the same +name on a sample. Again, possible to express, but should not be used. +[deprecated, superseded by attributes] -
-Field Descriptions +##### Field `locations_start_index` + +locations_start_index along with locations_length refers to to a slice of locations in Profile.location. Supersedes location_index. -##### Field `trace_id` +##### Field `locations_length` -A unique identifier of a trace that this linked span is part of. The ID is a -16-byte array. +locations_length along with locations_start_index refers to a slice of locations in Profile.location. Supersedes location_index. + +##### Field `timestamps` -##### Field `span_id` +Timestamps associated with Sample represented in ms. These timestamps are expected to fall within the Profile's time range. [optional] -A unique identifier for the linked span. The ID is an 8-byte array. +##### Field `attributes` + +References to attributes in Profile.attribute_table. [optional]
#### Message `Location` -Describes function and line table debug information. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +Describes function and line table debug information.
Field Descriptions +##### Field `id` + +Unique nonzero id for the location. A profile could use +instruction addresses or any integer sequence as ids. [deprecated] + ##### Field `mapping_index` -The id of the corresponding profile.Mapping for this location. +The index of the corresponding profile.Mapping for this location. It can be unset if the mapping is unknown or not applicable for this profile type. @@ -665,18 +945,46 @@ E.g., if memcpy() is inlined into printf: line[0].function_name == "memcpy" line[1].function_name == "printf" -##### Field `attribute_set_index` +##### Field `is_folded` + +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. + +##### Field `type_index` + +Type of frame (e.g. kernel, native, python, hotspot, php). Index into string table. + +##### Field `attributes` -Reference to an attribute set from the Profile's attribute set table. +References to attributes in Profile.attribute_table. [optional]
-#### Message `Mapping` +#### Message `Line` + +
+Field Descriptions -Describes the mapping from a binary to its original source code. These are stored in a lookup table in a Profile. These are referenced by index from other messages. +##### Field `function_index` + +The index of the corresponding profile.Function for this line. + +##### Field `line` + +Line number in source code. +
+ +#### Message `Mapping`
Field Descriptions +##### Field `id` + +Unique nonzero id for the mapping. [deprecated] + ##### Field `memory_start` Address at which the binary (or DLL) is loaded into memory. @@ -689,45 +997,62 @@ The limit of the address range occupied by this mapping. Offset in the binary that corresponds to the first mapped address. -##### Field `filename_index` +##### Field `filename` 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]". Index into string table +abstractions like "[vdso]". -##### Field `build_id_index` +##### Field `build_id` +Index into string table A string that uniquely identifies a particular program version with high probability. E.g., for binaries generated by GNU tools, -it could be the contents of the .note.gnu.build-id field. Index into string table +it could be the contents of the .note.gnu.build-id field. + +##### Field `has_functions` + +Index into string table +The following fields indicate the resolution of symbolic info. + +##### Field `file_id_index` + +A string that uniquely identifies a particular binary with high probability. +It is meant to work around deficiencies in the GNU Build ID that may compromise +uniqueness / correlatability. Index into string table. -##### Field `attribute_set_index` +##### Field `attributes` -Reference to an attribute set from the Profile's attribute set table. +References to attributes in Profile.attribute_table. [optional]
#### Message `Function` -Represents a function in a source file. These are stored in a lookup table in a Profile. These are referenced by index from other messages. -
Field Descriptions -##### Field `name_index` +##### Field `id` + +Unique nonzero id for the function. [deprecated] -Name of the function, in human-readable form if available. Index into string table +##### Field `name` -##### Field `system_name_index` +Name of the function, in human-readable form if available. +##### Field `system_name` + +Index into string table Name of the function, as identified by the system. -For instance, it can be a C++ mangled name. Index into string table +For instance, it can be a C++ mangled name. -##### Field `filename_index` +##### Field `filename` -Source file containing the function. Index into string table +Index into string table +Source file containing the function. ##### Field `start_line` +Index into string table Line number in source file.
@@ -737,7 +1062,7 @@ Line number in source file. #### Simple example -Considering the following example presented in a modified collapsed format: +Considering the following example presented in a modified folded format: ``` foo;bar;baz 100 region=us,trace_id=0x01020304010203040102030401020304,span_id=0x9999999999999999 1687841528000000 @@ -749,7 +1074,7 @@ It represents 2 samples: * one for stacktrace `foo;bar;baz` with value `100`, attributes `region=us`, linked to trace `0x01020304010203040102030401020304` and span `0x9999999999999999`, and timestamp `1687841528000000` * one for stacktrace `foo;bar` with value `200`, attributes `region=us`, no link, no timestamp -The resulting profile in OTLP format would look like this (in YAML format): +The resulting profile in OTLP format would look like this (converted to YAML format for legibility): ```yaml resource_profiles: @@ -758,75 +1083,65 @@ resource_profiles: schema_url: todo scope_profiles: - profiles: - - attribute_sets: - - attributes: null - - attributes: - - key: region - value: - Value: - string_value: us - functions: - - name_index: 1 - - name_index: 2 - - name_index: 3 - links: - - span_id: "" - trace_id: "" - - span_id: "9999999999999999" - trace_id: "01020304010203040102030401020304" - locations: - - line: - - {} - - line: - - function_index: 1 - - line: - - function_index: 2 - profile_types: - - aggregation_temporality: 1 - sample_rate: 100 - type_index: 4 - unit_index: 5 - attribute_set_indices: - - 1 - - 1 - link_indices: - - 1 - - 0 - stacktrace_indices: - - 0 - - 1 - timestamps: - - 1.687841528e+15 - - 0 - values: - - 100 - - 200 - stacktraces: - - location_indices: - - 0 - - 1 - - 2 - - location_indices: - - 0 - - 1 - string_table: - - "" - - foo - - bar - - baz - - cpu - - samples - attributes: null - profile_id: 0102030405060708090a0b0c0d0e0f10 - scope: - attributes: null + - profile_id: 0102030405060708090a0b0c0d0e0f10 + profile: + sample_type: + type: 4 + unit: 5 + aggregation_temporality: 1 + attribute_table: + - key: trace_id + value: + Value: + bytes_value: 0x01020304010203040102030401020304 + - key: span_id + value: + Value: + bytes_value: 0x9999999999999999 + - key: region + value: + Value: + string_value: us + function: + - name: 1 + - name: 2 + - name: 3 + location: + - line: + - {} + - line: + - function_index: 1 + - line: + - function_index: 2 + location_indices: + - 0 + - 1 + - 2 + sample: + - locations_start_index: 0 + locations_length: 3 + timestamps: + - 1687841528000000 + value: + - 100 + - locations_start_index: 0 + locations_length: 2 + value: + - 200 + string_table: + - "" + - foo + - bar + - baz + - cpu + - samples ``` ### Notable differences compared to other signals Due to the increased performance requirements associated with profiles signal, here are some notable differences between profiles signal and other signals. -#### Relationships between messages +#### Relationships Between Messages There are two main ways relationships between messages are represented: @@ -835,75 +1150,116 @@ There are two main ways relationships between messages are represented: Profiling signal is different from most other ones in that we use the referencing technique a lot to represent relationships between messages where there is a lot of duplication happening. This allows to reduce the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. -This pseudocode illustrates the conceptual difference between the two approaches. Note that this example is simplified for the sake of clarity: - -```json -// denormalized -"samples": [ - { - "stacktrace": ["foo", "bar"], - "value": 100, - "attribute_set": { - "endpoint": "/v1/users" - } - }, { - "stacktrace": ["foo", "bar", "baz"], - "value": 200, - "attribute_set": { - "endpoint": "/v1/users" - } - } -], - -// normalized -"attribute_sets": [ - { - "endpoint": "/v1/users" - } -], -"samples": [ - { - "stacktrace": ["foo", "bar"], - "value": 100, - "attribute_set_index": 0 - }, { - "stacktrace": ["foo", "bar", "baz"], - "value": 200, - "attribute_set_index": 0 - } -], +This example illustrates the conceptual difference between the two approaches. Note that this example is simplified for clarity and provided in YAML format for legibility: + +```yaml +# denormalized +samples: +- stacktrace: + - foo + - bar + value: 100 + attribute_set: + endpoint: "/v1/users" +- stacktrace: + - foo + - bar + - baz + value: 200 + attribute_set: + endpoint: "/v1/users" + +# normalized +attribute_sets: +- endpoint: "/v1/users" +samples: +- stacktrace: + - foo + - bar + value: 100 + attribute_set_index: 0 +- stacktrace: + - foo + - bar + - baz + value: 200 + attribute_set_index: 0 + ``` Explanation: because multiple samples have the same attributes, we can store them in a separate table and reference them by index. This reduces the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. Benchmarking shows that this approach is significantly more efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. See [Prior art and alternatives](#prior-art-and-alternatives) for more details. -#### Arrays of Integers vs Arrays of Structures - -Another optimization technique that we use to reduce the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload is using arrays of integers instead of arrays of structures to represent messages. This technique is used in conjunction with the referencing technique described above. Here's pseudocode that illustrates the approach. Note that this example is simplified for the sake of clarity: - -```json -// normalized -"samples": [ - { - "stacktrace_index": 1, - "value": 100 - }, { - "stacktrace_index": 2, - "value": 200 - } -], - -// arrays -"stacktrace_indices": [1, 2], -"values": [100, 200] +#### Relationship Between Samples and Locations + +Relationship between Samples and Locations is using the referencing technique described above. However, there's an additional optimization technique used to reduce the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. The technique is based on the fact that many samples share the same locations. + +Considering the following example presented in a folded format: + +``` +foo;bar;baz 100 +abc;def 200 +foo;bar 300 ``` -Explanation: in `normalized` representation samples are a collection of references to other messages plus a value. The standard way of representing those is to put each [Samples](#sample-structure) into a separate message, and link from [Samples](#sample-structure) to other messages. Parsing / generating such payloads creates many individual objects that runtime has to track. The second `arrays` representation puts values of the same kind into separate arrays. This reduces the size of the resulting protobuf payload and the number of objects that need to be allocated to parse / generate such payload. +It represents 3 samples: + +* one for stacktrace `foo;bar;baz` with value `100`. +* one for stacktrace `abc;def` with value `200`. +* one for stacktrace `foo;bar` with value `300`. Note that 2 of the locations are shared with the first sample. + +By storing locations in a separate table and referring to start_index+length in that table, we can reduce the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. With this approach we can also take advantage of the fact that many samples share the same locations. Below is a representation of the resulting protobuf payload (in YAML format for legibility): + +```yaml +sample: + - locations_start_index: 0 + locations_length: 3 + value: + - 100 + - locations_start_index: 2 + locations_length: 2 + value: + - 200 + - locations_start_index: 0 + locations_length: 2 + value: + - 300 +location_indices: + - 0 # foo + - 1 # bar + - 2 # baz + - 4 # abc + - 5 # def +location: + - line: + - function_index: 0 # foo + - line: + - function_index: 1 # bar + - line: + - function_index: 2 # baz + - line: + - function_index: 3 # abc + - line: + - function_index: 4 # def +function: + - name: 1 # foo + - name: 2 # bar + - name: 3 # baz + - name: 4 # abc + - name: 5 # def +string_table: + - "" + - foo + - bar + - baz + - abc + - def +``` Benchmarking shows that this approach is significantly more efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. See [Prior art and alternatives](#prior-art-and-alternatives) for more details. -## Trade-offs and mitigations +## Trade-offs and Mitigations The biggest trade-off was made between the performance characteristics of the format and it's simplicity. The emphasis was made on the performance characteristics, which resulted in a cognitively more complex format. @@ -914,110 +1270,143 @@ Authors feel like the complexity is justified for the following reasons: Alternative formats that are simpler to understand were considered, but they were not as efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. See [next chapter, Prior art and alternatives](#prior-art-and-alternatives) for more details. -## Prior art and alternatives +## Prior Art and Alternatives -The specification presented here was heavily inspired by pprof. Multiple alternative representations were considered, including: +This section describes other existing popular formats and alternative representations that were considered in the process of designing this data model. -* `denormalized` representation, where all messages are embedded and no references by index are used. This is the simplest representation, but it is also the least efficient (by a huge margin) in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. -* `normalized` representation, where messages that repeat often are stored in separate tables and are referenced by indices. See [this chapter](#relationships-between-messages) for more details. This technique reduces the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. -* `arrays` representation, which is based on `normalized` representation, but uses arrays of integers instead of arrays of structures to represent messages. See [this chapter](#arrays-of-integers-vs-arrays-of-structures) for more details. It further reduces the number of allocations, and the size of the resulting protobuf payload. -* `pprof` itself. More on that in the next section +### Other Popular Formats -### pprof +Many other popular formats were considered as part of the process of designing this format. The popularity was assesed based on [data from profilerpedia website](https://docs.google.com/spreadsheets/d/1UM-WFQhNf4GcyXmluSUGnMbOenvN-TqP2HQC9-Y50Lc/edit?usp=sharing). This chapter describes the most notable formats that were considered. -pprof itself was also considered as one of the options. It is a very efficient and very popular format, but it is not a good fit for OTLP for the combination of technical and non-technical reasons: +#### Folded Stacks -#### Divergence of Objectives +The [Folded Stacks representation](https://profilerpedia.markhansen.co.nz/formats/folded-stacks/), which is rooted in a straightforward text-based format, presents its own set of limitations. The main one is its inefficiency in handling large datasets, as it can struggle with both the complexity and the volume of data. The format's definition also reveals shortcomings, such as the absence of standardized, machine-readable attributes, resulting in varying interpretations and implementations by different profiling tools and analysis software. -Before we dive into the actual reasons, it's important to recognize the differing objectives between the pprof format and the proposed OTLP profiles format: +#### Chromium's Trace Event Format -* The pprof format, well-established in the Go ecosystem, primarily serves as a means to visualize and analyze profiling data. Users often share pprof files and use various tools for visualization. Interoperability is a key feature, given the extensive ecosystem that produces and consumes pprof files. +The [Chromium Trace Event Format](https://profilerpedia.markhansen.co.nz/formats/trace-event-format/), which employs JSON as its foundation, exhibits certain limitations. Notably, it does not excel in terms of payload size efficiency and lacks robust support for aggregation. Additionally, its specification demonstrates weaknesses, as it lacks machine-readable attributes, leading to distinct interpretations by various implementations, such as Perfetto and Catapult. -* On the other hand, OpenTelemetry has a broader mission, encompassing the collection and management of telemetry data across various languages and platforms. This mission emphasizes cross-linking between various signals (traces, metrics, logs, profiles), vendor-neutrality, and extensibility. OpenTelemetry aims to provide not only the wire format and a reference implementation for one runtime but also comprehensive tooling for various languages and runtimes, including client SDKs and collectors. +#### Linux perf.data -* It's important to note that pprof primarily serves as a file format, with users directly interacting with pprof files. In contrast, OTLP serves as a wire format, and users don't interact directly with OTLP data. Moreover, OTLP format may evolve over time without affecting user experience. +The [Linux perf.data format](https://profilerpedia.markhansen.co.nz/formats/linux-perf-data/), primarily aimed at low-level data collection, offers insights at a granularity that may not be suitable for high-level analysis. As it contains events generated by Performance Monitoring Units (PMUs) along with metadata, many of its fields find relevance primarily in data collected at the kernel level. -* OTLP profiles are not intended to replace pprof. Instead, they serve as a means to transport profiling data, linked to other signals, across the wire. +#### Java Flight Recorder (JFR) -#### Technical Reasons +[Java Flight Recorder](https://profilerpedia.markhansen.co.nz/formats/jfr/) (JFR) may not be the ideal choice for profiling applications outside the Java ecosystem. Its specialization in Java profiling limits its applicability in environments that rely on other programming languages, rendering it unsuitable for non-Java applications. -**Support for Linking Between Signals**: While it is possible to express links between signals in pprof using labels, the format is not optimized for this use-case within the broader telemetry ecosystem. +### Alternative Representations -**Support for Timestamps**: Similar to the previous point, pprof can handle timestamps, but doing so efficiently would require representing each timestamp as a separate Sample, which is inefficient due to the format's lack of optimization for this use-case. For more context, see [this PR from @felixge](https://github.com/google/pprof/pull/728). +In the process of refining the data model, multiple alternative representations were considered, including: -**Miscellaneous Improvements**: The OTLP profiles format introduces several improvements, such as the use of arrays-of-integers instead of arrays-of-structs representation (which reduces memory allocations), the use of indices instead of IDs to refer to structs (eliminating confusion and reducing payload size), and the use of semantic conventions to define profile types and units, among others. +* `pprof` representation is data in original pprof format. +* `denormalized` representation, where all messages are embedded and no references by index are used. This is the simplest representation, but it is also the least efficient (by a huge margin) in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. +* `normalized` representation, where messages that repeat often are stored in separate tables and are referenced by indices. See [this chapter](#relationships-between-messages) for more details. This technique reduces the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. +* `arrays` representation, which is based on `normalized` representation, but uses arrays of integers instead of arrays of structures to represent messages. It further reduces the number of allocations, and the size of the resulting protobuf payload. +* `pprofextended` is a modified `pprof` representation. It is the one presented in this OTEP. -#### Non-Technical Reasons +You can find exact proto definitions for each one [here](https://github.com/open-telemetry/opentelemetry-proto-profile/commit/622c1658673283102a9429109185615bfcfaa78e#diff-a21ad1b0e4735fa9b5085cf46abe16f6c13d1710fd255b15b28adb2493a129bfR1). -There are also non-technical considerations at play: +These alternative representations helped us narrow down various techniques for representing profiling data. It was found that all of the representations above are less performant compared to the data model presented in this OTEP. More on that in the next section, [Benchmarking](#benchmarking). -**Interoperability and Backwards Compatibility**: Interoperability is a key strength of pprof. Tools that read pprof files from a decade ago still work with files generated today and vice versa. Introducing changes to pprof to align with OTLP's objectives could disrupt this longstanding interoperability. +### Benchmarking -**Ability to Make Changes to the Format**: While using the same format would be ideal, the divergence in objectives between pprof and OTLP profiles could hinder effective collaboration and progress in introducing profiling support to OpenTelemetry. +The benchmarking was done using Go benchmarking tools. +As part of the process of designing the data model we ran many benchmarks. All benchmarks follow the same 3 step process: -#### Additional Considerations +* Get a profile in pprof format +* Convert it into a profile in some other format, serialize it to bytes, gzip the result +* Measure key performance indicators -##### Interoperability between OTLP and pprof +All benchmarks measured a few key indicators: -One of the stated requirements in this OTEP is that existing profiling formats (pprof) can be unambiguously mapped to this data model. This means that existing tools that generate pprof files are automatically compatible with any OTLP backend. +* `bytes` — size of payload after conversion and serialization +* `gzipped_bytes` — size of payload after gzip compression. +* `retained_objects` — number of go runtime objects created and retained after conversion. +* `unique_label_sets` — number of unique label sets in source pprof file +* `bytes_allocated` - number of bytes allocated by go runtime during conversion +* `allocs` — number of allocations by go runtime during conversion -It works in the opposite direction as well — any OTLP backend should be able to generate pprof files, albeit some functionality (like timestamps support) may be limited. This is important because it allows users to use existing tools to visualize profiles generated by OpenTelemetry. +`gzipped_bytes` is an important metric since this is a cost center for network traffic. -##### Performance implications in Go ecosystem +`bytes`, `retained_objects`, `bytes_allocated`, `allocs` metrics are important because they directly affects memory as well as garbage collection overhead on data producers as well as the intermediaries (such as collector). -There are concerns that using OTLP profiles will have a negative impact on performance in the Go ecosystem. We discussed this with Go runtime team in one of the meetings and the direction we landed on is that the Go runtime could provide lower level APIs that would allow us to avoid the overhead of parsing pprof and encoding it into OTLP. FWIW There's already APIs like that for memory profiles. +[Benchmarking results](https://docs.google.com/spreadsheets/d/1Q-6MlegV8xLYdz5WD5iPxQU2tsfodX1-CDV1WeGzyQ0/edit#gid=0) spreadsheet shows the most recent benchmarking results as well as history of previous benchmarking runs. [Here](https://github.com/petethepig/opentelemetry-collector/pull/1#:~:text=in%20text%20form-,To%20run%20benchmarks%3A,-Clone%20this%20repo) are instructions on how to run the benchmarks. Here's a rough history of benchmarking our group has done: -### Benchmarking +* "23 July 2023", "24 Aug 2023" — show differences between "pprof", "denormalized" and "normalized" representations +* "04 Oct 2023" — introduces "pprofextended" representation, compares it to "pprof" and "arrays". Shoes that "pprofextended" version is overall better than "pprof", but not as a good as "arrays" +* "06 Oct 2023" vs "After Stacktrace removal (Oct 6 2023)" — shows difference between representing stacktraces as separate struct vs a separate array of integers. Shows massive reduction in retained_objects. Demonstrates that after Stacktrace struct removal "pprofexntended" representation is better than "arrays" representation +* "Attribute Representations (Oct 13 2023)" — focuses on differences between different attribute representations. Shows that having a lookup table for attributes is optimal compared to other representations -[Benchmarking results](https://docs.google.com/spreadsheets/d/1Q-6MlegV8xLYdz5WD5iPxQU2tsfodX1-CDV1WeGzyQ0/edit#gid=0) showed that `arrays` representation is the most efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. Some notable benchmark results are showcased below: +Below you can see the benchmarking results for most notable example profiles: -#### Average profile +#### "average" profile -The source for this test is a single 10 second pprof profile collected from a simple go program. It represents a typical profile that is collected from a running application. You can see that the `arrays` representation is the most efficient in terms of memory allocations and size of the resulting protobuf payload. +The source for this benchmark is a single 10 second pprof profile collected from a simple go program. It represents a typical profile that is collected from a running application. |name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| |---|---|---|---|---|---|---| -|BenchmarkAveragePprof-10|8,030|3,834|n/a|1|n/a|n/a| -|BenchmarkAverageDenormalized-10|83,187|3,829|3,167|1|1,027,424|3,191| -|BenchmarkAverageNormalized-10|7,955|3,416|706|1|867,488|1,037| -|BenchmarkAverageArrays-10|7,742|3,311|584|1|869,648|880| +|pprof|7,974|3,772|653|1|876,968|824| +|denormalized|83,204|3,844|3,166|1|1,027,424|3,191| +|normalized|7,940|3,397|753|1|906,848|1,815| +|arrays|7,487|3,276|586|1|922,948|2,391| +|pprofextended|7,695|3,347|654|1|899,400|779| -#### Average profile with timestamps added to each sample +#### "average" profile with timestamps added to each sample -The source is the same as in the previous example, but this time there were timestamps added to each sample in the profile. `arrays` representation remains the most efficient one. +The source is the same as in the previous example, but this time there were timestamps added to each sample in the profile. |name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| |---|---|---|---|---|---|---| -|BenchmarkAverageTimestampsPprof-10|9,478|3,865|n/a|1|n/a|n/a| -|BenchmarkAverageTimestampsDenormalized-10|119,526|4,154|4,482|1|1,125,320|4,893| -|BenchmarkAverageTimestampsNormalized-10|9,637|3,549|941|1|890,192|1,873| -|BenchmarkAverageTimestampsArrays-10|9,560|3,381|684|1|894,472|1,680| +|pprof|9,516|3,787|968|1|898,696|1,568| +|denormalized|121,396|4,233|4,536|1|1,126,280|4,894| +|normalized|9,277|3,394|900|1|925,904|2,632| +|arrays|8,877|3,309|588|1|946,468|3,306| +|pprofextended|8,863|3,387|806|1|919,904|1,476| -#### Ruby profile with very deep stacktraces +#### "ruby" profile with very deep stacktraces -The source for this test is an aggregated pprof profile collected from a Ruby application that has very deep stacktraces. You can see that the `arrays` representation is the most efficient in terms of memory allocations and size of the resulting protobuf payload. +The source for this test is an aggregated pprof profile collected from a Ruby application that has very deep stacktraces. |name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| |---|---|---|---|---|---|---| -|BenchmarkRuby1Pprof-10|1,869,563|115,323|n/a|1|n/a|n/a| -|BenchmarkRuby1Denormalized-10|163,107,484|4,716,442|3,840,093|1|319,473,752|3,844,625| -|BenchmarkRuby1Normalized-10|1,931,905|130,556|41,457|1|18,982,328|78,242| -|BenchmarkRuby1Arrays-10|1,886,964|120,382|23,481|1|18,365,800|42,284| +|pprof|1,869,549|115,289|19,759|1|14,488,578|42,359| +|denormalized|163,107,501|4,716,428|3,840,093|1|319,473,752|3,844,625| +|normalized|1,931,909|130,565|46,890|1|315,003,144|1,725,508| +|arrays|1,868,982|120,298|23,483|1|314,117,160|1,689,537| +|pprofextended|841,957|94,852|19,759|1|20,719,752|33,410| -#### Large profile +#### "large" profile -The source for this test is an aggregated pprof profile collected from a Go application over a large period of time. This one shows that the `arrays` representation remains the most efficient, however, the `gzipped_bytes` number is a little bit larger. +The source for this test is an aggregated pprof profile collected from a Go application over a long period of time (24 hours). |name|bytes|gzipped_bytes|retained_objects|unique_label_sets|bytes_allocated|allocs| |---|---|---|---|---|---|---| -|BenchmarkLargePprof-10|16,767,419|4,625,632|n/a|163|n/a|n/a| -|BenchmarkLargeDenormalized-10|969,446,655|71,246,645|24,036,740|163|2,140,322,432|24,429,954| -|BenchmarkLargeNormalized-10|17,813,931|4,874,456|2,068,600|163|208,793,736|4,217,313| -|BenchmarkLargeArrays-10|16,980,323|5,779,036|964,989|163|218,418,624|3,396,515| +|pprof|2,874,764|1,110,109|350,659|27|27,230,584|470,033| +|denormalized|87,887,253|6,890,103|2,287,303|27|190,243,856|2,325,604| +|normalized|2,528,337|953,211|333,565|27|46,449,824|1,274,000| +|arrays|2,251,355|999,310|213,018|27|60,971,752|1,904,756| +|pprofextended|2,398,961|872,059|274,140|27|38,874,712|353,083| + +#### Conclusions + +After running many benchmarks and analyzing the results, we came to the following conclusions: + +* `denormalized` representation is good but lacks deeper integration with OpenTelemetry standards and could be improved in terms of performance. +* `denormalized` representation is significantly more expensive in terms of CPU utilization, memory consumption and size of the resulting protobuf payload compared to `normalized` representation. It is not suitable for production use. +* `normalized` representation is much better than `denormalized` one +* `arrays` representation is generally better than `normalized` one, but introduces significant changes to the data model and is not as easy to understand +* `pprofextended` (the representation that is used in this OTEP) is the perfect mix of performance and simplicity. It is significantly better than `normalized` representation in terms of CPU utilization, memory consumption and size of the resulting protobuf payload, but it is also more similar to original pprof and easier to understand and implement than `arrays` representation. ### Semantic Conventions -We plan to leverage OTEL Semantic Conventions for various enums such as profile types or units. Here's a non-exhaustive list of semantic conventions that are used in data model. It is expected to be extended in the future. +We plan to leverage OTEL Semantic Conventions for various attributes and enums such as profile types or units. Here's a non-exhaustive list of semantic conventions that are used in data model. It is expected to be polished and extended in the future. + +#### Attributes + +| Attribute | Type | Description | Examples | Requirement Level | +|---|---|---|---|---| +| `trace_id` | bytes | Reference to a trace | `0x01020304010203040102030401020304` | Conditionally Required: If `span_id` present. | +| `span_id` | bytes | Reference to a span | `0x9999999999999999` | Conditionally Required: If `trace_id` present. | #### Profile Types @@ -1037,12 +1426,12 @@ Here's a list of possible profile types. It is not exhaustive, and it is expecte #### Profile Units -Here's a list of possible profile units. It is not exhaustive, and it is expected that more units will be added in the future: +Here's a list of possible profile units. It is not exhaustive, and it is expected that more units will be added in the future. [UCUM](https://ucum.org/) will be used as a reference for some of these units: * `bytes` * `samples` -* `nanoseconds` -* `milliseconds` +* `ns` +* `ms` * `count` ### Decision Log @@ -1063,5 +1452,5 @@ This OTEP enables us to start working on various parts of [OTEL Specification](h That in turn would enable us to start working on: -* [OTEL Collector](https://github.com/open-telemetry/opentelemetry-collector) +* Profiles support in [OTEL Collector](https://github.com/open-telemetry/opentelemetry-collector) * Client SDK implementations in various languages (e.g Go and Java) diff --git a/text/profiles/images/otep0000/profiles-data-model.png b/text/profiles/images/otep0000/profiles-data-model.png index 1e000b4e73a16f370b1fc1584c86ceef3cd5a613..055f58d756c8e78482734b39865bf3bf5c62ec5b 100644 GIT binary patch literal 70246 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 Date: Wed, 1 Nov 2023 22:36:03 -0700 Subject: [PATCH 03/34] renames files --- ...es-data-model.md => 0239-profiles-data-model.md} | 5 ++++- .../{otep0000 => otep0239}/profiles-data-model.png | Bin 2 files changed, 4 insertions(+), 1 deletion(-) rename text/profiles/{0000-profiles-data-model.md => 0239-profiles-data-model.md} (99%) rename text/profiles/images/{otep0000 => otep0239}/profiles-data-model.png (100%) diff --git a/text/profiles/0000-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md similarity index 99% rename from text/profiles/0000-profiles-data-model.md rename to text/profiles/0239-profiles-data-model.md index d04fda58e..69cb88fdb 100644 --- a/text/profiles/0000-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -80,7 +80,7 @@ The following diagram shows the relationships between the messages. Relationship In addition to that, relationship between `samples` and `locations` is further optimized for better performance. More on that in [Relationship Between Samples and Locations](#relationship-between-samples-and-locations) section below. -![diagram of data relationships](./images/otep0000/profiles-data-model.png) +![diagram of data relationships](./images/otep0239/profiles-data-model.png) ### Relationships With Other Signals @@ -1454,3 +1454,6 @@ That in turn would enable us to start working on: * Profiles support in [OTEL Collector](https://github.com/open-telemetry/opentelemetry-collector) * Client SDK implementations in various languages (e.g Go and Java) + + +This is second version of the Profiling Data Model. After [we've gotten feedback from the greater OTel community](https://github.com/open-telemetry/oteps/pull/237) we went back to the drawing board and came up with a new version of the data model. The main difference between the two versions is that the new version is more similar to the original pprof format, which makes it easier to understand and implement. It also has better performance characteristics. See [this chapter](#benchmarking) for more details. diff --git a/text/profiles/images/otep0000/profiles-data-model.png b/text/profiles/images/otep0239/profiles-data-model.png similarity index 100% rename from text/profiles/images/otep0000/profiles-data-model.png rename to text/profiles/images/otep0239/profiles-data-model.png From 7e680aa1c3e5f15ea24e6c407324af3ecd711e9e Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Wed, 1 Nov 2023 22:40:20 -0700 Subject: [PATCH 04/34] cleanups --- text/profiles/0239-profiles-data-model.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 69cb88fdb..0c1b9029f 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1454,6 +1454,3 @@ That in turn would enable us to start working on: * Profiles support in [OTEL Collector](https://github.com/open-telemetry/opentelemetry-collector) * Client SDK implementations in various languages (e.g Go and Java) - - -This is second version of the Profiling Data Model. After [we've gotten feedback from the greater OTel community](https://github.com/open-telemetry/oteps/pull/237) we went back to the drawing board and came up with a new version of the data model. The main difference between the two versions is that the new version is more similar to the original pprof format, which makes it easier to understand and implement. It also has better performance characteristics. See [this chapter](#benchmarking) for more details. From 207f612d9f2b0b57c4f94f25c97939d9c856dd9b Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Wed, 1 Nov 2023 22:46:50 -0700 Subject: [PATCH 05/34] improves example --- text/profiles/0239-profiles-data-model.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 0c1b9029f..16e09f8e3 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1084,6 +1084,8 @@ resource_profiles: scope_profiles: - profiles: - profile_id: 0102030405060708090a0b0c0d0e0f10 + start_time_unix_nano: 1687841520000000 + end_time_unix_nano: 1687841530000000 profile: sample_type: type: 4 From 3d4424ef02718038a2d581067eca787fbfb5bbf5 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 11 Dec 2023 21:44:58 -0800 Subject: [PATCH 06/34] sync with the proto --- text/profiles/0239-profiles-data-model.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 16e09f8e3..995c0c42c 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -504,6 +504,9 @@ message Sample { // References to attributes in Profile.attribute_table. [optional] repeated uint64 attributes = 7; + + // A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] + uint32 stacktrace_id_index = 2; } message Label { @@ -908,6 +911,10 @@ Timestamps associated with Sample represented in ms. These timestamps are expect ##### Field `attributes` References to attributes in Profile.attribute_table. [optional] + +##### Field `stacktrace_id_index` + +A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] #### Message `Location` From b55df12f612e017c5948e2a2bc0d6624dcda9453 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 11 Dec 2023 21:45:14 -0800 Subject: [PATCH 07/34] adds language about backward and forward compatibility --- text/profiles/0239-profiles-data-model.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 995c0c42c..a757d130a 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -103,6 +103,13 @@ Additionally, `trace_id`, `span_id` can be used to reference specific [Samples]( The exact details of such linking are out of scope for this OTEP. It is expected that the exact details will be defined in Profiles part of [opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification). + +### Compatibility with Original pprof + +The proposed data model is backwards compatible with original pprof in a sense that a pprof file generated by existing software can be parsed using the new proto. + +It is not forwards compatible, meaning that a pprof file generated by the new proto cannot be parsed by existing software. This is mainly due to the sharing of the call stacks between samples + new format for labels (more on these differences below). + ### Proto Definition Proto definition is based on [pprof format](https://github.com/google/pprof/blob/main/proto/profile.proto). From ae3140c0725bed444e3e1a9156701d28a4c2872f Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 11 Dec 2023 21:55:17 -0800 Subject: [PATCH 08/34] lint fix --- text/profiles/0239-profiles-data-model.md | 1 - 1 file changed, 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index a757d130a..5ab8dbce3 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -103,7 +103,6 @@ Additionally, `trace_id`, `span_id` can be used to reference specific [Samples]( The exact details of such linking are out of scope for this OTEP. It is expected that the exact details will be defined in Profiles part of [opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification). - ### Compatibility with Original pprof The proposed data model is backwards compatible with original pprof in a sense that a pprof file generated by existing software can be parsed using the new proto. From 92dbf8aa23cb4607b6a08b1aedc3f1a15d20c492 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Thu, 4 Jan 2024 09:53:01 -0800 Subject: [PATCH 09/34] Update text/profiles/0239-profiles-data-model.md --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 5ab8dbce3..4da85cfd9 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -458,7 +458,7 @@ enum AggregationTemporality { 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_0+1 with a value of 1. + 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. */ From 0ded8c46018bf243df74ac7dca91c7fe706113df Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Thu, 11 Jan 2024 12:41:14 -0800 Subject: [PATCH 10/34] updates diagram --- text/profiles/0239-profiles-data-model.md | 106 +++++++++++++++--- .../images/otep0239/profiles-data-model.png | Bin 70246 -> 76430 bytes 2 files changed, 88 insertions(+), 18 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 4da85cfd9..f0be88b4c 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -11,6 +11,7 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Relationships With Other Signals](#relationships-with-other-signals) * [From profiles to other signals](#from-profiles-to-other-signals) * [From other signals to profiles](#from-other-signals-to-profiles) + * [Compatibility with Original pprof](#compatibility-with-original-pprof) * [Proto Definition](#proto-definition) * [Message Descriptions](#message-descriptions) * [Message `ProfilesData`](#message-profilesdata) @@ -20,6 +21,7 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Message `Profile`](#message-profile) * [Message `ValueType`](#message-valuetype) * [Message `Sample`](#message-sample) + * [Message `Link`](#message-link) * [Message `Location`](#message-location) * [Message `Line`](#message-line) * [Message `Mapping`](#message-mapping) @@ -175,12 +177,12 @@ option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1"; // ┌──────────────────┐ // │ Profile │ // └──────────────────┘ -// │ -// │ 1-n -// ▼ -// ┌──────────────────┐ 1-n ┌──────────────┐ -// │ Sample │ ──────▷ │ KeyValue │ -// └──────────────────┘ └──────────────┘ +// │ 1-n +// │ 1-n ┌───────────────────────────────────────┐ +// ▼ │ ▽ +// ┌──────────────────┐ 1-n ┌──────────────┐ ┌──────────┐ +// │ Sample │ ──────▷ │ KeyValue │ │ Link │ +// └──────────────────┘ └──────────────┘ └──────────┘ // │ 1-n △ △ // │ 1-n ┌─────────────────┘ │ 1-n // ▽ │ │ @@ -343,6 +345,8 @@ import "opentelemetry/proto/common/v1/common.proto"; option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1/alternatives/pprofextended"; +// Represents a complete profile, including sample types, samples, +// mappings to binaries, locations, functions, string table, and additional metadata. message Profile { // A description of the samples associated with each Sample.value. // For a cpu profile this might be: @@ -397,8 +401,23 @@ message Profile { repeated int64 location_indices = 15; // Lookup table for attributes. repeated opentelemetry.proto.common.v1.KeyValue attribute_table = 16; + // Lookup table for links. + repeated Link link_table = 17; +} + +// 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; @@ -458,14 +477,14 @@ enum AggregationTemporality { 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. + t_0+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 semantics and measurement units of a value. +// ValueType describes the type and units of a value, with an optional aggregation temporality. message ValueType { int64 type = 1; // Index into string table. int64 unit = 2; // Index into string table. @@ -511,10 +530,15 @@ message Sample { // References to attributes in Profile.attribute_table. [optional] repeated uint64 attributes = 7; + // References to links in Profile.link_table. [optional] + repeated uint64 links = 8; + // A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] - uint32 stacktrace_id_index = 2; + uint32 stacktrace_id_index = 9; } +// Provides additional context for a sample, +// such as thread ID or allocation size, with optional units. [deprecated] message Label { int64 key = 1; // Index into string table @@ -532,6 +556,16 @@ message Label { int64 num_unit = 4; // Index into string table } +// Indicates the type of build ID, either from the linker or a binary hash. +enum BuildIdKind { + // BUILD_ID_LINKER indicates that the build id is linker-provided (usually GNU build ID) + BUILD_ID_LINKER = 0; + // BUILD_ID_BINARY_HASH indicates that the build id is a hash of the binary. + BUILD_ID_BINARY_HASH = 1; +} + +// Describes the mapping of a binary in memory, including its address range, +// file offset, and metadata like build ID message Mapping { // Unique nonzero id for the mapping. [deprecated] uint64 id = 1; @@ -556,10 +590,8 @@ message Mapping { bool has_line_numbers = 9; bool has_inline_frames = 10; - // A string that uniquely identifies a particular binary with high probability. - // It is meant to work around deficiencies in the GNU Build ID that may compromise - // uniqueness / correlatability. Index into string table. - uint32 file_id_index = 11; + // Specifies the kind of build id. See BuildIdKind enum for more detaiks [optional] + BuildIdKind build_id_kind = 11; // References to attributes in Profile.attribute_table. [optional] repeated uint64 attributes = 12; @@ -602,6 +634,7 @@ message Location { repeated uint64 attributes = 7; } +// Details a specific line in a source code, linked to a function. message Line { // The index of the corresponding profile.Function for this line. uint64 function_index = 1; @@ -609,6 +642,8 @@ message Line { int64 line = 2; } +// Describes a function, including its human-readable name, system name, +// source file, and starting line number in the source. message Function { // Unique nonzero id for the function. [deprecated] uint64 id = 1; @@ -761,6 +796,9 @@ following conventions: mappings. For every nonzero Location.mapping_id there must be a unique Mapping with that id. +Represents a complete profile, including sample types, samples, +mappings to binaries, locations, functions, string table, and additional metadata. +
Field Descriptions @@ -849,11 +887,15 @@ Array of locations referenced by samples. ##### Field `attribute_table` Lookup table for attributes. + +##### Field `link_table` + +Lookup table for links.
#### Message `ValueType` -ValueType describes the semantics and measurement units of a value. +ValueType describes the type and units of a value, with an optional aggregation temporality.
Field Descriptions @@ -918,11 +960,33 @@ Timestamps associated with Sample represented in ms. These timestamps are expect References to attributes in Profile.attribute_table. [optional] +##### Field `links` + +References to links in Profile.link_table. [optional] + ##### Field `stacktrace_id_index` A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional]
+#### Message `Link` + +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. + +
+Field Descriptions + +##### Field `trace_id` + +A unique identifier of a trace that this linked span is part of. The ID is a +16-byte array. + +##### Field `span_id` + +A unique identifier for the linked span. The ID is an 8-byte array. +
+ #### Message `Location` Describes function and line table debug information. @@ -977,6 +1041,8 @@ References to attributes in Profile.attribute_table. [optional] #### Message `Line` +Details a specific line in a source code, linked to a function. +
#### Message `Function` @@ -1154,7 +1153,7 @@ Line number in source file. ### Example Payloads -#### Simple example +#### Simple Example Considering the following example presented in a modified folded format: @@ -1233,7 +1232,7 @@ resource_profiles: - samples ``` -### Notable differences compared to other signals +### Notable Differences Compared to Other Signals Due to the increased performance requirements associated with profiles signal, here are some notable differences between profiles signal and other signals. @@ -1355,7 +1354,7 @@ string_table: Benchmarking shows that this approach is significantly more efficient in terms of CPU utilization, memory consumption and size of the resulting protobuf payload. See [Prior art and alternatives](#prior-art-and-alternatives) for more details. -## Trade-offs and Mitigations +## Trade-Offs and Mitigations The biggest trade-off was made between the performance characteristics of the format and it's simplicity. The emphasis was made on the performance characteristics, which resulted in a cognitively more complex format. @@ -1435,7 +1434,7 @@ All benchmarks measured a few key indicators: Below you can see the benchmarking results for most notable example profiles: -#### "average" profile +#### "average" Profile The source for this benchmark is a single 10 second pprof profile collected from a simple go program. It represents a typical profile that is collected from a running application. @@ -1447,7 +1446,7 @@ The source for this benchmark is a single 10 second pprof profile collected from |arrays|7,487|3,276|586|1|922,948|2,391| |pprofextended|7,695|3,347|654|1|899,400|779| -#### "average" profile with timestamps added to each sample +#### "average" Profile With Timestamps Added to Each Sample The source is the same as in the previous example, but this time there were timestamps added to each sample in the profile. @@ -1459,7 +1458,7 @@ The source is the same as in the previous example, but this time there were time |arrays|8,877|3,309|588|1|946,468|3,306| |pprofextended|8,863|3,387|806|1|919,904|1,476| -#### "ruby" profile with very deep stacktraces +#### "ruby" Profile With Very Deep Stacktraces The source for this test is an aggregated pprof profile collected from a Ruby application that has very deep stacktraces. @@ -1471,7 +1470,7 @@ The source for this test is an aggregated pprof profile collected from a Ruby ap |arrays|1,868,982|120,298|23,483|1|314,117,160|1,689,537| |pprofextended|841,957|94,852|19,759|1|20,719,752|33,410| -#### "large" profile +#### "large" Profile The source for this test is an aggregated pprof profile collected from a Go application over a long period of time (24 hours). @@ -1540,7 +1539,7 @@ Some minor details about the data model are still being discussed and will be fl Here's a list of open questions: -### Units in attributes +### Units in Attributes Original pprof format allows to specify units for attributes. The current data model supports a similar concept via the use of string table (see `attribute_units` in `Sample` message). It might be a good idea to have the units be specified directly in `KeyValue` message. However, such change would require changes in virtually all signals and it is not clear if it is worth it. We intend to research this question in the future and if it is worth it, we will submit a separate OTEP to make this change. @@ -1548,7 +1547,7 @@ Original pprof format allows to specify units for attributes. The current data m Although there's support for timestamps in the data model, it is not clear how they should be used and therefore we expect to make changes to this aspect of the data model in the future after we do more experiments. -### Repetition of attribute keys +### Repetition of Attribute Keys Original pprof format allows for efficient encoding of repeating attribute keys. For example, if 3 attributes have the same key (e.g `pid: 1`, `pid: 2`, `pid: 3`), the key is only stored once in the string table. The current data model doesn't support this optimization. We intend to research if this optimization is truly needed and if it is, it will be added to the data model in the future. From 11fd8d5b5afdfce7aff6801d7abb94bfafe28e30 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 16 Jan 2024 18:37:51 -0800 Subject: [PATCH 13/34] Addresses more of Alexey's comments --- text/profiles/0239-profiles-data-model.md | 87 ++++++++++++++--------- 1 file changed, 55 insertions(+), 32 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 7b2c116f8..529f3aa88 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -349,6 +349,14 @@ import "opentelemetry/proto/common/v1/common.proto"; option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1/alternatives/pprofextended"; +// Represents a mapping between Attribute Keys and Units. +message AttributeUnit { + // Index into string table. + int64 attribute_key = 1; + // Index into string table. + int64 unit = 2; +} + // Represents a complete profile, including sample types, samples, // mappings to binaries, locations, functions, string table, and additional metadata. message Profile { @@ -376,8 +384,10 @@ message Profile { // string_table[0] must always be "". // Lookup table for attributes. repeated opentelemetry.proto.common.v1.KeyValue attribute_table = 16; + // Represents a mapping between Attribute Keys and Units. + repeated AttributeUnit attribute_units = 17; // Lookup table for links. - repeated Link link_table = 17; + repeated Link link_table = 18; repeated string string_table = 6; // frames with Function.function_name fully matching the following // regexp will be dropped from the samples, along with their successors. @@ -532,11 +542,8 @@ message Sample { // References to attributes in Profile.attribute_table. [optional] repeated uint64 attributes = 10; - // References to attribute units in Profile.string_table. Each number in this array MUST have a matching attribute reference in attributes array. [optional] - repeated uint64 attribute_units = 11; - - // References to links in Profile.link_table. [optional] - repeated uint64 links = 12; + // Reference to link in Profile.link_table. [optional] + uint64 link = 12; // Timestamps associated with Sample represented in ms. These timestamps are expected // to fall within the Profile's time range. [optional] @@ -782,26 +789,6 @@ This is a reference to a pprof profile. Required, even when original_payload is #### Message `Profile` -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 id. -- 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 id. - Represents a complete profile, including sample types, samples, mappings to binaries, locations, functions, string table, and additional metadata. @@ -846,6 +833,10 @@ A common table for strings referenced by various messages. string_table[0] must always be "". Lookup table for attributes. +##### Field `attribute_units` + +Represents a mapping between Attribute Keys and Units. + ##### Field `link_table` Lookup table for links. @@ -965,13 +956,9 @@ name on a sample. Again, possible to express, but should not be used. References to attributes in Profile.attribute_table. [optional] -##### Field `attribute_units` - -References to attribute units in Profile.string_table. Each number in this array MUST have a matching attribute reference in attributes array. [optional] +##### Field `link` -##### Field `links` - -References to links in Profile.link_table. [optional] +Reference to link in Profile.link_table. [optional] ##### Field `timestamps` @@ -979,6 +966,42 @@ Timestamps associated with Sample represented in ms. These timestamps are expect to fall within the Profile's time range. [optional] +#### Message `AttributeUnit` + +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 id. +- 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 id. + +Represents a mapping between Attribute Keys and Units. + +
+Field Descriptions + +##### Field `attribute_key` + +Index into string table. + +##### Field `unit` + +Index into string table. +
+ #### Message `Link` A pointer from a profile Sample to a trace Span. From 175a4e7214161854c55f7af2e3ccac3596b1ee64 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 16 Jan 2024 19:09:28 -0800 Subject: [PATCH 14/34] addresses comments from @Kielek --- text/profiles/0239-profiles-data-model.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 529f3aa88..fd69490d6 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -21,6 +21,7 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Message `Profile`](#message-profile) * [Message `ValueType`](#message-valuetype) * [Message `Sample`](#message-sample) + * [Message `AttributeUnit`](#message-attributeunit) * [Message `Link`](#message-link) * [Message `Location`](#message-location) * [Message `Line`](#message-line) @@ -146,6 +147,8 @@ package opentelemetry.proto.profiles.v1; import "opentelemetry/proto/common/v1/common.proto"; import "opentelemetry/proto/resource/v1/resource.proto"; +import "opentelemetry/proto/profiles/v1/alternatives/pprofextended/pprofextended.proto"; + option csharp_namespace = "OpenTelemetry.Proto.Profiles.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.profiles.v1"; @@ -347,6 +350,7 @@ package opentelemetry.proto.profiles.v1.alternatives.pprofextended; import "opentelemetry/proto/common/v1/common.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Profiles.V1.Alternatives.PprofExtended"; option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1/alternatives/pprofextended"; // Represents a mapping between Attribute Keys and Units. From 1e71ed0aa8d16c241ff292da48a44bf36988773f Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 22 Jan 2024 18:17:19 -0800 Subject: [PATCH 15/34] addresses Tigran's comment https://github.com/open-telemetry/oteps/pull/239#discussion_r1462454982 --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index fd69490d6..f013152f2 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -112,7 +112,7 @@ The exact details of such linking are out of scope for this OTEP. It is expected ### Compatibility With Original pprof -The proposed data model is backwards compatible with original pprof in a sense that a pprof file generated by existing software can be parsed using the new proto. +The proposed data model is backwards compatible with original pprof in a sense that a pprof file generated by existing software can be parsed using the new proto. All fields in the original pprof are preserved, so that original pprof files can still be parsed using the new proto, and no data is lost. It is not forwards compatible, meaning that a pprof file generated by the new proto cannot be parsed by existing software. This is mainly due to the sharing of the call stacks between samples + new format for labels (more on these differences below). From 51b8fb661055573cabbb08e30e05d3ea29383b1d Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 22 Jan 2024 18:33:50 -0800 Subject: [PATCH 16/34] backwards compatible -> backward compatible, forwards compatible -> forward compatible --- text/profiles/0239-profiles-data-model.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index f013152f2..85e743bdb 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -112,9 +112,9 @@ The exact details of such linking are out of scope for this OTEP. It is expected ### Compatibility With Original pprof -The proposed data model is backwards compatible with original pprof in a sense that a pprof file generated by existing software can be parsed using the new proto. All fields in the original pprof are preserved, so that original pprof files can still be parsed using the new proto, and no data is lost. +The proposed data model is backward compatible with original pprof in a sense that a pprof file generated by existing software can be parsed using the new proto. All fields in the original pprof are preserved, so that original pprof files can still be parsed using the new proto, and no data is lost. -It is not forwards compatible, meaning that a pprof file generated by the new proto cannot be parsed by existing software. This is mainly due to the sharing of the call stacks between samples + new format for labels (more on these differences below). +It is not forward compatible, meaning that a pprof file generated by the new proto cannot be parsed by existing software. This is mainly due to the sharing of the call stacks between samples + new format for labels (more on these differences below). ### Proto Definition From 4975f538bbc409e269310eb620ca5b6c9497aeb5 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 22 Jan 2024 18:38:33 -0800 Subject: [PATCH 17/34] copies proto improvements from opentelemetry-proto-profile repo --- text/profiles/0239-profiles-data-model.md | 62 +++++++++++++---------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 85e743bdb..293275fea 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -353,14 +353,6 @@ import "opentelemetry/proto/common/v1/common.proto"; option csharp_namespace = "OpenTelemetry.Proto.Profiles.V1.Alternatives.PprofExtended"; option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1/alternatives/pprofextended"; -// Represents a mapping between Attribute Keys and Units. -message AttributeUnit { - // Index into string table. - int64 attribute_key = 1; - // Index into string table. - int64 unit = 2; -} - // Represents a complete profile, including sample types, samples, // mappings to binaries, locations, functions, string table, and additional metadata. message Profile { @@ -423,6 +415,14 @@ message Profile { int64 default_sample_type = 14; } +// Represents a mapping between Attribute Keys and Units. +message AttributeUnit { + // Index into string table. + int64 attribute_key = 1; + // Index into string table. + int64 unit = 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 { @@ -657,6 +657,8 @@ message Line { uint64 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, @@ -793,6 +795,26 @@ This is a reference to a pprof profile. Required, even when original_payload is #### Message `Profile` +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 id. +- 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 id. + Represents a complete profile, including sample types, samples, mappings to binaries, locations, functions, string table, and additional metadata. @@ -972,26 +994,6 @@ to fall within the Profile's time range. [optional] #### Message `AttributeUnit` -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 id. -- 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 id. - Represents a mapping between Attribute Keys and Units.
@@ -1090,6 +1092,10 @@ The index of the corresponding profile.Function for this line. ##### Field `line` Line number in source code. + +##### Field `column` + +Column number in source code.
#### Message `Mapping` From e61721cda19dab8a7a7db0520540747438e11248 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 22 Jan 2024 18:42:36 -0800 Subject: [PATCH 18/34] clarified that you can't link to a specific sample --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 293275fea..51ea2f767 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -106,7 +106,7 @@ For other signals, such as logs or metrics, because other signals use the same w Other signals can use `profile_id` to reference a profile. For example, a log record can reference a profile that was collected at the time when the log record was generated by using `profile_id` as one of the attributes. This allows to correlate logs with profiles. -Additionally, `trace_id`, `span_id` can be used to reference specific [Samples](#message-sample) in a Profile, since [Samples](#message-sample) are linked to traces with these same identifiers using [Links](#message-link). +Additionally, `trace_id`, `span_id` can be used to reference groups of [Samples](#message-sample) (but not individual [Samples](#message-sample)) in a Profile, since [Samples](#message-sample) are linked to traces with these same identifiers using [Links](#message-link). The exact details of such linking are out of scope for this OTEP. It is expected that the exact details will be defined in Profiles part of [opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification). From d16459c7ada77b92b2964bd63a04a04ec41d9448 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 09:43:27 -0800 Subject: [PATCH 19/34] fixes string_table comment --- text/profiles/0239-profiles-data-model.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 51ea2f767..ef192a48e 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -376,14 +376,14 @@ message Profile { repeated int64 location_indices = 15; // Functions referenced by locations. repeated Function function = 5; - // A common table for strings referenced by various messages. - // string_table[0] must always be "". // Lookup table for attributes. repeated opentelemetry.proto.common.v1.KeyValue attribute_table = 16; // Represents a mapping between Attribute Keys and Units. repeated AttributeUnit attribute_units = 17; // Lookup table for links. repeated Link link_table = 18; + // A common table for strings referenced by various messages. + // string_table[0] must always be "". repeated string string_table = 6; // frames with Function.function_name fully matching the following // regexp will be dropped from the samples, along with their successors. @@ -855,8 +855,6 @@ Functions referenced by locations. ##### Field `attribute_table` -A common table for strings referenced by various messages. -string_table[0] must always be "". Lookup table for attributes. ##### Field `attribute_units` @@ -867,6 +865,11 @@ Represents a mapping between Attribute Keys and Units. Lookup table for links. +##### Field `string_table` + +A common table for strings referenced by various messages. +string_table[0] must always be "". + ##### Field `drop_frames` frames with Function.function_name fully matching the following From 346dce4d8dba03053975746586ee7de6fd1183e1 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 14:25:49 -0800 Subject: [PATCH 20/34] Update text/profiles/0239-profiles-data-model.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Juraci Paixão Kröhling --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index ef192a48e..b9e74f609 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1522,7 +1522,7 @@ The source for this test is an aggregated pprof profile collected from a Go appl After running many benchmarks and analyzing the results, we came to the following conclusions: -* `denormalized` representation is good but lacks deeper integration with OpenTelemetry standards and could be improved in terms of performance. +* `pprof` representation is good but lacks deeper integration with OpenTelemetry standards and could be improved in terms of performance. * `denormalized` representation is significantly more expensive in terms of CPU utilization, memory consumption and size of the resulting protobuf payload compared to `normalized` representation. It is not suitable for production use. * `normalized` representation is much better than `denormalized` one * `arrays` representation is generally better than `normalized` one, but introduces significant changes to the data model and is not as easy to understand From 9ffc90e49506504784a7790031b942cd896db7b9 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 15:37:03 -0800 Subject: [PATCH 21/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Christos Kalkanis --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index b9e74f609..10f883c72 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -73,7 +73,7 @@ These goals are based on the vision set out in [Profiling Vision OTEP](./0212-pr * Make profiling compatible with other signals * Standardize profiling data model for industry-wide sharing and reuse -* Profilers must be able to be implementable with low overhead and conforming to OpenTelemetry-wide runtime overhead / intrusiveness and wire data size requirements. +* Profilers must be implementable with low overhead and conforming to OpenTelemetry-wide runtime overhead / intrusiveness and wire data size requirements. The last point is particularly important in the context of profiling. Profilers generate large amounts of data, and users of profiling technology are very sensitive to the overhead that profiling introduces. In the past high overhead has been a blocker for wider adoption of continuous profiling and was one of the reasons why profiling was not used in production environments. Therefore it is important to make sure that the overhead of handling the profiling data on the client side as well as in intermediaries (e.g collector) is minimal. From cb4ad771474f9d08f5beb1137fc086471cf2dfd2 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 15:37:23 -0800 Subject: [PATCH 22/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Christos Kalkanis --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 10f883c72..eaaa3a37b 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -122,7 +122,7 @@ Proto definition is based on [pprof format](https://github.com/google/pprof/blob In the landscape of performance profiling tools, pprof's data format stands as a clear industry standard. Its evolution and enduring relevance are a reflection of its effectiveness in addressing diverse and complex performance profiling needs. Major technology firms and open-source projects alike routinely employ pprof, underscoring its universal applicability and reliability. -According to the [data from Profilerpedia](https://docs.google.com/spreadsheets/d/1UM-WFQhNf4GcyXmluSUGnMbOenvN-TqP2HQC9-Y50Lc/edit?usp=sharing), it's one of the most widely used formats. Compared to other formats it has the highest number of profilers, UIs, formats it can be converted to and from. +According to the [data from Profilerpedia](https://docs.google.com/spreadsheets/d/1UM-WFQhNf4GcyXmluSUGnMbOenvN-TqP2HQC9-Y50Lc/edit?usp=sharing), pprof is one of the most widely used formats. Compared to other formats it has the highest number of profilers, UIs, formats it can be converted to and from. The original pprof data model underwent enhancements to more effectively manage profiling data within the scope of OpenTelemetry, and certain upgrades were implemented to overcome a few of the original format's constraints. From 3dd9fc1ba386f4dd322c4e09cf719357efb63e5c Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 15:37:48 -0800 Subject: [PATCH 23/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Christos Kalkanis --- text/profiles/0239-profiles-data-model.md | 1 + 1 file changed, 1 insertion(+) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index eaaa3a37b..7065c2f1d 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -133,6 +133,7 @@ Here's a [link to a diff between original pprof and modified pprof](https://gith * Reuse of OpenTelemetry conventions and message types. * Semantic conventions for linking to other signals via `trace_id`s and `span_id`s. * First-class timestamp support. +* Expanded metadata attach points (Sample / Location / Mapping). Below you will find the proto for the new Profiles signal. It is split into two parts: the first part is the OpenTelemetry specific part, and the second part is the modified pprof proto. Intention here is to make it easier to compare modified pprof proto to the original pprof proto. From 8e3c98923ace5229382b33974a7c3bfde0e0dcde Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 15:38:04 -0800 Subject: [PATCH 24/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Christos Kalkanis --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 7065c2f1d..fa3a70bea 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1408,7 +1408,7 @@ This section describes other existing popular formats and alternative representa ### Other Popular Formats -Many other popular formats were considered as part of the process of designing this format. The popularity was assesed based on [data from profilerpedia website](https://docs.google.com/spreadsheets/d/1UM-WFQhNf4GcyXmluSUGnMbOenvN-TqP2HQC9-Y50Lc/edit?usp=sharing). This chapter describes the most notable formats that were considered. +Many other popular formats were considered as part of the process of designing this format. The popularity was assessed based on [data from Profilerpedia website](https://docs.google.com/spreadsheets/d/1UM-WFQhNf4GcyXmluSUGnMbOenvN-TqP2HQC9-Y50Lc/edit?usp=sharing). This chapter describes the most notable formats that were considered. #### Folded Stacks From 22ab7abae2065afa294303cd196b4f86353077e1 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 15:38:41 -0800 Subject: [PATCH 25/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Christos Kalkanis --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index fa3a70bea..4a51abe0f 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -688,7 +688,7 @@ These are detailed descriptions of protobuf messages that are used to represent #### Message `ProfilesData` -ProfilesData represents the profiles data that can be stored in a persistent storage, +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 From aa9f2987c2434f468be05a53cd212fedbb2d0221 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 23 Jan 2024 15:38:49 -0800 Subject: [PATCH 26/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Christos Kalkanis --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 4a51abe0f..898d7f6fc 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1466,7 +1466,7 @@ All benchmarks measured a few key indicators: * "23 July 2023", "24 Aug 2023" — show differences between "pprof", "denormalized" and "normalized" representations * "04 Oct 2023" — introduces "pprofextended" representation, compares it to "pprof" and "arrays". Shoes that "pprofextended" version is overall better than "pprof", but not as a good as "arrays" -* "06 Oct 2023" vs "After Stacktrace removal (Oct 6 2023)" — shows difference between representing stacktraces as separate struct vs a separate array of integers. Shows massive reduction in retained_objects. Demonstrates that after Stacktrace struct removal "pprofexntended" representation is better than "arrays" representation +* "06 Oct 2023" vs "After Stacktrace removal (Oct 6 2023)" — shows difference between representing stacktraces as separate struct vs a separate array of integers. Shows massive reduction in retained_objects. Demonstrates that after Stacktrace struct removal "pprofextended" representation is better than "arrays" representation * "Attribute Representations (Oct 13 2023)" — focuses on differences between different attribute representations. Shows that having a lookup table for attributes is optimal compared to other representations Below you can see the benchmarking results for most notable example profiles: From 8a85134295bf10e568059fca9b8fcd0414f842ba Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Wed, 24 Jan 2024 19:30:46 -0800 Subject: [PATCH 27/34] fixes relationships on diagrams --- text/profiles/0239-profiles-data-model.md | 4 ++-- .../images/otep0239/profiles-data-model.png | Bin 76430 -> 75855 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 898d7f6fc..6ef25acf4 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -194,7 +194,7 @@ option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1"; // │ 1-n △ △ // │ 1-n ┌─────────────────┘ │ 1-n // ▽ │ │ -// ┌──────────────────┐ 1-1 ┌──────────────┐ +// ┌──────────────────┐ n-1 ┌──────────────┐ // │ Location │ ──────▷ │ Mapping │ // └──────────────────┘ └──────────────┘ // │ @@ -211,7 +211,7 @@ option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1"; // └──────────────────┘ // -// ProfilesData represents the profiles data that can be stored in a persistent storage, +// 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. // diff --git a/text/profiles/images/otep0239/profiles-data-model.png b/text/profiles/images/otep0239/profiles-data-model.png index cafb3f40b764bd0e98457b95a00f9abb2e487929..3c9ac90a2bf03b5880269ce9fab66d89b7a8a2dd 100644 GIT binary patch literal 75855 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 J={a-#e*^Cdt+fCE literal 76430 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 D3ZEI1 From 8b973e97c0d564757199fbefdfa070dd7a4beea1 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 5 Feb 2024 10:35:24 -0800 Subject: [PATCH 28/34] Update text/profiles/0239-profiles-data-model.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Felix Geisendörfer --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 6ef25acf4..f5d2b900c 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1213,7 +1213,7 @@ resource_profiles: schema_url: todo scope_profiles: - profiles: - - profile_id: 0102030405060708090a0b0c0d0e0f10 + - profile_id: 0x0102030405060708090a0b0c0d0e0f10 start_time_unix_nano: 1687841520000000 end_time_unix_nano: 1687841530000000 profile: From 86844bff920cfd1e1dee072440403848b1165a03 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 5 Feb 2024 15:11:10 -0800 Subject: [PATCH 29/34] comment update --- text/profiles/0239-profiles-data-model.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index f5d2b900c..3e0b46271 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -340,10 +340,10 @@ Modified pprof: // 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 id. +// 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 id. +// unique Mapping with that index. syntax = "proto3"; @@ -811,10 +811,10 @@ following conventions: 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 id. + 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 id. + unique Mapping with that index. Represents a complete profile, including sample types, samples, mappings to binaries, locations, functions, string table, and additional metadata. From c9051417675e31f83771c4881339b3b39091061e Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 5 Feb 2024 16:02:17 -0800 Subject: [PATCH 30/34] Update text/profiles/0239-profiles-data-model.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Felix Geisendörfer --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 3e0b46271..0c453c74f 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1240,7 +1240,7 @@ resource_profiles: - name: 3 location: - line: - - {} + - function_index: 0 - line: - function_index: 1 - line: From e1da96df9f253f464c9ed681206fd80a3377bfe6 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Mon, 5 Feb 2024 16:04:48 -0800 Subject: [PATCH 31/34] clarifies profile_id uniqueness --- text/profiles/0239-profiles-data-model.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 3e0b46271..1dd4fc29f 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -262,7 +262,7 @@ message ScopeProfiles { // A ProfileContainer represents a single profile. It wraps pprof profile with OpenTelemetry specific metadata. message ProfileContainer { - // A unique identifier for a profile. The ID is a 16-byte array. An ID with + // 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. @@ -750,7 +750,7 @@ A ProfileContainer represents a single profile. It wraps pprof profile with Open ##### Field `profile_id` -A unique identifier for a profile. The ID is a 16-byte array. An ID with +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. From 83c612c06a59777c1b20776d0e6e120d442961e8 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Fri, 16 Feb 2024 11:26:03 -0800 Subject: [PATCH 32/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Reiley Yang --- text/profiles/0239-profiles-data-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 0c453c74f..1da1c6469 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -75,7 +75,7 @@ These goals are based on the vision set out in [Profiling Vision OTEP](./0212-pr * Standardize profiling data model for industry-wide sharing and reuse * Profilers must be implementable with low overhead and conforming to OpenTelemetry-wide runtime overhead / intrusiveness and wire data size requirements. -The last point is particularly important in the context of profiling. Profilers generate large amounts of data, and users of profiling technology are very sensitive to the overhead that profiling introduces. In the past high overhead has been a blocker for wider adoption of continuous profiling and was one of the reasons why profiling was not used in production environments. Therefore it is important to make sure that the overhead of handling the profiling data on the client side as well as in intermediaries (e.g collector) is minimal. +The last point is particularly important in the context of profiling. Profilers generate large amounts of data, and users of profiling technology are very sensitive to the overhead that profiling introduces. In the past high overhead has been a blocker for wider adoption of continuous profiling and was one of the reasons why profiling was not used in production environments. Therefore, it is important to make sure that the overhead of handling the profiling data on the client side as well as in intermediaries (e.g collector) is minimal. ## Data Model From c8db757b049f1867c2f90dbb70e1e7401fee4d55 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Fri, 16 Feb 2024 11:26:22 -0800 Subject: [PATCH 33/34] Update text/profiles/0239-profiles-data-model.md Co-authored-by: Reiley Yang --- text/profiles/0239-profiles-data-model.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 1da1c6469..90e165952 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -71,9 +71,9 @@ The purpose of the data model is to have a common understanding of what a profil These goals are based on the vision set out in [Profiling Vision OTEP](./0212-profiling-vision.md): -* Make profiling compatible with other signals -* Standardize profiling data model for industry-wide sharing and reuse -* Profilers must be implementable with low overhead and conforming to OpenTelemetry-wide runtime overhead / intrusiveness and wire data size requirements. +* Make profiling compatible with other signals. +* Standardize profiling data model for industry-wide sharing and reuse. +* Profilers must be implementable with low overhead and conforming to OpenTelemetry-wide runtime overhead/intrusiveness and wire data size requirements. The last point is particularly important in the context of profiling. Profilers generate large amounts of data, and users of profiling technology are very sensitive to the overhead that profiling introduces. In the past high overhead has been a blocker for wider adoption of continuous profiling and was one of the reasons why profiling was not used in production environments. Therefore, it is important to make sure that the overhead of handling the profiling data on the client side as well as in intermediaries (e.g collector) is minimal. From 631be747ae3862a431a90587c26135c654caa73c Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Fri, 16 Feb 2024 12:15:33 -0800 Subject: [PATCH 34/34] removes a leftover section from when we were going to put trace_id and span_id in attributes --- text/profiles/0239-profiles-data-model.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index 2b43ff700..396e84817 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -1533,13 +1533,6 @@ After running many benchmarks and analyzing the results, we came to the followin We plan to leverage OTEL Semantic Conventions for various attributes and enums such as profile types or units. Here's a non-exhaustive list of semantic conventions that are used in data model. It is expected to be polished and extended in the future. -#### Attributes - -| Attribute | Type | Description | Examples | Requirement Level | -|---|---|---|---|---| -| `trace_id` | bytes | Reference to a trace | `0x01020304010203040102030401020304` | Conditionally Required: If `span_id` present. | -| `span_id` | bytes | Reference to a span | `0x9999999999999999` | Conditionally Required: If `trace_id` present. | - #### Profile Types Here's a list of possible profile types. It is not exhaustive, and it is expected that more profile types will be added in the future:

Field Descriptions @@ -991,6 +1057,9 @@ Line number in source code. #### Message `Mapping` +Describes the mapping of a binary in memory, including its address range, +file offset, and metadata like build ID +
Field Descriptions @@ -1028,11 +1097,9 @@ it could be the contents of the .note.gnu.build-id field. Index into string table The following fields indicate the resolution of symbolic info. -##### Field `file_id_index` +##### Field `build_id_kind` -A string that uniquely identifies a particular binary with high probability. -It is meant to work around deficiencies in the GNU Build ID that may compromise -uniqueness / correlatability. Index into string table. +Specifies the kind of build id. See BuildIdKind enum for more detaiks [optional] ##### Field `attributes` @@ -1041,6 +1108,9 @@ References to attributes in Profile.attribute_table. [optional] #### Message `Function` +Describes a function, including its human-readable name, system name, +source file, and starting line number in the source. +
Field Descriptions diff --git a/text/profiles/images/otep0239/profiles-data-model.png b/text/profiles/images/otep0239/profiles-data-model.png index 055f58d756c8e78482734b39865bf3bf5c62ec5b..cafb3f40b764bd0e98457b95a00f9abb2e487929 100644 GIT binary patch literal 76430 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 D3ZEI1 literal 70246 zcmc$`c|4Zw`aXK2Qf3m$tXauWBy$m!DWPN@Qiha5ghJ*rR4P*$Qf5UcNr+G(i4-!I zWL8MVeO&Ka>$gAO@80{Lz4v$TwcgL$8_#n;_jBFnb)Lt09LITu9@f!dW?08SQ55sR z18PSoik6R}mI?q9{s;I;ghSz~k<4hr1EykJ;Vh z;<>)Ax1I+&A(rASJC_xM=vwf*4hyKIbHxdADb z^zzmkT%11-(EnuoIwr{1|6|3iH5ZPT&$*bHRt(oE{9(!;{v3O%UvIq#txcF@b?!>b63gnuwnF_vCYo>B%n@czJo1YG3i#G<1La);#DozLo{I z9k!L9{{QBm$}`s_tG_w_{bhS#14pdA$c>fxry7px?H7x>dGm@>`%~c!8yeThHl3jMqc^T%U+t@^|7hR(2T+B)%eCW z)jUyA&z|kh&d#>9w!ZQC&a1sb9a&&;L+f+N-0( za`*1t?!G=cRaMpWtSnV+?VMJ(4I4KK%gXZb%A77=nER9GK4u;hAHROfmIIp%4m>=< zr{KYM?%X*ZX$Q{1!NIl*8WJm%DzT=AZp6fd`1(>`+S;sNU0MF6*lpX_jt)HogJsm4 z+FJkkcwSdm*YU-`Gag z^6a0nNbPu;p2dZ^ir|InaNZm7@z1LDkWsEB4cB%f z>>iQft};Q52)c?bieq$iw8-@*2bEM%!0Eq&dEdp0dwgf}xpmFu@}53bPgJ_Z#?LSIM{aU*lA`)* zBDvcxxVf$AZ+QFm)$~aF#KNDh+U6hq{XroiD{Y;WY_xmJv5*XRVq#WOMlU_3wY0V4 z@77>tG$IA6zSl-ede1l`c!YQET)ld;&Mhzg!NG9dBSSxbCa0#Zpq%@vnelv#jEvsY zHL;!Nan$ra7${lIxkXY^ujtzMwnE2nbD#McNy@V7>Y5lyn-xbNn}?^TZ^<@&&aqxS ztUQRBmr{A;wkyr56fyUsi>;b7jE>$WOmVY_!+B3LGybP%yI3?dH0a5JT`V0ngQyMNdFs88m>6?hT-=r&JF4-yfwjWFvQv_hDC)4Do^Z3CzCK-s!PU%6 zQCWF;o8d2cvgg08yyEXqLw)-6sp#^8T*yj$d;5J}*!Ysuv?ebuh&?YVN-t(=p)oD- zxY1u9uR*P(j+>Y?b-(hre{)^jviI_^Yg2i4+;u$9q-<2 zbt#xtFm;Dn@yf@$y{85m{UZdGJBQ^eDk{=XH6$$ay(4a+!z!SVggcG8caNVY$uR3E z;yiMTynKAg%a^ODJ+iVNzP*jwDkS7PIW_e&=UFGmpzZMS+369@q0f)c){CCWU|0P9 zRmeu%H&S_#hn|J6e5Cyu^2E@CU%!4`kBej2ym|A$z`)9;KO^nIadGQr{{9tKRu)8% zk`=;h^L&;r-<5OAY;{wJoclAD^7JX!^z^jH%($?YmX@WR-Iu`;8}SvmN?n2??@&vQ z<4@5uzs*F$BvaK=Q&Yo7r4AlCRPn^N_WF$*G&c?`TfKU9kMyZir%X$|pW~8`J70P+ zcD1**7CM-P6)qz=$(3*?)P@Zkx_>14RAWmTnhM)ots(ia?F)9? zx#2I8e0$C>)4a2N@A>mm!y_Y-C+m1lw?7RRcgxiYB{7)cTUJ&!9&%2kH~3thPUP8Z zwqcTM`f^{HFXNL%2A52A{h$6*LE$CG?da(B;^M54g39XH=vS{@o0yrfxpn(?a!Cna zU|=BSd;h)&+l^dPTicDIqM|2SY)_n6<~Frd8{F2`_Tkf~z&m%ikO?eLpJq~2R2=yE z^Hq5{g&4v<@y*ECswT21y|bD}UuZCr_jdjvY(M%sjNIWLMSe z*URuQr7Z5;xs&_k$(8VM=F?72RyH({3o9py(U%(mx~jXP{+7EaG9AS5hI!x6e{ z)v8qo4jtmC*ze{hO{pLYaB*?rnb9LR33FZR>FuS>Gur;U=Zu}*N;5Mvp0#VG8Mv=D zJNJK^=&RYXb?e@P2Up>)#|IkM3$uOy{#{sFdQG&rg}SF_vDRV9UAxpG1r#kE9T|~V zWMySnS{yxk^iW2uWc8P8J%OxzZ{NNRxpqy})Rgbc*CM}}84m^T88&HYX^KK6$Lq`A zzFlQg9d={SdP`f|hXvywIGCdi>gwvgnWrKlZ{508>eOigCGQZIAMbmjEiUgpcTSQj z$D*^ausC115EL9tub`mNJvz!_V`F3M#9|Ycr}Hh4fv>f-H6%3jRUjjGz;!(%qm^!M zZsfx{I{2~erIzwPqx!nF9(ssH=jP@vDk|FbcNY8Ed8|_rH~{~AEp}tHxcqnH`Sa%~ z>ZRw@6@1bP7QU6by1GnjrIwi$yV}=kTQ0f$88tiIQM~3yLt@SCZO1sDcHX+hiMVGL z78b_dw7T{~Pfb2M5085pJ$>KDhnne`nHBA4%fcmXs?&?N2VVaXbGYSPS5j^+TS7vD zQT|D0l(P@LQ{xjIZ|O9wtwrvqq?{Z5x<^ezW4)v#`?_`OoZZ~2%Khjh-3ARjJUo(o zmKLQhZThmreyxh_T9wDohtVfePn|fiGFfcL4i@Ew$<<2pl*brd@!RXaZDrPrU{F`p&* zRNcgg*qx_Duz!G7GIu=w^li_kTW()>vxTZjNJ`pIomwW?b#J?~fq{Y0rcEpK^z>w1 z2iSW1`jRs;R_)%sTPt3M8DA22(aWl`oW$?#+iN!I+})y8TUV#1rNxBr%D!ezAZq_! zZEa>0W+1Do*P*L>e*RpAkXduI^P+Z)1Wnn}qWli?lJpN#5dwE%w9k9NE`H_}$9!!ASpjaX&N|A(20iOCt*;ppSw$T1x@*hA7YjgqzO@Y0Jt7k_OK5fRCC`Jv-I z_32n{LBVTaRXk0mnc3N2VlNm{vu(^0rbO>MU4E>TSX3k%s~Lk}c@@IG-oWTaZ{erB z&s=hc?!Egcywnzb>z0s$0^bYwG4&HCHtdp?mOS%S_H<{-+P>;=|A!ABW@?^DFXMkE z?90a9+uO^=&hA$k%-Z+a!Y2^9=44%r-yWC#as+b!p7r<4uuG?hTm7-aCI>$;?%lh$ zVrx5!nsrSCzsJ(Tp9ySVgrMqnE}Qpv_ejXdR09|yo*2Z$#I~Cj9qtdihidG+;%C{? zf;e75$I8lD^6TBU^Uqi*z+7Y#HSA&a@O6R3#l`CFLJbO6?b7mJ_$(=*EazQb@KjS% z>&A*3({T7va^|9To|FHu*&r1`G34L+vt2BJlKHyv8fDV zF2Y5oM>`l@TwIndU;ftnIx>jJu3en&qhDW*_f+#eDCX3$&dM{FhOMjn{!GfQFlhP}wi#-@U2Ba9`8lRYQ00Mt5(a$p!;ozUb@&pPnCL3uOcmR3bZMrQJ7 zTH=ul7cRuNaj#b)myFw%Q<<&nww%818KiKhN_Zlv)kB`h=ylHET zqYm5IZK+RGP9%r~dv}*p+b%hmex~{a#dz`~ksBe^k%Hp+qX4Iat@)cT&GZECI{ifg zOD96%?u3rbsj2PXzyDibpDJKP+WfqC+jE!As3td1baGiPl6`uw1MSh#_r6Tjq=2!@l;8*sa9G z$AceZu6!-M6c4N{c9Bs zo03XMNT>I2ZCaJGh3R;S5y7PydYUA3B38zhmO^WJcs>A-ho&zs^bHMZQUln==L?tm zq-}A9X&2y%qZTKYPn;_j+w!%$GO;$!)=9(qyV5P2tt$A zo8O@1|LobbOihCr024KJ^@@%TvjK&p#>Q9o`mb1(=FO`k9?7@oh|wd|6iUct9!Qj1 zWr1H6p;qCludmM}punTDuznoKJ`7Cj&pOudz~(`W|fkwH<4zha ziuOr9~bC0)Y4 zdKGD#|NNan=zJ*i@zILgwF4*J5?XPbg3IK)S{fi!FTWK9U*T zS?Ks#!tR4m$wW2p`0wBTY9g=PyDrsO^)3H4G7=uOSyu$DF90u()QOc`;^x~G{uZP- ztX%c^k(uLU8`|94A5(AKU`M-edG>7A={aWU6SlUBZkK-5rG#8CKOv^5)8_env-I6P zdoBzcrF=f`;?h1J)aA8svbd)l;vR>RP6jneGEdM183&g$ywqDyl!Po3IV039L^8`ORN%uPB;Bvdv5 z0T#pyc9_8@+rpTXl=TRK+%p|=vGi-c_xFoz*r2x6>Ex+XeSobzd(NN8AK7i1YCp(% zL6z0(U%U9p9f8eGFTY0Jy>~D9(W3|yQ*=>BV=gZ(UNU{@Sy&$#x;b)g1+b0L^Ya^7 z1eLyf`{JW*LowHX6rDY6Y_(G~J^lfx~17H(4?0NA%48@bxtGj`;;=alGiW8<4h z4;wdc&U(Vx;y2uyAB+gIs|Z+?Q@YW3jbBQ3b{H)k-71Pk2xL}r+AN;r+fScxp_>~u zw+IXSEzbYeU8mrY>+JQlK7RL4G~8&S_EUD%VQXCh#6?6<_>!@*HxL|`e!bmX;M}v% z6AP7IQeygOIy3~CB!wIliX z`Bzc(clSi0X%Q}&&R&R4Ow{f2{>^Of=(w6PF7@7XPw7%|>v!Web0E&C;Z}XSA<%yX zUVqNuGuBfD4xdClCkNQqaC0{y3kAAO4!1@ErdPwm4c`fdBk32P|ITpx z&Yh=43&^>L4jf1V)8mP{88vr2;UZ__`)k<`YYv)-|9OC7R1B8I@Yu0u>EU+-R{!Gr zqo#(mkapz??emsaD12bRF4oHLQ**QBnKLZ%^70@mMd$bY@!^+|6B44pcCrQS zd6bc{*TX}0abe8I=Hr8dMy1{tv)ZnOhJu%PQnw4t$NKf_U58qj7iOpYA3Zvg)n=zV zJUr~&T}~6WPMX2-^P?(4Z zwXb!V`|J(*gW3m^)_3mh?03%~iSOdYi!ucHqy}0d;uY@Cc;h_GW@ScX=-xP6_unH-A}!e=3W7?d%m%;Yq2{f zrrXbwR`B-i+i0vSvBg$_%OUU<*u-np4OCoVv63y1%xRv>^Aj50f4@hAFe}ciwaS^O z|54s7S+0DP=9CWY$YhKSzdkxl0R<1=vC=sfb#?X39clX?Jus~Jowm!!XPOe6j}10C z&OfYpKPF55*VZjtgn+}J%MERbN={C$bDIMk9c)TtC5gk-^zOd4m8(_>J32b{{J46R z0Xxxtmjwt9nk4jdTOXK-+&|M%EZs^cFDiN!bunEtdPl>;z&P5CF#{8mtaOewnaIg2 zSOv72QnkHCZ4Fz4{THfu#P2t%hL{VePyS-NpSM0#$wI^Rr@{@|(F4}mDRY01u-j)J z63W&Rs+Z=dc(?5QjA*Qk`u8UP`P8}EEmuWmoeO@hjX?hjt%2_G%V}d1nf4HHCv~g4 z2qknl%&F6Y{ro-X$XL$r( zuJ_;bd~&WUks~vA1Q&9B`t+yuapp1|by~p^My=`PrADl;%~!|`?p(>E?;F&x!`^9O zPUWUa_|%QR15^8@_?BYB9_y?T%6g!Fd!v$J{B(~j+5y0gRdjUzPfs7+!EB?44Nd1U z&Gz2V(2)ERy_i4xDnfz|pu3MMhQ7sdPrt*pL9#tk@nQXE6TPCU!<5*tM_(9T+ zEd+{Pnw@+F-FAl%(2I+I%KE^-R$LcWWn*LeC%BJ2HV@3plWfU8?hjd^FC|i` zB3U(fe0Jz@Ex#;fIWyivmP_ZJTp;w1lHc#;3CYYNpb&zDU{x0*In#ShJojY%IyQFD zz3dzuw8$dKUG@2Q^a2squj=ZwQuUqV_joZBdFG9@kDN~Mkh6_i+^w^mfzelW&X3NE z+Qw^Hx2(KIFt^~y%k-}*kKN7yWxcASHsf-?zIv$dk}a#LPFDH%0)}k4o5AOF zier?^*;e11YTW+-NY`ndY)E@= z5VZvHpfb}i3t|_ova&KVy72bxOpYzteqfz+5)@V?Ee;>392+}cn|>8dRNea9?OF#V zuitK+9=RaX;F9scs^yBe&^Ed^?;Upgr6iTGu>LaXT6H(C?A^Akz>=|>aV zer<>nd7iZ5uWezj)R7LGEo}w1j*dg>&zv%^qCSHExqj!)3ZU^4RLTmrZj~lg*=X>- zpcDX03hRpR>@d5E>S_hdWCUJ9zx}jBOkbJ9nK#zpUU_(U$^kk}o}H;GI@dSes3EBM z`Dyg+PfKH9shB9|$pJllF`D$UOJO0YEFD(!JDW z&#qkC!Ms1FCp9u@uljhdgF;(@Xn}qA_~hhkba97|AK%)Pd}Iw-dhD9C($41CnBPAd zR7G#g3=XtPtV>oCxp*@EmqN^;1mSDD&vu6W{r$scerAG4$y*jXC~#aTG9X|XHRUfx zGgTH1hNBlmBG1l~OrF!jp2uE`N@xLyU8LFLF1j?PPe%wAVlTYpH}3t2PTaRH(Z5qMAlQ+4h!Bq@EJ$Hx3p zdPyGPo0QYxz3$9gsdofczxw?7*j82ToohaPpqiVh&D`BNWpwn5jHef$FKTfFGf&ex z4pa&sIp)8Px+LaS$7>m~`dZG7rGtW}@9hYRHk)JQRpF&)0k9~U9n8YB7lQ)O{=|N* zTJ!y$ONt5#NjW*;F)=)`KhauK)Y-FRM?bfGyy2EX1tQs@S~Fc^`NrrPcM{b zY5JL2mFt$#`oz=ltj&5VQ{5J7oT;25`N^<3kA31lUI0OQ|KjyyQJphWYb4D_Qy9Z# zd~W^tZU6fh=@Xh;TC68}t3?0$qHL;LSqUFHbSPnuMP-!o@87=z?fd)tJ?2K9-MD)< zOg~L$Ra0d}g@jALR>|Z?&58oZTI$J}px4WnrjqR(jM4Swop{Ru@W?Lya*|_lrjM0S zbDbp@V|JcmL8>KP7P=1F^s>I!ot@@I4@7Ps3Zy0Ddd4c z1?+k>+#y%5R-p4eY-AMj`nB4I&6^pABErL~pyUQ=A1ZjqPy_3c_omb?X>cc zZ@<{G3&W3=;uHlXe&id5DZXvgVqA)~@hj2wv>Ef(oUh+6*d|&s^zC_Jf1Z_?8<@S1 z&CL%`CJOCeoO*vZ*}f@tl`4(6S@EqM7NuY9N>4HOn1Y-_10a9~s4-63(GD%!{_QC6?*4h?>b={;DfqxuEf$D5$Fn+v_xRE4F0k zly!dp^|?DKBcpW-r_8gkC#FTtG(L0fUC@TEHKpmgXz0ObLK(DGoj}7U>ovW7wDaY) z%L}tTAbt#N_hjG8f;6JMIKfJSl%%X+X1qbgpfl}LWhEU5)|xjr)=OGdEL*l>#XHyL z6HMvKSs;V`#>$oix-QR&p;~WIkV%lNHkwQORZi1vAqPDA3M%cn!RD=mCIKctJFUaf z@)s&DD`X%dhX7N9TF*V*D)n68K9SEB4tJ=2iYM$88h3is3+d8@X%m1iIzjJonof^C z=GgaFvwv$sI6+DtPh6U(M=9A4o)@Vr^H!b*ybTXNN?PJlFC7QZF*a!0x@YX#3@JBW z#;F3m@=Da0?MAuOwxii9kjo9t*6H6zUo(#sA?qc*#_Y2}ncZ;1_0bSgNQtpKd#$+lSb>xPs79_n{{zGSc_k#|XX7 zB&bxy8nWFhaEPD2!$G8<9kE(A0cMo|tga1S zSLF3)2gFH9WF6xCFgG`^pzN|Qy{)aS1hwW2ZHx%U05PDaDgjF*Y~OLB_NEuB;W4~x zl%%VPI@4Jaint{p0!Ysv&9L{SOGG0HrSdRSD%19K3;zt|bXkpkI2>B$ogl}l_t+nzjazcBT+fNPt$xW=JF450Y0CnQ9G1NfJgN-l8!KCQ~aYAZ8S)9#)g z;k*3MReMd2VGX5!RI%`BXTZ6HcW&TVg>D2C`7*qdn3&eDr^EArkB*ty$k@1|rG*RO z6>PMfOWj?1=T3i=>G7APrI+I)=b-Y2z(Dow+czQb(dfZpSyDZ7W(V0JAVG)_uc&Bt za(Eqtd$2L9iGb|v?3Z{_5~jMtJy#7}|7`wzo8q_tMod5fx<**&e9Er68A zkFULY_3B~lKKK9>F3TFz78j~#5^fmUzUxTa8gi?xT$iht!*j8wx4iL@*xlt}zv#G1QU?#ghmqG( zRBz)A6T|-pUcmopui^jk`mVc|4S1=sv2R9fW|k%Pig5s)hQ|HID;CGp<;I7&d!hjLPE6BeHCpW$62_vkg}<3xF&+OU4|}jxo;HXcvp&VL2+r5y$(yR zbKb8**yPm-<)>uj@+DUfmQlWx_pgoPe|P)NsdO7WIHXB#)VimlQ*E_(q4j&)L^HK%N11CQje}!*stj&}iBDE8_|c~F zF9)AAc~0qRi{WiXtMSdZOqTf^xbWl)t8RmCS3z6cthjw)uLEwSI>8TL{M;X|@v*U?vPdQ7fHB8XLG`-U*^4xmHC#g5@)t*M zxugv?+?+37vqjY4LqX@fUf{ToUgh#iOyNLjz}i|35Wv{$H6sBOiV= zpU+!e-hbGyqcel4YDWY9d`L34Mm5VQr>ptgf6qnLJDnXAKZC@(zi)TtI9 z=?@=iJ*Vtn6cane6np(dsS)7UZz^C4y6Qr zR35ZGl_qh*Q0|wa$R6q&y%5K;Mq0YO)~2m=6Mn8mBkNqSTYQdA`eSudc$nYiQ74Ok zE=A!|yt`SG;zNgbX|qe5q)mEXwgYeAU+r_HaJPel@0d|*t?0+NS(b<7d(v0o`oGq$ z_d34+G|dT+U^n2m92&Igs3x1FQU`nL; z?P6ldX@73jJR-TYVcL3m1dujlFSreuNpU`SaIdlPIw>hB81jUdg=3kl)&d&F#KwY6 zVuHvmC0OUPkOb>NP(p$LayXF92Vj7-gxJGRgLZC2&kXWT6{`scCVH$bt6?J4{rmT? z2XqGp28I(YsHu#3Mof&1j3HIlpvv#VgGz|Pf4j!4tX`ec#fmK${$S+8%Aj*l16)7} z#y^BaiHp06rL!s}wn)J{EiEkroiF7{@v5t{w6|Xcy9P|fm7u-?O;U_;J7mc(T#$hP z5;!J^s!Qx|4QE%X23_YOC%XD<5vU z$Zd!VICHCaN6|SttR6*~n3znCv>%(XD8L=U$!G;{o11{w12c$pzG@;=0(U=cb=6!(9e zTwsL2-Smu%FeCO1qw7$({$?mS12w@f(gPGvI6C04q~v58fMfu9KFFOlU_>G4vI0#R z-g(z{z}|i;K{P0&4TJ<91R`p3w1XGA#X7DXrYrM| zvIl?RIqz>QE@ww0Kzzh$I`{VB3$k-^27EU63fHyBzpxdiPx%YOkc0s{N5c1AnEJyA@JT0C7r3u8`J2zIQ zp{BMByC4t32Rr~7#R@3h%?aC_i8^)GXO5SM7l7#C5V&e01%u%*c`|6D)dLcRbfOzJ zZR&+@gL`_cD-sstKJ?3*0j~|s1Z=|G4xP6+(h5J*(QG3cXjrFPpDc%N@$ON0o{S!P zDnhkE)ANO7d|~(t4a~}h(N#P)_YVG!HbA|QxcKYDcH@GT=;TSi7R=m|;rjFAa?++- z+t{Gs1c8_62EA?Ib{t{RWy?B8Y+9$lMVwSuIzRwju(;C&mX-P{yKnn8A3fZPM}y8I$Q|R8(Lhgds48 z%xDRUii_`qpb^b}ndpF4s$VO`xOQQaZ8+4zF3MF&;i!WB+66_TC zng1qVKHt}VRuks2nHuFq8klVB;&-#csyFkwZ1LgX6O{5w$6q%Y*oC)jSy@$86%rO^ zaPbS}i{7&wbp(q;lt=6u(vgvo2ow|#Fk+ytlLw{R1JL`zHYee;=uMbBtPe>Xn{*Sx zkZ8LhFEco1!5R&oQx*3~c%T~x0*LJp7F=`^l<)tpQ(iyxkipU9_R05mL%X{zy?@v5 z{!-`|4c##;FCsE77c&_jKYU1n$34~jXa=?;@<>!&0oXteYW7={u7SaA2Nd?3NY>*n zctBG>n}Si*Auj6(I|T#;TnD)|?t-KV6ZEb)Fd3252RPR_Kc4ZLXfZi^BQ$i?nl)=O zia8OVZ_Y?x4C=ckURn-fq5J30)~7!;$b?OJ>PzsxlrMV7XKs5$k)1X+l_i1dkCArd z3OQgkCxXrzIDq}~=*NeQ>R~*McBSv-W;)XnFGH}9gRfWn(?f}Bqu`bS{a!p<(j*gl z$gsId1THCxl9zv>{`mHPpV--8%0Layslp*yUR}KcZ6fAk^2Uu}d?DfEU`M%+9v!-D zk;@O3AXY&Z=pR_?H)eDB)B9oR%^y*Aock}9Os%49iBs?SlFtAm;Kh`OL(RLE;ic(v z@P0c_)|JE0kOv!sA!!ZxKU*|h#Qpzc7twpQHoE^fW>id%WaQ*L%+OEcpyWKplj=%1 zLIXBw$EiVANr7E4Dl2Q-)M!UM@KR`q-PGVGP7aQJpwbH*KkxX6M0+PEJv~V;MZFQV zEh9JgI+3fTBqWkxOkK^c2S4jYPtTk9M!8xiPi~qT`Wy+_I3&dG$NPJ5ueD5oZU8G99=hiC+?)?fcN7pF3<8k&>3)h$0y4biv(yGc`H%xJ)U3q5rA) z=FPzsm6c$mu7P#iqM&dWf7`00l#r?wyN?>kdR)rU1{d`i*MkqG=gJgYk^9|7+6+J0 zA_6onWa)LwdQNVkNdoC$$l1IdFbm6jAE7@BrQ&UCYitk;{~_Fdc>mPz-%+cCnXMd< zhzXMnaChtab)k|{; zhSL@aBkM&#f^$JMepeR_*m^8`;19tN&%Zk0+xFa=g$YK|b>Q&EL<@U@ zN+*9d(Fe2eS0LKXK>&l>!2D#w|8f!XBPG&Ox9;2_ip~~s@!-_dO+WzMLqpecOrBX2 z^>831l4|aXh2i+>GgII4{ZN^l-ezhNYS#e~=uEQc8%u z3U4AC0a$`GiO*R$h*bD*@QkugCe2ddSH!pL9Px_l-!Vkxv@ea+<8ukJGK>bN!f%{X z-hvRt^qr-#lS{`fnN< zq4oYFxvjJZl%gP|p8wot&=vGA6JHTA@jZI!2UG&T{G#c|vkP-^48}g6;ug9Rh%+84 zBvzm}QxkcSCFiYf1n9qBGF1a7b6au359`yX!{9H&QzPXdX>(AZeNp^BqhEKtF#3f# zEe1#hq)xH(@?L{;Q&>sKoTq#UFiWad+S^%9R<G$@}1yU=mc803{{;j^G8&sgm` z@TeF6Hu&5J^NH!Z)c@Q! zm;?_FI#_w4vD&w9AEBiXCn?CEGg#MiFng020QWmSKJE*i5s>dh+q?Su<&>4HDT*WP zX>aRP)#@W;2Zx855R*VkMkhNl&D4h_uWwmAVX~p?iMJjEP$LNcOMHNsSXVl?b9+-`?prN$;ck@~s0`8q}}?d|M7z@!uK6DrJl zig>CSR;^0rm%nfwhEmiCl3rj(V{i{-V<)p)sEjIVYTJ%I+CaJf`gX8q3aUZ^O4(M| zH}DmP6r1NFGsi`U2jcXw0(g8AB9$V;ATXyc$Pwh`i5~5WhvJepF2l%_~ zk=`qc6Ak6r^^oh)jzxus*YEt(+SC?(YAz%M;cF}Rih~^~k)4{I>5B}sXXZZ$q2uxO zg~tv^bL(LRii0*&w+PCqMI?Oe$i*Yx-U|5U|J2ToWtq;?!^h*4F3HirybZKf?EUx2 zxTk}IDDu>8ko4NIQh_4t*Ju38R~Kl@#LOJ{ViT|vabQE*(omisr^~S@O8~w+fM!U| zz~{vXoP`=EPo6A*+rb#)l`k;_ASHMmH~DRF@DO!iJ699@=JwDYn=$EU4CA0vNAd0d zVwl@*Vrshm>w89DG;9ZtJurk{rvb)YVQ6k?EZwd%P#HzXV$tn z;(NyHmifY~xfQNLshvA*Q{h*Ye!*Nn;$ui$@NPdp24ahK?ij>Q(&@glt}(yiEk<7~ z-`(0u#0Qx(UqjqGFKRr}@gF$|BN8sz^X=P)$wVO$?879?&xMADf&#YtHHv4+@D-wv zj*gC$?$^^QYQ%*~iZM7-AlQnwHsgL8^M;$~%0MM!Bysni0b~8bZAV<%(^lrRE;(%l z<%})0iG@$rm+a?S@v>p(8aXf`Fhn!+QBYU_E-ftKydjR;%Zq=(_sKoo?-y1Wik#X9 zA6!srsnX@Y-?>ZRu*lpI3fLLdetzMPHrQo2KqUcbfr(cE1e2+Zik!$WHv{Zd9y!-7 zM2dm**@KAVlL2qEDq+Yw549IFG9id~q81?25hF3=;Oy*K9(`GneL(f7PYlGfTxCt{ zB-q7hHq2#z71ARY)6-FWo7l{sS~fxU0E9N-v0>j1$OMGPoL&A+-xJZ zPYn~je5CC``B&A{WJHTn1)nyJySuw#bPbPYOKf_xG%ozyNV&u2tnY3_+C* z4UysvXu4~X+R7)6;U?fdQFC?Og{VcVDyGm^`SBwM9X-oGqy+{J5yp6Qzk{{uH{U)) zs1&$&iQbx*msbR%FeoGdC(`T?Y6Q|D954Y+09PF3&_R3eUXrS{9e9Af&)pt|k)7Bk3g8s$e{EOv+0gh;K7`Y~$ zBR0uESD7+liV)8zh#_NJkXqg+FVIJ%f&l17{o6;`&rr2*-cS^HNFpO)2G<$Y5zQU^ zzJ7$A0>nr96z#n7J`LUCzqqMN;L{u6(@^Rd%i&qB^YVQt%}?@ zP-Q|ypo4NJyFKCnERlTP&5Ik0+z{HhaXDrhE4(4=3}8|S+a`d`+RBOs;2pFE_ArLV zRRD4WO`0yl6fKN|1aXYaXyb$cWX~H|FN`KWcx12Txk5%Nhr>d?EZ=ob@=m(s)1s64o_{jq&r4S)wr+?& zV?BDN*L?MAX-W0n>u#&rjQK9tQ#tJ`w7)Hc(~oAw%;KU@o!pfWx!|?k3knSi7@~7| z?{#ufRy=K*NUqnGv+LC~l`?3!h;G|P=rJ&f^Og!mgvue(wDF zD=%Lv0^G)5GBPoNpM@4KbWh`tsU0B6P`l75s$)15Re4v#m=A(ULx20NLmQhN3Qx*G z7jwq@krQFQxQgD>{!ly-P8AgqE7dlRAt3|i{AtbwYS7hMd?pS(1ND^Y&Wo{1!F5fM*=?R>g;(II^$lxKWz z1~_c6&B;ZOY~w`8Qf!5Uy5@LoZ7r{MK2+L$E3-4RRPJg;be-5FAua86o;&j1y?g!7 zb8^JKo!=wpHuzv|nU$j^I3i-m1FiYx%a`)^?^z%>e&yJ!rk3LuSeaCxNE60D*Z=at z*aq}>x+0i_4rX_&YyZg<{f+_e?=BCv{4!-Ut)WaAKe*5MDEvAR5aeDz6%+9qqz5 zVUhbRq4)rQ$7nzI&Sn7_mmL!4L@k?Nk8%5f@k3um~tuCg{s!DV;$;wn7ADe zMBB2*PXG0oPr$S#_c6;(%^bntkdX914<-$h`-=+(Er$$imGzB{m!4$~Dpxu<4hjxB zbl9#J5ph_7g*x}0W87yc-ABNUFXZdQc%Q_5-Ihp3iuW_k^F33i((cL~ExUc9@|eoG z8@DnL9~31eJldtCyTWFX$yhNNn)GLNV5+c16|t<@NZQHWtSs5?p-)E3d!#ULKR1s<~gA zS>mMW&?&tBBMlde>dsAk>3X{b&e$-{EHAkH&t)uoBz7&(Q`0PMm7M1-zb-2eQRZf6 zFVr^mU%M`rX(j*TmnQqo^nFyeA~txdDy%}PBbqvMdV3ire>Ga*3img^#t%LJB76rE zYrmJztX$|9M)KH)+ZLU)r=D~*!0YF}j=Zv>!YaL@nof#R^rA6SoVte-N(Ms5`<;R^ zU7}~rw%Jrn-3uT;nwXyCVB6OX5P(_#R{*2QM>0rfhw1~%pF_gumX>`Fk0d{Na%AW? znt;PupLk5NUoYQg!ufU$QM=w=+U-8noUs~(7gKvIC`QPUGM;B_ZI`3rHadR1u>TlZ zE7!*xxFWbRv$J2LHNOrC0ofkoQ6i{QMB#ve5j0U@g7Sdl?b`2PtAj8b&dIQxlVN{~ zl;z2jD{$Q{LPF{=Tu z+Q8T6JBcncILNTx{5KMqYj9x7Ui4!)rw1H9GuR0_qQ_}!s$!f8MaOw=+Nr*XA&?fs zjj-;VEucN?0kB?yx_(d2jX1^tp)BFvxai{U|H%&!k=#U4kx{3Z#VjO+)Z+!VY1qy=vY)S&;Hc!IPxMY-<57B&0n5s1+zCbabgJwseN_x;@( za$i7^IMRoX0zz;+`UGFb*~LW__^$9NRq$-h8C05+j5_45U0g^3#ng^AO;&n3b+~MK zD(s4&_tncTFAy{X-2SSzR`b`s{c37XN9K0$p~m4A`=Ko1^T@eBAaYj<;|zvCSn}+T z-eO*Q>2>kqD|9|xjm$@2ZBF$jcZA~{zbuH50_6B1Kzrx@y0z(_ z9ALr|fpd+hO+e^Yr%z{->pn0EvXI3{Hrv{@p|cJ(iRA95j(Tz`HzIkE6W+#I5_T)d8nyP z&M;*;!q6x!VJQt`VY}QJe>W{ zW$c(zoQVi__T?0pPNEVsM#$?Dl?B0@{kR%PQ8+xL8nAt$es>o+bP4uP1u~`$t;?jV z5&OaR=H!KORS4}*&vcLm6%ATtV^B%Jys!jpVpYJjE{JGKe#RX;z0_;Or z!*MPFDe>EnA4Bp2?CjDhhK%Ic7BrdupsJH$q$3T=<%OwZu%SLZ$>h)n2uO}*Ad(s= zHxlZ=)ZyZ#Gy8^CxT~q1kTuS6CMHabAytDbCnrZBprSw5C2baodMkl*Jjlbv*;f@H zrX!M7gE6hINfu&2=_YpsHXu3O2~V{OW4@8t8kU%9JJN7Rjt#ijd;AqWvH78k!)O>e zh38TYlE2phW7%~&PG&exr1Wn;Z??%Z78sn5yuT@zOGG$4Gak&TgYBMx&Ge@{2Rr+M z&J(ZDtWOSPHjSKRg0spdn)P)LN^cWkCiA>F(S+EjF(&QE_S`(Q-n}0 z6RQfa@EVaOf+jiU3KP>0V)kDH+XqFMIgatbD&g+l-Yc-lqGQ!K`+Srey)RLaF~tT7 zhU7fZ*}?(7=t|y?i61$9*cZ>)8pF?Iz6Hxm9tgr!7&Csr!X$>tc+kIwnbgvLM<1#D zJ_dMBbP&i^>yRgBBlfE`-&k|tiRO1OnExC(1=4jLI?!9zTw+H|O~d@?=zGy5kYlM5 zJO{V_bC$=GCl#;@PuJ^GU}yVyt||4k9+PCaITVlfXTht2vxP_`Fs~h?tcfS7hy;k~^3yM-NQZERi^cD{=XXsL2gJqq-WQFpC_f!v> zSu%+Qg*Osx!Js?~yPn3wxozR*m;yi>?g9PIP4TA&7cVa(EUP(BXsFs~@w2D)#7PVlsOZ1j>guxfT5)EW=@V6N<8Yj(V(vY$UqI!M+JjSa z;(R!eBnWaYhEd41TR40H-Ys1@A~~hTZ!rSQm#Gvqln|iRD&c^`83v@BShqiQx}TnYfC$lqbDW?5 z-LP+^aOq4hqZP~qASPbl5ix*H!fYKB;b~l4)S996L$u#9qlq@sd={%gHaCLEEj*+7E^_cycwjWcuEwZ2nd%s6p zw3Kw_pNd2|vRUL%W&Qz6_I-g?cSKH*}R^?#V^ zyi%Cd7B%p_*UrnFn3|YqTsMZtFDA-YFQ)3|R)}oC24?Nv^XpNHk(m8n90FL-oW4rLiE zjn%JjZ{aE`$K6W8eV+4k2mB1E<$~^$pnUzf-?_G+GLX2`F~dN#W(q6vT{Uf6A^0@PH!UqKAqo%DR8CnGvu};$_(mAQ zmSMinOm{I4ln6QOkDTBMz4R)X#UR=-MhVVM4H{D6$BN#+e^2?sU6KB2P@VqpG|na} z_c?k}rO!rS-Hr=)fLg&yQRO(8u6tnM%V~3{a9a1|ru@csyPd8|`F8s1jmF9sr!?>M zplrV;`M7Rp13`3{rnnLn)ufsx_7FoFYjBPRjx-B4cfqZmkn5@-;w6D5WOqN>yzoW| z*eH(^9y0nrwdnl45;od7#C9Z06A69!2ze{ zup;46)DF|44|XLus!6Hhi1f(8^G^*l?^t1wg*;Q>k7IyMR!~3Vj-;{Tz@8ao*^7mG zA|i@S7kd!UvNRP2IAWRt(nq;5<+vh%rNC_SE+=QR0WDurkmq$JpXR! zc{~!96b@+vgPJ4Fj6^~4D0vs1{Ib9ujp=IA!eCmO2~QI~#6DPY;#=141gtlCdb+WM zYoCfj^+P>@jX(N4zewGRjwXHqxbAA8G)4d$qTkSR*%YQkW=U{%*Q?&DYg2dpK<*S@ zY$vc06}M!(f)Us{iWE%P+aOcR$T_)S#}kq?h-vK=AbJ}VA@l>U3+$W7U?h}WuB@Xu z6-eSe@YFz{UJuXx5X%FsTQy!IasJzZ`dqk@U>I6&LsE&J7lW zbDn>3`dOL%)nhmd3H<8AXJ(?9jj6;;e;$U|2o&B(N8nCor5<+8HXP};1@8Y%u*yA% z)5hn;ZA4-hUBSd7)ZdUOPH<@>%y5zp&Ho#BZywEM`}PZeQ)wbfqfixGD{gkLW3dub9CRo{k+fn*WPRGcdfnN`=5JN ze242guk$>P&vb0M6%p}xWy*sG%BYca&+)0l6t0Y-{__-e>S1K=P=X_=q_$eO%Fy+z zut-y!I}Fjz0XP?~`EYE!h8^Y_{QA1^Lhn5#hbX;cxO}0%?fPo>oGUKDPf&z{*bpT? z+ykRgBZ_norC+~(&1D>efNU)_RgDTlLy>)dBE)84)w}?^JcWy;f z^=88!;WMoiNr$Tc&6_uc*a+bd;;VZU3YDu+R!)x6Tz3RWELpZJ8a-qWj^lu?FP}as zBp!;!I>v6|+j=B)`*k!%j2d11HKxBGEjxURmw(^s;!@MNU3H@3WXGIQ1a=2&zf;P!eU zE`=%ImqsqXO)G?61qtcbM{ir(6zcub7N6Exwf70SaXL!Kpo2~7C3cZfZh%;Qy?=}Z zex^NnQV90f4b9&YTDy=ME?T~PWA5C9dV_;jWryNfp8U%`!4VrWz36i zxm#rHV`YusBd}yXM0OnofBFk-aBkIy=AEdu6#p}p;@SagATg1sHj13ir$?jfBKtj6 zEWR+<@owFkT2oX7q-uJ7TkKhR-dUtKfT@bYC|xJJR?}*-!x9lcuDQwqqzfGZs4(V0 z-s1;(-#cSrF|;|py9?C2UC>jb1Ho}Bs`J>u2bq3ta5lZfV~tx|(`1{#x=67dZ78{Y zvF5Kr*h{)cJg9=Jl$Dt^tW~Yg_tnm$TqH<9$?r*dx^VX>fcMIWk6I=3O1vNZJ#5p^ zp|uYU`NMNh-96UxPMkyly+U(qcPv`8@~%!>?DsX68Jv_>MB*r_+Q5>KmDH>%qQdz* zw>#kGf0@NP^cjMjb_~4H}-cjpDlqllIn?;+)G%wBXm~=N#zsUP4Sn zZ9kqk;_47T=?=?e{_%Hk42%gNnd~w+$Szzhtid8O9m1N1D#&LJ2gjleHg7|zK?fu< zQBQ}m{RN&SUQd+YjAB1-V)~AKcw&O;q}E}tr3zFlc)93{(4P}8goMdr#Bg258^45) zwr#7=)!ms*IvrVuA>&4;?28JK-j|fPIK+|a?19K1Y!@tONO};p;qaozM=x0g5@ccm zmoLA9)C78<&OYaYJ#8*4D;W`?TO&E8a|!V0-t?B2wgsq=5FI-o4{H&$oAO@?gOOY4o_C)e}5eH^aky z@tzOj;?_z_uS7eDs8U62SB%2eRvz4jE6DY`eEBj$w{OmAeeHMk>h>Ey^rc82;DP!C zjS#RZN+VTKVa8L(C-3{`$xVoeUshDG{sWqMz~&VZq_`dJBiX|Kh0O5QsFdif z!LC6zhR@2x0J#(cS6*nc3a%(P)9#%S*c0#gX-o0oCsooYBcKQ?SIjjHaW3F3E3!cM z{fjb+&wl;l#m;^*$bq~h1`@lkb;-v6N|@awDEJzGl(ZFd;FLD#gdZs~llPM>^9;0$f4Ha&W}x*Hoa?lpaGUj^H*_!hRdDD3kc96>uM%Wz0c z=YQHZ{YFn>+&!ToN{whX#c>Qr?L*s4c;nm+qRVHRbr#^ud;v6x-)zHEu^g6i}40?8iZ#Kq1xM-cF8``J; z9GI5rlVX3~)lp)i9QkPVa)!j?nP<=SRcT1uKXTdp);qPxqyK-9ryPnsw#j93p_HqR(}#>Qw`AG&z8{e$qAQ;m^Hw*c*#Er` z`RkwOb5su*?3g)h>wD!(cda}p+6mcQy)9sVZY{J4x)wEerO{Eo(Br3BSXRvo4$0Ku z`t=x)#c5T%J{5MO4>Ja7Jc(r8Hx# zWSWbYeOq8Y_4j28Uz(VYvoXGMr(fa!RG2l-ZIP=mIKr?j=51o4E7`XjIb~kUj{D=L zg(WI+&FdArFL!*Neo@iVp6-|edWHR0@t0%YXEf*3$_JIX4=)<8z;YS&#K+d|dCxde z5E;HWZb*!N($njerkC%W6AZ^6OxccoJ6OTSa&%ODWYPX2JeH$V?Aia9pylWq=(SG( z;f==XUjrFBU09~Q&`Ci1dLMd5c+SvBGZ@&)b|%;7ew#Iurq|a#XTli? z50md_3#cZ5XffQtlY?P`EgL)r@k`i~l!Sv`fgy*o0Ip~cpk}YzX5lv71$V^hBu1_ML` zcr{L6eJ!oaP?FE()if|*$yR*jY_@nGr?}aRk9AiHsoi*9RrqT8Q!>)FT1}7b9xu&FED!tYakrpj`*CAG!At^oN#~!JrBrF_Rz% zwt@`<6LP=K-vdWZ_|_XQ$(jy!svR8<{Ae%Gtw-r3)jU6Ul8jdOt^x6w~aC3a*(C_}k36sd!sLNn`!cfyh>H9gtzb9bjqkL+@pal|?SPyGhia2TV6=h^^=7QeuZyF+XULP~r@U1Az{TpJ($WN3VJo~_Ph@7aSJW}8y zO9E1$3da!9b0o`#_tK?Hqul;i6JjoYf641vh(PKmaBdhBxNze_AIY}khb!atX7$@U zH$ksSVQU0d6XT6;0hzYGZf*=`RXkCfZu3m!D)P>PG7_`TyP;p5Wseq zRdfYvcX~-UL@7ECk1vR@W1!#A8rM0VX4`fNfkUKr4O$>2MUIkB_Pr z;=5Z5CGoG3$mtu9`(rEsG0TW{4aq-_cUJ#?_r@J`2FS_=Y}N%tN|3YmG1+^G-X-_} z{yo52+($1B&rVsSr2Igs7*4exA1iz{;r~MesK^&U_sLN{Rs@eQ7Lf8kmQmZ@cN?%% zE6pYSYj_*?GpJ4}ZxV3M6NG11e7*pt4IS`($OfrPMd&HLBCnFS%y$`VUS0?L40Q%2JXd8!<%L56Z3duV1-(_gv0KptMk}n{9l17JMLz9^reGm9j3Vu2JXELlj zV~jn|4Hn{kD?~F-f()dgBEyKEqrCdR?3l|{GZ2dUZ%&BXA_eoa%KPg;!+l7cV6=SM zviT5F@CLknjZMp5)L%&d*;Rnj=0-_}1b~*dnCButcLC!VJV*XwQy`cPHZ7Tt+?To@ zS+refCn-*iNA{Oe?vJKZ(Xd8-d4Fa<;YS^vooiuEALaJCnjo81`*oS$e!1VX2y}qe zKriu6`aLY=db#sZwjdO6rs7<(gl+umZ-pybETy8nT*R)YTBYl4x6t+_DrH#R!ypjb zX?y}46P$V0kW7FYW`gGB;wKBqFW~!-cp9z|-^fF`t}xG(z|{8l{S7Y|cc3RMLBVW)X>7#BW=oaD)pp+^g#)8mUR z24?sFjBlDAnw~;!UdM~R8IZpmJP;|mpCM|k?M0G2^IZfwz~^6oRzhjL{``zEJ(lA5`}|26RF3OEa_5@1b!=6JE!; z3~Bg`t9Syg!kVc8o8^4QG3@8ZkQd41h9hYiNJ0d-s?iNuvUI5r@$V?;t|RtRcP=lA z8+SM(mw=Dvz+4HUwg7(-e|K$90N*@DXP3WxeR(F-u{FYhz!gw8^8%q-gVMq)B_#!l z+jwl9ixB|8$qS*6tp^%1Gf3J#CDx!gL_C*b?z)toe zcFr<7ra{!fuPQ#1lCNV>SS$faixNRiW_of2TpB3DU5JeV9R~k_rH;AcT+F@@KXCZ) z#{bEp^~(Mii)P_n5xkYKWpiH#;N#1d`T@^NCF-mnJiUd^8!$|Z8Ok^<^>cHD-sU18 zYlZ?YnPoAeYtu>hlIwz7I*U=^u-=nArJZ>{Ti@pnVtYo}usf}+`SwNepWJhY+uKSs zFa7!bg~I0BP(3wy%vt@a#^y=`ij{u5>(_)=u3AN+Uwj)R1*^i|0<2VowD=abl2KkQEIb!G%x9 z<*<9{-Fe>eqyOh%+%VSC*JF-1=_g>jX1Jjw-8pwgpjzz3f<#l754k))xEcGV<-F|% z2*HX1WH#=%Q@K`H#-^eH%sct|>A*+g^!v~dy>iHqv0k0qC-x=h!tQimCuvpks1tPE z3^rNTx;H%?%TMmxvu6f_=4pYA^=&P%@4ss%gZI-NmfNkqO){_o%6Pz16&mu$d!ub1 zvI)vEOj0F{sWl4EKGefX3B?qdW{j2Og z-1*b;2!CHEvmLC43^znZi8&4d;Q_O&iXv4L&jpscS^Ngin=&Jy-XP;=Cc2zdGKq=3 z9Q)WV{BkhvA$<+{E5ueBy(6OYd{pC0N@OPcDVRj)1uc^I3a#~YWAD5rF9`w@nk2Bv zdZ)6q5@#`z(-e7v5ciJCbvUzNiWTLH-Uu1!8SNMq2G;9ofy2FtZD*RZ4%{wh-N1*+ z70+Yw(LdjpCm(cM{Us+4yTnW-`%iBcU78#&`GtTq;A$yDQg|p7)4Y(pu>w>VO(#OX z%<@_OJ*;VX@?oD$Zye^-NJYz2%W@8x3Iu|~{EW;m3vVpwRoFIO0o4_M1+6&e(q!-V z+aal5Eme-j4_E3nsvhF0CSl0>kZ!?&S}s=F$fU0}k!;g82pyd4-S7G?l!rkMcnXpQ zpP+Z|c}FPsPaanqT$Z7i{5;$ImFc@K^`zlXe;KQL&_TZ2e!Q#o z9&9B<%iqA*h{^6Pu8Um9-$%ZNA}HCu^y@28+CBa*V@V;QeY7#7uQFt?Pmjn?uY=+T zmE=wjK_<*I?yd;|$seVDmMEQLUduGwqBjoaa3ynK@Bt6p3brh&`s9C{ZiTNua)Te4@}@Tp1cDe)L(pR zB4cz%br7&kBEG{Ut&35oQ8aLP+pL>c6Fk%{Z95o!DN?^-N;kpvrIrGkky9R7QLAdY zwj&JzwuO8dp*(7S#0EsY|GY*0i&p$UKI zBD4qIkuKwjjV(t2%zWZWvSEzr@1RgzIFBb0HQDghC`8WLG3LFb&uC(HHYc`TRnS1h z8{y(k!rn~Lp71vPZ90@LJUA{D3T62Qy43Ic-v68%>y!uKgZ``pUY(e)s2y;?M{$tvk5@R9s4rO80lBWqIjXJ z0QF(8Rr5M|mZ&YjS#Aqi7Y53dBjX(x@9Nk#%k>%(; z-|g?nItqG}BC0_e(Jvsv2j6rTM%!RVJ;!h=5VeI9itJXAh}JboBqMIcn0tq&BK5O6lb9zO?VBW|@KJ_k;vIT?Da&{ZQGXF2ePP*ptM zza!5eE8ox;ixmP03m(W#P-b31t^(RNYIG?R2Fo~Chk4O~kEX$1T`mY+Ak#Gt`hRg7 zJe50>b;!{3uSpGy7p!jwMw+6?C)8!f_NYJkf&`wR6Q#UsVt&x%qh)|R+5>q;fGNW;BA}|svkEYSrDnB=-9+(e}ejLw}yra!UR0oF_}aK1iskp2k5S8lqrOL z2#QEdTNSW~!hFD(A)S^s5iB{_&1>!~AOQw0aNQk6=uG#$1%aIt5#$ERME&^%B_60q zfFPaXVcndEJz=f9{LyU@uvg(_tCRI5F$*CYTP(q6|Ke(YO>kcpx;~=>C(>_6MzZ1N z<9*R0c0v3WdKMXkthnS15b8aMqk!mnp0%|#$z%_TV!fN382zw3a|2NAq^YHTpYZ{b zr(bS^(+fxteFS8yBhLsmQ1$o?M7jV_1Um&{h|&fDZUPys@Aoc1fdIL5K*Zgrsn9Xt zF(t8oLIOpJgckgi+XBDpJ^qa^}d zLI+?Sz=;5)lwvcbrKN$ChE9JQGTbBiC}H*JQY4o^=*)zc1F{o}qC$C)QTg~uM#dSt zkOA-EA#I>i*wT|t&_9MMqM)Kz1WASO_ZQsNkr!*rGkuFMLe@LDy8a1wLK8d-_BS*J zFWHkK9)c*o=)f75%(tTS^^0Y1h{*B;kbY6$gyepLGYEaPR z7zsxC-HiX{p~@IM30A_+O<$^MJ_ko(P2!lm`akT#8J}T}NrV00|Gv=c49&2$6I1?= z0_mSePyBZtFCz9Gk3kMg?nvB^Cn4wDeGZNVz`N8VC&)G69zIhJZCnt+(#Kt@w)yku$CFb* zGxR6M!;-~szIB_uz&+n3Im{p5Zg|76RjT*PjBV_z8!lWh(wK^I_nBAyDrxNOU)IJU zamBTp9b=}^(#6GvPj0z|TqP>ca`OiF zoZ5Q1U(O58wI|-MF9Y-PkEcnK-PojY)afiH|8d>itS8AqR{=Jt#m~7`aMar+CM3=% zzHw>_M6>dCqJWA$XNva~zdCbzMuA&>6}=4cMRC)h<###-D=xed##k}@1xw_a&nXe5 zbpbP?x-uM+a0l2nVU1YEfbFUIVB3_VZD8PTBsWeUt|Kr_T)S6qNX+Nk{aLROV)<2Kh*479k zHnevnB7kB6Ne!$1H51`4VPc9~dGd&hgz%BZ=;BHq@IN^5X!m>a#Ow;HD_j&0${Hfc)xAsrM0sx-w-^B zHi^N2U4%9({7Z$%e|GI`hao?7UL+|X!wb|5AZPTfU*MtPJl;_qNYV_Mi;H1NAy^N& zD16jR_PM1Okunm&h6!0LK<#FI@ZuyNDe`VZpVF_A#b?DNIgIajrW$w|1cFFL13<7|%uJ0LTAw^hI9r z8~2kECLAB{CJq*|GN8{?0dkD#%rsa07{>D;d#~O>W)JD^siX%6ha+zoT2q>|O&a?A z7%o$wG4A9#K%JyALVe9&87c1%zN4K+k)RA6 zKXt-n6oE#Wa^%Rx1Z2J~s+3vN_1XZm_3RMQpl2mB4{B0$3QUld zQ^mcslXu^Lv;bF|)+}4dfJTSN8r+*JkXfS+>4GI;7do0z?tMcvvy=2pXn9Fu0=W;l zCm_-w$Uj=*fzon6kTB#Vp}Puf7j+qVb1*E|u&sur5^8Gwxv-a1n&_lNEZ(ihjrKXb1(nU5-V1YlRd($%fuxG$Y>*b|N<}tj-ieUsR%|q;a9H?)@_}CMK77Eb-1|QVPli|(W0Ap z5v)})F6-Z<97H(OIB>09E6T;)wZe}k$Km=@IK~l)^-ECV)8CN14x7ptH%>Q}-8pS9 zX|g@orA`kvxk6GAJC|7eL_LC*fCc*!0f%k2=pRJVrws*Qu_#6rju?T5Bgw0@(2zQwAi+@|XDEFeJ~%Fhr8PF3@n1^K5#eU>Y0kEHr%& z-~Z06#p6%UC}y>SojbB+CEoLX`jDXjYA_N^KLPx==X@;8bfmAsIJg&^Q*tk(%)>7j zqp?KZ55!v>AtC&|&IkVWyj1vBP~&+2{&ZEVbIC6I?&;O8FRGmmKJY0PUQ}fC zWX?{G#$eACF{!UV99x{`4H8 zH2}NY3lnCl0zN{D*tXptaTq9cTP$=#eg&zN)AfX)8vg`^um51WDnKzb?O!06HO57Q z$EN>Tz}>sWfco$N;^=UL$}|->_5RbKt}Clu63+I0HtRYHM?xw@m_`@7ml9%uQztH{ z!PyW*L$$e>_G4QhG&MFW?c2fh#R7R@wwQ3-L}{PsY&M99+{E}vf7nEBWwttAN311? zn0;t@v6q7x9cen15_M>TxWIH7s0&n3A z#2KyvG)N8$oWt7B#6h^ypVQ52gg)lFIFu$MP8S>7LeM24vQ83s$jpHBA=Djm&6iFW z6CEBzM_&f6-qqb5ngEQm;@FDB*OZE*q!1A?pbk4u> zib&SWU=rB4D<^PAZysHB222Rst*opv4GZERL(oD$=I_5hIfEZxXHc|{#}7~XIc&es zZL=DxWjv0w0xI7=8Gc}w<~bEd8H?d-nGL2~f{ZGca)Oz{D=tnGE{h^Fuf1-W>>&|xtfnf*8wkJxdj9TIh2h(Zet1y42;#U&$2yE zHZ;^QZ?LHC%AgTZ2cU&hu|cS;vXW0yGP6`7rL75jr_Fm)I98w*2*iln@t;FgU=PcI zAQSB|=y*HyJia+9pAZ0dM$fk3lJID$;1N4l3iq3kQEpaoW*!{FV;_$D^DE4-glxYL z@(RgEKVe@w`dw|kaON}4WnOIs+ zrWiED5Jxg#1~6D8OFlqp633{^cXrBvpCm9eRL`^#S0qqNZRwIF30NI{eReiBni#s3 zI6P%*sHu4qBl`SX|9;d~X{%bLu%ka=D@y}I1vIGdt04zyV|pH73)WtFAf3mUnzItw^!Emqwq}Bpg_W>tSleCQFM4Vo?(a zTS%$yEv$;4ZK)Aqnp23+MX5D-piNM0Npdq8G=~8*!u9os9gy~WO5NE2J66IDjTK{3 zT(0%0$5p{rs**xMM~9{uF5YhW2HX}EI)F*R`0Kp%#;&+(#h9UhtN4jG?C{1F(~w)# zKKl+FxD}=T@MmR&tU3q}j8fPjBhzeru7OtJN6tg-3<}&uxU4bC4pgu=QR6EG9kM>t znj3;IMX4|_sSS^girMX3YF@0MBmCOrBbj#T>iu)93~S$7XpTCr!X$QGo% zP}yT4R|6}y7ZmHn)u6Og!gmaTpTsEMI%Nw^wh$;(F!!4rMj(ztpxf%|=rHMdM;pdE zRx>WY9rnl{pdnp|g#%W{N)GKUx!;(edX})W$iM=VTFx^XaE!X3h{81 zYpXM-Rgav}f9I~K0GiEZ^PV_dU7(9Oo1W*^A zOz=QRDhLIIiHSxE!1P%RBiI$^cCB&mvI0=}1QG{%AvE5&e!VB9bp9An$Aw`v z>^y^!sEfI|D^LM8V#gv19n;izdN7mghsWvbR#YG?hH>>5fg7Ux z!`CCFRSTKAx#V5$<>t!ZP_?Luo(+mK&UN|^;MyQO8LbWW0va1~nzO*P zp|`38*MxlTV}UP^P64PjFjY7? zdwF0dMLo!X7P7qjvLGP+MIE(sq0PiArlzHl5)+Ufr?};V1)G5lV>(XRnIw9!*3RRy zZ}Pk)vSx0v?8zQAEZnOTwu&m8OYx7Mt$W&WtNwrW{{-uWt34CuDjmkPRBT>4k87;x zmeRLz^+5k^@hpbE_`0@-%UKNFvXr>Dy9cq!OeI8ZMzO{_7&>ZG3$;vp{hMlSToU%5 z%1o-x(a*1BZr-pme|q7e+3Sy9UcLN9T!yBR(a0E{Uv^2}_(Oe51LX6An;ZK+O1zj% z;hhjjAMr>IyZ`gL^i3Y}y2ltDaJ_UudwGteyKPmSi!}Zg%lVX4 zU%*p&D^nri?2*W~Wl58ITHgyyo4%K->RMFP0qIw4zC6osyz`UouO9`0)2#)o>Zi_5 z^oy+hq4Rjblb#*B)su5~n6^DGHM%|YWv9k7xuj)yVTQ+wuR+%6e-cU|&?F-u~^y!!nH$_kaar!@t@@IXHr)mNq#gw2b3hTy=7ISzf*L zs=U~+XYe{n;eva5zq2Y|GVz$}I@!~W6IakktX=9nuH)^aUt_-JiTn}W2916AF3PO8 z3J)AUqPMfn-T3@*yFEcY z`v+sy$G%8RS$d&VSe|?S)MC7trQ0mO?APTi%(Jyu3zU|bXxa=kKmejx%fKU9ai3Sy z=zP~%)r~#Xi9h=3zWx3AVtIyvL6Yz`Nssm`FAlW|)5Q#!oSk%P@80&Pn-Al)OG`Iz z*+dU-A3t8EroA11*BqvhB;lQe8p1Pc|6-}WXq_{KWjWv5%*@zDo1cvRUCn!#R1L?f zH48ua=N!EJ?}Km@TaETkUSpcr7gp$&iTr zyBN@o#z+ObEC9MXS+LR=b4;luZotxNwyX<`Ij?bN`*xGzlGj!weALrJ{J&N=WYKD1 z`9uQsPZkNmb!LMD6QPA~D=Ic1m>jzz{h_Rk2Ab0rIgX8P$+BgA`I)JyFTgzf%mX0< zngQBFg6i-GXhX7x(7*|nJYZ*P_nfs*7UJX$!osBdp*$I&2G5a`0iXvE)$`J9PG6FS zBbVRS#zrBgh7tJUWpVQj(Y+66-NH5tW6^WaebA|EKQlEkaR;M@GX&89?{I!JWm@|q zcLy;{#mxrZyClzJH%5ne4k}C_R{P-~grAB}NXQp85i*i$bhaJ!haeq=Je);HQ1wL8 zIs+db*7n}|vZ|_hkmm_3TaY$L$3s|{{)PmDlV)ZrsAo|?(cuX7DRj~M5OHGO_;ds8 ztwc-icT$>r;L7gytfO%G(b0%{8|4s$lN%`!gaLLZ{mjQ@;MzhZ&Zwc!fpn+n{rdpG zSy1U+j*01#%``MJdfd;83S&Kn!^4qkm?e$$ddN!e<1>Mm(#y2khvT>xr6){b4^R>< zR_seehs3dJ71~S|h>jrMpg?CR7-!NTGaOU{ zzns9Zureq{i-8T%*l$d(+{wQSzUtnZm^t`anP2T5>DFx#fE-q48^FXMW#6|1D$-B5 zG?P%#V!#LNy&fPJsn`Z13|NLZMnksi2|JK1L=!Z?0YY)+hCYL$q!_@xhJXHyM@f-> zx>2j)6w0>u+noiJlIr>thv8rJ@%P_|wFZAGe04KWz{cY@NBioo%Q=r%r=8r7b;fG& zoV}B0PkR;zINnEk8P}k>BqT}e8agUb5aTdg?*cSp4p~-IS?+N)e#kXR`?PFrcdIYhfGdnl=%NC#py3=Sp znq&-hWCHETVrb=yLA;*;ssR6^u?^^k@%dF_YT!!U5B3|LMl)O$`|m53Djrg2DyaY- zns&BZ4Z^S&NMA6oO;`jO;5t-+a56$QZe4K8aXr30ntRelo*!!Ug<%4?`AJ|jxa)z1;KISaVAUha zN>37CZFILZhJ^BQ%FBuGM>j#?y=-#7?njj^QEbM_C}_e@9Ci7<0o@xce0PE6qOnK% zu7ya$4s^9?C_BkZOe)T_G@1xbVZmb7t<7u1mj-PX{u1ra1p;*Mt>GGqcX(b+PcX?k;rp;)_hqoyKS z&IDk%iCC-x3bUD+9|Flpg7`%#$jk;F^ge*BnOJmMu*?XEi5)_`*op^t-+iB7RKBe* zd?19`qJWP=M4TZ36j-xHVMgiu_XqRvsnJBJS!C!b1s%p{F}k9MjZ?z zV@OL*09>dPw9zxcE_de~KWv-g$O7rc03VE2sykOD8;=H-#ZV_4Ue-8VmROh^mfnZ< z0b^JWCD-3i)^y;Osx-axQ1aP{O=rBcPHt1Hb=r|uJDI?xt!ETfqGoM}$bzxvb5;Bp zX4u`{ejiW$1N5>RPSidDJU#{;QzCXF0f>DuUpff_5y9ycFOgjDRZ^r;;&Nc2>?g+EHXR&3x`v7uy9?EITtulP`TMG;y{1b))aD4Z?Y7xcqk$-BC*hP?V?w`#y+pWyCF{`cxmXjEi= zd^nCgW;QppGfy!!2gwZggMPdo2nh}rx$w;xw`(37TYOelF!BVpLAD3i3pIbNDjsvW zaOzTs1=MM`ac9nAL-A(0wWr4NGB$dMk@#>lAnNBHwr&{Sv-OfYs$-9ZI@_d{c72=~ zxXvo{&sOE1k&Sx6T1E%bP@U@KkN0iH=~)Fhu`%0zGawSmI}rbPGiwWa@e{~-fhhGB zWYF|O$YN99wTpH2Ux>oF9k%0jn>Jlt?efbVAjWs(Zmqnuci!>ZZ2MCX8W(cxmm!Hc zO!6AZ83R`FCW?|*1lU~J%05mTvm%dWKAY?)JEa*x*Sr?T79^MrdJ~<4vX~o7004{@ z+W-<__2V=Y1N^W;JSHMSZpV%=%o2d+UK)o2dhF+ z9ntVTb9Ab^-#)+cGxMq-B%_2PNs0?@VvIrU{g4{7vya`Os<_x2C`B+~7#kxlT*k)# z6iQ_ngHHoI5K&Y4_zLb~Wh?|xrNmvlR1tE7F8O!C^n^T^A=y^f=_$^SR*BCO}_6@4jC*VuK=CGoIdnaMRD@5FIvF`!rXz10|Eo!N;%mDr8 z4YcJca1RKnSPXBo7r*@VS?g_SX*Br4y&;@$%P=TC!lD%r6tsoNRia;5jko`D%e0+U3NJ!{pHot!D z34E6`K>yyc?1QL-ac0MtKE-jZ6T6g(wgwd$uIKL zHBKKGIPpCt|Gxi7Uz6Wf}(T4C5u4n{2U`cpgb6yVFZe)Bntv@7u+{Aql_A$8#0b93&q(%FSgP1&W! z_MquxFwmYfb1m%hGVMK8=41&A7y}N-LQWBgVJm)<>OdcwA}KX957hnp_4FL z5=gUw4NrOi@m;pX=mt_0z$%eG4P+527El4RG215LJHG^`4#C?(S^8;6`^05d#J9N! z_l;eog!M8PR9IBdAvUVheGU)ZAaq}KqgD_1WscbVM+<&ktU6NGgajIUpL;WBwtF-gD7`ab&_UFNrijtf(006_k#r3y* zl{EsciVvvJJxoE6GY~cspTkE;E+lrMSh-~Lq5~16+7Z(UV#1MpA=%rJ>^D-ta|K>L z8u^SKEaF1vJO&N6fUgQkFP|~UC~u%YK?u!AHx#&WPo8L6IWOy!TdCa+on>O+0tt97 zDv(wB8yQ-Sn7x86%GG{nS5>6cQB;Vi`Hmpg5_R+jaCHdoxe2O~f^v-DgTUk5TOBnM z8GG?y!ibNAc2N}PBIVGCakAo5wc}Yoj&71cD}oGdsP4c*mjj!AjZ=|dK;Rg<0~DxR zB$KDW>(HDEDk30V4+qNr4RtAPq7c-NX1Bq2dE{1)T6sz@o<%dixFzS3__w7moz8J_ z9P&DL{^%yN(v;pC7pfy>_>O4uaeA~ig#`!iM*jo1;Y#!=`Mr*rj{YChEnYz+0|f}p z56_OYXn4$x5H(}WQbfnZKp#~Lu0zha6*^YQzewkqDYN{a+MjeV@%;f5X?#L8`k7P2m$GvoP6Bi2FL=;Rq z$cf*O^^B%x{y{%?Q{UvR*CSC6nWqajTdi0&WtP54j89YRu~ek)%h*eW?^=!H%Yn0C zqhW*g841TNXIu31O3=r3gAAOJ@b2S-I!iz@rtofP8+DE4sQsB}o9?>{Ae-iX7-r?y z*&1;>IZdo8&cwEt)v=I|u9@Mq^V)!%dA8Fx9$q1+z5em0AuKA$ygT4h=zw>{1kF0U ziDAIO`&<@TL#+bxY=#Y(!8=;o!lAjX;+LES&M8RBoHsVUZ>5V=NB2@5E_fXo7+(Ou z#ux{TLid)hw0c2iUHoV&2fJIvm0ACYMI)%H7Y`4nh$3?II*tV(ZuoDdcX0xet~|N z$KT@v0~WB((ujXXRT-29f7+%eNF06>*R+Lw``{Vf@f7@=PyDDIxZaYl*1EhCvbDu=vy{p;kf-?;Grm6&5*h0#^-mkAn)sA|}G zcr-9>%jn~8Scj4>4fXYv;+Z8G0^lMvVT`~6!Gh^OPO#q=LS-;2cPt7A0F=;TXPQRi zs+79#?{f`|j7({0s()+O%mAr z4?yat3kNw-uq7q&YICbgY^~lLAIpZG0zqQB8=1dzyj+3%O4(BUWK|w*ss!1E7=!Pu zWvfAs-T!{*Ekdd(-U}Lzl(Xu`_x(u~5Eg#?-5E|Ev|!jd^P0x6$$6;6bf92~OCNRh zFfu)H;u|PGU}<%_IN6{Q$v&v)tra(W)dG%)g*L|h=ZsF|zQ3Kqb7t?5S$*^1_Zw(& zuunCHwemgOqLwI7Qh^qOuCz3ClSofMR@I)L&Efea(AYpjc+esK{n!G9q?j7>3msm| zfu?q&HaG!7KKskym=sbr5F7HzyCJd8a;VR~=RHibdv@ee zG$8@FeLI>lR=H!Sryh2kY^Fn15wdk4ULTNb1SaM~xRJg?@%^|cF^mlK#(5dG8zmyM z<6L|y4(~Eu`ZL!T-+>>pFo+4XJpx+{5NHS32Z|0ONtvHeomOZPYiG5NcTB4hx8gXg0WDx+{?7 zP^Lpz`*r_KLLne<<-R7cUQ5`w96uh`OV**ej~La{pX}R&Y=C4uOo*9_8EvhHc&`?q z+0y%n3$2AHE}G)r?q~@h_7b`dwV!gKAt9J;DUyNhB*)PoQKj}{jVB{p4#=VgIf(YK zg0;-r{$5+3RIbY;zH!n9^}7jJ>6hswcp$QsPKvMGX(7?PJ zg%wBJHPsSbr}~eU!n(nYXwfYn_iJeAsA>N>cFosU8wa-*2!p!EPQZY*F+XPF4|Yy* ztyi?CzPS^kD+UbM+T}QU;S*mM2zj!hS~dZ zl=}0Nki=VJuA8@TjK;~js)0+gFCu~1kY zPld~YbwQrEagV5#CB6W3s-gS`<48KpnSGD*CmJy%EKrUzkt;x6V_Sz5AI`&)r-@uI zFx3kBD$s^(M1!*pv7RX8%h7PzDdjKVwe&mC68rrm!aArNKyV2}1*gOg?hOhI zBn2(ayv2rb5mDMmX_m0l)h4JFmF68Z%-;wC%I3-of#s8qLI^ZrE-t9dW0O1wxh<;r zLWC5%!|WYZwlxdn241@i_YZo9@B_>zc>9<*Vp*gT6oe>I2CW}@4~oV|QH7rW#$Byz z=wNTtP-sAyqEN-_t+Z^dhJLi?qN5y;iE#O+=Vmp3pVm@fC6VkTqDw@p$)Buqs^=Z&tYn=eh))RV4n*y3+4wY8@97C2MBqx=StyDr zm#o^$RuYNd`wpEK$LiHpsMG1_w`k3krs3ESjd%;ERBpfYO9X{y5f(YV7HOw|wjj$j zDM~#l07?)NoTII!fKOPe@2K)z^aSrP(s5<=*}s6T`5jd27wL8D9tK*u#G)9+;7MWsd0_r7F6-^7PNu}!}YEWr%h zG6f=}TeUP*cVq5==PW;Yl&B`?^C^XZNHO3dTT%Byva}yt0;{1>G5|OF2i!#REd+#z zS3t8zs{}1t@u&0eA71-7-Y-{)kAPjAhSp!9Wyh#GjnF!Ef5$k z(^C$pf*UifSEJ2CTkt-5*8-xQ&@$qiJzgG@H@`*!lpc4oP8kj|J<#>QL#S)dR_ViQNDK%&;@Vtje)+z`Zu8Uv>fnSm|?ocqbY;C~xf_%>>CB-_g zhn0Wx=5@ey0NoHx4ofUxcv4(p+Xu8jJSBh&1PqZ5tm)aAQ+IgPuQDqzl}uGzX5d3C zTDg*RfV2uAyrV>JD=Q6vJk;&uR7VeR2P?A%f;t?{FjXd{UKhsbIP~&swr;(J{l8@$ zKq8z+eV>29zxk@IEfV*P-VE1Z!*YRoC7h~61>m7ZfR7R)x^OS}5NVc>yCV)D3GNUR zusnKo2Zs_2%Z7NaYhb_^+&;K=$E2;ezhK<{CAFocLojLqF$Ib^D=-mcBR{_n*3|v8 zgE622JBNl+`d?fGUWAKKqwlMDRd0iPOdQBU8|(oX+xr%$jud(g++TxiJ0Ccf;DMiYbZc(j@n;u7;o$^P+}fH^E?Vl-fN!pt@hb zeY>a1Np-G?@nR{lo)zTS+n9{Bt?+)(nr zC@S(&=WD&hG4wWK-j8(iKK{%k36bul*H-&|8mWJ_S9C$f`n+L=?`iAYxP zBTET`XF&hq$?gAR2v~JPJM!`=)d%m$iYU?lxNT3VuquCWQ<;zT z>Qe?W1N4($J+80Mui-k`KW=ZE&K_MU@~83GDyHSDSdZsOef!;dI(;c*H9h)Xm$g%W zr~mo27H0%s@55!Wg|)Mc2EG_{4NNU|@}0ar-^Djir|aV~MKLaD!CtpbNZ$%JEDq%m zT^XLLHDBVMVEc>x94me+an5V(-lPyE(oono`PHIVXT(8e%0?`u6l%Au<@inI&5{cg zr@sEG8U!7@*7C#H{hE%nS%02w@=7~gs;N*ES?PV(qGN1^cw5e`(8C%h6c;fjgqPjA zt#8x?)j22gJT8?_buN|4M+NGq+}X$4D$jY%x^!!IPv;Vi*q~^}z)|6xcfpD&W;&yz z84rhl1WiTwC%&C-(p|b))*QMkT)(TcBr@aTQ!1{(Q|3rlC-t30}XQTmz?4vP)< z1yWiP{B&N(GxwYks`U??t~!{Ah>#qXLoOp;}dbZc^!t2edELCJfA}!u99d7ej=lykp%Hy#H@wu zVzzn(F@@_c30F6BudnXDIx*VBIGOMKXe*y)WBBlLzxucvgJ16lJqzM_8}oHb%Vtx( zqGQs@Ydy2(;KEnG9$a`NEbM!Wy8&Hz1=anV1uOQ69N^Oyy%NG-{&nbbpl*eOHP;^D z&z*IB`^ya92(07Fcu@RtiQ)=LT=h5gFYoM;<@znKHmvjP%H7Z8uI~}*=8uzQaj( z@4kAs?zv>%DTu%x;y&)axIK8QKw*S*PFgpclB}I@+8y2nTIOG@UWD349QkA0bmFzg z`A3oMKFP83w*0KC%9VE7vgEeQz_Nzv;KJ@p$v1xD%527!`B46+^4{A`rXNF?aAgJ+ zwKSx6jvO@qe60AhkI@IcLx_G#PZlaUIu;vpu7d6O!oc{0d-qv68(vM^)9nbgX8d}a z6{&N=jx4S%RbggIQoVhyY~{Cs4fm4wHOka1a4PGYzTUU_^qs?-Ty`A3>gzS{{N1<@ zx}nETnOsZsnfGj2T(+sivbe8O`kMk~&*vQs-n-xW)3ZpS^%r)EsviBZp|I>7Znb{a z*?nbh)>};Cwwg2?vd%MzwB4d%ARP57-sg42X%#1j1xi8dJQE^MI65Aee2~G)Ei3eU zucLHddO4Gj$CnKUjb?m|7kA(KUAJ_X={415aW>;>{5$xZM%Acc6Q> z*X1F$w>DqwcP8pA`k^FH5Wg(#%x%d5&a$Fl=(6#8?l#ZrznzwxBlj`P`IV=&a6#jDR_t-CSrJ#4l+M8D7$oTGyf1GM^d3npF zN5r)%*3O^D#kzaj$#Xo;)qeYbyeW$DzQ1Izet2alN5hA2kCspIJdq${z=2ciZNx-U z*la%UKD*UP_>IhpjDd`OD+T>3k9Tj2V6n6~-g6dmN}WCJ=Em8-kJQA6h(``Sx9rj4 zywe!A?f0>x67n}JU#=TCP5h-|?RLCtb<$LLE5BB(0`9tte+Ju0*ibTg- zzaM`+6)cKOsxwC=<##lRJ#D}4d{*d6zH{o9FxR2-&ajf^l`V}gs=Fb2e6hRT+->i^ z_98hALFs!X-IF_34PJtLNh18V#o$nJ^Bb-|`Enl8Y?8;+_Lo>T+?o>bG~a~pquG@s zeazaT)M1X5Ec=JbbAf3U%v*MUwmEAnqnYB**(*0v?}w@ju$xa8`yra#sM{rhI-cr)WI zKWzC59$d!0X_f647&6aD)Tx(S->H*x|MaDhUgvukPG0Tb*APG-?(fh04v5_tG>~q- zSR|yfqair7dF)x$$-BeT&&;%<+6~P3ho;X5&YpA5*YU_0_sInp`{Kol&)c?-bog53 z-!P#)x8~+XLUvHuuBZy=(;=U>FIiflW}8bU#5qin~yEz z&f#W<=k~=RH?%HKZwV1@y(_r7%l&zr*-I6rwiG;4>)n+Y-_+z!7AI$wdkISN*oYUz zMA~M)7m3oZtJyXsD>!z*DEu6DQ1`YC@88v3&gha&6-{~`;p?4?6;Z6tbcNB56+3xO zo$u(bPv0(@*XVFZHg@G*|}FNWoOy|ETW23~T9rRojsh?E_#g=YO67#Wj^`2Y_KK}1Y>v+{1 zJeaf%3~iQcdA~da1?1@y0qOvGu?N$J#~FvpcuJ@(xh_P?Hx;g$8h$J(Z7pTrSnLab z)%BTu&1Y_bDAL(W-xhm~N=ltm*xtpd?(xV|_u{thnaBUG&%>5^(^ryJsnF$x4SrAh zjZ2i~`lG8)F?fWFbMKjC^%mjyacelxftp8Twqb}>$@jKS_nVU?7s_PLDXNA3{vI^z z7An5n({fAVeaZdM7H8#m`0DOL*H_E58;x}}PbYtsdM^!Tz2A)* zfxI~ zI=|oF6W_AUUitec$AJ0(u@j+of9{Hl<`rt?!8&N(B}Pjdsl4gnKP~{ z@ZQA6x0=!YVEjo@gR!9(yJ9MiNXSln*IB6$iEUXp@n|+zlmWXR*}iV$=k&MDx~G}u zTly-rv}S&5ese8MXL1{147gH*)_N3X01<-6m}T89nAv<;k= zsw0NLG4OWK=Ip)Z_@-eZ>fb7SEgly=TsV7HRJQV(r+XY*h*{37um&IhWDPJzwzhY* z2f|rBK$q$98;lTHB7}CbaH{3%Vt_dwQan>I*%FtQ1#1CO0?!*lv*f z^pVgb)d+3nq+`dw$LtX;&>N|;*=4=4?=;y*>b~hRg_IXyFdF`l=hc_6{e4?P_;^BK z-jDATokE9$e_ej8`5zY`tx)AsWSB(zuMr!rWyKGTWJk~lJn&2x%1W5yv?XA58Sf|eE)Ic<)`Ts%iFpi zAnQ<%sS%ja0oFw7zvt`*xxYhp%a={ex!q}zv~Ruevc#>_rdh%0zVK;WeII7f1<9P! z^%6~9Hg;-pFO1*s&pq;LtC-`Z?Gy7nJC(TgApFTKY#@f_b z_hd)xX`kx&d%s>PSeo^m7(6Z&QjS?p^YgQ1cd2YL-{MIP`!5BVnO2(C#r^8qT9@PZ z%}A#PoQZwvR@}x7;#&~2|8?B!%MR=PzA8^+CN8S?@+2KTvJdM9cC5-QpY{gp=Ot`v zp-(iZLdqR>{8pMde_g`n!}{>xsZ$_rMNTN9MFbu$bkli1Vd7W&sM=c;}QRDmRL@dV`~Il#CPn7g?9qcGyGR+0AB|5!eXE| zwYBZv!7!xCeG?`q@tjg3O)h&PoiRCBSxS9-X%Q@ z5cOd*33qxTZ~&hYtpDbVveI`9ww+jz+w^JYT!*ii=ax09;&LBrFeXBk-?X6|Gp&T z5xRPMf?#+<%!)^9LE~8$@yPj|cAv`E8}6y{7I{UCSU{09Kra=lyhgwG5TB$CC+3VT zb*I%rKHz}PHbD;{e?Ze}i-bgdPfrT@9Y_h$4D_s`1(`3gqxj=nA_aiF0eS&q?f^#I zjb8tiWOT;R-@Bk17y|)W z-XB}>pP$$xnfK6^dQlk;y!U?4iT6qO{mcu{6Lku=%Bo1s%(`_dNk9Ja;oF5n7Pk(c z%8Jh#evlbQ7cNomdQWio6`3D0k~6;k*Jr{HhweCgvTyk)7njnVp*0m>hZRTmw3NZ& znGZx2!lSYUX`eJ~!K%)T%6<=`KB&h^;6JQEgaYwq0i7xoP^Rg{b7d;_{hI~Xm)m^c z`Y~34%szYKf&vi?v?EvXlE^psvoP6&v3zK!Qw?m^F#w3K9(un02WpEXYVF*0v(Bb;$ z2u(6o0ReddcI$|yWn(cOhi}w%xa8P@gSgn@za04R;db=TDa0xtWCYvOZ?>ArWx~;b zfG^i?-V6f1NX#xB0YIRiwmQ>ft0(*w1CeD5)h;9@tMQm`s%|==S5$U+qVj|W6?n8!=pEnC|j^q27o@tDw$W=IXg!{ zxj;gw$X_NtO6Y>Rmjs4>lf`cqgAPrC7ho8mKt?}EXTJo6zanD+X07&Ms}L3xfX(ai z@uHrRxZRq%)NI1ygRLSV@F<-B!HqVrgr~4tXLBaNw(TUq3*xJD-`~-o6C9_+$r958 zizjt*Z$QT)K`$eE5#G*LbpXrim`UJ|!KeKS&@LSW(&-c;PU#j9Pewvg%`?j^-GYbA) z36=`8SY-tuatMO6h&^VVNmFVQNqon=fVVUg@V6KxMwS@sfz!r50|17#(dQ%-zk-wz zXpbCTpgZ=%D_9L3da#&;J%tNCaammZ zsdsrg(@NRF zuzPoQF#aC+LhGHB6Tuuvhr)(1NIQ&6hFccxW)I!Eq9Sq7O+3?dR6*moDxR7K6idU6v~OWN1IFrNm4ezsf?&pmKNm&Uf|b7 zpkd^uI|f%2GfX^w%Brss9ldh)8vzaW%)HrQ(&V)TmQloh3kVb3Al0E60MYl66Y;np ze&$eO3lbwNPzEe5Epztr!zT&SHIhJ$ucQSp0}6#0j)HRlu6+wyk2aW5vX*nR1@=U)&hiR#H378uEI9FV{j4E+%l;7&_NOk{7o=D&E?x$O1y zVD28@?xuC`AHAL$`=}=OaA#cv-x*uG*~KOy!TNd@#xN*Sgrua_V@-)sdPNP<{D0FP z!DU(lw^mx(8mvrNJ)(&9#(lu|(QCZ){S--g2Y9(fs^H130gOubF{tZ>`%N?4L>f9&3~B^BGlK$1F0{~vxtL=i|9Re;Pyw@2v% zbgKrl0R-2E0<%g7{a{p|5r`fZX&MUo-T;!-0U;C}e|e+n?RK!R=Gdf=831NJ_AoWT ze?&(Vv5kwODxF|axhb=H0YllQ9fh z&02hCtj#9c6-Jn!@DvFO2ncX0G(vJa;0#MJGBJ*?f;&dsVn?GF;8+gG*K7Wx!zv2N zVa4*l%2YXCB1lzN_oYya-(>q%`Il6tN8eEnjI)}-b){oShYOWW|Bp8tB_>avu#)Hh z`Q~VJ+hccGO+A+i)0j}5rrDYIqdo*wLQ>(C4%rDdKE6m4W`DGfVM(JKNd7Ug*C7#^SWfESy!lZ)(;*z8LQI9R zP|8B@l$-wT&ZANm>(S$f#|x6j23HQV8GmW0OI@oK%^wM`GkiVG>=6#NJyV`=(u0-< zrbZOhP71)3OQUG212v#ftOrvIYe!`H$P%9+uffzl*Cr>|eb$@{6ZEf^g#Oe{4kibP2;@pGTNQ+$sJ=Ou&M_7@F5g?L)h$aTc^?_J$ZNIgq zE@HzhKK_!G80FzAW=7&b_I5%%*9XIo1`vHx4{Tw^`hyZ}?nfT(o>&3Hj^_6mNHeP` z@~^1i?`meG-0c^wqp3;r>h2VPd5ci#!&iBE#-`>oV*-jIW+xtI z{Pma5R1-Pyfc1d+p7KRjV?H6BZLm$ILyb-1-W})m0N`fBsA0|dO+$D?p(OSLb#(+d zw(GELBlSZ=PmlOv!I@$jCfi|9SA=6IhC#Lx4yr^L2zzs~NFi(>JSUZ`goFfa@EN}c zf%B?KC(z^ILaeVy*a%(45$PTV0MPgspe@8NA?N zR@nR@ZmSE2>9=o>1O&tGB&?gh?(X@n0!#}MAHN8%Fb4Bk?8zM*Lm#OyT`XF=G}C=&0zjax4$XxOjJ>obfY z-w4eck@3OtPj^&dmKMX9a8gJj4!)$)GhtnYgXZE%QD z01F2e-}rT6HiN{bqonR-rXoIKU_pg(+jS)#mY7=Gewocc!W&V<6`yJs zCGMf1KM*Z3=pUkl zoZs&s4b{-_q}miwKn)q$Wq9n7LJ?~k(Y=7Q(u!JX=j z1qP8WpRofD_U>@RA<;%mZy_11y+eeIV>9LX7J_cU<-?=6!Ja6lv2g18c7ZG*yKP| zpnv}SxA#y1GP}u8iHN9&Oq-B)gpgTB?imjcS9n?w7a~XUqW}A- z-)gb-cBZejcyOflKOutmmurt%Sy`QdHs_C%E5f=!;6+9`3k9MsE598l(G3Fgk3vDc z1IHvyltEy1bh<96^o;fOQ9xma-+CPq3&E?InwhD8{`r!^`PbaWh42$8xD?gEt;ESF z_>RKKn3s$u4&Kio)^0GwgVj=V%(+Qa>-Ethh zrtc&qc{7fN^VYneEh_E&oqK!tt-cxw{_>QgR~_DGq?TNAaer%YG656FN^K;~!X^y2*XlTas zx_zHK9fH)GmfJt@UKA^bFzdm*2)tBezOEiP^`i7dzZ0v;VXZdd*8;XYo?KN_l=@y+UDeR0C?%t1#G$-MS!T;9~EYnjan@%nG7<1JV8{&S!6UyoB~ zWd)Q*cIZyb>~qz=8BhPTT$Wl?Yx~ny>y_u;g*xH4zw(aeG&I+v>wJf#;qN8?VcsT3m99>A;ddD#^+Cjz3InDR12^ zhD9`88P2!{3OK)G_Dd$a5ew4#cyW*X z$hUqa@#xn*YEivnUNsuh>fau+cZ=uTB-?qdUH|6s7cbYmk;>~~uoQ9@`f>N$Wsf-3 zyORg6AAIu;<7Ok?G@s(ffb{+-m+s~-Z@Jf6Piwe@(JfhIrm5!M_;(RoT;#x43ZrMb z8%5RrqCGAWrJ+gl+wX38+V*%x!L%mwz^N}*@$Bha7k9Afvc2}XyV}&gcMPVRR$n;s zQnLP$^Sc990x64$e+I&f|9Fgdxq0943ky9Li5EH8<7sNQpRyy{tmePUd%>F#vnw@2G){LHiZOkWKeW-bf=VP(-J-(j%lkk;ql)UM6( z($Q;vRo=2~@w)KWuYg;~|E+59=(N7}e|i!}@@MwGtk%#lArDi&z|VN_U`=l7Id8f9 z`fO*(G_A4-m$7Y^+T$`Jvn#&#OINx1$R%=*8Fh90Zd;hIVdv=CyEepFs``t`!2q+@ zlvFB{8<#!vFMs)*m$g5^5`X2=#<8pG9q44v93HlxbQMnM{M~Kza2rbu`=T@JsT801 zwu`PjOCuo}_pk1iT=}s6{^Db&l8h71eG6Yyy$^L7X5YG1qt7PKS@F2eSE|_dro`0; zh9O}w49C{r|FtFRN6JFg%i`i0^Bii?3#IQh36yFR>fcu_{0mN<{wCYNPH<<9P!0|Q~k$JwA(x% z7R+1iw%B2)DJ*znHKuG&{mBiDdt0KyFQy21o?rERf2)t=QSV2U)E@d~iGM#!Sth-d z-Ci?%`E%ICp5C^G+SQw8FP*c!_yOOYEP-;{#QxOox)#4Ov&H$8ZgX_p-D7jsxvM3m z@|TYsGM+QHUX$1{^)NEZkA0XH&7Q>d-(}*d>p%4#Q+l<0E3;(h*uy>lhEU%@@eFS! zp8oQ4{FcA{&HPn-nLkwj>Yc1tU_DeSMY(UiCL`NSIhob-p3}|aogSMlQoqmg%y{n= zGZ?jt4n4Mg;_%E@N4u>(J-28mAAC}odo@S8yq>=k`t`Zp7m zR#co)*w-M6=$VRO&*EPnlzaG6nD+Fda$G=~wxzgb-R!4qwDwzF;>ELt8m<8BtS zuBRfW%yN(P$AylHVCj^cD;ehPFHef$wcPcNrnZOkTa_S9_QAM+rT$j(1Dg9gFLFlx zN#uE1w6$*ivdi$dKYn!54)OmwtPWV(9(g>>cR5ltct4TJ&Q`GgfxF9;vtxJ>$5x#e zTmPLj_G2)d-0G3{>Z)wEmp8Y>LB;b?XG0<)WqqU#wbIA}II8mRFEP4u7p&TSR&jp6 zTS(+B-YSa>LFH#^WEr<=#MGQCAIs^m-*2w9_=m%Y`{iYo-fY22%N5QHA;EX-GeNU|*B{&|i4?jpZeu7|6Myw?^; zdx9OnX`9G~Efo&KZ|m=e0ds4!onJj{ zKIG&rmhk=TB_kXQ~-|xS2ZPxz(HF+x!_;yMu9y&$a}Y2!w_5Q&w*ZTU1Z0mD$!Q4t@J=$a-TYPitp9f3v2`y1R}7 zg7v5tjI!(#LV6j*W2pnLe%oop*WT1Z_w1TS!NVIz6f>2Ed_l- zB^ntkmI~iqmdvc33dj}_mk1CL^5oBc5N2qW_PI=VORm>cW^A_|$0fz1_at_SbN!DC zFlefQHgs@c%C#!$KKB+s-sjI%-Hd9!sNc}>)SPW*J+~sgE?Dn!c*q+sX^QXig`KO{ zDu(K`6uY&?j!oSiU2r!wrEI$vFKxtk{cu{{)ZF(i;%qryt?5lG%v7N*(oH@2no0)R z8ncV!=DzrC3hAbGY-e=r)cRzw<}G$}{q`!El?`H85^aBm>Q-MnzTJ1;B8sscSvi;( zJ|5%L_o}1Sa{^+v>D|hDTeLIQ-rSKoZ=y&hrMuQ2 z#(;F8RtW>Z87YIfzU}#g2K0|ZZWS|#YMH(MBsqL;L?a{nxZ2cZC7%*Ffe9!oZa`a( zgmM5e_c)t>vK#`qU}mZZoWtMlzfd!ni6`kx=){qe)bQ|CG@j}KQx3GGP3W~0*8HVb zwDgftHqbwsGYdX+cg_WISU>t=%L z*A7{n+Y+fIB(Z_aVI3UJuOPjSWWT$*GT|@<(+ISJ_}BBuk$88ADm{P7Zzjuaa9~Fe zGwJOxZc@1hM7f{1wE>D?4_{g8I*nfjksiOiiUPCk%?YoK4;-L)pP=!G2**hYHvQ}3 z@|+$5-QPiQJox*m0>~t1V0btux<_(E>NV%rjQEe#G@1lo+Mf$U4Q z#zq?8^CSitU@u7v!&w#Zea-XdTKdP<3%)~_W9}%7c!{AK%zHK?E*woUSWsx;6xy0+ zCIJ(?HE8W?kY7jtik?1#hp!B#75_>6szqzp4T;T=FRVlF6YdOwI06C|zXqq5HGyl^ ztD&=B^7mGkG8$~;T@m;X-GxD@J8%G3_c^a}zFBpK3uioFk3g(S+ zj;$1+9b`0ARQzHa*(xPv799^6Uyk;3d^wU330F2WW(I(YZrN7&JGb(TJa!hNA}Qv#3FOjbJU3gaKp%03tUOLdZPp`t++1`Dx%9 zkUj@N1Av15HrHK$S<}*2iG?? zMvoRo!Se1db2tM5%O>4obe;qeO$~8!Xb`qYa`gJ7O4IN~n1BDic^ycx#JO}u1p`8LFIu7VnKmgGM_zG(>h?rKv zW{LpFK&*h)bx9ZMk)@FW(1+S7wyCAwUY!P2!L+ zw^>dTC_!MXPw%)TAb;pD z9+C91NMs`1N?|p<3Y}i!TL9KeMwE^Q)A?0bMtPB(4b`_a`W_^Wl%!VUxlEe!;xOnV zz!?xoc-;t?Sku}%r6Wde80K57z!9Fx?AXCZ0;ZwN8$k1w3$w*Udj~qbCg{p(U*ncl zLqCNUA{N=xA7rNS69n6zxR4T@9#w&?T)YV`v~lgwbVY+rbyUa50P7)1b%xIa8GeYF zkn+s1l8}<(0AGa_56eZ-(9sD+yEqPcHwj9&_aWYu4WYe(h7E!u5d6TF#M?*nO97|K zh%ysPhB+0yEli*frA6~;8jK0|j!+#RT)Gj$N(dH%xnbOgbvsTestZAOgz`XM7nGSm zp@TbO_;vA6&>w5cId>VrW;G1W+Jn#+>G9=T!xe{xh_T6w1Qm!FsK|fNkI?X>&}$!^ z0=UKVhRMdT;$RU3b9rTVXTWCCgzZ0Ks_o#=MHUYe?Ysoc&IYt5gO5maf#1M|nSvTP zFZ%7->7CRIz~yW)`$t77;i-b zWI@Bw21Ev6_hB7vqcFbRMkqPZi>pGnL|kSut@E>c#02?bp8Py8&bRl{5%OrzBpZ%y zxdBtb1VjL`5C@_TW6)Qz@`b_W0g3W|OZI&z4b`*`i1^{GRuv?+=n~3l!a^u_H zp5Cka`kVG9tbpT0G}(~Nv4Y;HDSzMyICW-Ln$onZ*+rRSOs0Qa49 zD&P_18=wtIMeBMW)fyKzT5}_5nWy zdMf0}o2C>Y#JlF?y9`~jZo!&H?(vmT$o=3DWic*~2?K@f-^-sR*y%{r2lTw$yU*X( z+V1$Oa839OD~OkgykA^jZA3q+1vkUWBw68x_<6k@WB!FTcN{4SSnRoo?k z$J38JyX5BP)@oIK@%zj|Q#zqcffJ>Te~sl&61Vl_YDC!vR;*G$K!p*{P&jR`t)+!f zLbg?^r+cf9g7Kz&?laVyEWEsuJ6(J3PxBg$f*eE@01&3AtECfc1ZcTou4hh(mKT?sNmZpZ9Y8}N6I1JO5326K4u-{RbA=19Q z|6!*HF$uwT#))4u(H6*aR%p)=P`vb40rgzT&S!z>&|^-NdYnEA%Mb}T`9J79OL#v> z*1@9re$;zHX8U$EB#SU}a$bd8SWrb}`SNE}XSCSIR#AHXTGEpU8!*v|ktC9v&fKX8 zTu4}1nGfB5%*+@$?Ng_=5-S?)uDQp+Sm40`pa$p-Hp`o&T}(h6HBgS0`pwMD6vJSb zIPEOLdej)im1$qlME3dkJb4~{v5Zg@!Q8;OI> zGMJr?2F-iVot{;`zkl`Bm<#W)moz<#eTtB1x;{<&`S}Is=Z^`M!5Qn}Z~n_P z^qdfgaYiF8oRiW37_9;JvSM&G-9`yT5tFwN84U+W#LSN{6b32^3Y;+1s*!$6%aPL6{-L8noQ%{1pxc0(oNK>ls)vH3 z0wrhXonCNu0YXu7p755y+KbeT;I}0rB#Bi2_@FpISf>Aip9#ScBl%~nv9hZnf84xf zS_Y+VFo+W*02}-cN)2J&0T|To348=}(Ez*})z0)*HCim#IY=5fL38-mvSldFUMTQ| zSH{QoJ^Q%#n>-!@tP4uOZ_y^0DGp#$XhJ0yMe?%2sr2nzqBR1?*l_G%^`Ad~h%-gb z{rerG-uw+OUeLN$&2a+!BGUjq$OD8*g18?3ieuO(V0%f3a1fu@zJ5JceNkwFZ{HXU z$tgJ_t8!oNEd8}i3BaiNIy{UFH#Q0dH3&`|D4SJ&&b-S&!3;S$6*kTH9~Hw!>GA5{ z;Xp@_TpV$3+*z?T(&}hP?tO|SfAY_VB^_=DCN4JcNt(vbxgYLg=sJi0}FeMwMD!U zS#TjqmVEZ3QPj{}Wv;!;?_YKzMYR}YRLqe&oNJ->x7yuQ^=!H))g-sbW9XIDruQu^ zOeh~=sm?_5Krbmn50BATIOjeIv3d|#tcbm|v~TidMkz_o0a(GYbn-t(=e3cx#2NV{p;V{joHtVa57#EuRJ<{H$dd(v#B52KVYC~Qe>J(ZEaVh87Jq*m9+{1b=^a9|Sn>QMoW04LlpNc?9mDZp`Rfldi69x>4I z2?>?BI5v<|5-BEhbPn8|?0xKgW0Lq((%}p=x6qVah94(e?y2!Hi6CZdut2g8f{$pG zKO&IV^sitS3R1;(jPtj1(IbH#q~4;WB5sbT4CKytV`s3b3tC5d5^#5uKi{p5gA^wU zawfQ1fHEHwt=qqq3@cF3#(A)aM8EhJhVEo2hzaD_^Rg0Pr{QS=OLX2l(v4!R7 z9`<7-H)#QT2h)!nj|qT@vC6wKeMo3adv2eXrq+_1T# zC2-?Jpiac>g1?qe4mRgh6p@&{;pSOuc4@$3lOzrhAJgQ!yFpNRwlu#HT*50Lcys@F zrVAoP=^tsQO2acSBNoEp3*Q(OuLk@u;4?an6`ByQ$;u*k=`A)6;$=yq9^p|E1+Lnu zzq}gfxWWp*ACSt-&ZbAhM-~}jx#>DCAhl2hpr28dp_rDIrh$$EEKHtZVBe5?JqQ5^ zn|{0`3u-Ws)gs{6*Ijns507i&|93hhQOPq8A39S8oj~|pa*&b+BZNmenpq8w$f2ZI z!1)ws;)3Zxwl+U6rVxS8;HnZm3yM7kRD(Fr2*aQw46nl$G_B>zIK<@Ktriq4cv7P;z6S1)mq-mDi}L~;Kn+F} zlrF%MhIn_Q*Heo#g@`9F#jM?3TT>I!-Bg%E&oKo=lBm91Kb3wO`}IBlm1S-fUj=x| zxPf~Uzh02fu3yHDteGJ8UV&AYqi?vIA1BzQ=vu(xg%0ac`>*ZO(S*c|4g(L4>u9zG zq9H|C!8o<(@)cN%Ba;gjU8Ki%q{4&7e`$`3(Aej?g^`BMdaPYw{V!PR2jM78rZs6u zG_~bnpCU651bb=JTbWTaIuINYoe6dpYdP5D5yMzgMvPj{sbM`{B$vQIcWk|P8OBuG zG~lMzQ5-s&KZ9fc3oJ6huyKMH_an4B6O^K!qfW{fivy?THn?}!l}sW}I5wVO!N~VNeDyOn}vds5^jZ_#JJ6UbB!bmazeW0W|K;zmLceDV*EVZ*SdK+a&Caq@G;sWG zK$)e1pYLc3%~6VS>o|dp#cMEf7cou4!Lc8nQDA80bQC)YWA2eu4ARyjO;e(dK>I5r zDw6|AHP5kJPGe~yav1Q;8zC=(5hv(UJ~`O}V)q_CWF@UgRGr0WWT0h%SYtlKcGl`| ztIBBmXcVTC{*TLr7t)COH5?8{#AIr;Nq)}#3-KYd8G03GS$SRxy)YR#38NKaobLSK zn*`25c<)$FsbT!o08S>t#DgH7x`*~1apOjVG$ShaEbdSX%~(>3ktQY5xzWSnR&d)4 zDO4zmFY745cmC*9zl2#?5qw7fVnfBTkz_WIZw2z}sWUe+Z|fKsG+;~>!*Bo2?hA}0 zyvMn)>S}_uk8UCVh0ao(#cc4>NyG>qJscYzdaU>GP{g7MeuxkRF@Zdro9<+QHSg^m z#XuZHc@;fYqh^A)RuIx;{wq5`Z}9!=0nOum;Gm_WIe*`}iihNpV1AIY2Dh1poq$lu zFbYe2meB|zWg<3$8oXq1&PZM=;Vi-zO%+RYsm~>KQ{?nm+em_DNlF#;@>j+iK0bM?{K*b~I;=Ha0R*J0v_1xKxWpoq%s9JY$p zSaU5ny?QtNKgpVlLUj-=MbySYh&O_*vpNEk7enyRM_=`E~mZ0>L~A|yPxS1F*$igjNgDBy^+_J0tEK!V-C zbQ|58|Bvo|U*EkrlQdIt0*!$7*U@2$Mjq<-^>E}R^f){bppSbdxd2jNWJbJ$1<iVwoXm%}iNc1+ zUSPb87L7EC@|GU4|@0aK}McL9x{LA!;W&QrI1#vD2r zgu~!rC^Zv$r_aqnP6o5KmZ z-}en_b8ng?kL!a#0w`Ec^uuSW*LN>;{Q{$epvpS-Zz4~)mC66#|3~_@uiFVtM{o&D zKOT|Fk*Wv(`(Id`teWcf{rgAdtd7`z;RL%6pJts3o9R4jzCM^|C9m-)I5){|k9XGT zC!fx*>U!I0kS2$}Zk0biQPLjV*t{YyCiF{RAeZpn<=HPi_5hb77`Nv{ceH(KK zK9ss%7`U{C&o?TIh)f>m5vQv{>qHKi_w*Vw9o?2YzhF`MaZH>OPf7u`f#(r0ZZv5V zxs`ohdeO6OSW{BcWh{>D_|=lUvzA&kpY9E;65_p($h}Ja^T(RHuWgw)$B%LWESFre zvaJ2|x4(Dikhsn9fJjDEr7;3F{r8&eoP_IJ&+lZax^L$ys=aNKK3_Jzf*-!qddqWn zDHN7UU5$OF(PuKAt$(%2?NDQb&Q;^fk7eR#Jm^?h%txe2op7YKxlG0 zv$)qN|Aht!se*!OA-4VZtel5Vhj+crV$KoYgdbw62f^aFf%f5Z^K#l}#bW(?6Y)l* zq>YR^(XAx_vY6OfEJd9?H}yma8Td0N2Zum*H$#|cb6eJ5h9BcAWoq~1;yBQaBVahp z*x?|U-+L!H+1A-vqA^=rL*rd}O`UNI){)K9()*XpEXe`=9yX8OKaT)W2}-113qf90FA0NXM*JgANba_W-6$R%$MIdIn=nh2>-G zy?xYkp+Qin9FsQQ!an*FyZHZj*#BpvsY6WyB0mEKUE9Ag1qjz{9dNY#7j!a(iq8EUuH-q1g z#0rpZ9u6VtAfAhgiaNGuttVv!V52mYK@c6rbQFh$egmhMTU=l@o{sSK|KgxY)U)_f zD2KxdB#KQKns5#D5rM;gXphV{7031uXUH{x-l43b1=5BclT`Fz%oE+=x6XVnG+{EM zu%a#4_sa;Qj3>!=q!PekT2MrU23xw<@9)`!?hZjQ8wwa;uKUU6h(d(W@FAa%L>UCU zfn1RkWoY@f{87cyvX(wXfE=Jn`x}57IsU=nQ4N?ZIZ9y*eNi5;4(-GuB=r2#9{?di zw;cKd5-Jbe5Acj#7mIV+e3Zrg+`0w4P$+vIV2S0(qjKw z^csn-BM|}ha1hwyDF@PYP_X*3ZgdF%zR1GIe-)|+xa881IH`XKuelhpqa<335=Rz% zBoZ4#%*ydeZbEWm?B{m*V3PiQq+-%@N~)s#Cb|>fxlRjGl|n?;@-THDzCO32hcLd= z6adOpjE7_;Px2V3buyx~HB3j`gVfb9PQAWoCb*4tNs(Z80%HGD!kcZQ6(~ZVfdq0u zML^Wdq?_|%=tm#+ni>|yt(ca51!X-%G)Yh~nDzR?g#zI1MG@IeIvAI5AQD5o(6Owr*T-*;|rq@d=HhRCa`+wa{|EX&>~zs&vn`g z=e7cNA$$eM2~jK8KTOp|mZLj-MTxmA87PQJ68y)YZnPYw%r)X1!~&FssDkkH!O6+V z9Wmed(a|KLB@{t2XtBY@aS$Uv0lIMGWQfVB5o@T40YxlKQTx_^NIZ7lZzs;ua;HBq z~rL)#Ay(~0uVoJ3=OD*iTVH&yhx$XJJfR~71OjjQ2CxsL6m zZ;c7gFZ`!((O^mdog3K)J!w)zyW@g*NJc5;*Y}-Ce8Zsm*$s4?p$7QluY8 zuLCpqvgLjCOnVz({2KwVE_aZb1%_&Fj=CpLitgF7r|A5+70F{!Qbb;c2wtrl8vRa% z=$+c5HM@x17S9`lQ8-r*BB)1Z@#Ag?0nw)qhaQm=wRJ3^5DQ>XJU;#92?wGA@G zg8RT~^qh#u3`@)aK20qk;Lc6GK%|Ir45~E4C7_(|Wsq=!>YTV40P7%byO2!g^HpMA z0SqB0>_F7R=@}WTDa6|v2@Vu+o?!Yw4UwoJvnKxONJ+NETqD!pz~zG+_C&a^q!|&I5(`;Pqm|t)8OpscvJT|;QFRi z(S@GpLsu58_xA3+v#`6N(DvA*a_D5!`IWvqEy{P__iyUCGxKYohsVRL4ZbRypc1Q{ zT%ewU2gE}-_hN^kI%6Qp273c(EY%b&nh_)(3GoI+Ky0l2=FDK74|(ZU{Ng&_!u*+CN!4X#DA^X?m%`301e$@|&(_;_OT$u}o=C?!YX z4b!~+;JeIfnKHpk;2E}``{ zg;nL<$B(*4kMe;RR%ataNr<>Zp1^B;tJ9*51Bj zVo&Y)6TIOJ-mGe&{@Qd=n_(*RyD2xX796lTw4xQ!p+U3OQZn9nq) zICsQbEw!*P8hxl0#r-f#YM9flWf8`4@s5fg&)t^nLs$Q6lHW5W8RJ}fcjp08}?>@9HI6j`U`MoTBI}hK&3;v0)ynZ(Y z(qEKow%wWJ`a3^ag4(vw(-nR6O$(k6u1R6m@q6yUQoDJ|O3N8HhmPKDBnzsIZGm0S z>l;^ubg+BKBsF6SNo6c8w{r(#Vn=US%(+STcY0Gaj@A?9gN*14B^mcRySk15eoFsj zJ^2KnGDu=^u%?byx|Hcyv3<(anRJlU)zv{!G5gNFf?3`m$z?njBp;mxZK%4 z;`td(X<2~hetyb&NQ4r1#N!Tm^m|lH{aIpQV4$qds;C>^prYwA)9Kmtbt3Z-)CCn)bSBqGx7d5iMaiZxvK1P?86f8 z>vQw-H&C*^Jf4PxiP+qS76qMvmedvtPHkB|PC0>)W>Y?Y~+Ep8C=GX#}8Rw}h8!e!;|V7;J@xel-J z9^VwZh8g`YArdGXQ1p^0ks#*S zD^E?<6{FL912)r^mSDsDu))@1rOm49@4pwl-j2@BX>|QUd@mdo2ul3=HBK)Fh(Y_O zPkP|oklarcGYkf79G{5!g;qLCa^O#%@L=SDD-%0&QGH8 zE6=*R%n2@RRbVN}d3xtYm|I&lVSUlnrDI%=G!b{`rHOYwP_8EQ%5w?|;`np}-?)?k zBH#hhk_2KvM^2~}mkkFTe{U8b}tEME=+et}V zQO!Ead4SA_#h0*{5Iq*q)fU8T_b&E|{S_j}mY0_&;mxzN=ei1ywNx$iyaofU8Q6D8 z)P>g`mBbHgW9-Wy3=b?*z@gCv)x316x@#Ij{l@~2Oht2$t*o-xM-9s2%bFSrzC)u^ zsfnef4kC5BrbXp4*$oX15l$P68aEts6sH-I0wnt8svEv|QcRqdn9{ReBYS%xh~W{F zL^{SVj}sG|h{h}Xv)h#hg8F8DIi5OY3+cb9nHg4Tb&NsGbJ85f(c~1LF|B}$gNa+W z9*#iTo}PFlc{w?`zBwNfr^KYPxEUx8+Pz62GC1+=5WZd;?Decqvz2djkQjJ`xk#2`l3`2QhEs#R5d zlqzdni4zrljia2M47Ut71KWAJoR*RFM~~Pr#10?c2=WuwE^;9KducC-vta05PfF59 zs}DyJHoLXfxZ(FAG)>2cu+D?BSM>4phtoU3w$O5L5L3C!6wuJ1!LWuJBT5iNzbfk% zz`O`qQq696hh5IKk1oq6xw*OfFz;sP=Gs1g);BU@@?ZWXhC1xS_<1EIC90&)-_I#w z2T{RMi|Q^Aqofqr25Pk8E$yE6sXBM=Tx(a?)h{khE@kasz8K>7u}>-_zcn6*P&zCs ziqRKlSQTRrD)9y>HlVj$783yy!64Z-vGC^?jxM-}LNZ*Dx%OwDeKRK{D43{tR@A2| z1sk<2$~6>nA+ Date: Thu, 11 Jan 2024 15:58:48 -0800 Subject: [PATCH 11/34] adds a open questions section, clarifies attribute units --- text/profiles/0239-profiles-data-model.md | 52 +++++++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index f0be88b4c..a17accce6 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -50,8 +50,12 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Profile Types](#profile-types) * [Profile Units](#profile-units) * [Decision Log](#decision-log) -* [Open questions](#open-questions) -* [Future possibilities](#future-possibilities) +* [Open Questions](#open-questions) + * [Units in attributes](#units-in-attributes) + * [Timestamps](#timestamps) + * [Repetition of attribute keys](#repetition-of-attribute-keys) + * [Locations Optimization](#locations-optimization) +* [Future Possibilities](#future-possibilities) ## Motivation @@ -93,7 +97,7 @@ There are two types of relationships between profiles and other signals: #### From profiles to other signals -`trace_id` and `span_id` (semantic convention) attributes attached to a Sample are used to represent connections between profile [Samples](#message-sample) and trace spans. +[Link](#message-link) is a message that is used to represent connections between profile [Samples](#message-sample) and trace spans. It uses `trace_id` and `span_id` as identifiers. For other signals, such as logs or metrics, because other signals use the same way of linking between such signals and traces (`trace_id` and `span_id`), it is possible to correlate profiles with other signals using this same information. @@ -101,7 +105,7 @@ For other signals, such as logs or metrics, because other signals use the same w Other signals can use `profile_id` to reference a profile. For example, a log record can reference a profile that was collected at the time when the log record was generated by using `profile_id` as one of the attributes. This allows to correlate logs with profiles. -Additionally, `trace_id`, `span_id` can be used to reference specific [Samples](#message-sample) in a Profile, since [Samples](#message-sample) are linked to traces with these same identifiers. +Additionally, `trace_id`, `span_id` can be used to reference specific [Samples](#message-sample) in a Profile, since [Samples](#message-sample) are linked to traces with these same identifiers using [Links](#message-link). The exact details of such linking are out of scope for this OTEP. It is expected that the exact details will be defined in Profiles part of [opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification). @@ -530,11 +534,14 @@ message Sample { // References to attributes in Profile.attribute_table. [optional] repeated uint64 attributes = 7; + // References to attribute units in Profile.string_table. Each number in this array MUST have a matching attribute reference in attributes array. [optional] + repeated uint64 attribute_units = 8; + // References to links in Profile.link_table. [optional] - repeated uint64 links = 8; + repeated uint64 links = 9; // A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] - uint32 stacktrace_id_index = 9; + uint32 stacktrace_id_index = 10; } // Provides additional context for a sample, @@ -960,6 +967,10 @@ Timestamps associated with Sample represented in ms. These timestamps are expect References to attributes in Profile.attribute_table. [optional] +##### Field `attribute_units` + +References to attribute units in Profile.string_table. Each number in this array MUST have a matching attribute reference in attributes array. [optional] + ##### Field `links` References to links in Profile.link_table. [optional] @@ -1523,11 +1534,34 @@ Here's a list of possible profile units. It is not exhaustive, and it is expecte There were many other alternatives considered during the design process. See [Decision Log](https://github.com/open-telemetry/opentelemetry-proto-profile/blob/54bba7a86d839b9d29488de8e22d8c567d283e7b/opentelemetry/proto/profiles/v1/decision-log.md#L0-L1) for more information about various decisions that were made during the design process. -## Open questions +## Open Questions + +Some minor details about the data model are still being discussed and will be flushed out in the future OTEPs. We intend to finalize these details after doing experiments with early versions of working client + collector + backend implementations and getting feedback from the community. The goal of this OTEP is to provide a solid foundation for these experiments and [more](#future-possibilities). + +Here's a list of open questions: + +### Units in attributes + +Original pprof format allows to specify units for attributes. The current data model supports a similar concept via the use of string table (see `attribute_units` in `Sample` message). It might be a good idea to have the units be specified directly in `KeyValue` message. However, such change would require changes in virtually all signals and it is not clear if it is worth it. We intend to research this question in the future and if it is worth it, we will submit a separate OTEP to make this change. + +### Timestamps + +Although there's support for timestamps in the data model, it is not clear how they should be used and therefore we expect to make changes to this aspect of the data model in the future after we do more experiments. + +### Repetition of attribute keys + +Original pprof format allows for efficient encoding of repeating attribute keys. For example, if 3 attributes have the same key (e.g `pid: 1`, `pid: 2`, `pid: 3`), the key is only stored once in the string table. The current data model doesn't support this optimization. We intend to research if this optimization is truly needed and if it is, it will be added to the data model in the future. + +### Locations Optimization + +[Relationship Between Samples And Location](#relationship-between-samples-and-locations) section describes the technique that is used to reduce the size of the resulting protobuf payload and the number of objects that need to be allocated to parse such payload. However, there are concerns that this technique makes the data model more complex, in particular: + +* it requires somewhat custom memory management which means things like array-out-of-bounds can go unnoticed +* makes it harder to implement a `Merge` function for 2 or more profiles -Client implementations are out of scope for this OTEP. At the time of writing this we do have a reference implementation in Go, as well as a working backend and collector, but they are not yet ready for production use. We are also working on a reference implementation in Java. We are looking for contributors to help us with other languages. +We intend to research this question in the future while we experiment with early versions of working client + collector + backend implementations. If it is not worth it, we will submit a separate OTEP to remove this change. -## Future possibilities +## Future Possibilities This OTEP enables us to start working on various parts of [OTEL Specification](https://github.com/open-telemetry/opentelemetry-specification): From be4f47443c886375cd67147952664959bcf6d1a9 Mon Sep 17 00:00:00 2001 From: Dmitry Filimonov Date: Tue, 16 Jan 2024 17:34:41 -0800 Subject: [PATCH 12/34] addresses many Alexey's comments --- text/profiles/0239-profiles-data-model.md | 179 +++++++++++----------- 1 file changed, 89 insertions(+), 90 deletions(-) diff --git a/text/profiles/0239-profiles-data-model.md b/text/profiles/0239-profiles-data-model.md index a17accce6..7b2c116f8 100644 --- a/text/profiles/0239-profiles-data-model.md +++ b/text/profiles/0239-profiles-data-model.md @@ -9,9 +9,9 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Data Model](#data-model) * [Relationships Diagram](#relationships-diagram) * [Relationships With Other Signals](#relationships-with-other-signals) - * [From profiles to other signals](#from-profiles-to-other-signals) - * [From other signals to profiles](#from-other-signals-to-profiles) - * [Compatibility with Original pprof](#compatibility-with-original-pprof) + * [From Profiles to Other Signals](#from-profiles-to-other-signals) + * [From Other Signals to Profiles](#from-other-signals-to-profiles) + * [Compatibility With Original pprof](#compatibility-with-original-pprof) * [Proto Definition](#proto-definition) * [Message Descriptions](#message-descriptions) * [Message `ProfilesData`](#message-profilesdata) @@ -27,11 +27,11 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Message `Mapping`](#message-mapping) * [Message `Function`](#message-function) * [Example Payloads](#example-payloads) - * [Simple example](#simple-example) - * [Notable differences compared to other signals](#notable-differences-compared-to-other-signals) + * [Simple Example](#simple-example) + * [Notable Differences Compared to Other Signals](#notable-differences-compared-to-other-signals) * [Relationships Between Messages](#relationships-between-messages) * [Relationship Between Samples and Locations](#relationship-between-samples-and-locations) -* [Trade-offs and Mitigations](#trade-offs-and-mitigations) +* [Trade-Offs and Mitigations](#trade-offs-and-mitigations) * [Prior Art and Alternatives](#prior-art-and-alternatives) * [Other Popular Formats](#other-popular-formats) * [Folded Stacks](#folded-stacks) @@ -40,10 +40,10 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Java Flight Recorder (JFR)](#java-flight-recorder-jfr) * [Alternative Representations](#alternative-representations) * [Benchmarking](#benchmarking) - * ["average" profile](#average-profile) - * ["average" profile with timestamps added to each sample](#average-profile-with-timestamps-added-to-each-sample) - * ["ruby" profile with very deep stacktraces](#ruby-profile-with-very-deep-stacktraces) - * ["large" profile](#large-profile) + * ["average" Profile](#average-profile) + * ["average" Profile With Timestamps Added to Each Sample](#average-profile-with-timestamps-added-to-each-sample) + * ["ruby" Profile With Very Deep Stacktraces](#ruby-profile-with-very-deep-stacktraces) + * ["large" Profile](#large-profile) * [Conclusions](#conclusions) * [Semantic Conventions](#semantic-conventions) * [Attributes](#attributes) @@ -51,9 +51,9 @@ Introduces Data Model for Profiles signal to OpenTelemetry. * [Profile Units](#profile-units) * [Decision Log](#decision-log) * [Open Questions](#open-questions) - * [Units in attributes](#units-in-attributes) + * [Units in Attributes](#units-in-attributes) * [Timestamps](#timestamps) - * [Repetition of attribute keys](#repetition-of-attribute-keys) + * [Repetition of Attribute Keys](#repetition-of-attribute-keys) * [Locations Optimization](#locations-optimization) * [Future Possibilities](#future-possibilities) @@ -95,13 +95,13 @@ There are two types of relationships between profiles and other signals: * from other signals to profiles (e.g from log records, exemplars or trace spans) * from profiles to other signals -#### From profiles to other signals +#### From Profiles to Other Signals [Link](#message-link) is a message that is used to represent connections between profile [Samples](#message-sample) and trace spans. It uses `trace_id` and `span_id` as identifiers. For other signals, such as logs or metrics, because other signals use the same way of linking between such signals and traces (`trace_id` and `span_id`), it is possible to correlate profiles with other signals using this same information. -#### From other signals to profiles +#### From Other Signals to Profiles Other signals can use `profile_id` to reference a profile. For example, a log record can reference a profile that was collected at the time when the log record was generated by using `profile_id` as one of the attributes. This allows to correlate logs with profiles. @@ -109,7 +109,7 @@ Additionally, `trace_id`, `span_id` can be used to reference specific [Samples]( The exact details of such linking are out of scope for this OTEP. It is expected that the exact details will be defined in Profiles part of [opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification). -### Compatibility with Original pprof +### Compatibility With Original pprof The proposed data model is backwards compatible with original pprof in a sense that a pprof file generated by existing software can be parsed using the new proto. @@ -368,10 +368,16 @@ message Profile { repeated Mapping mapping = 3; // Locations referenced by samples via location_indices. repeated Location location = 4; + // Array of locations referenced by samples. + repeated int64 location_indices = 15; // Functions referenced by locations. repeated Function function = 5; // A common table for strings referenced by various messages. // string_table[0] must always be "". + // Lookup table for attributes. + repeated opentelemetry.proto.common.v1.KeyValue attribute_table = 16; + // Lookup table for links. + repeated Link link_table = 17; repeated string string_table = 6; // frames with Function.function_name fully matching the following // regexp will be dropped from the samples, along with their successors. @@ -401,12 +407,6 @@ message Profile { // Index into the string table of the type of the preferred sample // value. If unset, clients should default to the last sample value. int64 default_sample_type = 14; - // Array of locations referenced by samples. - repeated int64 location_indices = 15; - // Lookup table for attributes. - repeated opentelemetry.proto.common.v1.KeyValue attribute_table = 16; - // Lookup table for links. - repeated Link link_table = 17; } // A pointer from a profile Sample to a trace Span. @@ -502,8 +502,16 @@ message ValueType { // indicator of a higher level request being handled etc. message Sample { // The indices recorded here correspond to locations in Profile.location. - // The leaf is at location_index[0]. [deprecated] + // The leaf is at location_index[0]. [deprecated, superseded by locations_start_index / locations_length] repeated uint64 location_index = 1; + // locations_start_index along with locations_length refers to to a slice of locations in Profile.location. + // Supersedes location_index. + uint64 locations_start_index = 7; + // locations_length along with locations_start_index refers to a slice of locations in Profile.location. + // Supersedes location_index. + uint64 locations_length = 8; + // A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] + uint32 stacktrace_id_index = 9; // 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. @@ -521,27 +529,18 @@ message Sample { // name on a sample. Again, possible to express, but should not be used. // [deprecated, superseded by attributes] repeated Label label = 3; - - // locations_start_index along with locations_length refers to to a slice of locations in Profile.location. Supersedes location_index. - uint64 locations_start_index = 4; - - // locations_length along with locations_start_index refers to a slice of locations in Profile.location. Supersedes location_index. - uint64 locations_length = 5; - - // Timestamps associated with Sample represented in ms. These timestamps are expected to fall within the Profile's time range. [optional] - repeated uint64 timestamps = 6; - // References to attributes in Profile.attribute_table. [optional] - repeated uint64 attributes = 7; + repeated uint64 attributes = 10; // References to attribute units in Profile.string_table. Each number in this array MUST have a matching attribute reference in attributes array. [optional] - repeated uint64 attribute_units = 8; + repeated uint64 attribute_units = 11; // References to links in Profile.link_table. [optional] - repeated uint64 links = 9; + repeated uint64 links = 12; - // A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] - uint32 stacktrace_id_index = 10; + // Timestamps associated with Sample represented in ms. These timestamps are expected + // to fall within the Profile's time range. [optional] + repeated uint64 timestamps = 13; } // Provides additional context for a sample, @@ -563,11 +562,14 @@ message Label { int64 num_unit = 4; // Index into string table } -// Indicates the type of build ID, either from the linker or a binary hash. +// Indicates the semantics of the build_id field. enum BuildIdKind { - // BUILD_ID_LINKER indicates that the build id is linker-provided (usually GNU build ID) + // Linker-generated build ID, stored in the ELF binary notes. BUILD_ID_LINKER = 0; - // BUILD_ID_BINARY_HASH indicates that the build id is a hash of the binary. + // Build ID based on the content hash of the binary. Currently no particular + // hashing approach is standardized, so a given producer needs to define it + // themselves and thus unlike BUILD_ID_LINKER this kind of hash is producer-specific. + // We may choose to provide a standardized stable hash recommendation later. BUILD_ID_BINARY_HASH = 1; } @@ -590,18 +592,15 @@ message Mapping { // with high probability. E.g., for binaries generated by GNU tools, // it could be the contents of the .note.gnu.build-id field. int64 build_id = 6; // Index into string table - + // Specifies the kind of build id. See BuildIdKind enum for more details [optional] + BuildIdKind build_id_kind = 11; + // References to attributes in Profile.attribute_table. [optional] + repeated uint64 attributes = 12; // The following fields indicate the resolution of symbolic info. bool has_functions = 7; bool has_filenames = 8; bool has_line_numbers = 9; bool has_inline_frames = 10; - - // Specifies the kind of build id. See BuildIdKind enum for more detaiks [optional] - BuildIdKind build_id_kind = 11; - - // References to attributes in Profile.attribute_table. [optional] - repeated uint64 attributes = 12; } // Describes function and line table debug information. @@ -833,14 +832,23 @@ into that address range. mapping[0] will be the main binary. Locations referenced by samples via location_indices. +##### Field `location_indices` + +Array of locations referenced by samples. + ##### Field `function` Functions referenced by locations. -##### Field `string_table` +##### Field `attribute_table` A common table for strings referenced by various messages. string_table[0] must always be "". +Lookup table for attributes. + +##### Field `link_table` + +Lookup table for links. ##### Field `drop_frames` @@ -886,18 +894,6 @@ is cleaned. 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. - -##### Field `location_indices` - -Array of locations referenced by samples. - -##### Field `attribute_table` - -Lookup table for attributes. - -##### Field `link_table` - -Lookup table for links.
#### Message `ValueType` @@ -929,7 +925,21 @@ indicator of a higher level request being handled etc. ##### Field `location_index` The indices recorded here correspond to locations in Profile.location. -The leaf is at location_index[0]. [deprecated] +The leaf is at location_index[0]. [deprecated, superseded by locations_start_index / locations_length] + +##### Field `locations_start_index` + +locations_start_index along with locations_length refers to to a slice of locations in Profile.location. +Supersedes location_index. + +##### Field `locations_length` + +locations_length along with locations_start_index refers to a slice of locations in Profile.location. +Supersedes location_index. + +##### Field `stacktrace_id_index` + +A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] ##### Field `value` @@ -951,18 +961,6 @@ discouraged case is having a string label and a numeric label of the same name on a sample. Again, possible to express, but should not be used. [deprecated, superseded by attributes] -##### Field `locations_start_index` - -locations_start_index along with locations_length refers to to a slice of locations in Profile.location. Supersedes location_index. - -##### Field `locations_length` - -locations_length along with locations_start_index refers to a slice of locations in Profile.location. Supersedes location_index. - -##### Field `timestamps` - -Timestamps associated with Sample represented in ms. These timestamps are expected to fall within the Profile's time range. [optional] - ##### Field `attributes` References to attributes in Profile.attribute_table. [optional] @@ -975,9 +973,10 @@ References to attribute units in Profile.string_table. Each number in this array References to links in Profile.link_table. [optional] -##### Field `stacktrace_id_index` +##### Field `timestamps` -A 128bit id that uniquely identifies this stacktrace, globally. Index into string table. [optional] +Timestamps associated with Sample represented in ms. These timestamps are expected +to fall within the Profile's time range. [optional]
#### Message `Link` @@ -1103,18 +1102,18 @@ A string that uniquely identifies a particular program version with high probability. E.g., for binaries generated by GNU tools, it could be the contents of the .note.gnu.build-id field. -##### Field `has_functions` - -Index into string table -The following fields indicate the resolution of symbolic info. - ##### Field `build_id_kind` -Specifies the kind of build id. See BuildIdKind enum for more detaiks [optional] +Index into string table +Specifies the kind of build id. See BuildIdKind enum for more details [optional] ##### Field `attributes` References to attributes in Profile.attribute_table. [optional] + +##### Field `has_functions` + +The following fields indicate the resolution of symbolic info.