opentelemetry-instrumentation-aws_sdk 0.5.4 → 0.7.0

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: 877637b5387d476ece45e8537ccc2eed0dd52600c414cb2f96e0391a0ba06560
4
- data.tar.gz: a643b9573b8dedaa45acc014970c4ecc85ba74f21ccd4fc240ed4c9165e4b7b7
3
+ metadata.gz: fc28b8e181dc59950237cb56fbde713e2083003bab88acd345bd90dba7b5eb1a
4
+ data.tar.gz: a479a21f7d6c14d691df13d7683bf5a680045185520205018d70a9736b306a2a
5
5
  SHA512:
6
- metadata.gz: dec9fd1339e6ed63091a32e9c695927bef9e4c7c7b1d65fc2c1cacc56f5a3ae4d2739d1317878bbe98b4b95a882f90c1a3540d253ad9d5663581bca028b3d117
7
- data.tar.gz: adc5712d47bdf9d7aad92fe6756f1c515994b1160d4cdbbe13b60bd7fd441a18c7be6d050be5681378f777a4d5f6d8afaf2d4c19d966d87c8546dfa610dfc730
6
+ metadata.gz: 86d3e8d2c0a94cd739f5abdeae3c762573d6e175b0fc4ffd682fc1811ce1da7fc2d4fd73ce0131573531b9f3643d9ef5b3bf775869aa9445012d43295af2c02c
7
+ data.tar.gz: 1b1d40e77d958f1869163cf01f1d6ddf6bb8713170747cf6d754fc225d6a9715efe6454a3b5f4fb7e9d5d0025d22ca745c0dccf46385718509f97a604fd3c33f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Release History: opentelemetry-instrumentation-aws_sdk
2
2
 
3
+ ### v0.7.0 / 2024-10-08
4
+
5
+ * ADDED: Integration with V3 telemetry provider
6
+
7
+ ### v0.6.0 / 2024-09-19
8
+
9
+ * ADDED: All AWS services emit traces
10
+
3
11
  ### v0.5.4 / 2024-07-23
4
12
 
5
13
  * DOCS: Add cspell to CI
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
 
@@ -32,6 +32,30 @@ OpenTelemetry::SDK.configure do |c|
32
32
  c.use_all
33
33
  end
