/*
 * 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 = "proto3";

option java_multiple_files = true;
option java_package = "org.apache.skywalking.apm.network.language.agent";
option csharp_namespace = "SkyWalking.NetworkProtocol";

import "Common.proto";
import "Downstream.proto";
import "KeyWithStringValue.proto";

service TraceSegmentService {
    rpc collect (stream UpstreamSegment) returns (Downstream) {
    }
}

message UpstreamSegment {
    repeated UniqueId globalTraceIds = 1;
    bytes segment = 2; // the byte array of TraceSegmentObject
}

message UniqueId {
    repeated int64 idParts = 1;
}

message TraceSegmentObject {
    UniqueId traceSegmentId = 1;
    repeated SpanObject spans = 2;
    int32 applicationId = 3;
    int32 applicationInstanceId = 4;
    bool isSizeLimited = 5;
}

message TraceSegmentReference {
    RefType refType = 1;
    UniqueId parentTraceSegmentId = 2;
    int32 parentSpanId = 3;
    int32 parentApplicationInstanceId = 4;
    string networkAddress = 5;
    int32 networkAddressId = 6;
    int32 entryApplicationInstanceId = 7;
    string entryServiceName = 8;
    int32 entryServiceId = 9;
    string parentServiceName = 10;
    int32 parentServiceId = 11;
}

message SpanObject {
    int32 spanId = 1;
    int32 parentSpanId = 2;
    int64 startTime = 3;
    int64 endTime = 4;
    repeated TraceSegmentReference refs = 5;
    int32 operationNameId = 6;
    string operationName = 7;
    int32 peerId = 8;
    string peer = 9;
    SpanType spanType = 10;
    SpanLayer spanLayer = 11;
    int32 componentId = 12;
    string component = 13;
    bool isError = 14;
    repeated KeyWithStringValue tags = 15;
    repeated LogMessage logs = 16;
}

enum RefType {
    CrossProcess = 0;
    CrossThread = 1;
}

enum SpanLayer {
    Unknown = 0;
    Database = 1;
    RPCFramework = 2;
    Http = 3;
    MQ = 4;
    Cache = 5;
}

message LogMessage {
    int64 time = 1;
    repeated KeyWithStringValue data = 2;
}
