xref: /aosp_15_r20/external/googleapis/google/api/distribution.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
1*d5c09012SAndroid Build Coastguard Worker// Copyright 2023 Google LLC
2*d5c09012SAndroid Build Coastguard Worker//
3*d5c09012SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*d5c09012SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*d5c09012SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*d5c09012SAndroid Build Coastguard Worker//
7*d5c09012SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*d5c09012SAndroid Build Coastguard Worker//
9*d5c09012SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*d5c09012SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*d5c09012SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*d5c09012SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*d5c09012SAndroid Build Coastguard Worker// limitations under the License.
14*d5c09012SAndroid Build Coastguard Worker
15*d5c09012SAndroid Build Coastguard Workersyntax = "proto3";
16*d5c09012SAndroid Build Coastguard Worker
17*d5c09012SAndroid Build Coastguard Workerpackage google.api;
18*d5c09012SAndroid Build Coastguard Worker
19*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/any.proto";
20*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/timestamp.proto";
21*d5c09012SAndroid Build Coastguard Worker
22*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/api/distribution;distribution";
23*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true;
24*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "DistributionProto";
25*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api";
26*d5c09012SAndroid Build Coastguard Workeroption objc_class_prefix = "GAPI";
27*d5c09012SAndroid Build Coastguard Worker
28*d5c09012SAndroid Build Coastguard Worker// `Distribution` contains summary statistics for a population of values. It
29*d5c09012SAndroid Build Coastguard Worker// optionally contains a histogram representing the distribution of those values
30*d5c09012SAndroid Build Coastguard Worker// across a set of buckets.
31*d5c09012SAndroid Build Coastguard Worker//
32*d5c09012SAndroid Build Coastguard Worker// The summary statistics are the count, mean, sum of the squared deviation from
33*d5c09012SAndroid Build Coastguard Worker// the mean, the minimum, and the maximum of the set of population of values.
34*d5c09012SAndroid Build Coastguard Worker// The histogram is based on a sequence of buckets and gives a count of values
35*d5c09012SAndroid Build Coastguard Worker// that fall into each bucket. The boundaries of the buckets are given either
36*d5c09012SAndroid Build Coastguard Worker// explicitly or by formulas for buckets of fixed or exponentially increasing
37*d5c09012SAndroid Build Coastguard Worker// widths.
38*d5c09012SAndroid Build Coastguard Worker//
39*d5c09012SAndroid Build Coastguard Worker// Although it is not forbidden, it is generally a bad idea to include
40*d5c09012SAndroid Build Coastguard Worker// non-finite values (infinities or NaNs) in the population of values, as this
41*d5c09012SAndroid Build Coastguard Worker// will render the `mean` and `sum_of_squared_deviation` fields meaningless.
42*d5c09012SAndroid Build Coastguard Workermessage Distribution {
43*d5c09012SAndroid Build Coastguard Worker  // The range of the population values.
44*d5c09012SAndroid Build Coastguard Worker  message Range {
45*d5c09012SAndroid Build Coastguard Worker    // The minimum of the population values.
46*d5c09012SAndroid Build Coastguard Worker    double min = 1;
47*d5c09012SAndroid Build Coastguard Worker
48*d5c09012SAndroid Build Coastguard Worker    // The maximum of the population values.
49*d5c09012SAndroid Build Coastguard Worker    double max = 2;
50*d5c09012SAndroid Build Coastguard Worker  }
51*d5c09012SAndroid Build Coastguard Worker
52*d5c09012SAndroid Build Coastguard Worker  // `BucketOptions` describes the bucket boundaries used to create a histogram
53*d5c09012SAndroid Build Coastguard Worker  // for the distribution. The buckets can be in a linear sequence, an
54*d5c09012SAndroid Build Coastguard Worker  // exponential sequence, or each bucket can be specified explicitly.
55*d5c09012SAndroid Build Coastguard Worker  // `BucketOptions` does not include the number of values in each bucket.
56*d5c09012SAndroid Build Coastguard Worker  //
57*d5c09012SAndroid Build Coastguard Worker  // A bucket has an inclusive lower bound and exclusive upper bound for the
58*d5c09012SAndroid Build Coastguard Worker  // values that are counted for that bucket. The upper bound of a bucket must
59*d5c09012SAndroid Build Coastguard Worker  // be strictly greater than the lower bound. The sequence of N buckets for a
60*d5c09012SAndroid Build Coastguard Worker  // distribution consists of an underflow bucket (number 0), zero or more
61*d5c09012SAndroid Build Coastguard Worker  // finite buckets (number 1 through N - 2) and an overflow bucket (number N -
62*d5c09012SAndroid Build Coastguard Worker  // 1). The buckets are contiguous: the lower bound of bucket i (i > 0) is the
63*d5c09012SAndroid Build Coastguard Worker  // same as the upper bound of bucket i - 1. The buckets span the whole range
64*d5c09012SAndroid Build Coastguard Worker  // of finite values: lower bound of the underflow bucket is -infinity and the
65*d5c09012SAndroid Build Coastguard Worker  // upper bound of the overflow bucket is +infinity. The finite buckets are
66*d5c09012SAndroid Build Coastguard Worker  // so-called because both bounds are finite.
67*d5c09012SAndroid Build Coastguard Worker  message BucketOptions {
68*d5c09012SAndroid Build Coastguard Worker    // Specifies a linear sequence of buckets that all have the same width
69*d5c09012SAndroid Build Coastguard Worker    // (except overflow and underflow). Each bucket represents a constant
70*d5c09012SAndroid Build Coastguard Worker    // absolute uncertainty on the specific value in the bucket.
71*d5c09012SAndroid Build Coastguard Worker    //
72*d5c09012SAndroid Build Coastguard Worker    // There are `num_finite_buckets + 2` (= N) buckets. Bucket `i` has the
73*d5c09012SAndroid Build Coastguard Worker    // following boundaries:
74*d5c09012SAndroid Build Coastguard Worker    //
75*d5c09012SAndroid Build Coastguard Worker    //    Upper bound (0 <= i < N-1):     offset + (width * i).
76*d5c09012SAndroid Build Coastguard Worker    //
77*d5c09012SAndroid Build Coastguard Worker    //    Lower bound (1 <= i < N):       offset + (width * (i - 1)).
78*d5c09012SAndroid Build Coastguard Worker    message Linear {
79*d5c09012SAndroid Build Coastguard Worker      // Must be greater than 0.
80*d5c09012SAndroid Build Coastguard Worker      int32 num_finite_buckets = 1;
81*d5c09012SAndroid Build Coastguard Worker
82*d5c09012SAndroid Build Coastguard Worker      // Must be greater than 0.
83*d5c09012SAndroid Build Coastguard Worker      double width = 2;
84*d5c09012SAndroid Build Coastguard Worker
85*d5c09012SAndroid Build Coastguard Worker      // Lower bound of the first bucket.
86*d5c09012SAndroid Build Coastguard Worker      double offset = 3;
87*d5c09012SAndroid Build Coastguard Worker    }
88*d5c09012SAndroid Build Coastguard Worker
89*d5c09012SAndroid Build Coastguard Worker    // Specifies an exponential sequence of buckets that have a width that is
90*d5c09012SAndroid Build Coastguard Worker    // proportional to the value of the lower bound. Each bucket represents a
91*d5c09012SAndroid Build Coastguard Worker    // constant relative uncertainty on a specific value in the bucket.
92*d5c09012SAndroid Build Coastguard Worker    //
93*d5c09012SAndroid Build Coastguard Worker    // There are `num_finite_buckets + 2` (= N) buckets. Bucket `i` has the
94*d5c09012SAndroid Build Coastguard Worker    // following boundaries:
95*d5c09012SAndroid Build Coastguard Worker    //
96*d5c09012SAndroid Build Coastguard Worker    //    Upper bound (0 <= i < N-1):     scale * (growth_factor ^ i).
97*d5c09012SAndroid Build Coastguard Worker    //
98*d5c09012SAndroid Build Coastguard Worker    //    Lower bound (1 <= i < N):       scale * (growth_factor ^ (i - 1)).
99*d5c09012SAndroid Build Coastguard Worker    message Exponential {
100*d5c09012SAndroid Build Coastguard Worker      // Must be greater than 0.
101*d5c09012SAndroid Build Coastguard Worker      int32 num_finite_buckets = 1;
102*d5c09012SAndroid Build Coastguard Worker
103*d5c09012SAndroid Build Coastguard Worker      // Must be greater than 1.
104*d5c09012SAndroid Build Coastguard Worker      double growth_factor = 2;
105*d5c09012SAndroid Build Coastguard Worker
106*d5c09012SAndroid Build Coastguard Worker      // Must be greater than 0.
107*d5c09012SAndroid Build Coastguard Worker      double scale = 3;
108*d5c09012SAndroid Build Coastguard Worker    }
109*d5c09012SAndroid Build Coastguard Worker
110*d5c09012SAndroid Build Coastguard Worker    // Specifies a set of buckets with arbitrary widths.
111*d5c09012SAndroid Build Coastguard Worker    //
112*d5c09012SAndroid Build Coastguard Worker    // There are `size(bounds) + 1` (= N) buckets. Bucket `i` has the following
113*d5c09012SAndroid Build Coastguard Worker    // boundaries:
114*d5c09012SAndroid Build Coastguard Worker    //
115*d5c09012SAndroid Build Coastguard Worker    //    Upper bound (0 <= i < N-1):     bounds[i]
116*d5c09012SAndroid Build Coastguard Worker    //    Lower bound (1 <= i < N);       bounds[i - 1]
117*d5c09012SAndroid Build Coastguard Worker    //
118*d5c09012SAndroid Build Coastguard Worker    // The `bounds` field must contain at least one element. If `bounds` has
119*d5c09012SAndroid Build Coastguard Worker    // only one element, then there are no finite buckets, and that single
120*d5c09012SAndroid Build Coastguard Worker    // element is the common boundary of the overflow and underflow buckets.
121*d5c09012SAndroid Build Coastguard Worker    message Explicit {
122*d5c09012SAndroid Build Coastguard Worker      // The values must be monotonically increasing.
123*d5c09012SAndroid Build Coastguard Worker      repeated double bounds = 1;
124*d5c09012SAndroid Build Coastguard Worker    }
125*d5c09012SAndroid Build Coastguard Worker
126*d5c09012SAndroid Build Coastguard Worker    // Exactly one of these three fields must be set.
127*d5c09012SAndroid Build Coastguard Worker    oneof options {
128*d5c09012SAndroid Build Coastguard Worker      // The linear bucket.
129*d5c09012SAndroid Build Coastguard Worker      Linear linear_buckets = 1;
130*d5c09012SAndroid Build Coastguard Worker
131*d5c09012SAndroid Build Coastguard Worker      // The exponential buckets.
132*d5c09012SAndroid Build Coastguard Worker      Exponential exponential_buckets = 2;
133*d5c09012SAndroid Build Coastguard Worker
134*d5c09012SAndroid Build Coastguard Worker      // The explicit buckets.
135*d5c09012SAndroid Build Coastguard Worker      Explicit explicit_buckets = 3;
136*d5c09012SAndroid Build Coastguard Worker    }
137*d5c09012SAndroid Build Coastguard Worker  }
138*d5c09012SAndroid Build Coastguard Worker
139*d5c09012SAndroid Build Coastguard Worker  // Exemplars are example points that may be used to annotate aggregated
140*d5c09012SAndroid Build Coastguard Worker  // distribution values. They are metadata that gives information about a
141*d5c09012SAndroid Build Coastguard Worker  // particular value added to a Distribution bucket, such as a trace ID that
142*d5c09012SAndroid Build Coastguard Worker  // was active when a value was added. They may contain further information,
143*d5c09012SAndroid Build Coastguard Worker  // such as a example values and timestamps, origin, etc.
144*d5c09012SAndroid Build Coastguard Worker  message Exemplar {
145*d5c09012SAndroid Build Coastguard Worker    // Value of the exemplar point. This value determines to which bucket the
146*d5c09012SAndroid Build Coastguard Worker    // exemplar belongs.
147*d5c09012SAndroid Build Coastguard Worker    double value = 1;
148*d5c09012SAndroid Build Coastguard Worker
149*d5c09012SAndroid Build Coastguard Worker    // The observation (sampling) time of the above value.
150*d5c09012SAndroid Build Coastguard Worker    google.protobuf.Timestamp timestamp = 2;
151*d5c09012SAndroid Build Coastguard Worker
152*d5c09012SAndroid Build Coastguard Worker    // Contextual information about the example value. Examples are:
153*d5c09012SAndroid Build Coastguard Worker    //
154*d5c09012SAndroid Build Coastguard Worker    //   Trace: type.googleapis.com/google.monitoring.v3.SpanContext
155*d5c09012SAndroid Build Coastguard Worker    //
156*d5c09012SAndroid Build Coastguard Worker    //   Literal string: type.googleapis.com/google.protobuf.StringValue
157*d5c09012SAndroid Build Coastguard Worker    //
158*d5c09012SAndroid Build Coastguard Worker    //   Labels dropped during aggregation:
159*d5c09012SAndroid Build Coastguard Worker    //     type.googleapis.com/google.monitoring.v3.DroppedLabels
160*d5c09012SAndroid Build Coastguard Worker    //
161*d5c09012SAndroid Build Coastguard Worker    // There may be only a single attachment of any given message type in a
162*d5c09012SAndroid Build Coastguard Worker    // single exemplar, and this is enforced by the system.
163*d5c09012SAndroid Build Coastguard Worker    repeated google.protobuf.Any attachments = 3;
164*d5c09012SAndroid Build Coastguard Worker  }
165*d5c09012SAndroid Build Coastguard Worker
166*d5c09012SAndroid Build Coastguard Worker  // The number of values in the population. Must be non-negative. This value
167*d5c09012SAndroid Build Coastguard Worker  // must equal the sum of the values in `bucket_counts` if a histogram is
168*d5c09012SAndroid Build Coastguard Worker  // provided.
169*d5c09012SAndroid Build Coastguard Worker  int64 count = 1;
170*d5c09012SAndroid Build Coastguard Worker
171*d5c09012SAndroid Build Coastguard Worker  // The arithmetic mean of the values in the population. If `count` is zero
172*d5c09012SAndroid Build Coastguard Worker  // then this field must be zero.
173*d5c09012SAndroid Build Coastguard Worker  double mean = 2;
174*d5c09012SAndroid Build Coastguard Worker
175*d5c09012SAndroid Build Coastguard Worker  // The sum of squared deviations from the mean of the values in the
176*d5c09012SAndroid Build Coastguard Worker  // population. For values x_i this is:
177*d5c09012SAndroid Build Coastguard Worker  //
178*d5c09012SAndroid Build Coastguard Worker  //     Sum[i=1..n]((x_i - mean)^2)
179*d5c09012SAndroid Build Coastguard Worker  //
180*d5c09012SAndroid Build Coastguard Worker  // Knuth, "The Art of Computer Programming", Vol. 2, page 232, 3rd edition
181*d5c09012SAndroid Build Coastguard Worker  // describes Welford's method for accumulating this sum in one pass.
182*d5c09012SAndroid Build Coastguard Worker  //
183*d5c09012SAndroid Build Coastguard Worker  // If `count` is zero then this field must be zero.
184*d5c09012SAndroid Build Coastguard Worker  double sum_of_squared_deviation = 3;
185*d5c09012SAndroid Build Coastguard Worker
186*d5c09012SAndroid Build Coastguard Worker  // If specified, contains the range of the population values. The field
187*d5c09012SAndroid Build Coastguard Worker  // must not be present if the `count` is zero.
188*d5c09012SAndroid Build Coastguard Worker  Range range = 4;
189*d5c09012SAndroid Build Coastguard Worker
190*d5c09012SAndroid Build Coastguard Worker  // Defines the histogram bucket boundaries. If the distribution does not
191*d5c09012SAndroid Build Coastguard Worker  // contain a histogram, then omit this field.
192*d5c09012SAndroid Build Coastguard Worker  BucketOptions bucket_options = 6;
193*d5c09012SAndroid Build Coastguard Worker
194*d5c09012SAndroid Build Coastguard Worker  // The number of values in each bucket of the histogram, as described in
195*d5c09012SAndroid Build Coastguard Worker  // `bucket_options`. If the distribution does not have a histogram, then omit
196*d5c09012SAndroid Build Coastguard Worker  // this field. If there is a histogram, then the sum of the values in
197*d5c09012SAndroid Build Coastguard Worker  // `bucket_counts` must equal the value in the `count` field of the
198*d5c09012SAndroid Build Coastguard Worker  // distribution.
199*d5c09012SAndroid Build Coastguard Worker  //
200*d5c09012SAndroid Build Coastguard Worker  // If present, `bucket_counts` should contain N values, where N is the number
201*d5c09012SAndroid Build Coastguard Worker  // of buckets specified in `bucket_options`. If you supply fewer than N
202*d5c09012SAndroid Build Coastguard Worker  // values, the remaining values are assumed to be 0.
203*d5c09012SAndroid Build Coastguard Worker  //
204*d5c09012SAndroid Build Coastguard Worker  // The order of the values in `bucket_counts` follows the bucket numbering
205*d5c09012SAndroid Build Coastguard Worker  // schemes described for the three bucket types. The first value must be the
206*d5c09012SAndroid Build Coastguard Worker  // count for the underflow bucket (number 0). The next N-2 values are the
207*d5c09012SAndroid Build Coastguard Worker  // counts for the finite buckets (number 1 through N-2). The N'th value in
208*d5c09012SAndroid Build Coastguard Worker  // `bucket_counts` is the count for the overflow bucket (number N-1).
209*d5c09012SAndroid Build Coastguard Worker  repeated int64 bucket_counts = 7;
210*d5c09012SAndroid Build Coastguard Worker
211*d5c09012SAndroid Build Coastguard Worker  // Must be in increasing order of `value` field.
212*d5c09012SAndroid Build Coastguard Worker  repeated Exemplar exemplars = 10;
213*d5c09012SAndroid Build Coastguard Worker}
214