Skip to content

Commit a458737

Browse files
authored
User Agent metrics (#3031)
1 parent c53f9fa commit a458737

34 files changed

+327
-158
lines changed

build_tools/aws-sdk-code-generator/lib/aws-sdk-code-generator/resource_batch_action_code.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def build
1515
parts << 'batch_enum.each do |batch|'
1616
parts << initialize_params
1717
parts << apply_params_per_batch
18-
parts << " Aws::Plugins::UserAgent.feature('resource') do"
18+
parts << " Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do"
1919
parts << " batch[0].client.#{client_method}(params)"
2020
parts << ' end'
2121
parts << 'end'

build_tools/aws-sdk-code-generator/lib/aws-sdk-code-generator/resource_client_request.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def build(options)
1515
parts = []
1616
parts << request_options(params) if merge
1717
parts << assignment(options)
18-
parts << "Aws::Plugins::UserAgent.feature('resource') do\n"
18+
parts << "Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do\n"
1919
parts << " @client."
2020
parts << operation_name(request)
2121
parts << arguments(merge, params, streaming)

build_tools/aws-sdk-code-generator/lib/aws-sdk-code-generator/resource_waiter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def wait_call(waiter)
5454
).to_s.strip
5555
parts = []
5656
parts << 'resp = ' if waiter['path']
57-
parts << "Aws::Plugins::UserAgent.feature('resource') do\n"
57+
parts << "Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do\n"
5858
parts << " waiter.wait(params.merge(#{args}))"
5959
parts << "\nend"
6060
parts.join

build_tools/aws-sdk-code-generator/templates/resource_class.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ module {{module_name}}
213213
:retry
214214
end
215215
end
216-
Aws::Plugins::UserAgent.feature('resource') do
216+
Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
217217
Aws::Waiters::Waiter.new(options).wait({})
218218
end
219219
end

build_tools/services.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class ServiceEnumerator
1010
MANIFEST_PATH = File.expand_path('../../services.json', __FILE__)
1111

1212
# Minimum `aws-sdk-core` version for new gem builds
13-
MINIMUM_CORE_VERSION = "3.193.0"
13+
MINIMUM_CORE_VERSION = "3.197.0"
1414

1515
# Minimum `aws-sdk-core` version for new S3 gem builds
16-
MINIMUM_CORE_VERSION_S3 = "3.194.0"
16+
MINIMUM_CORE_VERSION_S3 = "3.197.0"
1717

1818
EVENTSTREAM_PLUGIN = "Aws::Plugins::EventStreamConfiguration"
1919

gems/aws-sdk-core/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Unreleased Changes
22
------------------
33

4+
* Feature - Bump User Agent to version 2.1 to track business metrics. This changes the User Agent plugin order to be just before sending.
5+
46
3.196.1 (2024-05-14)
57
------------------
68

gems/aws-sdk-core/lib/aws-sdk-core/pageable_response.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def each(&block)
201201
def next_response(params)
202202
params = next_page_params(params)
203203
request = context.client.build_request(context.operation_name, params)
204-
Aws::Plugins::UserAgent.feature('paginator') do
204+
Aws::Plugins::UserAgent.metric('PAGINATOR') do
205205
request.send_request
206206
end
207207
end

gems/aws-sdk-core/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ def add_handlers(handlers, config)
1111
# AttemptHandler comes just before we would retry an error.
1212
# Or before we would follow redirects.
1313
handlers.add(AttemptHandler, step: :sign, priority: 39)
14+
# ErrorHandler comes after we have parsed an error.
15+
handlers.add(ErrorHandler, step: :sign, priority: 95)
1416
# LatencyHandler is as close to sending as possible.
1517
handlers.add(LatencyHandler, step: :sign, priority: 0)
1618
end
@@ -62,17 +64,27 @@ def call(context)
6264
call_attempt.x_amzn_request_id = headers["x-amzn-request-id"]
6365
end
6466
call_attempt.http_status_code = context.http_response.status_code
65-
if e = resp.error
67+
context.metadata[:current_call_attempt] = call_attempt
68+
request_metrics.add_call_attempt(call_attempt)
69+
resp
70+
end
71+
end
72+
73+
class ErrorHandler < Seahorse::Client::Handler
74+
def call(context)
75+
resp = @handler.call(context)
76+
call_attempt = context.metadata[:current_call_attempt]
77+
if (e = resp.error)
6678
e_name = _extract_error_name(e)
6779
e_msg = e.message
6880
call_attempt.aws_exception = "#{e_name}"
6981
call_attempt.aws_exception_msg = "#{e_msg}"
7082
end
71-
request_metrics.add_call_attempt(call_attempt)
7283
resp
7384
end
7485

7586
private
87+
7688
def _extract_error_name(error)
7789
if error.is_a?(Aws::Errors::ServiceError)
7890
error.class.code

gems/aws-sdk-core/lib/aws-sdk-core/plugins/request_compression.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,20 @@ def call(context)
9191
end
9292
end
9393
end
94-
@handler.call(context)
94+
with_metric(selected_encoding) { @handler.call(context) }
9595
end
9696

9797
private
9898

99+
def with_metric(encoding, &block)
100+
case encoding
101+
when 'gzip'
102+
Aws::Plugins::UserAgent.metric('GZIP_REQUEST_COMPRESSION', &block)
103+
else
104+
block.call
105+
end
106+
end
107+
99108
def request_encoding_selection(context)
100109
encoding_list = context.operation.request_compression['encodings']
101110
encoding_list.find { |encoding| RequestCompression::SUPPORTED_ENCODINGS.include?(encoding) }

gems/aws-sdk-core/lib/aws-sdk-core/plugins/retry_errors.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def call(context)
235235

236236
get_send_token(config)
237237
add_retry_headers(context)
238-
response = @handler.call(context)
238+
response = with_metric(config.retry_mode) { @handler.call(context) }
239239
error_inspector = Retries::ErrorInspector.new(
240240
response.error, response.context.http_response.status_code
241241
)
@@ -272,6 +272,10 @@ def call(context)
272272

273273
private
274274

275+
def with_metric(retry_mode, &block)
276+
Aws::Plugins::UserAgent.metric("RETRY_MODE_#{retry_mode.upcase}", &block)
277+
end
278+
275279
def get_send_token(config)
276280
# either fail fast or block until a token becomes available
277281
# must be configurable
@@ -359,7 +363,7 @@ def compute_request_ttl(context)
359363
class LegacyHandler < Seahorse::Client::Handler
360364

361365
def call(context)
362-
response = @handler.call(context)
366+
response = with_metric { @handler.call(context) }
363367
if response.error
364368
error_inspector = Retries::ErrorInspector.new(
365369
response.error, response.context.http_response.status_code
@@ -378,6 +382,10 @@ def call(context)
378382

379383
private
380384

385+
def with_metric(&block)
386+
Aws::Plugins::UserAgent.metric('RETRY_MODE_LEGACY', &block)
387+
end
388+
381389
def retry_if_possible(response, error_inspector)
382390
context = response.context
383391
if should_retry?(context, error_inspector)

0 commit comments

Comments
 (0)