/*
 * 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.profile";
option csharp_namespace = "SkyWalking.NetworkProtocol";

import "common/common.proto";
import "common/trace-common.proto";
import "language-agent/Downstream.proto";

service ProfileTask {

    // query all sniffer need to execute profile task commands
    rpc getProfileTaskCommands (ProfileTaskCommandQuery) returns (Commands) {
    }

    // collect dumped segment snapshot
    rpc collectSnapshot (stream ProfileTaskSegemntSnapshot) returns (Downstream) {
    }

    // report profiling task finished
    rpc reportTaskFinish (ProfileTaskFinishReport) returns (Downstream) {
    }

}

message ProfileTaskCommandQuery {
    // current sniffer information
    int32 serviceId = 1;
    int32 instanceId = 2;

    // last commmand timestamp
    int64 lastCommandTime = 3;
}

// dumped segment snapshot
message ProfileTaskSegemntSnapshot {
    // profile task id
    string taskId = 1;
    // dumped segment id
    UniqueId traceSegmentId = 2;
    // dump timestamp
    int64 time = 3;
    // snapshot dump sequence, start with zero
    int32 sequence = 4;
    // snapshot stack
    ProfileTaskSegmentStack stack = 5;
}

message ProfileTaskSegmentStack {
    // snapshot code signature list
    repeated string codeSignatures = 1;
}

// profile task finished report
message ProfileTaskFinishReport {
    // current sniffer information
    int32 serviceId = 1;
    int32 instanceId = 2;

    // profile task
    string taskId = 3;
}