// Copyright 2020 The Pigweed Authors
//
// 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
//
//     https://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 pw.metric.proto;

// A metric, described by the name (path + name), and the value.
//
// This flattened representation, while more complicated than the obvious tree
// structure alternative, enables streaming metrics from the device in low
// memory or low compute situations.
message Metric {
  // The token path from the root. The last token is the metric name, and
  // previous tokens are the parent group names. This could be converted from
  // the tokens into a string; for example the token path {0xfaff, 0xabcd}:
  //
  //  - The group is 0xfaff (root, parent)
  //  - The metric is 0xabcd
  //
  // Given the token database, this might be converted into:
  //
  //   /i2c_bus_1/failed_transactions
  //
  // Note: This uses a repeated fixed32 instead of a "Oneof" with the string
  // path to reduce the encoded size. Using a repeated Oneof name { str,
  // fixed32 } would cost approximately 6N bytes for N path elements, vs 2 + 4N
  // bytes in the packed case.
  repeated fixed32 token_path = 1;

  // The string path from the root. Similar to token path, but with strings.
  // Note: This is currently unsupported.
  repeated string string_path = 2;

  // The metric value. This field should be omitted when used as a query.
  oneof value {
    float as_float = 3;
    uint32 as_int = 4;
  };
}

message MetricRequest {
  // Metrics or the groups matched to the given paths are returned.  The intent
  // is to support matching semantics, with at least subsetting to e.g. collect
  // all the metrics in a group and its children. We may also implement
  // wildcard matchers.
  //
  // Value fields in the metrics will be ignored, since this is a query.
  //
  // Note: This is currently unsupported.
  repeated Metric metrics = 1;
}

message MetricResponse {
  repeated Metric metrics = 1;
}

service MetricService {
  // Returns metrics or groups matching the requested paths.
  rpc Get(MetricRequest) returns (stream MetricResponse) {}
}
