opentelemetry-instrumentation-aws_sdk 0.5.3 → 0.6.0
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 +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +3 -2
- data/lib/opentelemetry/instrumentation/aws_sdk/handler.rb +36 -48
- data/lib/opentelemetry/instrumentation/aws_sdk/instrumentation.rb +20 -12
- data/lib/opentelemetry/instrumentation/aws_sdk/messaging_helper.rb +56 -5
- data/lib/opentelemetry/instrumentation/aws_sdk/version.rb +1 -1
- metadata +6 -7
- data/lib/opentelemetry/instrumentation/aws_sdk/services.rb +0 -121
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05256cef329eccec85d4d6732b402aa9c1be08fa39da455cee3ed43d4b0ed9c7
|
4
|
+
data.tar.gz: d4f05d032386bdbabfb064e051757a02fc27b75947594bb89211b311abb54446
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7dada29094deea482504658785d9b13ce16d2e8d4198d0c08b64c378618cda70d30744ece8a0b59a12df3a39f18a23ca9f93c1b3186ea51e53e4a6c03e887127
|
7
|
+
data.tar.gz: 379d073b4f1d46dce866fdd15a85677cc7f436b82c608a40731f4a716222fda9b3774fecf0264679046f79b1cf71179398a7c555c7815f8f35e5ce461784eb73
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Release History: opentelemetry-instrumentation-aws_sdk
|
2
2
|
|
3
|
+
### v0.6.0 / 2024-09-19
|
4
|
+
|
5
|
+
* ADDED: All AWS services emit traces
|
6
|
+
|
7
|
+
### v0.5.4 / 2024-07-23
|
8
|
+
|
9
|
+
* DOCS: Add cspell to CI
|
10
|
+
|
3
11
|
### v0.5.3 / 2024-07-02
|
4
12
|
|
5
13
|
* DOCS: Fix CHANGELOGs to reflect a past breaking change
|
@@ -10,7 +18,7 @@
|
|
10
18
|
|
11
19
|
### v0.5.1 / 2024-02-08
|
12
20
|
|
13
|
-
* FIXED: Return nil for non-
|
21
|
+
* FIXED: Return nil for non-existent key in AwsSdk::MessageAttributeGetter
|
14
22
|
|
15
23
|
### v0.5.0 / 2023-09-07
|
16
24
|
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ The OpenTelemetry `aws-sdk` gem is a community maintained instrumentation for [a
|
|
6
6
|
|
7
7
|
Install the gem using:
|
8
8
|
|
9
|
-
```
|
9
|
+
```console
|
10
10
|
gem install opentelemetry-instrumentation-aws_sdk
|
11
11
|
```
|
12
12
|
|
@@ -49,7 +49,7 @@ This will run SNS publish command, printing OpenTelemetry traces to the console
|
|
49
49
|
|
50
50
|
The `opentelemetry-instrumentation-aws_sdk` gem source is [on github][repo-github], along with related gems including `opentelemetry-api` and `opentelemetry-sdk`.
|
51
51
|
|
52
|
-
The OpenTelemetry Ruby gems are maintained by the OpenTelemetry
|
52
|
+
The OpenTelemetry Ruby gems are maintained by the OpenTelemetry Ruby special interest group (SIG). You can get involved by joining us on our [GitHub Discussions][discussions-url], [Slack Channel][slack-channel] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
|
53
53
|
|
54
54
|
## License
|
55
55
|
|
@@ -61,4 +61,5 @@ Apache 2.0 license. See [LICENSE][license-github] for more information.
|
|
61
61
|
[license-github]: https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/main/LICENSE
|
62
62
|
[ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
|
63
63
|
[community-meetings]: https://github.com/open-telemetry/community#community-meetings
|
64
|
+
[slack-channel]: https://cloud-native.slack.com/archives/C01NWKKMKMY
|
64
65
|
[discussions-url]: https://github.com/open-telemetry/opentelemetry-ruby/discussions
|
@@ -9,36 +9,32 @@ module OpenTelemetry
|
|
9
9
|
module AwsSdk
|
10
10
|
# Generates Spans for all interactions with AwsSdk
|
11
11
|
class Handler < Seahorse::Client::Handler
|
12
|
-
SQS_SEND_MESSAGE = 'SQS.SendMessage'
|
13
|
-
SQS_SEND_MESSAGE_BATCH = 'SQS.SendMessageBatch'
|
14
|
-
SQS_RECEIVE_MESSAGE = 'SQS.ReceiveMessage'
|
15
|
-
SNS_PUBLISH = 'SNS.Publish'
|
16
|
-
|
17
12
|
def call(context)
|
18
13
|
return super unless context
|
19
14
|
|
20
|
-
|
15
|
+
service_id = service_name(context)
|
21
16
|
operation = context.operation&.name
|
22
|
-
client_method = "#{
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
17
|
+
client_method = "#{service_id}.#{operation}"
|
18
|
+
|
19
|
+
tracer.in_span(
|
20
|
+
span_name(context, client_method, service_id),
|
21
|
+
attributes: attributes(context, client_method, service_id, operation),
|
22
|
+
kind: span_kind(client_method, service_id)
|
23
|
+
) do |span|
|
24
|
+
if instrumentation_config[:inject_messaging_context] &&
|
25
|
+
%w[SQS SNS].include?(service_id)
|
26
|
+
MessagingHelper.inject_context(context, client_method)
|
27
|
+
end
|
32
28
|
|
33
|
-
tracer.in_span(span_name(context, client_method), attributes: attributes, kind: span_kind(client_method)) do |span|
|
34
|
-
inject_context(context, client_method)
|
35
29
|
if instrumentation_config[:suppress_internal_instrumentation]
|
36
30
|
OpenTelemetry::Common::Utilities.untraced { super }
|
37
31
|
else
|
38
32
|
super
|
39
33
|
end.tap do |response|
|
40
|
-
span.set_attribute(
|
41
|
-
|
34
|
+
span.set_attribute(
|
35
|
+
OpenTelemetry::SemanticConventions::Trace::HTTP_STATUS_CODE,
|
36
|
+
context.http_response.status_code
|
37
|
+
)
|
42
38
|
|
43
39
|
if (err = response.error)
|
44
40
|
span.record_exception(err)
|
@@ -65,48 +61,40 @@ module OpenTelemetry
|
|
65
61
|
context.client.class.api.metadata['serviceId'] || context.client.class.to_s.split('::')[1]
|
66
62
|
end
|
67
63
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
if client_method == SQS_SEND_MESSAGE_BATCH
|
74
|
-
context.params[:entries].each do |entry|
|
75
|
-
entry[:message_attributes] ||= {}
|
76
|
-
OpenTelemetry.propagation.inject(entry[:message_attributes], setter: MessageAttributeSetter)
|
77
|
-
end
|
64
|
+
def span_kind(client_method, service_id)
|
65
|
+
case service_id
|
66
|
+
when 'SQS', 'SNS'
|
67
|
+
MessagingHelper.span_kind(client_method)
|
78
68
|
else
|
79
|
-
|
80
|
-
OpenTelemetry.propagation.inject(context.params[:message_attributes], setter: MessageAttributeSetter)
|
69
|
+
OpenTelemetry::Trace::SpanKind::CLIENT
|
81
70
|
end
|
82
71
|
end
|
83
72
|
|
84
|
-
def
|
85
|
-
case
|
86
|
-
when
|
87
|
-
|
88
|
-
when SQS_RECEIVE_MESSAGE
|
89
|
-
OpenTelemetry::Trace::SpanKind::CONSUMER
|
73
|
+
def span_name(context, client_method, service_id)
|
74
|
+
case service_id
|
75
|
+
when 'SQS', 'SNS'
|
76
|
+
MessagingHelper.legacy_span_name(context, client_method)
|
90
77
|
else
|
91
|
-
|
78
|
+
client_method
|
92
79
|
end
|
93
80
|
end
|
94
81
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
82
|
+
def attributes(context, client_method, service_id, operation)
|
83
|
+
{
|
84
|
+
'aws.region' => context.config.region,
|
85
|
+
OpenTelemetry::SemanticConventions::Trace::RPC_SYSTEM => 'aws-api',
|
86
|
+
OpenTelemetry::SemanticConventions::Trace::RPC_METHOD => operation,
|
87
|
+
OpenTelemetry::SemanticConventions::Trace::RPC_SERVICE => service_id
|
88
|
+
}.tap do |attrs|
|
89
|
+
attrs[SemanticConventions::Trace::DB_SYSTEM] = 'dynamodb' if service_id == 'DynamoDB'
|
90
|
+
MessagingHelper.apply_span_attributes(context, attrs, client_method, service_id) if %w[SQS SNS].include?(service_id)
|
103
91
|
end
|
104
92
|
end
|
105
93
|
end
|
106
94
|
|
107
95
|
# A Seahorse::Client::Plugin that enables instrumentation for all AWS services
|
108
96
|
class Plugin < Seahorse::Client::Plugin
|
109
|
-
def add_handlers(handlers,
|
97
|
+
def add_handlers(handlers, _config)
|
110
98
|
# run before Seahorse::Client::Plugin::ParamValidator (priority 50)
|
111
99
|
handlers.add Handler, step: :validate, priority: 49
|
112
100
|
end
|
@@ -13,7 +13,7 @@ module OpenTelemetry
|
|
13
13
|
|
14
14
|
install do |_config|
|
15
15
|
require_dependencies
|
16
|
-
|
16
|
+
add_plugins(Seahorse::Client::Base, *loaded_service_clients)
|
17
17
|
end
|
18
18
|
|
19
19
|
present do
|
@@ -41,31 +41,39 @@ module OpenTelemetry
|
|
41
41
|
|
42
42
|
def require_dependencies
|
43
43
|
require_relative 'handler'
|
44
|
-
require_relative 'services'
|
45
44
|
require_relative 'message_attributes'
|
46
45
|
require_relative 'messaging_helper'
|
47
46
|
end
|
48
47
|
|
49
|
-
def
|
48
|
+
def add_plugins(*targets)
|
50
49
|
targets.each { |klass| klass.add_plugin(AwsSdk::Plugin) }
|
51
50
|
end
|
52
51
|
|
53
|
-
def
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
# the wrong constant, resulting in patch failure.
|
58
|
-
available_services = ::Aws.constants & SERVICES.map(&:to_sym)
|
59
|
-
available_services.each_with_object([]) do |service, constants|
|
60
|
-
next if ::Aws.autoload?(service)
|
52
|
+
def loaded_service_clients
|
53
|
+
::Aws.constants.each_with_object([]) do |c, constants|
|
54
|
+
m = ::Aws.const_get(c)
|
55
|
+
next unless loaded_service?(c, m)
|
61
56
|
|
62
57
|
begin
|
63
|
-
constants <<
|
58
|
+
constants << m.const_get(:Client)
|
64
59
|
rescue StandardError => e
|
65
60
|
OpenTelemetry.logger.warn("Constant could not be loaded: #{e}")
|
66
61
|
end
|
67
62
|
end
|
68
63
|
end
|
64
|
+
|
65
|
+
# This check does the following:
|
66
|
+
# 1 - Checks if the service client is autoload or not
|
67
|
+
# 2 - Validates whether if is a service client
|
68
|
+
# note that Seahorse::Client::Base is a superclass for V3 clients
|
69
|
+
# but for V2, it is Aws::Client
|
70
|
+
def loaded_service?(constant, service_module)
|
71
|
+
!::Aws.autoload?(constant) &&
|
72
|
+
service_module.is_a?(Module) &&
|
73
|
+
service_module.const_defined?(:Client) &&
|
74
|
+
(service_module.const_get(:Client).superclass == Seahorse::Client::Base ||
|
75
|
+
service_module.const_get(:Client).superclass == Aws::Client)
|
76
|
+
end
|
69
77
|
end
|
70
78
|
end
|
71
79
|
end
|
@@ -7,9 +7,15 @@
|
|
7
7
|
module OpenTelemetry
|
8
8
|
module Instrumentation
|
9
9
|
module AwsSdk
|
10
|
-
#
|
10
|
+
# An utility class to help SQS/SNS-related span attributes/context injection
|
11
11
|
class MessagingHelper
|
12
12
|
class << self
|
13
|
+
SQS_SEND_MESSAGE = 'SQS.SendMessage'
|
14
|
+
SQS_SEND_MESSAGE_BATCH = 'SQS.SendMessageBatch'
|
15
|
+
SQS_RECEIVE_MESSAGE = 'SQS.ReceiveMessage'
|
16
|
+
SNS_PUBLISH = 'SNS.Publish'
|
17
|
+
SEND_MESSAGE_CLIENT_METHODS = [SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH].freeze
|
18
|
+
|
13
19
|
def queue_name(context)
|
14
20
|
topic_arn = context.params[:topic_arn]
|
15
21
|
target_arn = context.params[:target_arn]
|
@@ -28,19 +34,64 @@ module OpenTelemetry
|
|
28
34
|
'unknown'
|
29
35
|
end
|
30
36
|
|
37
|
+
def legacy_span_name(context, client_method)
|
38
|
+
case client_method
|
39
|
+
when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
|
40
|
+
"#{MessagingHelper.queue_name(context)} publish"
|
41
|
+
when SQS_RECEIVE_MESSAGE
|
42
|
+
"#{MessagingHelper.queue_name(context)} receive"
|
43
|
+
else
|
44
|
+
client_method
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def apply_span_attributes(context, attrs, client_method, service_id)
|
49
|
+
case service_id
|
50
|
+
when 'SQS'
|
51
|
+
apply_sqs_attributes(attrs, context, client_method)
|
52
|
+
when 'SNS'
|
53
|
+
apply_sns_attributes(attrs, context, client_method)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def span_kind(client_method)
|
58
|
+
case client_method
|
59
|
+
when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
|
60
|
+
OpenTelemetry::Trace::SpanKind::PRODUCER
|
61
|
+
when SQS_RECEIVE_MESSAGE
|
62
|
+
OpenTelemetry::Trace::SpanKind::CONSUMER
|
63
|
+
else
|
64
|
+
OpenTelemetry::Trace::SpanKind::CLIENT
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def inject_context(context, client_method)
|
69
|
+
return unless SEND_MESSAGE_CLIENT_METHODS.include?(client_method)
|
70
|
+
|
71
|
+
if client_method == SQS_SEND_MESSAGE_BATCH
|
72
|
+
context.params[:entries].each do |entry|
|
73
|
+
entry[:message_attributes] ||= {}
|
74
|
+
OpenTelemetry.propagation.inject(entry[:message_attributes], setter: MessageAttributeSetter)
|
75
|
+
end
|
76
|
+
else
|
77
|
+
context.params[:message_attributes] ||= {}
|
78
|
+
OpenTelemetry.propagation.inject(context.params[:message_attributes], setter: MessageAttributeSetter)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
31
84
|
def apply_sqs_attributes(attributes, context, client_method)
|
32
85
|
attributes[SemanticConventions::Trace::MESSAGING_SYSTEM] = 'aws.sqs'
|
33
86
|
attributes[SemanticConventions::Trace::MESSAGING_DESTINATION_KIND] = 'queue'
|
34
87
|
attributes[SemanticConventions::Trace::MESSAGING_DESTINATION] = queue_name(context)
|
35
88
|
attributes[SemanticConventions::Trace::MESSAGING_URL] = context.params[:queue_url] if context.params[:queue_url]
|
36
|
-
|
37
|
-
attributes[SemanticConventions::Trace::MESSAGING_OPERATION] = 'receive' if client_method == 'SQS.ReceiveMessage'
|
89
|
+
attributes[SemanticConventions::Trace::MESSAGING_OPERATION] = 'receive' if client_method == SQS_RECEIVE_MESSAGE
|
38
90
|
end
|
39
91
|
|
40
92
|
def apply_sns_attributes(attributes, context, client_method)
|
41
93
|
attributes[SemanticConventions::Trace::MESSAGING_SYSTEM] = 'aws.sns'
|
42
|
-
|
43
|
-
return unless client_method == 'SNS.Publish'
|
94
|
+
return unless client_method == SNS_PUBLISH
|
44
95
|
|
45
96
|
attributes[SemanticConventions::Trace::MESSAGING_DESTINATION_KIND] = 'topic'
|
46
97
|
attributes[SemanticConventions::Trace::MESSAGING_DESTINATION] = queue_name(context)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opentelemetry-instrumentation-aws_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenTelemetry Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opentelemetry-api
|
@@ -156,14 +156,14 @@ dependencies:
|
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: 1.
|
159
|
+
version: 1.66.0
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: 1.
|
166
|
+
version: 1.66.0
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: rubocop-performance
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,16 +238,15 @@ files:
|
|
238
238
|
- lib/opentelemetry/instrumentation/aws_sdk/instrumentation.rb
|
239
239
|
- lib/opentelemetry/instrumentation/aws_sdk/message_attributes.rb
|
240
240
|
- lib/opentelemetry/instrumentation/aws_sdk/messaging_helper.rb
|
241
|
-
- lib/opentelemetry/instrumentation/aws_sdk/services.rb
|
242
241
|
- lib/opentelemetry/instrumentation/aws_sdk/version.rb
|
243
242
|
homepage: https://github.com/open-telemetry/opentelemetry-ruby-contrib
|
244
243
|
licenses:
|
245
244
|
- Apache-2.0
|
246
245
|
metadata:
|
247
|
-
changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.
|
246
|
+
changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.6.0/file/CHANGELOG.md
|
248
247
|
source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/tree/main/instrumentation/aws_sdk
|
249
248
|
bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/issues
|
250
|
-
documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.
|
249
|
+
documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.6.0
|
251
250
|
post_install_message:
|
252
251
|
rdoc_options: []
|
253
252
|
require_paths:
|
@@ -1,121 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module OpenTelemetry
|
4
|
-
module Instrumentation
|
5
|
-
# rubocop:disable Metrics/ModuleLength:
|
6
|
-
module AwsSdk
|
7
|
-
SERVICES = %w[
|
8
|
-
ACM
|
9
|
-
APIGateway
|
10
|
-
AppStream
|
11
|
-
ApplicationAutoScaling
|
12
|
-
ApplicationDiscoveryService
|
13
|
-
Athena
|
14
|
-
AutoScaling
|
15
|
-
Batch
|
16
|
-
Budgets
|
17
|
-
CloudDirectory
|
18
|
-
CloudFormation
|
19
|
-
CloudFront
|
20
|
-
CloudHSM
|
21
|
-
CloudHSMV2
|
22
|
-
CloudSearch
|
23
|
-
CloudSearchDomain
|
24
|
-
CloudTrail
|
25
|
-
CloudWatch
|
26
|
-
CloudWatchEvents
|
27
|
-
CloudWatchLogs
|
28
|
-
CodeBuild
|
29
|
-
CodeCommit
|
30
|
-
CodeDeploy
|
31
|
-
CodePipeline
|
32
|
-
CodeStar
|
33
|
-
CognitoIdentity
|
34
|
-
CognitoIdentityProvider
|
35
|
-
CognitoSync
|
36
|
-
ConfigService
|
37
|
-
CostandUsageReportService
|
38
|
-
DAX
|
39
|
-
DataPipeline
|
40
|
-
DatabaseMigrationService
|
41
|
-
DeviceFarm
|
42
|
-
DirectConnect
|
43
|
-
DirectoryService
|
44
|
-
DynamoDB
|
45
|
-
DynamoDBStreams
|
46
|
-
EC2
|
47
|
-
ECR
|
48
|
-
ECS
|
49
|
-
EFS
|
50
|
-
EMR
|
51
|
-
ElastiCache
|
52
|
-
ElasticBeanstalk
|
53
|
-
ElasticLoadBalancing
|
54
|
-
ElasticLoadBalancingV2
|
55
|
-
ElasticTranscoder
|
56
|
-
ElasticsearchService
|
57
|
-
EventBridge
|
58
|
-
Firehose
|
59
|
-
GameLift
|
60
|
-
Glacier
|
61
|
-
Glue
|
62
|
-
Greengrass
|
63
|
-
Health
|
64
|
-
IAM
|
65
|
-
ImportExport
|
66
|
-
Inspector
|
67
|
-
IoT
|
68
|
-
IoTDataPlane
|
69
|
-
KMS
|
70
|
-
Kinesis
|
71
|
-
KinesisAnalytics
|
72
|
-
Lambda
|
73
|
-
LambdaPreview
|
74
|
-
Lex
|
75
|
-
LexModelBuildingService
|
76
|
-
Lightsail
|
77
|
-
MTurk
|
78
|
-
MachineLearning
|
79
|
-
MarketplaceCommerceAnalytics
|
80
|
-
MarketplaceEntitlementService
|
81
|
-
MarketplaceMetering
|
82
|
-
MigrationHub
|
83
|
-
Mobile
|
84
|
-
OpsWorks
|
85
|
-
OpsWorksCM
|
86
|
-
Organizations
|
87
|
-
Pinpoint
|
88
|
-
Polly
|
89
|
-
RDS
|
90
|
-
Redshift
|
91
|
-
Rekognition
|
92
|
-
ResourceGroupsTaggingAPI
|
93
|
-
Route53
|
94
|
-
Route53Domains
|
95
|
-
S3
|
96
|
-
SES
|
97
|
-
SMS
|
98
|
-
SNS
|
99
|
-
SQS
|
100
|
-
SSM
|
101
|
-
STS
|
102
|
-
SWF
|
103
|
-
ServiceCatalog
|
104
|
-
Schemas
|
105
|
-
Shield
|
106
|
-
SimpleDB
|
107
|
-
Snowball
|
108
|
-
States
|
109
|
-
StorageGateway
|
110
|
-
Support
|
111
|
-
Textract
|
112
|
-
WAF
|
113
|
-
WAFRegional
|
114
|
-
WorkDocs
|
115
|
-
WorkSpaces
|
116
|
-
XRay
|
117
|
-
].freeze
|
118
|
-
end
|
119
|
-
# rubocop:enable Metrics/ModuleLength:
|
120
|
-
end
|
121
|
-
end
|