fluent-plugin-google-cloud 0.10.4 → 0.10.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a1e4077eb78db81677fa78de507e0aa13acd11a5a07a94004a4df57b3b3ee09a
4
- data.tar.gz: 03602f3a4196b0527a164954c1015e595b7364728513843304c098f7ce440d20
3
+ metadata.gz: cfb8318e26804ad6f09d4e16777e3bbef7448a671f6a81dc3c2c2e30fd5e8a92
4
+ data.tar.gz: 4410e23d39d9dacf8fad1b9053be2fc9da055c37e3be1fcd13916a04f0ae3758
5
5
  SHA512:
6
- metadata.gz: 93388ca7c2229d29dd42e6f9d35972841a4024d9e16fc5403993289c6e48f8911d7a12ff8944b73812b15b0fc2311dbf1919e11581343c90e0dfde599ad6c8a3
7
- data.tar.gz: c04221d3ac69bfaa0a5831830a8138352a3956a3ad9adb9b99df027b1788252b8e1085e58b7ff180d574511f91cf2b408b0405c5310e3fd11982ad9f36f6d1c1
6
+ metadata.gz: f28ea72b58f2ed3d8eedea65b002fad2dda4ffc8a62b4b0a5c5c26fd54e04a058d680ea9745199fa8dcfbae5b1b984400a3cae5e88332b563453eb0c6415967e
7
+ data.tar.gz: 2992d107c0617ba61f6637d6f0e57d997b6b19068d9c67bbd7794adef43489a8bf7dc133601ddfe59d1a150f47ce6b41388fb0decbded25a4d49b35dfabf2b00
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-google-cloud (0.10.4)
4
+ fluent-plugin-google-cloud (0.10.9)
5
5
  fluentd (= 1.11.2)
6
6
  google-api-client (= 0.30.8)
7
7
  google-cloud-logging (= 1.6.6)
8
- google-protobuf (= 3.12.2)
9
- googleapis-common-protos (= 1.3.9)
8
+ google-protobuf (= 3.15.8)
9
+ googleapis-common-protos (= 1.3.10)
10
10
  googleauth (= 0.9.0)
11
11
  grpc (= 1.31.1)
12
12
  json (= 2.2.0)
@@ -18,20 +18,20 @@ GEM
18
18
  specs:
19
19
  addressable (2.7.0)
20
20
  public_suffix (>= 2.0.2, < 5.0)
21
- ast (2.4.1)
22
- concurrent-ruby (1.1.7)
23
- cool.io (1.7.0)
21
+ ast (2.4.2)
22
+ concurrent-ruby (1.1.8)
23
+ cool.io (1.7.1)
24
24
  coveralls (0.8.23)
25
25
  json (>= 1.8, < 3)
26
26
  simplecov (~> 0.16.1)
27
27
  term-ansicolor (~> 1.3)
28
28
  thor (>= 0.19.4, < 2.0)
29
29
  tins (~> 1.6)
30
- crack (0.4.4)
30
+ crack (0.4.5)
31
+ rexml
31
32
  declarative (0.0.20)
32
- declarative-option (0.1.0)
33
- docile (1.3.2)
34
- faraday (0.17.3)
33
+ docile (1.3.5)
34
+ faraday (0.17.4)
35
35
  multipart-post (>= 1.2, < 3)
36
36
  fluentd (1.11.2)
37
37
  cool.io (>= 1.4.5, < 2.0.0)
@@ -57,12 +57,12 @@ GEM
57
57
  representable (~> 3.0)
58
58
  retriable (>= 2.0, < 4.0)
59
59
  signet (~> 0.10)
60
- google-cloud-core (1.5.0)
60
+ google-cloud-core (1.6.0)
61
61
  google-cloud-env (~> 1.0)
62
62
  google-cloud-errors (~> 1.0)
63
- google-cloud-env (1.4.0)
63
+ google-cloud-env (1.5.0)
64
64
  faraday (>= 0.17.3, < 2.0)
65
- google-cloud-errors (1.0.1)
65
+ google-cloud-errors (1.1.0)
66
66
  google-cloud-logging (1.6.6)
67
67
  concurrent-ruby (~> 1.1)
68
68
  google-cloud-core (~> 1.2)
