// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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="proto2";
import "brpc/options.proto";

package brpc;
option java_package="com.brpc";
option java_outer_classname="Span";

enum SpanType {
    SPAN_TYPE_SERVER = 0;
    SPAN_TYPE_CLIENT = 1;
    SPAN_TYPE_BTHREAD = 2;
}

// We don't unify RpczSpan and TracingSpan as one because the former one needs
// to be as lightweight as possible, say `info' equals span_name + annotations
// in TracingSpan which needs heavier memory allocations.
message RpczSpan {
    required uint64 trace_id = 1;
    required uint64 span_id = 2;
    required uint64 parent_span_id = 3;
    optional uint64 log_id = 4;
    optional uint64 base_cid = 5;
    optional uint64 ending_cid = 6;
    // We don't use additional message for EndPoint to save a memory allocation.
    optional uint32 remote_ip = 7;
    optional uint32 remote_port = 8;
    optional SpanType type = 9;
    optional bool async = 10;
    optional ProtocolType protocol = 11;
    optional int32 error_code = 12;
    optional int32 request_size = 13;
    optional int32 response_size = 14;
    optional int64 received_real_us = 15;
    optional int64 start_parse_real_us = 16;
    optional int64 start_callback_real_us = 17;
    optional int64 start_send_real_us = 18;
    optional int64 sent_real_us = 19;
    optional bytes info = 20;
    repeated RpczSpan client_spans = 21;
    optional bytes full_method_name = 22;
}

message BriefSpan {
    required uint64 trace_id = 1;
    required uint64 span_id = 2;
    optional uint64 log_id = 3;
    optional SpanType type = 4;
    optional int32 error_code = 5;
    optional int32 request_size = 6;
    optional int32 response_size = 7;
    optional int64 start_real_us = 8;
    optional int64 latency_us = 9;
    optional bytes full_method_name = 10;
}

message SpanAnnotation {
    required int64 realtime_us = 1;
    required string content = 2;
}

message TracingSpan {
    required uint64 trace_id = 1;
    required uint64 span_id = 2;
    required uint64 parent_span_id = 3;
    optional uint64 log_id = 4;
    optional uint32 remote_ip = 5;
    optional uint32 remote_port = 6;
    optional SpanType type = 7;
    optional ProtocolType protocol = 8;
    optional int32 error_code = 9;
    optional int32 request_size = 10;
    optional int32 response_size = 11;
    optional int64 received_real_us = 12;
    optional int64 start_parse_real_us = 13;
    optional int64 start_callback_real_us = 14;
    optional int64 start_send_real_us = 15;
    optional int64 sent_real_us = 16;
    optional string span_name = 17;
    repeated SpanAnnotation annotations = 18;
    repeated TracingSpan client_spans = 19;
}
