fluent-plugin-google-cloud 0.10.4 → 0.10.9

Sign up to get free protection for your applications and to get access to all the features.
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