@@ -73,16 +73,16 @@ GEM
73
73
  google-gax (~> 1.8)
74
74
  googleapis-common-protos (>= 1.3.9, < 2.0)
75
75
  googleapis-common-protos-types (>= 1.0.4, < 2.0)
76
- google-cloud-trace (0.40.0)
76
+ google-cloud-trace (0.41.0)
77
77
  concurrent-ruby (~> 1.1)
78
78
  google-cloud-core (~> 1.5)
79
79
  google-cloud-trace-v1 (~> 0.0)
80
80
  google-cloud-trace-v2 (~> 0.0)
81
81
  stackdriver-core (~> 1.3)
82
- google-cloud-trace-v1 (0.1.2)
82
+ google-cloud-trace-v1 (0.3.0)
83
83
  gapic-common (~> 0.3)
84
84
  google-cloud-errors (~> 1.0)
85
- google-cloud-trace-v2 (0.1.2)
85
+ google-cloud-trace-v2 (0.3.0)
86
86
  gapic-common (~> 0.3)
87
87
  google-cloud-errors (~> 1.0)
88
88
  google-gax (1.8.1)
@@ -91,13 +91,13 @@ GEM
91
91
  googleauth (~> 0.9)
92
92
  grpc (~> 1.24)
93
93
  rly (~> 0.2.3)
94
- google-protobuf (3.12.2)
95
- googleapis-common-protos (1.3.9)
96
- google-protobuf (~> 3.0)
97
- googleapis-common-protos-types (~> 1.0)
98
- grpc (~> 1.0)
99
- googleapis-common-protos-types (1.0.5)
94
+ google-protobuf (3.15.8)
95
+ googleapis-common-protos (1.3.10)
100
96
  google-protobuf (~> 3.11)
97
+ googleapis-common-protos-types (>= 1.0.5, < 2.0)
98
+ grpc (~> 1.27)
99
+ googleapis-common-protos-types (1.0.6)
100
+ google-protobuf (~> 3.14)
101
101
  googleauth (0.9.0)
102
102
  faraday (~> 0.12)
103
103
  jwt (>= 1.4, < 3.0)
@@ -112,13 +112,13 @@ GEM
112
112
  http_parser.rb (0.6.0)
113
113
  httpclient (2.8.3)
114
114
  json (2.2.0)
115
- jwt (2.2.2)
115
+ jwt (2.2.3)
116
116
  memoist (0.16.2)
117
117
  metaclass (0.0.4)
118
- mini_mime (1.0.2)
118
+ mini_mime (1.1.0)
119
119
  mocha (1.9.0)
120
120
  metaclass (~> 0.0.1)
121
- msgpack (1.3.3)
121
+ msgpack (1.4.2)
122
122
  multi_json (1.15.0)
123
123
  multipart-post (2.1.1)
124
124
  opencensus (0.5.0)
@@ -130,8 +130,8 @@ GEM
130
130
  os (1.1.1)
131
131
  parser (2.7.2.0)
132
132
  ast (~> 2.4.1)
133
- power_assert (1.2.0)
134
- powerpack (0.1.2)
133
+ power_assert (2.0.0)
134
+ powerpack (0.1.3)
135
135
  prometheus-client (0.9.0)
136
136
  quantile (~> 0.2.1)
137
137
  public_suffix (4.0.6)
@@ -139,11 +139,12 @@ GEM
139
139
  rainbow (2.2.2)
140
140
  rake
141
141
  rake (10.5.0)
142
- representable (3.0.4)
142
+ representable (3.1.1)
143
143
  declarative (< 0.1.0)
144
- declarative-option (< 0.2.0)
144
+ trailblazer-option (>= 0.1.1, < 0.2.0)
145
145
  uber (< 0.2.0)
146
146
  retriable (3.1.2)
147
+ rexml (3.2.5)
147
148
  rly (0.2.3)
148
149
  rubocop (0.39.0)
149
150
  parser (>= 2.3.0.7, < 3.0)
@@ -151,11 +152,11 @@ GEM
151
152
  rainbow (>= 1.99.1, < 3.0)
152
153
  ruby-progressbar (~> 1.7)
153
154
  unicode-display_width (~> 1.0, >= 1.0.1)
