// Copyright 2018 The Bazel Authors. All rights reserved.
//
// 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 remote_logging;

import "google/protobuf/timestamp.proto";
import "google/bytestream/bytestream.proto";
import "google/devtools/remoteexecution/v1test/remote_execution.proto";
import "google/longrunning/operations.proto";
import "google/rpc/status.proto";
import "google/watcher/v1/watch.proto";

option java_package = "com.google.devtools.build.lib.remote.logging";

// A single log entry for gRPC calls related to remote execution.
message LogEntry {
  // Request metadata included in call.
  google.devtools.remoteexecution.v1test.RequestMetadata metadata = 1;

  // Status of the call on close.
  google.rpc.Status status = 2;

  // Full method name of the method called as returned from
  // io.grpc.MethodDescriptor.getFullMethodName() (i.e. in format
  // $FULL_SERVICE_NAME/$METHOD_NAME).
  string method_name = 3;

  // Method specific details for this call.
  RpcCallDetails details = 4;

  // Time the call started.
  google.protobuf.Timestamp start_time = 5;

  // Time the call closed.
  google.protobuf.Timestamp end_time = 6;
}

// Details for a call to
// google.devtools.remoteexecution.v1test.Execution.Execute.
message ExecuteDetails {
  // The google.devtools.remoteexecution.v1test.ExecuteRequest sent by the
  // call.
  google.devtools.remoteexecution.v1test.ExecuteRequest request = 1;

  // The google.longrunning.Operation received by the Execute call.
  google.longrunning.Operation response = 2;
}

// Details for a call to
// google.devtools.remoteexecution.v1test.ActionCache.GetActionResult.
message GetActionResultDetails {
  // The google.devtools.remoteexecution.v1test.GetActionResultRequest sent by
  // the call.
  google.devtools.remoteexecution.v1test.GetActionResultRequest request = 1;

  // The received google.devtools.remoteexecution.v1test.ActionResult.
  google.devtools.remoteexecution.v1test.ActionResult response = 2;
}

// Details for a call to google.watcher.v1.Watch.
message WatchDetails {
  // The google.watcher.v1.Request sent by the Watch call.
  google.watcher.v1.Request request = 1;

  // Each google.watcher.v1.ChangeBatch response received from the
  // Watch call in order.
  repeated google.watcher.v1.ChangeBatch responses = 2;
}

// Details for a call to
// google.devtools.remoteexecution.v1test.ContentAddressableStorage.FindMissingBlobs.
message FindMissingBlobsDetails {
  // The google.devtools.remoteexecution.v1test.FindMissingBlobsRequest request
  // sent.
  google.devtools.remoteexecution.v1test.FindMissingBlobsRequest request = 1;

  // The google.devtools.remoteexecution.v1test.FindMissingBlobsResponse
  // received.
  google.devtools.remoteexecution.v1test.FindMissingBlobsResponse response = 2;
}

// Details for a call to google.bytestream.Read.
message ReadDetails {
  // The google.bytestream.ReadRequest sent.
  google.bytestream.ReadRequest request = 1;

  // The number of reads performed in this call.
  int64 num_reads = 2;

  // The total number of bytes read totalled over all stream responses.
  int64 bytes_read = 3;
}

// Details for a call to google.bytestream.Write.
message WriteDetails {
  // The names of resources requested to be written to in this call in the order
  // they were first requested in. If the ByteStream protocol is followed
  // according to specification, this should only contain have a single element,
  // which is the resource name specified in the first message of the stream.
  repeated string resource_names = 1;

  // The number of writes performed in this call.
  int64 num_writes = 2;

  // The total number of bytes sent over the stream.
  int64 bytes_sent = 3;

  // The received google.bytestream.WriteResponse.
  google.bytestream.WriteResponse response = 4;
}

// Contains details for specific types of calls.
message RpcCallDetails {
  oneof details {
    ExecuteDetails execute = 1;
    GetActionResultDetails get_action_result = 2;
    WatchDetails watch = 3;
    FindMissingBlobsDetails find_missing_blobs = 4;
    ReadDetails read = 5;
    WriteDetails write = 6;
  }
}
