/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * 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.
 */
//
// Histogram-collected metrics.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;
option java_outer_classname = "HistogramEventProtos";
option java_package = "org.chromium.components.metrics";

package metrics;

// Next tag: 4
message HistogramEventProto {
  // The name of the histogram, hashed.
  optional fixed64 name_hash = 1;

  // The sum of all the sample values.
  // Together with the total count of the sample values, this allows us to
  // compute the average value.  The count of all sample values is just the sum
  // of the counts of all the buckets.
  optional int64 sum = 2;

  // The per-bucket data.
  message Bucket {
    // Each bucket's range is bounded by min <= x < max.
    // It is valid to omit one of these two fields in a bucket, but not both.
    // If the min field is omitted, its value is assumed to be equal to max - 1.
    // If the max field is omitted, its value is assumed to be equal to the next
    // bucket's min value (possibly computed per above).  The last bucket in a
    // histogram should always include the max field.
    optional int64 min = 1;
    optional int64 max = 2;

    // The bucket's index in the list of buckets, sorted in ascending order.
    // This field was intended to provide extra redundancy to detect corrupted
    // records, but was never used.  As of M31, it is no longer sent by Chrome
    // clients to reduce the UMA upload size.
    optional int32 bucket_index = 3 [deprecated = true];

    // The number of entries in this bucket.
    optional int64 count = 4;
  }
  repeated Bucket bucket = 3;
}
