// 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.v1experimental; import "opentelemetry/proto/common/v1/common.proto"; import "opentelemetry/proto/resource/v1/resource.proto"; import "opentelemetry/proto/profiles/v1experimental/pprofextended.proto"; option csharp_namespace = "OpenTelemetry.Proto.Profiles.V1Experimental"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.profiles.v1experimental"; option java_outer_classname = "ProfilesProto"; option go_package = "go.opentelemetry.io/proto/otlp/profiles/v1experimental"; // Relationships Diagram // // ┌──────────────────┐ LEGEND // │ ProfilesData │ // └──────────────────┘ ─────▶ embedded // │ // │ 1-n ─────▷ referenced by index // ▼ // ┌──────────────────┐ // │ ResourceProfiles │ // └──────────────────┘ // │ // │ 1-n // ▼ // ┌──────────────────┐ // │ ScopeProfiles │ // └──────────────────┘ // │ // │ 1-n // ▼ // ┌──────────────────┐ // │ ProfileContainer │ // └──────────────────┘ // │ // │ 1-1 // ▼ // ┌──────────────────┐ // │ Profile │ // └──────────────────┘ // │ n-1 // │ 1-n ┌───────────────────────────────────────┐ // ▼ │ ▽ // ┌──────────────────┐ 1-n ┌──────────────┐ ┌──────────┐ // │ Sample │ ──────▷ │ KeyValue │ │ Link │ // └──────────────────┘ └──────────────┘ └──────────┘ // │ 1-n △ △ // │ 1-n ┌─────────────────┘ │ 1-n // ▽ │ │ // ┌──────────────────┐ n-1 ┌──────────────┐ // │ Location │ ──────▷ │ Mapping │ // └──────────────────┘ └──────────────┘ // │ // │ 1-n // ▼ // ┌──────────────────┐ // │ Line │ // └──────────────────┘ // │ // │ 1-1 // ▽ // ┌──────────────────┐ // │ Function │ // └──────────────────┘ // // ProfilesData represents the profiles data that can be stored in persistent storage, // OR can be embedded by other protocols that transfer OTLP profiles data but do not // implement the OTLP protocol. // // The main difference between this message and collector protocol is that // in this message there will not be any "control" or "metadata" specific to // OTLP protocol. // // When new fields are added into this message, the OTLP request MUST be updated // as well. message ProfilesData { // An array of ResourceProfiles. // For data coming from a single resource this array will typically contain // one element. Intermediary nodes that receive data from multiple origins // typically batch the data before forwarding further and in that case this // array will contain multiple elements. repeated ResourceProfiles resource_profiles = 1; } // A collection of ScopeProfiles from a Resource. message ResourceProfiles { reserved 1000; // The resource for the profiles in this message. // If this field is not set then no resource info is known. opentelemetry.proto.resource.v1.Resource resource = 1; // A list of ScopeProfiles that originate from a resource. repeated ScopeProfiles scope_profiles = 2; // The Schema URL, if known. This is the identifier of the Schema that the resource data // is recorded in. To learn more about Schema URL see // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url // This schema_url applies to the data in the "resource" field. It does not apply // to the data in the "scope_profiles" field which have their own schema_url field. string schema_url = 3; } // A collection of ProfileContainers 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 ProfileContainers that originate from an instrumentation scope. repeated ProfileContainer profiles = 2; // The Schema URL, if known. This is the identifier of the Schema that the metric data // is recorded in. To learn more about Schema URL see // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url // This schema_url applies to all profiles in the "profiles" field. string schema_url = 3; } // A ProfileContainer represents a single profile. It wraps pprof profile with OpenTelemetry specific metadata. message ProfileContainer { // A globally unique identifier for a profile. The ID is a 16-byte array. An ID with // all zeroes is considered invalid. // // This field is required. bytes profile_id = 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. 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 = 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; // Specifies format of the original payload. Common values are defined in semantic conventions. [required if original_payload is present] string original_payload_format = 6; // 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; // This is a reference to a pprof profile. Required, even when original_payload is present. opentelemetry.proto.profiles.v1experimental.Profile profile = 8; }