34
34
  ```
35
+ ### Configuration options
36
+ This instrumentation offers the following configuration options:
37
+ * `:inject_messaging_context` (default: `false`): When set to `true`, adds context key/value
38
+ to Message Attributes for SQS/SNS messages.
39
+ * `suppress_internal_instrumentation` (default: `false`): When set to `true`, any spans with
40
+ span kind of `internal` are suppressed from traces.
41
+
42
+ ## Integration with SDK V3's Telemetry support
43
+ AWS SDK for Ruby V3 added support for Observability which includes a new configuration,
44
+ `telemetry_provider` and an OpenTelemetry-based telemetry provider. Only applies to
45
+ AWS service gems released after 2024-09-03.
46
+
47
+ Using later versions of these gems will give more details on the internal spans.
48
+ See below for example usage:
49
+ ```ruby
50
+ # configures the OpenTelemetry SDK with instrumentation defaults
51
+ OpenTelemetry::SDK.configure do |c|
52
+ c.use 'OpenTelemetry::Instrumentation::AwsSdk'
53
+ end
54
+
55
+ # create open-telemetry provider and pass to client config
56
+ otel_provider = Aws::Telemetry::OTelProvider.new
57
+ client = Aws::S3::Client.new(telemetry_provider: otel_provider)
58
+ ```
35
59
 
36
60
  ## Example
37
61
 
@@ -49,7 +73,7 @@ This will run SNS publish command, printing OpenTelemetry traces to the console
49
73
 
50
74
  The `opentelemetry-instrumentation-aws_sdk` gem source is [on github][repo-github], along with related gems including `opentelemetry-api` and `opentelemetry-sdk`.
51
75
 
52
- The OpenTelemetry Ruby gems are maintained by the OpenTelemetry-Ruby special interest group (SIG). You can get involved by joining us in [GitHub Discussions][discussions-url] 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].
76
+ 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
77
 
54
78
  ## License
55
79
 
@@ -61,4 +85,5 @@ Apache 2.0 license. See [LICENSE][license-github] for more information.
61
85
  [license-github]: https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/main/LICENSE
62
86
  [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
63
87
  [community-meetings]: https://github.com/open-telemetry/community#community-meetings
88
+ [slack-channel]: https://cloud-native.slack.com/archives/C01NWKKMKMY
64
89
  [discussions-url]: https://github.com/open-telemetry/opentelemetry-ruby/discussions
@@ -7,38 +7,31 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module AwsSdk
10
- # Generates Spans for all interactions with AwsSdk
10
+ # This handler supports specifically supports V2 and V3
11
+ # prior to Observability support released on 2024-09-03.
11
12
  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
13
  def call(context)
18
14
  return super unless context
19
15
 
20
- service_name = service_name(context)
21
- operation = context.operation&.name
22
- client_method = "#{service_name}.#{operation}"
23
- attributes = {
24
- 'aws.region' => context.config.region,
25
- OpenTelemetry::SemanticConventions::Trace::RPC_SYSTEM => 'aws-api',
26
- OpenTelemetry::SemanticConventions::Trace::RPC_METHOD => operation,
27
- OpenTelemetry::SemanticConventions::Trace::RPC_SERVICE => service_name
28
- }
29
- attributes[SemanticConventions::Trace::DB_SYSTEM] = 'dynamodb' if service_name == 'DynamoDB'
30
- MessagingHelper.apply_sqs_attributes(attributes, context, client_method) if service_name == 'SQS'
31
- MessagingHelper.apply_sns_attributes(attributes, context, client_method) if service_name == 'SNS'
16
+ service_id = HandlerHelper.service_id(context, legacy: true)
17
+ client_method = HandlerHelper.client_method(service_id, context)
18
+
19
+ tracer.in_span(
20
+ HandlerHelper.span_name(context, client_method, service_id, legacy: true),
21
+ attributes: HandlerHelper.span_attributes(context, client_method, service_id, legacy: true),
22
+ kind: HandlerHelper.span_kind(client_method, service_id)
23
+ ) do |span|
24
+ MessagingHelper.inject_context_if_supported(context, client_method, service_id)
32
25
 
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
- if instrumentation_config[:suppress_internal_instrumentation]
26
+ if HandlerHelper.instrumentation_config[:suppress_internal_instrumentation]
36
27
  OpenTelemetry::Common::Utilities.untraced { super }
37
28
  else
38
29
  super
39
30
  end.tap do |response|
40
- span.set_attribute(OpenTelemetry::SemanticConventions::Trace::HTTP_STATUS_CODE,
41
- context.http_response.status_code)
31
+ span.set_attribute(
32
+ OpenTelemetry::SemanticConventions::Trace::HTTP_STATUS_CODE,
33
+ context.http_response.status_code
34
+ )
42
35
 
43
36
  if (err = response.error)
44
37
  span.record_exception(err)
@@ -53,60 +46,11 @@ module OpenTelemetry
53
46
  def tracer
54
47
  AwsSdk::Instrumentation.instance.tracer
55
48
  end
56
-
57
- def instrumentation_config
58
- AwsSdk::Instrumentation.instance.config
59
- end
60
-
61
- def service_name(context)
62
- # Support aws-sdk v2.0.x, which 'metadata' has a setter method only
63
- return context.client.class.to_s.split('::')[1] if ::Seahorse::Model::Api.instance_method(:metadata).parameters.length.positive?
64
-
65
- context.client.class.api.metadata['serviceId'] || context.client.class.to_s.split('::')[1]
66
- end
67
-
68
- SEND_MESSAGE_CLIENT_METHODS = [SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH].freeze
69
- def inject_context(context, client_method)
70
- return unless SEND_MESSAGE_CLIENT_METHODS.include? client_method
71
- return unless instrumentation_config[:inject_messaging_context]
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
78
- else
79
- context.params[:message_attributes] ||= {}
80
- OpenTelemetry.propagation.inject(context.params[:message_attributes], setter: MessageAttributeSetter)
81
- end
82
- end
83
-
84
- def span_kind(client_method)
85
- case client_method
86
- when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
87
- OpenTelemetry::Trace::SpanKind::PRODUCER
88
- when SQS_RECEIVE_MESSAGE
89
- OpenTelemetry::Trace::SpanKind::CONSUMER
90
- else
91
- OpenTelemetry::Trace::SpanKind::CLIENT
92
- end
93
- end
94
-
95
- def span_name(context, client_method)
96
- case client_method
97
- when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
98
- "#{MessagingHelper.queue_name(context)} publish"
99
- when SQS_RECEIVE_MESSAGE
100
- "#{MessagingHelper.queue_name(context)} receive"
101
- else
102
- client_method
103
- end
104
- end
105
49
  end
106
50
 
107
51
  # A Seahorse::Client::Plugin that enables instrumentation for all AWS services
108
52
  class Plugin < Seahorse::Client::Plugin
109
- def add_handlers(handlers, config)
53
+ def add_handlers(handlers, _config)
110
54
  # run before Seahorse::Client::Plugin::ParamValidator (priority 50)
111
55
  handlers.add Handler, step: :validate, priority: 49
112
56
  end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ module Instrumentation
9
+ module AwsSdk
10
+ # Utility module that contains shared methods between AwsSdk and Telemetry handlers
11
+ module HandlerHelper
12
+ class << self
13
+ def instrumentation_config
14
+ AwsSdk::Instrumentation.instance.config
15
+ end
16
+
17
+ def client_method(service_id, context)
18
+ "#{service_id}.#{context.operation.name}".delete(' ')
19
+ end
20
+
21
+ def span_attributes(context, client_method, service_id, legacy: false)
22
+ {
23
+ 'aws.region' => context.config.region,
24
+ OpenTelemetry::SemanticConventions::Trace::CODE_FUNCTION => context.operation_name.to_s,
25
+ OpenTelemetry::SemanticConventions::Trace::CODE_NAMESPACE => 'Aws::Plugins::Telemetry',
26
+ OpenTelemetry::SemanticConventions::Trace::RPC_METHOD => context.operation.name,
27
+ OpenTelemetry::SemanticConventions::Trace::RPC_SERVICE => service_id,
28
+ OpenTelemetry::SemanticConventions::Trace::RPC_SYSTEM => 'aws-api'
29
+ }.tap do |attrs|
30
+ attrs[OpenTelemetry::SemanticConventions::Trace::CODE_NAMESPACE] = 'Aws::Plugins::AwsSdk' if legacy
31
+ attrs[SemanticConventions::Trace::DB_SYSTEM] = 'dynamodb' if service_id == 'DynamoDB'
32
+
33
+ MessagingHelper.apply_span_attributes(context, attrs, client_method, service_id) if MessagingHelper::SUPPORTED_SERVICES.include?(service_id)
34
+ end
35
+ end
36
+
37
+ def span_kind(client_method, service_id)
38
+ case service_id
39
+ when *MessagingHelper::SUPPORTED_SERVICES
40
+ MessagingHelper.span_kind(client_method)
41
+ else
42
+ OpenTelemetry::Trace::SpanKind::CLIENT
43
+ end
44
+ end
45
+
46
+ def span_name(context, client_method, service_id, legacy: false)
47
+ case service_id
48
+ when *MessagingHelper::SUPPORTED_SERVICES
49
+ if legacy
50
+ MessagingHelper.legacy_span_name(context, client_method)
51
+ else
52
+ MessagingHelper.span_name(context, client_method)
53
+ end
54
+ else
55
+ client_method
56
+ end
57
+ end
58
+
59
+ def service_id(context, legacy: false)
60
+ if legacy
61
+ legacy_service_id(context)
62
+ else
63
+ context.config.api.metadata['serviceId'] ||
64
+ context.config.api.metadata['serviceAbbreviation'] ||
65
+ context.config.api.metadata['serviceFullName']
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def legacy_service_id(context)
72
+ # Support aws-sdk v2.0.x, which 'metadata' has a setter method only
73
+ return context.client.class.to_s.split('::')[1] if ::Seahorse::Model::Api.instance_method(:metadata).parameters.length.positive?
74
+
75
+ context.client.class.api.metadata['serviceId'] || context.client.class.to_s.split('::')[1]
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -7,13 +7,39 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module AwsSdk
10
- # Instrumentation class that detects and installs the AwsSdk instrumentation
10
+ # The `OpenTelemetry::Instrumentation::AwsSdk::Instrumentation` class contains
11
+ # logic to detect and install the AwsSdk instrumentation.
12
+ #
13
+ # ## Configuration keys and options
14
+ #
15
+ # ### `:inject_messaging_context`
16
+ #
17
+ # Allows adding of context key/value to Message Attributes for SQS/SNS messages.
18
+ #
19
+ # - `false` **(default)** - Context key/value will not be added.
20
+ # - `true` - Context key/value will be added.
21
+ #
22
+ # ### `:suppress_internal_instrumentation`
23
+ #
24
+ # Disables tracing of spans of `internal` span kind.
25
+ #
26
+ # - `false` **(default)** - Internal spans are traced.
27
+ # - `true` - Internal spans are not traced.
28
+ #
29
+ # @example An explicit default configuration
30
+ # OpenTelemetry::SDK.configure do |c|
31
+ # c.use 'OpenTelemetry::Instrumentation::AwsSdk', {
32
+ # inject_messaging_context: false,
33
+ # suppress_internal_instrumentation: false
34
+ # }
35
+ # end
11
36
  class Instrumentation < OpenTelemetry::Instrumentation::Base
12
37
  MINIMUM_VERSION = Gem::Version.new('2.0.0')
13
38
 
14
39
  install do |_config|
15
40
  require_dependencies
16
- add_plugin(Seahorse::Client::Base, *loaded_constants)
41
+ patch_telemetry_plugin if telemetry_plugin?
42
+ add_plugins(Seahorse::Client::Base, *loaded_service_clients)
17
43
  end
18
44
 
19
45
  present do
@@ -41,31 +67,61 @@ module OpenTelemetry
41
67
 
42
68
  def require_dependencies
43
69
  require_relative 'handler'
44
- require_relative 'services'
70
+ require_relative 'handler_helper'
45
71
  require_relative 'message_attributes'
46
72
  require_relative 'messaging_helper'
73
+ require_relative 'patches/telemetry'
47
74
  end
48
75
 
49
- def add_plugin(*targets)
50
- targets.each { |klass| klass.add_plugin(AwsSdk::Plugin) }
76
+ def add_plugins(*targets)
77
+ targets.each do |klass|
78
+ next if supports_telemetry_plugin?(klass)
79
+
80
+ klass.add_plugin(AwsSdk::Plugin)
81
+ end
82
+ end
83
+
84
+ def supports_telemetry_plugin?(klass)
85
+ telemetry_plugin? &&
86
+ klass.plugins.include?(Aws::Plugins::Telemetry)
87
+ end
88
+
89
+ def telemetry_plugin?
90
+ ::Aws::Plugins.const_defined?(:Telemetry)
91
+ end
92
+
93
+ # Patches AWS SDK V3's telemetry plugin for integration
94
+ # This patch supports configuration set by this gem and
95
+ # additional span attributes that was not provided by the plugin
96
+ def patch_telemetry_plugin
97
+ ::Aws::Plugins::Telemetry::Handler.prepend(Patches::Handler)
51
98
  end
52
99
 
53
- def loaded_constants
54
- # Cross-check services against loaded AWS constants
55
- # Module#const_get can return a constant from ancestors when there's a miss.
56
- # If this conincidentally matches another constant, it will attempt to patch
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)
100
+ def loaded_service_clients
101
+ ::Aws.constants.each_with_object([]) do |c, constants|
102
+ m = ::Aws.const_get(c)
103
+ next unless loaded_service?(c, m)
61
104
 
62
105
  begin
63
- constants << ::Aws.const_get(service, false).const_get(:Client, false)
106
+ constants << m.const_get(:Client)
64
107
  rescue StandardError => e
65
108
  OpenTelemetry.logger.warn("Constant could not be loaded: #{e}")
66
109
  end
67
110
  end
68
111
  end
112
+
113
+ # This check does the following:
114
+ # 1 - Checks if the service client is autoload or not
115
+ # 2 - Validates whether if is a service client
116
+ # note that Seahorse::Client::Base is a superclass for V3 clients
117
+ # but for V2, it is Aws::Client
118
+ def loaded_service?(constant, service_module)
119
+ !::Aws.autoload?(constant) &&
120
+ service_module.is_a?(Module) &&
121
+ service_module.const_defined?(:Client) &&
122
+ (service_module.const_get(:Client).superclass == Seahorse::Client::Base ||
123
+ service_module.const_get(:Client).superclass == Aws::Client)
124
+ end
69
125
  end
70
126
  end
71
127
  end
@@ -7,9 +7,20 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module AwsSdk
10
- # MessagingHelper class provides methods for calculating messaging span attributes
10
+ # An utility class to help SQS/SNS-related span attributes/context injection
11
11
  class MessagingHelper
12
+ SUPPORTED_SERVICES = %w[SQS SNS].freeze
12
13
  class << self
14
+ SQS_SEND_MESSAGE = 'SQS.SendMessage'
15
+ SQS_SEND_MESSAGE_BATCH = 'SQS.SendMessageBatch'
16
+ SQS_RECEIVE_MESSAGE = 'SQS.ReceiveMessage'
17
+ SNS_PUBLISH = 'SNS.Publish'
18
+ SEND_MESSAGE_CLIENT_METHODS = [SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH].freeze
19
+
20
+ def supported_services
21
+ SUPPORTED_SERVICES
22
+ end
23
+
13
24
  def queue_name(context)
14
25
  topic_arn = context.params[:topic_arn]
15
26
  target_arn = context.params[:target_arn]
@@ -28,19 +39,82 @@ module OpenTelemetry
28
39
  'unknown'
29
40
  end
30
41
 
42
+ def span_name(context, client_method)
43
+ case client_method
44
+ when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
45
+ "#{client_method}.#{queue_name(context)}.Publish"
46
+ when SQS_RECEIVE_MESSAGE
47
+ "#{client_method}.#{queue_name(context)}.Receive"
48
+ else
49
+ client_method
50
+ end
51
+ end
52
+
53
+ def legacy_span_name(context, client_method)
54
+ case client_method
55
+ when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
56
+ "#{MessagingHelper.queue_name(context)} publish"
57
+ when SQS_RECEIVE_MESSAGE
58
+ "#{MessagingHelper.queue_name(context)} receive"
59
+ else
60
+ client_method
61
+ end
62
+ end
63
+
64
+ def apply_span_attributes(context, attrs, client_method, service_id)
65
+ case service_id
66
+ when 'SQS'
67
+ apply_sqs_attributes(attrs, context, client_method)
68
+ when 'SNS'
69
+ apply_sns_attributes(attrs, context, client_method)
70
+ end
71
+ end
72
+
73
+ def span_kind(client_method)
74
+ case client_method
75
+ when SQS_SEND_MESSAGE, SQS_SEND_MESSAGE_BATCH, SNS_PUBLISH
76
+ OpenTelemetry::Trace::SpanKind::PRODUCER
77
+ when SQS_RECEIVE_MESSAGE
78
+ OpenTelemetry::Trace::SpanKind::CONSUMER
79
+ else
80
+ OpenTelemetry::Trace::SpanKind::CLIENT
81
+ end
82
+ end
83
+
84
+ def inject_context_if_supported(context, client_method, service_id)
85
+ if HandlerHelper.instrumentation_config[:inject_messaging_context] &&
86
+ SUPPORTED_SERVICES.include?(service_id)
87
+ inject_context(context, client_method)
88
+ end
89
+ end
90
+
91
+ def inject_context(context, client_method)
92
+ return unless SEND_MESSAGE_CLIENT_METHODS.include?(client_method)
93
+
94
+ if client_method == SQS_SEND_MESSAGE_BATCH
95
+ context.params[:entries].each do |entry|
96
+ entry[:message_attributes] ||= {}
97
+ OpenTelemetry.propagation.inject(entry[:message_attributes], setter: MessageAttributeSetter)
98
+ end
99
+ else
100
+ context.params[:message_attributes] ||= {}
101
+ OpenTelemetry.propagation.inject(context.params[:message_attributes], setter: MessageAttributeSetter)
102
+ end
103
+ end
104
+
105
+ private
106
+
31
107
  def apply_sqs_attributes(attributes, context, client_method)
32
108
  attributes[SemanticConventions::Trace::MESSAGING_SYSTEM] = 'aws.sqs'
33
109
  attributes[SemanticConventions::Trace::MESSAGING_DESTINATION_KIND] = 'queue'
34
110
  attributes[SemanticConventions::Trace::MESSAGING_DESTINATION] = queue_name(context)
35
111
  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'
112
+ attributes[SemanticConventions::Trace::MESSAGING_OPERATION] = 'receive' if client_method == SQS_RECEIVE_MESSAGE
38
113
  end
39
114
 
40
115
  def apply_sns_attributes(attributes, context, client_method)
41
116
  attributes[SemanticConventions::Trace::MESSAGING_SYSTEM] = 'aws.sns'
42
-
43
- return unless client_method == 'SNS.Publish'
117
+ return unless client_method == SNS_PUBLISH
44
118
 
45
119
  attributes[SemanticConventions::Trace::MESSAGING_DESTINATION_KIND] = 'topic'
46
120
  attributes[SemanticConventions::Trace::MESSAGING_DESTINATION] = queue_name(context)
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ module Instrumentation
9
+ module AwsSdk
10
+ module Patches
11
+ # Patch for Telemetry Plugin Handler in V3 SDK
12
+ module Handler
13
+ def call(context)
14
+ span_wrapper(context) { @handler.call(context) }
15
+ end
16
+
17
+ private
18
+
19
+ def span_wrapper(context, &block)
20
+ service_id = HandlerHelper.service_id(context)
21
+ client_method = HandlerHelper.client_method(service_id, context)
22
+ context.tracer.in_span(
23
+ HandlerHelper.span_name(context, client_method, service_id),
24
+ attributes: HandlerHelper.span_attributes(context, client_method, service_id),
25
+ kind: HandlerHelper.span_kind(client_method, service_id)
26
+ ) do |span|
27
+ MessagingHelper.inject_context_if_supported(context, client_method, service_id)
28
+
29
+ if HandlerHelper.instrumentation_config[:suppress_internal_instrumentation]
30
+ OpenTelemetry::Common::Utilities.untraced { super }
31
+ else
32
+ yield span
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -7,7 +7,7 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module AwsSdk
10
- VERSION = '0.5.4'
10
+ VERSION = '0.7.0'
11
11
  end
12
12
  end
13
13
  end
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.5.4
4
+ version: 0.7.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-07-24 00:00:00.000000000 Z
11
+ date: 2024-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -156,28 +156,28 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 1.65.0
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.65.0
166
+ version: 1.66.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: rubocop-performance
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: '1.20'
173
+ version: 1.22.0
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: '1.20'
180
+ version: 1.22.0
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: simplecov
183
183
  requirement: !ruby/object:Gem::Requirement
@@ -198,14 +198,14 @@ dependencies:
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: '3.19'
201
+ version: 3.24.0
202
202
  type: :development
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - "~>"
207
207
  - !ruby/object:Gem::Version
208
- version: '3.19'
208
+ version: 3.24.0
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: yard
211
211
  requirement: !ruby/object:Gem::Requirement
@@ -235,19 +235,20 @@ files:
235
235
  - lib/opentelemetry/instrumentation.rb
236
236
  - lib/opentelemetry/instrumentation/aws_sdk.rb
237
237
  - lib/opentelemetry/instrumentation/aws_sdk/handler.rb
238
+ - lib/opentelemetry/instrumentation/aws_sdk/handler_helper.rb
238
239
  - lib/opentelemetry/instrumentation/aws_sdk/instrumentation.rb
239
240
  - lib/opentelemetry/instrumentation/aws_sdk/message_attributes.rb
240
241
  - lib/opentelemetry/instrumentation/aws_sdk/messaging_helper.rb
241
- - lib/opentelemetry/instrumentation/aws_sdk/services.rb
242
+ - lib/opentelemetry/instrumentation/aws_sdk/patches/telemetry.rb
242
243
  - lib/opentelemetry/instrumentation/aws_sdk/version.rb
243
244
  homepage: https://github.com/open-telemetry/opentelemetry-ruby-contrib
244
245
  licenses:
245
246
  - Apache-2.0
246
247
  metadata:
247
- changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.5.4/file/CHANGELOG.md
248
+ changelog_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.7.0/file/CHANGELOG.md
248
249
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/tree/main/instrumentation/aws_sdk
249
250
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby-contrib/issues
250
- documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.5.4
251
+ documentation_uri: https://rubydoc.info/gems/opentelemetry-instrumentation-aws_sdk/0.7.0
251
252
  post_install_message:
252
253
  rdoc_options: []
253
254
  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