// Copyright 2017 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.api;

import "google/api/label.proto";

option go_package = "google.golang.org/genproto/googleapis/api/metric;metric";
option java_multiple_files = true;
option java_outer_classname = "MetricProto";
option java_package = "com.google.api";
option objc_class_prefix = "GAPI";


// Defines a metric type and its schema. Once a metric descriptor is created,
// deleting or altering it stops data collection and makes the metric type's
// existing data unusable.
message MetricDescriptor {
  // The kind of measurement. It describes how the data is reported.
  enum MetricKind {
    // Do not use this default value.
    METRIC_KIND_UNSPECIFIED = 0;

    // An instantaneous measurement of a value.
    GAUGE = 1;

    // The change in a value during a time interval.
    DELTA = 2;

    // A value accumulated over a time interval.  Cumulative
    // measurements in a time series should have the same start time
    // and increasing end times, until an event resets the cumulative
    // value to zero and sets a new start time for the following
    // points.
    CUMULATIVE = 3;
  }

  // The value type of a metric.
  enum ValueType {
    // Do not use this default value.
    VALUE_TYPE_UNSPECIFIED = 0;

    // The value is a boolean.
    // This value type can be used only if the metric kind is `GAUGE`.
    BOOL = 1;

    // The value is a signed 64-bit integer.
    INT64 = 2;

    // The value is a double precision floating point number.
    DOUBLE = 3;

    // The value is a text string.
    // This value type can be used only if the metric kind is `GAUGE`.
    STRING = 4;

    // The value is a [`Distribution`][google.api.Distribution].
    DISTRIBUTION = 5;

    // The value is money.
    MONEY = 6;
  }

  // The resource name of the metric descriptor. Depending on the
  // implementation, the name typically includes: (1) the parent resource name
  // that defines the scope of the metric type or of its data; and (2) the
  // metric's URL-encoded type, which also appears in the `type` field of this
  // descriptor. For example, following is the resource name of a custom
  // metric within the GCP project `my-project-id`:
  //
  //     "projects/my-project-id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount"
  string name = 1;

  // The metric type, including its DNS name prefix. The type is not
  // URL-encoded.  All user-defined custom metric types have the DNS name
  // `custom.googleapis.com`.  Metric types should use a natural hierarchical
  // grouping. For example:
  //
  //     "custom.googleapis.com/invoice/paid/amount"
  //     "appengine.googleapis.com/http/server/response_latencies"
  string type = 8;

  // The set of labels that can be used to describe a specific
  // instance of this metric type. For example, the
  // `appengine.googleapis.com/http/server/response_latencies` metric
  // type has a label for the HTTP response code, `response_code`, so
  // you can look at latencies for successful responses or just
  // for responses that failed.
  repeated LabelDescriptor labels = 2;

  // Whether the metric records instantaneous values, changes to a value, etc.
  // Some combinations of `metric_kind` and `value_type` might not be supported.
  MetricKind metric_kind = 3;

  // Whether the measurement is an integer, a floating-point number, etc.
  // Some combinations of `metric_kind` and `value_type` might not be supported.
  ValueType value_type = 4;

  // The unit in which the metric value is reported. It is only applicable
  // if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The
  // supported units are a subset of [The Unified Code for Units of
  // Measure](http://unitsofmeasure.org/ucum.html) standard:
  //
  // **Basic units (UNIT)**
  //
  // * `bit`   bit
  // * `By`    byte
  // * `s`     second
  // * `min`   minute
  // * `h`     hour
  // * `d`     day
  //
  // **Prefixes (PREFIX)**
  //
  // * `k`     kilo    (10**3)
  // * `M`     mega    (10**6)
  // * `G`     giga    (10**9)
  // * `T`     tera    (10**12)
  // * `P`     peta    (10**15)
  // * `E`     exa     (10**18)
  // * `Z`     zetta   (10**21)
  // * `Y`     yotta   (10**24)
  // * `m`     milli   (10**-3)
  // * `u`     micro   (10**-6)
  // * `n`     nano    (10**-9)
  // * `p`     pico    (10**-12)
  // * `f`     femto   (10**-15)
  // * `a`     atto    (10**-18)
  // * `z`     zepto   (10**-21)
  // * `y`     yocto   (10**-24)
  // * `Ki`    kibi    (2**10)
  // * `Mi`    mebi    (2**20)
  // * `Gi`    gibi    (2**30)
  // * `Ti`    tebi    (2**40)
  //
  // **Grammar**
  //
  // The grammar includes the dimensionless unit `1`, such as `1/s`.
  //
  // The grammar also includes these connectors:
  //
  // * `/`    division (as an infix operator, e.g. `1/s`).
  // * `.`    multiplication (as an infix operator, e.g. `GBy.d`)
  //
  // The grammar for a unit is as follows:
  //
  //     Expression = Component { "." Component } { "/" Component } ;
  //
  //     Component = [ PREFIX ] UNIT [ Annotation ]
  //               | Annotation
  //               | "1"
  //               ;
  //
  //     Annotation = "{" NAME "}" ;
  //
  // Notes:
  //
  // * `Annotation` is just a comment if it follows a `UNIT` and is
  //    equivalent to `1` if it is used alone. For examples,
  //    `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.
  // * `NAME` is a sequence of non-blank printable ASCII characters not
  //    containing '{' or '}'.
  string unit = 5;

  // A detailed description of the metric, which can be used in documentation.
  string description = 6;

  // A concise name for the metric, which can be displayed in user interfaces.
  // Use sentence case without an ending period, for example "Request count".
  string display_name = 7;
}

// A specific metric, identified by specifying values for all of the
// labels of a [`MetricDescriptor`][google.api.MetricDescriptor].
message Metric {
  // An existing metric type, see [google.api.MetricDescriptor][google.api.MetricDescriptor].
  // For example, `custom.googleapis.com/invoice/paid/amount`.
  string type = 3;

  // The set of label values that uniquely identify this metric. All
  // labels listed in the `MetricDescriptor` must be assigned values.
  map<string, string> labels = 2;
}
