// 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 "github.com/golang/protobuf/ptypes/empty/empty.proto"; // from google/protobuf/empty.proto

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

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

// Service for configuring logs-based metrics.
service MetricsServiceV2 {
  // Lists logs-based metrics.
  rpc ListLogMetrics(ListLogMetricsRequest) returns (ListLogMetricsResponse) {
    option (google.api.http) = { get: "/v2/{parent=projects/*}/metrics" };
  }

  // Gets a logs-based metric.
  rpc GetLogMetric(GetLogMetricRequest) returns (LogMetric) {
    option (google.api.http) = { get: "/v2/{metric_name=projects/*/metrics/*}" };
  }

  // Creates a logs-based metric.
  rpc CreateLogMetric(CreateLogMetricRequest) returns (LogMetric) {
    option (google.api.http) = { post: "/v2/{parent=projects/*}/metrics" body: "metric" };
  }

  // Creates or updates a logs-based metric.
  rpc UpdateLogMetric(UpdateLogMetricRequest) returns (LogMetric) {
    option (google.api.http) = { put: "/v2/{metric_name=projects/*/metrics/*}" body: "metric" };
  }

  // Deletes a logs-based metric.
  rpc DeleteLogMetric(DeleteLogMetricRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v2/{metric_name=projects/*/metrics/*}" };
  }
}

// Describes a logs-based metric.  The value of the metric is the
// number of log entries that match a logs filter.
message LogMetric {
  // Stackdriver Logging API version.
  enum ApiVersion {
    // Stackdriver Logging API v2.
    V2 = 0;

    // Stackdriver Logging API v1.
    V1 = 1;
  }

  // Required. The client-assigned metric identifier. Example:
  // `"severe_errors"`.  Metric identifiers are limited to 100
  // characters and can include only the following characters: `A-Z`,
  // `a-z`, `0-9`, and the special characters `_-.,+!*',()%/`.  The
  // forward-slash character (`/`) denotes a hierarchy of name pieces,
  // and it cannot be the first character of the name.  The '%' character
  // is used to URL encode unsafe and reserved characters and must be
  // followed by two hexadecimal digits according to RFC 1738.
  string name = 1;

  // Optional. A description of this metric, which is used in documentation.
  string description = 2;

  // Required. An [advanced logs filter](/logging/docs/view/advanced_filters).
  // Example: `"resource.type=gae_app AND severity>=ERROR"`.
  string filter = 3;

  // Output only. The API version that created or updated this metric.
  // The version also dictates the syntax of the filter expression. When a value
  // for this field is missing, the default value of V2 should be assumed.
  ApiVersion version = 4;
}

// The parameters to ListLogMetrics.
message ListLogMetricsRequest {
  // Required. The resource name containing the metrics.
  // Example: `"projects/my-project-id"`.
  string parent = 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;

  // 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 = 3;
}

// Result returned from ListLogMetrics.
message ListLogMetricsResponse {
  // A list of logs-based metrics.
  repeated LogMetric metrics = 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 GetLogMetric.
message GetLogMetricRequest {
  // The resource name of the desired metric.
  // Example: `"projects/my-project-id/metrics/my-metric-id"`.
  string metric_name = 1;
}

// The parameters to CreateLogMetric.
message CreateLogMetricRequest {
  // The resource name of the project in which to create the metric.
  // Example: `"projects/my-project-id"`.
  //
  // The new metric must be provided in the request.
  string parent = 1;

  // The new logs-based metric, which must not have an identifier that
  // already exists.
  LogMetric metric = 2;
}

// The parameters to UpdateLogMetric.
message UpdateLogMetricRequest {
  // The resource name of the metric to update.
  // Example: `"projects/my-project-id/metrics/my-metric-id"`.
  //
  // The updated metric must be provided in the request and have the
  // same identifier that is specified in `metricName`.
  // If the metric does not exist, it is created.
  string metric_name = 1;

  // The updated metric, whose name must be the same as the
  // metric identifier in `metricName`. If `metricName` does not
  // exist, then a new metric is created.
  LogMetric metric = 2;
}

// The parameters to DeleteLogMetric.
message DeleteLogMetricRequest {
  // The resource name of the metric to delete.
  // Example: `"projects/my-project-id/metrics/my-metric-id"`.
  string metric_name = 1;
}
