// Copyright 2016 Google Inc. // // 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 google.tracing.v1; import "google/api/annotations.proto"; import "google/protobuf/timestamp.proto"; import "google/rpc/status.proto"; option go_package = "google.golang.org/genproto/googleapis/tracing/v1;tracing"; option java_multiple_files = true; option java_outer_classname = "TraceProto"; option java_package = "com.google.tracing.v1"; // A TraceId uniquely identifies a Trace. It is conceptually a 128-bit value, // represented as a string, containing the hex-encoded value. message TraceId { // Trace ID specified as a hex-encoded string. *Must* be 32 bytes long. string hex_encoded = 1; } message Module { // Binary module. // E.g. main binary, kernel modules, and dynamic libraries // such as libc.so, sharedlib.so string module = 1; // Build_id is a unique identifier for the module, // probably a hash of its contents string build_id = 2; } message StackTrace { // Presents a single stack frame in a stack trace. message StackFrame { // Fully qualified names which uniquely identify function/method/etc. string function_name = 1; // Used when function name is ‘mangled’. Not guaranteed to be fully // qualified but usually it is. string orig_function_name = 2; // File name of the frame. string file_name = 3; // Line number of the frame. int64 line_number = 4; // Column number is important in JavaScript(anonymous functions), // Might not be available in some languages. int64 column_number = 5; // Binary module the code is loaded from. Module load_module = 6; // source_version is deployment specific. It might be // better to be stored in deployment metadata. // However, in distributed tracing, it’s hard to keep track of // source/binary versions at one place for all spans. string source_version = 7; } // Stack frames of this stack trace. repeated StackFrame stack_frame = 1; // User can choose to use his own hash function to hash large labels to save // network bandwidth and storage. // Typical usage is to pass both initially to inform the storage of the // mapping. And in subsequent calls, pass in stack_trace_hash_id only. // User shall verify the hash value is successfully stored. uint64 stack_trace_hash_id = 2; } // Allowed label values. message LabelValue { // The value of the label. oneof value { // A string value. string string_value = 1; // An integer value. int64 int_value = 2; // A boolean value. bool bool_value = 3; } } // A span represents a single operation within a trace. Spans can be nested // and form a trace tree. Often, a trace contains a root span that describes the // end-to-end latency and, optionally, one or more subspans for // its sub-operations. Spans do not need to be contiguous. There may be gaps // between spans in a trace. message Span { // A time-stamped annotation in the Span. message TimeEvent { // Text annotation with a set of labels. message Annotation { // A user-supplied message describing the event. string description = 1; // A set of labels on the annotation. map labels = 2; } // An event describing an RPC message sent/received on the network. message NetworkEvent { // The type of the network event. SENT or RECV event. enum Type { UNSPECIFIED = 0; SENT = 1; RECV = 2; } // If available, this is the kernel time: // For sent messages, this is the time at which the first bit was sent. // For received messages, this is the time at which the last bit was // received. google.protobuf.Timestamp kernel_time = 1; Type type = 2; // Every message has an identifier, that must be different from all the // network messages in this span. // This is very important when the request/response are streamed. uint64 message_id = 3; // Number of bytes send/receive. uint64 message_size = 4; } // The local machine absolute timestamp when this event happened. google.protobuf.Timestamp local_time = 1; oneof value { // Optional field for user supplied map Annotation annotation = 2; // Optional field that can be used only for network events. NetworkEvent network_event = 3; } } // Link one span with another which may be in a different Trace. Used (for // example) in batching operations, where a single batch handler processes // multiple requests from different traces. message Link { // The type of the link. enum Type { UNSPECIFIED = 0; CHILD = 1; PARENT = 2; } // The trace and span identifier of the linked span. TraceId trace_id = 1; fixed64 span_id = 2; Type type = 3; } // Identifier for the span. Must be a 64-bit integer other than 0 and // unique within a trace. fixed64 id = 1; // Name of the span. The span name is sanitized and displayed in the // Stackdriver Trace tool in the {% dynamic print site_values.console_name %}. // The name may be a method name or some other per-call site name. // For the same executable and the same call point, a best practice is // to use a consistent name, which makes it easier to correlate // cross-trace spans. string name = 2; // ID of parent span. 0 or missing if this is a root span. fixed64 parent_id = 3; // Local machine clock in nanoseconds from the UNIX epoch, // at which span execution started. // On the server side these are the times when the server application // handler starts running. google.protobuf.Timestamp local_start_time = 4; // Local machine clock in nanoseconds from the UNIX epoch, // at which span execution ended. // On the server side these are the times when the server application // handler finishes running. google.protobuf.Timestamp local_end_time = 5; // Properties of a span. Labels at the span level. // E.g. // "/instance_id": "my-instance" // "/zone": "us-central1-a" // "/grpc/peer_address": "ip:port" (dns, etc.) // "/grpc/deadline": "Duration" // "/http/user_agent" // "/http/request_bytes": 300 // "/http/response_bytes": 1200 // "/http/url": google.com/apis // "/pid" // "abc.com/mylabel": "my label value" map labels = 6; // Stack trace captured at the start of the span. This is optional. StackTrace stack_trace = 7; // A collection of time-stamped events. repeated TimeEvent time_events = 8; // A collection of links. repeated Link links = 9; // The final status of the Span. This is optional. google.rpc.Status status = 10; // True if this Span has a remote parent (is an RPC server Span). bool has_remote_parent = 11; } // A trace describes how long it takes for an application to perform some // operations. It consists of a tree of spans, each of which contains details // about an operation with time information and operation details. message Trace { // Globally unique identifier for the trace. Common to all the spans. TraceId trace_id = 1; // Collection of spans in the trace. The root span has parent_id == 0. repeated Span spans = 2; }