154
- ruby-progressbar (1.10.1)
155
- serverengine (2.2.1)
155
+ ruby-progressbar (1.11.0)
156
+ serverengine (2.2.3)
156
157
  sigdump (~> 0.2.2)
157
158
  sigdump (0.2.4)
158
- signet (0.14.0)
159
+ signet (0.15.0)
159
160
  addressable (~> 2.3)
160
161
  faraday (>= 0.17.3, < 2.0)
161
162
  jwt (>= 1.5, < 3.0)
@@ -165,7 +166,7 @@ GEM
165
166
  json (>= 1.8, < 3)
166
167
  simplecov-html (~> 0.10.0)
167
168
  simplecov-html (0.10.2)
168
- stackdriver-core (1.4.0)
169
+ stackdriver-core (1.5.0)
169
170
  google-cloud-core (~> 1.2)
170
171
  strptime (0.2.5)
171
172
  sync (0.5.0)
@@ -173,12 +174,13 @@ GEM
173
174
  tins (~> 1.0)
174
175
  test-unit (3.3.3)
175
176
  power_assert
176
- thor (1.0.1)
177
- tins (1.26.0)
177
+ thor (1.1.0)
178
+ tins (1.28.0)
178
179
  sync
179
- tzinfo (2.0.2)
180
+ trailblazer-option (0.1.1)
181
+ tzinfo (2.0.4)
180
182
  concurrent-ruby (~> 1.0)
181
- tzinfo-data (1.2020.4)
183
+ tzinfo-data (1.2021.1)
182
184
  tzinfo (>= 1.0.0)
183
185
  uber (0.1.0)
184
186
  unicode-display_width (1.7.0)
@@ -10,7 +10,7 @@ eos
10
10
  gem.homepage =
11
11
  'https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud'
12
12
  gem.license = 'Apache-2.0'
13
- gem.version = '0.10.4'
13
+ gem.version = '0.10.9'
14
14
  gem.authors = ['Stackdriver Agents Team']
15
15
  gem.email = ['stackdriver-agents@google.com']
16
16
  gem.required_ruby_version = Gem::Requirement.new('>= 2.2')
@@ -20,11 +20,11 @@ eos
20
20
  gem.require_paths = ['lib']
21
21
 
22
22
  gem.add_runtime_dependency 'fluentd', '1.11.2'
23
- gem.add_runtime_dependency 'googleapis-common-protos', '1.3.9'
23
+ gem.add_runtime_dependency 'googleapis-common-protos', '1.3.10'
24
24
  gem.add_runtime_dependency 'googleauth', '0.9.0'
25
25
  gem.add_runtime_dependency 'google-api-client', '0.30.8'
26
26
  gem.add_runtime_dependency 'google-cloud-logging', '1.6.6'
27
- gem.add_runtime_dependency 'google-protobuf', '3.12.2'
27
+ gem.add_runtime_dependency 'google-protobuf', '3.15.8'
28
28
  gem.add_runtime_dependency 'grpc', '1.31.1'
29
29
  gem.add_runtime_dependency 'json', '2.2.0'
30
30
  gem.add_runtime_dependency 'opencensus', '0.5.0'
@@ -15,6 +15,7 @@
15
15
  require 'fileutils'
16
16
  require 'fluent/config'
17
17
  require 'fluent/config/v1_parser'
18
+ require 'fluent/plugin_helper'
18
19
  require 'googleauth'
19
20
  require 'google/apis/logging_v2'
20
21
  require 'open-uri'
@@ -32,6 +33,10 @@ module Fluent
32
33
  include Fluent::Config
33
34
  Fluent::Plugin.register_filter('analyze_config', self)
34
35
 
36
+ # Required for the timer_execute method below
37
+ include PluginHelper::Mixin
38
+ helpers :timer
39
+
35
40
  module Constants
36
41
  # Built-in plugins that are ok to reference in metrics.
