/*
 * 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 "language-agent/Downstream.proto";
import "language-agent/KeyWithStringValue.proto";
import "common/trace-common.proto";

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

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;
}

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