// Copyright 2017, OpenCensus 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 opencensus.proto.trace.v1; import "opencensus/proto/resource/v1/resource.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; option java_multiple_files = true; option java_package = "io.opencensus.proto.trace.v1"; option java_outer_classname = "TraceProto"; option go_package = "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"; option ruby_package = "OpenCensus.Proto.Trace.V1"; // A span represents a single operation within a trace. Spans can be // nested to form a trace tree. Spans may also be linked to other spans // from the same or different trace. And form graphs. Often, a trace // contains a root span that describes the end-to-end latency, and one // or more subspans for its sub-operations. A trace can also contain // multiple root spans, or none at all. Spans do not need to be // contiguous - there may be gaps or overlaps between spans in a trace. // // The next id is 17. // TODO(bdrutu): Add an example. message Span { // A unique identifier for a trace. All spans from the same trace share // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes // is considered invalid. // // This field is semantically required. Receiver should generate new // random trace_id if empty or invalid trace_id was received. // // This field is required. bytes trace_id = 1; // A unique identifier for a span within a trace, assigned when the span // is created. The ID is an 8-byte array. An ID with all zeroes is considered // invalid. // // This field is semantically required. Receiver should generate new // random span_id if empty or invalid span_id was received. // // This field is required. bytes span_id = 2; // This field conveys information about request position in multiple distributed tracing graphs. // It is a list of Tracestate.Entry with a maximum of 32 members in the list. // // See the https://github.com/w3c/distributed-tracing for more details about this field. message Tracestate { message Entry { // The key must begin with a lowercase letter, and can only contain // lowercase letters 'a'-'z', digits '0'-'9', underscores '_', dashes // '-', asterisks '*', and forward slashes '/'. string key = 1; // The value is opaque string up to 256 characters printable ASCII // RFC0020 characters (i.e., the range 0x20 to 0x7E) except ',' and '='. // Note that this also excludes tabs, newlines, carriage returns, etc. string value = 2; } // A list of entries that represent the Tracestate. repeated Entry entries = 1; } // The Tracestate on the span. Tracestate tracestate = 15; // The `span_id` of this span's parent span. If this is a root span, then this // field must be empty. The ID is an 8-byte array. bytes parent_span_id = 3; // A description of the span's operation. // // For example, the name can be a qualified method name or a file name // and a line number where the operation is called. A best practice is to use // the same display name at the same call point in an application. // This makes it easier to correlate spans in different traces. // // This field is semantically required to be set to non-empty string. // When null or empty string received - receiver may use string "name" // as a replacement. There might be smarted algorithms implemented by // receiver to fix the empty span name. // // This field is required. TruncatableString name = 4; // Type of span. Can be used to specify additional relationships between spans // in addition to a parent/child relationship. enum SpanKind { // Unspecified. SPAN_KIND_UNSPECIFIED = 0; // Indicates that the span covers server-side handling of an RPC or other // remote network request. SERVER = 1; // Indicates that the span covers the client-side wrapper around an RPC or // other remote request. CLIENT = 2; } // Distinguishes between spans generated in a particular context. For example, // two spans with the same name may be distinguished using `CLIENT` (caller) // and `SERVER` (callee) to identify queueing latency associated with the span. SpanKind kind = 14; // The start time of the span. On the client side, this is the time kept by // the local machine where the span execution starts. On the server side, this // is the time when the server's application handler starts running. // // This field is semantically required. When not set on receive - // receiver should set it to the value of end_time field if it was // set. Or to the current time if neither was set. It is important to // keep end_time > start_time for consistency. // // This field is required. google.protobuf.Timestamp start_time = 5; // The end time of the span. On the client side, this is the time kept by // the local machine where the span execution ends. On the server side, this // is the time when the server application handler stops running. // // This field is semantically required. When not set on receive - // receiver should set it to start_time value. It is important to // keep end_time > start_time for consistency. // // This field is required. google.protobuf.Timestamp end_time = 6; // A set of attributes, each with a key and a value. message Attributes { // The set of attributes. The value can be a string, an integer, a double // or the Boolean values `true` or `false`. Note, global attributes like // server name can be set as tags using 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 map attribute_map = 1; // 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. int32 dropped_attributes_count = 2; } // A set of attributes on the span. Attributes attributes = 7; // A stack trace captured at the start of the span. StackTrace stack_trace = 8; // A time-stamped annotation or message event in the Span. message TimeEvent { // The time the event occurred. google.protobuf.Timestamp time = 1; // A text annotation with a set of attributes. message Annotation { // A user-supplied message describing the event. TruncatableString description = 1; // A set of attributes on the annotation. Attributes attributes = 2; } // An event describing a message sent/received between Spans. message MessageEvent { // Indicates whether the message was sent or received. enum Type { // Unknown event type. TYPE_UNSPECIFIED = 0; // Indicates a sent message. SENT = 1; // Indicates a received message. RECEIVED = 2; } // The type of MessageEvent. Indicates whether the message was sent or // received. Type type = 1; // An identifier for the MessageEvent's message that can be used to match // SENT and RECEIVED MessageEvents. For example, this field could // represent a sequence ID for a streaming RPC. It is recommended to be // unique within a Span. uint64 id = 2; // The number of uncompressed bytes sent or received. uint64 uncompressed_size = 3; // The number of compressed bytes sent or received. If zero, assumed to // be the same size as uncompressed. uint64 compressed_size = 4; } // A `TimeEvent` can contain either an `Annotation` object or a // `MessageEvent` object, but not both. oneof value { // A text annotation with a set of attributes. Annotation annotation = 2; // An event describing a message sent/received between Spans. MessageEvent message_event = 3; } } // A collection of `TimeEvent`s. A `TimeEvent` is a time-stamped annotation // on the span, consisting of either user-supplied key-value pairs, or // details of a message sent/received between Spans. message TimeEvents { // A collection of `TimeEvent`s. repeated TimeEvent time_event = 1; // The number of dropped annotations in all the included time events. // If the value is 0, then no annotations were dropped. int32 dropped_annotations_count = 2; // The number of dropped message events in all the included time events. // If the value is 0, then no message events were dropped. int32 dropped_message_events_count = 3; } // The included time events. TimeEvents time_events = 9; // A pointer from the current span to another span in the same trace or in a // different trace. For example, this can be used in batching operations, // where a single batch handler processes multiple requests from different // traces or when the handler receives a request from a different project. 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; // The relationship of the current span relative to the linked span: child, // parent, or unspecified. enum Type { // The relationship of the two spans is unknown, or known but other // than parent-child. TYPE_UNSPECIFIED = 0; // The linked span is a child of the current span. CHILD_LINKED_SPAN = 1; // The linked span is a parent of the current span. PARENT_LINKED_SPAN = 2; } // The relationship of the current span relative to the linked span. Type type = 3; // A set of attributes on the link. Attributes attributes = 4; // The Tracestate associated with the link. Tracestate tracestate = 5; } // A collection of links, which are references from this span to a span // in the same or different trace. message Links { // A collection of links. repeated Link link = 1; // The number of dropped links after the maximum size was enforced. If // this value is 0, then no links were dropped. int32 dropped_links_count = 2; } // The included links. Links links = 10; // An optional final status for this span. Semantically when Status // wasn't set it is means span ended without errors and assume // Status.Ok (code = 0). Status status = 11; // An optional resource that is associated with this span. If not set, this span // should be part of a batch that does include the resource information, unless resource // information is unknown. opencensus.proto.resource.v1.Resource resource = 16; // A highly recommended but not required flag that identifies when a // trace crosses a process boundary. True when the parent_span belongs // to the same process as the current span. This flag is most commonly // used to indicate the need to adjust time as clocks in different // processes may not be synchronized. google.protobuf.BoolValue same_process_as_parent_span = 12; // An optional number of child spans that were generated while this span // was active. If set, allows an implementation to detect missing child spans. google.protobuf.UInt32Value child_span_count = 13; } // The `Status` type defines a logical error model that is suitable for different // programming environments, including REST APIs and RPC APIs. This proto's fields // are a subset of those of // [google.rpc.Status](https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto), // which is used by [gRPC](https://github.com/grpc). message Status { // The status code. This is optional field. It is safe to assume 0 (OK) // when not set. int32 code = 1; // A developer-facing error message, which should be in English. string message = 2; } // The value of an Attribute. message AttributeValue { // The type of the value. oneof value { // A string up to 256 bytes long. TruncatableString string_value = 1; // A 64-bit signed integer. int64 int_value = 2; // A Boolean value represented by `true` or `false`. bool bool_value = 3; // A double value. double double_value = 4; } } // The call stack which originated this span. message StackTrace { // A single stack frame in a stack trace. message StackFrame { // The fully-qualified name that uniquely identifies the function or // method that is active in this frame. TruncatableString function_name = 1; // An un-mangled function name, if `function_name` is // [mangled](http://www.avabodh.com/cxxin/namemangling.html). The name can // be fully qualified. TruncatableString original_function_name = 2; // The name of the source file where the function call appears. TruncatableString file_name = 3; // The line number in `file_name` where the function call appears. int64 line_number = 4; // The column number where the function call appears, if available. // This is important in JavaScript because of its anonymous functions. int64 column_number = 5; // The binary module from where the code was loaded. Module load_module = 6; // The version of the deployed source code. TruncatableString source_version = 7; } // A collection of stack frames, which can be truncated. message StackFrames { // Stack frames in this call stack. repeated StackFrame frame = 1; // The number of stack frames that were dropped because there // were too many stack frames. // If this value is 0, then no stack frames were dropped. int32 dropped_frames_count = 2; } // Stack frames in this stack trace. StackFrames stack_frames = 1; // The hash ID is used to conserve network bandwidth for duplicate // stack traces within a single trace. // // Often multiple spans will have identical stack traces. // The first occurrence of a stack trace should contain both // `stack_frames` and a value in `stack_trace_hash_id`. // // Subsequent spans within the same request can refer // to that stack trace by setting only `stack_trace_hash_id`. // // TODO: describe how to deal with the case where stack_trace_hash_id is // zero because it was not set. uint64 stack_trace_hash_id = 2; } // A description of a binary module. message Module { // TODO: document the meaning of this field. // For example: main binary, kernel modules, and dynamic libraries // such as libc.so, sharedlib.so. TruncatableString module = 1; // A unique identifier for the module, usually a hash of its // contents. TruncatableString build_id = 2; } // A string that might be shortened to a specified length. message TruncatableString { // The shortened string. For example, if the original string was 500 bytes long and // the limit of the string was 128 bytes, then this value contains the first 128 // bytes of the 500-byte string. Note that truncation always happens on a // character boundary, to ensure that a truncated string is still valid UTF-8. // Because it may contain multi-byte characters, the size of the truncated string // may be less than the truncation limit. string value = 1; // The number of bytes removed from the original string. If this // value is 0, then the string was not shortened. int32 truncated_byte_count = 2; }