-
Notifications
You must be signed in to change notification settings - Fork 268
/
stats.proto
340 lines (311 loc) · 12.7 KB
/
stats.proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
syntax = "proto3";
package envoy.config.metrics.v2;
import "envoy/api/v2/core/address.proto";
import "envoy/type/matcher/string.proto";
import "google/protobuf/any.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/wrappers.proto";
import "udpa/annotations/status.proto";
import "validate/validate.proto";
option java_package = "io.envoyproxy.envoy.config.metrics.v2";
option java_outer_classname = "StatsProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/config/metrics/v2;metricsv2";
option (udpa.annotations.file_status).package_version_status = FROZEN;
// [#protodoc-title: Stats]
// Statistics :ref:`architecture overview <arch_overview_statistics>`.
// Configuration for pluggable stats sinks.
message StatsSink {
// The name of the stats sink to instantiate. The name must match a supported
// stats sink. The built-in stats sinks are:
//
// * :ref:`envoy.stat_sinks.statsd <envoy_api_msg_config.metrics.v2.StatsdSink>`
// * :ref:`envoy.stat_sinks.dog_statsd <envoy_api_msg_config.metrics.v2.DogStatsdSink>`
// * :ref:`envoy.stat_sinks.metrics_service <envoy_api_msg_config.metrics.v2.MetricsServiceConfig>`
// * :ref:`envoy.stat_sinks.hystrix <envoy_api_msg_config.metrics.v2.HystrixSink>`
//
// Sinks optionally support tagged/multiple dimensional metrics.
string name = 1;
// Stats sink specific configuration which depends on the sink being instantiated. See
// :ref:`StatsdSink <envoy_api_msg_config.metrics.v2.StatsdSink>` for an example.
oneof config_type {
google.protobuf.Struct config = 2 [deprecated = true];
google.protobuf.Any typed_config = 3;
}
}
// Statistics configuration such as tagging.
message StatsConfig {
// Each stat name is iteratively processed through these tag specifiers.
// When a tag is matched, the first capture group is removed from the name so
// later :ref:`TagSpecifiers <envoy_api_msg_config.metrics.v2.TagSpecifier>` cannot match that
// same portion of the match.
repeated TagSpecifier stats_tags = 1;
// Use all default tag regexes specified in Envoy. These can be combined with
// custom tags specified in :ref:`stats_tags
// <envoy_api_field_config.metrics.v2.StatsConfig.stats_tags>`. They will be processed before
// the custom tags.
//
// .. note::
//
// If any default tags are specified twice, the config will be considered
// invalid.
//
// See :repo:`well_known_names.h <source/common/config/well_known_names.h>` for a list of the
// default tags in Envoy.
//
// If not provided, the value is assumed to be true.
google.protobuf.BoolValue use_all_default_tags = 2;
// Inclusion/exclusion matcher for stat name creation. If not provided, all stats are instantiated
// as normal. Preventing the instantiation of certain families of stats can improve memory
// performance for Envoys running especially large configs.
//
// .. warning::
// Excluding stats may affect Envoy's behavior in undocumented ways. See
// `issue #8771 <https://github.com/envoyproxy/envoy/issues/8771>`_ for more information.
// If any unexpected behavior changes are observed, please open a new issue immediately.
StatsMatcher stats_matcher = 3;
}
// Configuration for disabling stat instantiation.
message StatsMatcher {
// The instantiation of stats is unrestricted by default. If the goal is to configure Envoy to
// instantiate all stats, there is no need to construct a StatsMatcher.
//
// However, StatsMatcher can be used to limit the creation of families of stats in order to
// conserve memory. Stats can either be disabled entirely, or they can be
// limited by either an exclusion or an inclusion list of :ref:`StringMatcher
// <envoy_api_msg_type.matcher.StringMatcher>` protos:
//
// * If ``reject_all`` is set to ``true``, no stats will be instantiated. If ``reject_all`` is set to
// ``false``, all stats will be instantiated.
//
// * If an exclusion list is supplied, any stat name matching *any* of the StringMatchers in the
// list will not instantiate.
//
// * If an inclusion list is supplied, no stats will instantiate, except those matching *any* of
// the StringMatchers in the list.
//
//
// A StringMatcher can be used to match against an exact string, a suffix / prefix, or a regex.
// **NB:** For performance reasons, it is highly recommended to use a prefix- or suffix-based
// matcher rather than a regex-based matcher.
//
// Example 1. Excluding all stats.
//
// .. code-block:: json
//
// {
// "statsMatcher": {
// "rejectAll": "true"
// }
// }
//
// Example 2. Excluding all cluster-specific stats, but not cluster-manager stats:
//
// .. code-block:: json
//
// {
// "statsMatcher": {
// "exclusionList": {
// "patterns": [
// {
// "prefix": "cluster."
// }
// ]
// }
// }
// }
//
// Example 3. Including only manager-related stats:
//
// .. code-block:: json
//
// {
// "statsMatcher": {
// "inclusionList": {
// "patterns": [
// {
// "prefix": "cluster_manager."
// },
// {
// "prefix": "listener_manager."
// }
// ]
// }
// }
// }
//
oneof stats_matcher {
option (validate.required) = true;
// If `reject_all` is true, then all stats are disabled. If `reject_all` is false, then all
// stats are enabled.
bool reject_all = 1;
// Exclusive match. All stats are enabled except for those matching one of the supplied
// StringMatcher protos.
type.matcher.ListStringMatcher exclusion_list = 2;
// Inclusive match. No stats are enabled except for those matching one of the supplied
// StringMatcher protos.
type.matcher.ListStringMatcher inclusion_list = 3;
}
}
// Designates a tag name and value pair. The value may be either a fixed value
// or a regex providing the value via capture groups. The specified tag will be
// unconditionally set if a fixed value, otherwise it will only be set if one
// or more capture groups in the regex match.
message TagSpecifier {
// Attaches an identifier to the tag values to identify the tag being in the
// sink. Envoy has a set of default names and regexes to extract dynamic
// portions of existing stats, which can be found in :repo:`well_known_names.h
// <source/common/config/well_known_names.h>` in the Envoy repository. If a :ref:`tag_name
// <envoy_api_field_config.metrics.v2.TagSpecifier.tag_name>` is provided in the config and
// neither :ref:`regex <envoy_api_field_config.metrics.v2.TagSpecifier.regex>` or
// :ref:`fixed_value <envoy_api_field_config.metrics.v2.TagSpecifier.fixed_value>` were specified,
// Envoy will attempt to find that name in its set of defaults and use the accompanying regex.
//
// .. note::
//
// It is invalid to specify the same tag name twice in a config.
string tag_name = 1;
oneof tag_value {
// Designates a tag to strip from the tag extracted name and provide as a named
// tag value for all statistics. This will only occur if any part of the name
// matches the regex provided with one or more capture groups.
//
// The first capture group identifies the portion of the name to remove. The
// second capture group (which will normally be nested inside the first) will
// designate the value of the tag for the statistic. If no second capture
// group is provided, the first will also be used to set the value of the tag.
// All other capture groups will be ignored.
//
// Example 1. a stat name ``cluster.foo_cluster.upstream_rq_timeout`` and
// one tag specifier:
//
// .. code-block:: json
//
// {
// "tag_name": "envoy.cluster_name",
// "regex": "^cluster\\.((.+?)\\.)"
// }
//
// Note that the regex will remove ``foo_cluster.`` making the tag extracted
// name ``cluster.upstream_rq_timeout`` and the tag value for
// ``envoy.cluster_name`` will be ``foo_cluster`` (note: there will be no
// ``.`` character because of the second capture group).
//
// Example 2. a stat name
// ``http.connection_manager_1.user_agent.ios.downstream_cx_total`` and two
// tag specifiers:
//
// .. code-block:: json
//
// [
// {
// "tag_name": "envoy.http_user_agent",
// "regex": "^http(?=\\.).*?\\.user_agent\\.((.+?)\\.)\\w+?$"
// },
// {
// "tag_name": "envoy.http_conn_manager_prefix",
// "regex": "^http\\.((.*?)\\.)"
// }
// ]
//
// The two regexes of the specifiers will be processed in the definition order.
//
// The first regex will remove ``ios.``, leaving the tag extracted name
// ``http.connection_manager_1.user_agent.downstream_cx_total``. The tag
// ``envoy.http_user_agent`` will be added with tag value ``ios``.
//
// The second regex will remove ``connection_manager_1.`` from the tag
// extracted name produced by the first regex
// ``http.connection_manager_1.user_agent.downstream_cx_total``, leaving
// ``http.user_agent.downstream_cx_total`` as the tag extracted name. The tag
// ``envoy.http_conn_manager_prefix`` will be added with the tag value
// ``connection_manager_1``.
string regex = 2 [(validate.rules).string = {max_bytes: 1024}];
// Specifies a fixed tag value for the ``tag_name``.
string fixed_value = 3;
}
}
// Stats configuration proto schema for built-in *envoy.stat_sinks.statsd* sink. This sink does not support
// tagged metrics.
// [#extension: envoy.stat_sinks.statsd]
message StatsdSink {
oneof statsd_specifier {
option (validate.required) = true;
// The UDP address of a running `statsd <https://github.com/etsy/statsd>`_
// compliant listener. If specified, statistics will be flushed to this
// address.
api.v2.core.Address address = 1;
// The name of a cluster that is running a TCP `statsd
// <https://github.com/etsy/statsd>`_ compliant listener. If specified,
// Envoy will connect to this cluster to flush statistics.
string tcp_cluster_name = 2;
}
// Optional custom prefix for StatsdSink. If
// specified, this will override the default prefix.
// For example:
//
// .. code-block:: json
//
// {
// "prefix" : "envoy-prod"
// }
//
// will change emitted stats to
//
// .. code-block:: cpp
//
// envoy-prod.test_counter:1|c
// envoy-prod.test_timer:5|ms
//
// Note that the default prefix, "envoy", will be used if a prefix is not
// specified.
//
// Stats with default prefix:
//
// .. code-block:: cpp
//
// envoy.test_counter:1|c
// envoy.test_timer:5|ms
string prefix = 3;
}
// Stats configuration proto schema for built-in *envoy.stat_sinks.dog_statsd* sink.
// The sink emits stats with `DogStatsD <https://docs.datadoghq.com/guides/dogstatsd/>`_
// compatible tags. Tags are configurable via :ref:`StatsConfig
// <envoy_api_msg_config.metrics.v2.StatsConfig>`.
// [#extension: envoy.stat_sinks.dog_statsd]
message DogStatsdSink {
reserved 2;
oneof dog_statsd_specifier {
option (validate.required) = true;
// The UDP address of a running DogStatsD compliant listener. If specified,
// statistics will be flushed to this address.
api.v2.core.Address address = 1;
}
// Optional custom metric name prefix. See :ref:`StatsdSink's prefix field
// <envoy_api_field_config.metrics.v2.StatsdSink.prefix>` for more details.
string prefix = 3;
}
// Stats configuration proto schema for built-in *envoy.stat_sinks.hystrix* sink.
// The sink emits stats in `text/event-stream
// <https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events>`_
// formatted stream for use by `Hystrix dashboard
// <https://github.com/Netflix-Skunkworks/hystrix-dashboard/wiki>`_.
//
// Note that only a single HystrixSink should be configured.
//
// Streaming is started through an admin endpoint :http:get:`/hystrix_event_stream`.
// [#extension: envoy.stat_sinks.hystrix]
message HystrixSink {
// The number of buckets the rolling statistical window is divided into.
//
// Each time the sink is flushed, all relevant Envoy statistics are sampled and
// added to the rolling window (removing the oldest samples in the window
// in the process). The sink then outputs the aggregate statistics across the
// current rolling window to the event stream(s).
//
// rolling_window(ms) = stats_flush_interval(ms) * num_of_buckets
//
// More detailed explanation can be found in `Hystrix wiki
// <https://github.com/Netflix/Hystrix/wiki/Metrics-and-Monitoring#hystrixrollingnumber>`_.
int64 num_buckets = 1;
}