37
42
  KNOWN_PLUGINS = {
@@ -212,7 +217,7 @@ module Fluent
212
217
  if File.file?(@google_fluentd_config_path) &&
213
218
  File.file?(@google_fluentd_baseline_config_path)
214
219
  @log.info(
215
- 'google-fluentd configuration file found at' \
220
+ 'analyze_config plugin: google-fluentd configuration file found at' \
216
221
  " #{@google_fluentd_config_path}. " \
217
222
  'google-fluentd baseline configuration file found at' \
218
223
  " #{@google_fluentd_baseline_config_path}. " \
@@ -240,27 +245,49 @@ module Fluent
240
245
  "analyze_config plugin: monitoring_type #{@monitoring_type} is " \
241
246
  'unknown; there will be no metrics.')
242
247
  end
243
- registry = Monitoring::MonitoringRegistryFactory.create(
248
+
249
+ @registry = Monitoring::MonitoringRegistryFactory.create(
244
250
  @monitoring_type, project_id, resource, @gcm_service_address)
251
+ # Export metrics every 60 seconds.
252
+ timer_execute(:export_config_analysis_metrics, 60) { @registry.export }
245
253
 
246
- plugin_usage = registry.counter(
254
+ @log.info('analyze_config plugin: Registering counters.')
255
+ enabled_plugins_counter = @registry.counter(
247
256
  :enabled_plugins,
248
- [:plugin_name, :is_default_plugin, :has_default_config],
257
+ [:plugin_name, :is_default_plugin,
258
+ :has_default_config, :has_ruby_snippet],
249
259
  'Enabled plugins',
250
- 'agent.googleapis.com/agent/internal/logging/config')
251
- config_usage = registry.counter(
260
+ 'agent.googleapis.com/agent/internal/logging/config',
261
+ 'GAUGE')
262
+ @log.info(
263
+ 'analyze_config plugin: registered enable_plugins counter. ' \
264
+ "#{enabled_plugins_counter}")
265
+ plugin_config_counter = @registry.counter(
252
266
  :plugin_config,
253
267
  [:plugin_name, :param, :is_present, :has_default_config],
254
268
  'Configuration parameter usage for plugins relevant to Google Cloud.',
255
- 'agent.googleapis.com/agent/internal/logging/config')
256
- config_bool_values = registry.counter(
269
+ 'agent.googleapis.com/agent/internal/logging/config',
270
+ 'GAUGE')
271
+ @log.info('analyze_config plugin: registered plugin_config counter. ' \
272
+ "#{plugin_config_counter}")
273
+ config_bool_values_counter = @registry.counter(
257
274
  :config_bool_values,
258
275
  [:plugin_name, :param, :value],
259
276
  'Values for bool parameters in Google Cloud plugins',
260
- 'agent.googleapis.com/agent/internal/logging/config')
277
+ 'agent.googleapis.com/agent/internal/logging/config',
278
+ 'GAUGE')
279
+ @log.info('analyze_config plugin: registered config_bool_values ' \
280
+ "counter. #{config_bool_values_counter}")
261
281
 
262
282
  config = parse_config(@google_fluentd_config_path)
283
+ @log.debug(
284
+ 'analyze_config plugin: successfully parsed google-fluentd' \
285
+ " configuration file at #{@google_fluentd_config_path}. #{config}")
263
286
  baseline_config = parse_config(@google_fluentd_baseline_config_path)
287
+ @log.debug(
288
+ 'analyze_config plugin: successfully parsed google-fluentd' \
289
+ ' baseline configuration file at' \
290
+ " #{@google_fluentd_baseline_config_path}: #{baseline_config}")
264
291
 
265
292
  # Create hash of all baseline elements by their plugin names.
266
293
  baseline_elements = Hash[baseline_config.elements.collect do |e|
@@ -290,7 +317,7 @@ module Fluent
290
317
  is_default_plugin = false
291
318
  has_default_config = false
292
319
  end
293
- plugin_usage.increment(
320
+ enabled_plugins_counter.increment(
294
321
  labels: {
295
322
  plugin_name: plugin_name,
296
323
  is_default_plugin: is_default_plugin,
@@ -303,7 +330,7 @@ module Fluent
303
330
  # detect_exceptions).
304
331
  next unless GOOGLE_PLUGIN_PARAMS.key?(e['@type'])
305
332
  GOOGLE_PLUGIN_PARAMS[e['@type']].each do |p|
306
- config_usage.increment(
333
+ plugin_config_counter.increment(
307
334
  labels: {
308
335
  plugin_name: e['@type'],
309
336
  param: p,
@@ -314,7 +341,7 @@ module Fluent
314
341
  },
315
342
  by: 1)
316
343
  next unless e.key?(p) && %w(true false).include?(e[p])
317
- config_bool_values.increment(
344
+ config_bool_values_counter.increment(
318
345
  labels: {
319
346
  plugin_name: e['@type'],
320
347
  param: p,
@@ -323,6 +350,8 @@ module Fluent
323
350
  by: 1)
324
351
  end
325
352
  end
353
+ @log.info(
354
+ 'analyze_config plugin: Successfully finished analyzing config.')
326
355
  else
327
356
  @log.info(
328
357
  'analyze_config plugin: google-fluentd configuration file does not ' \
@@ -341,6 +370,9 @@ module Fluent
341
370
 
342
371
  def shutdown
343
372
  super
373
+ # Export metrics on shutdown. This is a best-effort attempt, and it might
374
+ # fail, for instance if there was a recent write to the same time series.
375
+ @registry.export unless @registry.nil?
344
376
  end
345
377
 
346
378
  # rubocop:disable Lint/UnusedMethodArgument
@@ -52,7 +52,7 @@ module Monitoring
52
52
  def initialize(_project_id, _monitored_resource, _gcm_service_address)
53
53
  end
54
54
 
55
- def counter(_name, _labels, _docstring, _prefix)
55
+ def counter(_name, _labels, _docstring, _prefix, _aggregation)
56
56
  BaseCounter.new
57
57
  end
58
58
 
@@ -75,7 +75,7 @@ module Monitoring
75
75
  end
76
76
 
77
77
  # Exception-driven behavior to avoid synchronization errors.
78
- def counter(name, _labels, docstring, _prefix)
78
+ def counter(name, _labels, docstring, _prefix, _aggregation)
79
79
  # When we upgrade to Prometheus client 0.10.0 or higher, pass the
80
80
  # labels in the metric constructor. The 'labels' field in
81
81
  # Prometheus client 0.9.0 has a different function and will not
@@ -102,12 +102,18 @@ module Monitoring
102
102
  @gcm_service_address = gcm_service_address
103
103
  @recorders = {}
104
104
  @exporters = {}
105
+ @log.info(
106
+ 'monitoring module: Successfully initialized Open Census monitoring ' \
107
+ 'registry.')
105
108
  end
106
109
 
107
- def counter(name, labels, docstring, prefix)
110
+ def counter(name, labels, docstring, prefix, aggregation)
108
111
  translator = MetricTranslator.new(name, labels)
109
112
  measure = OpenCensus::Stats::MeasureRegistry.get(translator.name)
110
113
  if measure.nil?
114
+ @log.info(
115
+ 'monitoring module: Registering a new measure registry for ' \
116
+ "#{translator.name}")
111
117
  measure = OpenCensus::Stats.create_measure_int(
112
118
  name: translator.name,
113
119
  unit: OpenCensus::Stats::Measure::UNIT_NONE,
@@ -115,7 +121,10 @@ module Monitoring
115
121
  )
116
122
  end
117
123
  unless @exporters.keys.include?(prefix)
118
- @recorders[prefix] = OpenCensus::Stats.ensure_recorder
124
+ @log.info(
125
+ 'monitoring module: Registering a new exporter for ' \
126
+ "#{prefix}")
127
+ @recorders[prefix] = OpenCensus::Stats::Recorder.new
119
128
  @exporters[prefix] = \
120
129
  OpenCensus::Stats::Exporters::Stackdriver.new(
121
130
  project_id: @project_id,
@@ -124,25 +133,47 @@ module Monitoring
124
133
  resource_labels: @metrics_monitored_resource.labels,
125
134
  gcm_service_address: @gcm_service_address
126
135
  )
136
+ @log.info(
137
+ 'monitoring module: Registered recorders and exporters for ' \
138
+ "#{prefix}.\n#{@exporters[prefix]}")
127
139
  end
128
- OpenCensus::Stats.create_and_register_view(
129
- name: translator.name,
130
- measure: measure,
131
- aggregation: OpenCensus::Stats.create_sum_aggregation,
132
- description: docstring,
133
- columns: translator.view_labels.map(&:to_s)
140
+ if aggregation == 'GAUGE'
141
+ stats_aggregation = OpenCensus::Stats.create_last_value_aggregation
142
+ else
143
+ stats_aggregation = OpenCensus::Stats.create_sum_aggregation
144
+ end
145
+ @recorders[prefix].register_view(
146
+ OpenCensus::Stats::View.new(
147
+ name: translator.name,
148
+ measure: measure,
149
+ aggregation: stats_aggregation,
150
+ description: docstring,
151
+ columns: translator.view_labels.map(&:to_s)
152
+ )
134
153
  )
135
- OpenCensusCounter.new(@recorders[prefix], measure, translator)
154
+ counter = OpenCensusCounter.new(@recorders[prefix], measure, translator)
155
+ @log.info(
156
+ 'monitoring module: Successfully initialized Open Census counter for ' \
157
+ "#{prefix}/#{name}.")
158
+ counter
136
159
  rescue StandardError => e
137
160
  @log.warn "Failed to count metrics for #{name}.", error: e
138
161
  raise e
139
162
  end
140
163
 
141
164
  def export
165
+ @log.debug(
166
+ "monitoring module: Exporting metrics for #{@exporters.keys}.")
142
167
  @exporters.keys.each do |prefix|
168
+ @log.debug(
169
+ "monitoring module: Exporting metrics for #{prefix}. " \
170
+ "#{@recorders[prefix].views_data}")
143
171
  @exporters[prefix].export @recorders[prefix].views_data
144
172
  end
145
173
  rescue StandardError => e
174
+ # TODO(lingshi): Fix the error handling here. Seems like the export is
175
+ # done asynchronously. So any failure happens silently. More details at
176
+ # https://github.com/census-ecosystem/opencensus-ruby-exporter-stackdriver/blob/f8de506204972548ca535eff6010d15f328df6c3/lib/opencensus/stats/exporters/stackdriver.rb#L156
146
177
  @log.warn 'Failed to export some metrics.', error: e
147
178
  raise e
148
179
  end
@@ -564,37 +564,37 @@ module Fluent
564
564
  # we can't change it.
565
565
  @uptime_metric = @registry.counter(
566
566
  :uptime, [:version], 'Uptime of Logging agent',
567
- 'agent.googleapis.com/agent')
567
+ 'agent.googleapis.com/agent', 'CUMULATIVE')
568
568
  update_uptime
569
569
  timer_execute(:update_uptime, 1) { update_uptime }
570
570
  @successful_requests_count = @registry.counter(
571
571
  :stackdriver_successful_requests_count,
572
572
  [:grpc, :code],
573
573
  'A number of successful requests to the Stackdriver Logging API',
574
- 'agent.googleapis.com/agent')
574
+ 'agent.googleapis.com/agent', 'CUMULATIVE')
575
575
  @failed_requests_count = @registry.counter(
576
576
  :stackdriver_failed_requests_count,
577
577
  [:grpc, :code],
578
578
  'A number of failed requests to the Stackdriver Logging '\
579
579
  'API, broken down by the error code',
580
- 'agent.googleapis.com/agent')
580
+ 'agent.googleapis.com/agent', 'CUMULATIVE')
581
581
  @ingested_entries_count = @registry.counter(
582
582
  :stackdriver_ingested_entries_count,
583
583
  [:grpc, :code],
584
584
  'A number of log entries ingested by Stackdriver Logging',
585
- 'agent.googleapis.com/agent')
585
+ 'agent.googleapis.com/agent', 'CUMULATIVE')
586
586
  @dropped_entries_count = @registry.counter(
587
587
  :stackdriver_dropped_entries_count,
588
588
  [:grpc, :code],
589
589
  'A number of log entries dropped by the Stackdriver output plugin',
590
- 'agent.googleapis.com/agent')
590
+ 'agent.googleapis.com/agent', 'CUMULATIVE')
591
591
  @retried_entries_count = @registry.counter(
592
592
  :stackdriver_retried_entries_count,
593
593
  [:grpc, :code],
594
594
  'The number of log entries that failed to be ingested by '\
595
595
  'the Stackdriver output plugin due to a transient error '\
596
596
  'and were retried',
597
- 'agent.googleapis.com/agent')
597
+ 'agent.googleapis.com/agent', 'CUMULATIVE')
598
598
  @ok_code = @use_grpc ? GRPC::Core::StatusCodes::OK : 200
599
599
  end
600
600