// Copyright 2016 Google Inc.
//
// 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 google.logging.v2;

import "google.golang.org/genproto/googleapis/api/serviceconfig/annotations.proto"; // from google/api/annotations.proto
import "google.golang.org/genproto/googleapis/api/monitoredres/monitored_resource.proto"; // from google/api/monitored_resource.proto
import "google.golang.org/genproto/googleapis/logging/v2/log_entry.proto"; // from google/logging/v2/log_entry.proto
import "github.com/golang/protobuf/ptypes/duration/duration.proto"; // from google/protobuf/duration.proto
import "github.com/golang/protobuf/ptypes/empty/empty.proto"; // from google/protobuf/empty.proto
import "github.com/golang/protobuf/ptypes/timestamp/timestamp.proto"; // from google/protobuf/timestamp.proto
import "google.golang.org/genproto/googleapis/rpc/status/status.proto"; // from google/rpc/status.proto

option cc_enable_arenas = true;
option java_multiple_files = true;
option java_outer_classname = "LoggingProto";
option java_package = "com.google.logging.v2";

option go_package = "google.golang.org/genproto/googleapis/logging/v2";

// Service for ingesting and querying logs.
service LoggingServiceV2 {
  // Deletes a log and all its log entries.
  // The log will reappear if it receives new entries.
  rpc DeleteLog(DeleteLogRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v2beta1/{log_name=projects/*/logs/*}" };
  }

  // Writes log entries to Stackdriver Logging.  All log entries are
  // written by this method.
  rpc WriteLogEntries(WriteLogEntriesRequest) returns (WriteLogEntriesResponse) {
    option (google.api.http) = { post: "/v2/entries:write" body: "*" };
  }

  // Lists log entries.  Use this method to retrieve log entries from Cloud
  // Logging.  For ways to export log entries, see
  // [Exporting Logs](/logging/docs/export).
  rpc ListLogEntries(ListLogEntriesRequest) returns (ListLogEntriesResponse) {
    option (google.api.http) = { post: "/v2/entries:list" body: "*" };
  }

  // Lists the monitored resource descriptors used by Stackdriver Logging.
  rpc ListMonitoredResourceDescriptors(ListMonitoredResourceDescriptorsRequest) returns (ListMonitoredResourceDescriptorsResponse) {
    option (google.api.http) = { get: "/v2/monitoredResourceDescriptors" };
  }
}

// The parameters to DeleteLog.
message DeleteLogRequest {
  // Required. The resource name of the log to delete.  Example:
  // `"projects/my-project/logs/syslog"`.
  string log_name = 1;
}

// The parameters to WriteLogEntries.
message WriteLogEntriesRequest {
  // Optional. A default log resource name that is assigned to all log entries
  // in `entries` that do not specify a value for `log_name`.  Example:
  // `"projects/my-project/logs/syslog"`.  See
  // [LogEntry][google.logging.v2.LogEntry].
  string log_name = 1;

  // Optional. A default monitored resource object that is assigned to all log
  // entries in `entries` that do not specify a value for `resource`. Example:
  //
  //     { "type": "gce_instance",
  //       "labels": {
  //         "zone": "us-central1-a", "instance_id": "00000000000000000000" }}
  //
  // See [LogEntry][google.logging.v2.LogEntry].
  google.api.MonitoredResource resource = 2;

  // Optional. Default labels that are added to the `labels` field of all log
  // entries in `entries`. If a log entry already has a label with the same key
  // as a label in this parameter, then the log entry's label is not changed.
  // See [LogEntry][google.logging.v2.LogEntry].
  map<string, string> labels = 3;

  // Required. The log entries to write. Values supplied for the fields
  // `log_name`, `resource`, and `labels` in this `entries.write` request are
  // added to those log entries that do not provide their own values for the
  // fields.
  //
  // To improve throughput and to avoid exceeding the
  // [quota limit](/logging/quota-policy) for calls to `entries.write`,
  // you should write multiple log entries at once rather than
  // calling this method for each individual log entry.
  repeated LogEntry entries = 4;

  // Optional. Whether valid entries should be written even if some other
  // entries fail due to INVALID_ARGUMENT or PERMISSION_DENIED errors. If any
  // entry is not written, the response status will be the error associated
  // with one of the failed entries and include error details in the form of
  // WriteLogEntriesPartialErrors.
  bool partial_success = 5;
}

// Result returned from WriteLogEntries.
// empty
message WriteLogEntriesResponse {

}

// The parameters to `ListLogEntries`.
message ListLogEntriesRequest {
  // Deprecated. One or more project identifiers or project numbers from which
  // to retrieve log entries.  Examples: `"my-project-1A"`, `"1234567890"`. If
  // present, these project identifiers are converted to resource format and
  // added to the list of resources in `resourceNames`. Callers should use
  // `resourceNames` rather than this parameter.
  repeated string project_ids = 1;

  // Optional. One or more cloud resources from which to retrieve log entries.
  // Example: `"projects/my-project-1A"`, `"projects/1234567890"`.  Projects
  // listed in `projectIds` are added to this list.
  repeated string resource_names = 8;

  // Optional. A filter that chooses which log entries to return.  See [Advanced
  // Logs Filters](/logging/docs/view/advanced_filters).  Only log entries that
  // match the filter are returned.  An empty filter matches all log entries.
  string filter = 2;

  // Optional. How the results should be sorted.  Presently, the only permitted
  // values are `"timestamp asc"` (default) and `"timestamp desc"`. The first
  // option returns entries in order of increasing values of
  // `LogEntry.timestamp` (oldest first), and the second option returns entries
  // in order of decreasing timestamps (newest first).  Entries with equal
  // timestamps are returned in order of `LogEntry.insertId`.
  string order_by = 3;

  // Optional. The maximum number of results to return from this request.
  // Non-positive values are ignored.  The presence of `nextPageToken` in the
  // response indicates that more results might be available.
  int32 page_size = 4;

  // Optional. If present, then retrieve the next batch of results from the
  // preceding call to this method.  `pageToken` must be the value of
  // `nextPageToken` from the previous response.  The values of other method
  // parameters should be identical to those in the previous call.
  string page_token = 5;
}

// Result returned from `ListLogEntries`.
message ListLogEntriesResponse {
  // A list of log entries.
  repeated LogEntry entries = 1;

  // If there might be more results than appear in this response, then
  // `nextPageToken` is included.  To get the next set of results, call this
  // method again using the value of `nextPageToken` as `pageToken`.
  string next_page_token = 2;
}

// The parameters to ListMonitoredResourceDescriptors
message ListMonitoredResourceDescriptorsRequest {
  // Optional. The maximum number of results to return from this request.
  // Non-positive values are ignored.  The presence of `nextPageToken` in the
  // response indicates that more results might be available.
  int32 page_size = 1;

  // Optional. If present, then retrieve the next batch of results from the
  // preceding call to this method.  `pageToken` must be the value of
  // `nextPageToken` from the previous response.  The values of other method
  // parameters should be identical to those in the previous call.
  string page_token = 2;
}

// Result returned from ListMonitoredResourceDescriptors.
message ListMonitoredResourceDescriptorsResponse {
  // A list of resource descriptors.
  repeated google.api.MonitoredResourceDescriptor resource_descriptors = 1;

  // If there might be more results than appear in this response, then
  // `nextPageToken` is included.  To get the next set of results, call this
  // method again using the value of `nextPageToken` as `pageToken`.
  string next_page_token = 2;
}
