From 0a290967e415e6c8e9ecebdb2795f0a6e2669ddd Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Wed, 29 Mar 2023 11:28:37 -0700
Subject: [PATCH 01/44] testing tagchange to see if its covered by ci

---
 lib/datadog/tracing/contrib/aws/ext.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/datadog/tracing/contrib/aws/ext.rb b/lib/datadog/tracing/contrib/aws/ext.rb
index fb5948db13c..2e9cfffddb0 100644
--- a/lib/datadog/tracing/contrib/aws/ext.rb
+++ b/lib/datadog/tracing/contrib/aws/ext.rb
@@ -18,7 +18,7 @@ module Ext
           TAG_OPERATION = 'aws.operation'.freeze
           TAG_OPERATION_COMMAND = 'command'.freeze
           TAG_PATH = 'path'.freeze
-          TAG_REGION = 'aws.region'.freeze
+          TAG_REGION = 'region'.freeze
         end
       end
     end

From 4496b3a680c7de21e0b26ae04f7165aba65d9249 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Mon, 3 Apr 2023 15:13:26 -0700
Subject: [PATCH 02/44] add top level region, xname (bucketname), aws_service
 tags to aws-sdk requests

---
 lib/datadog/tracing/contrib/aws/ext.rb        |   3 +-
 .../tracing/contrib/aws/instrumentation.rb    |  76 ++
 .../tracing/contrib/aws/parsed_context.rb     |  15 +
 .../contrib/aws/instrumentation_spec.rb       | 845 +++++++++++++++++-
 4 files changed, 937 insertions(+), 2 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/ext.rb b/lib/datadog/tracing/contrib/aws/ext.rb
index 2e9cfffddb0..6acde9f4703 100644
--- a/lib/datadog/tracing/contrib/aws/ext.rb
+++ b/lib/datadog/tracing/contrib/aws/ext.rb
@@ -18,7 +18,8 @@ module Ext
           TAG_OPERATION = 'aws.operation'.freeze
           TAG_OPERATION_COMMAND = 'command'.freeze
           TAG_PATH = 'path'.freeze
-          TAG_REGION = 'region'.freeze
+          TAG_REGION = 'aws.region'.freeze
+          TAG_TOP_LEVEL_REGION = 'region'.freeze
         end
       end
     end
diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index b05dfc73a32..69460825b29 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -30,6 +30,80 @@ def annotate!(span, context)
             span.span_type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
             span.name = Ext::SPAN_COMMAND
             span.resource = context.safely(:resource)
+            aws_service = span.resource.split(".")[0]
+            span.set_tag("aws_service", aws_service)
+            params = context.safely(:params)
+            
+            if aws_service == "sqs"
+              queue_url = params.fetch(:queue_url, "")
+              queue_name = params.fetch(:queue_name, "")
+              if queue_url
+                # example queue_url: https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
+                queue_name = queue_url.split("/")[-1]
+                aws_account = queue_url.split("/")[-2]
+                span.set_tag("aws_account", aws_account)
+                #span.set_tag_str("aws.sqs.queue_url", queue_url)
+              end
+              span.set_tag("queuename", queue_name)
+            end
+            
+            if aws_service == "sns"
+              topic_arn = params.fetch(:topic_arn, nil)
+              topic_name = params.fetch(:name, nil)
+              if topic_arn
+                  # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
+                  topic_name = topic_arn.split(":")[-1]
+                  aws_account = topic_arn.split(":")[-2]
+                  span.set_tag("aws_account", aws_account)
+              end
+              span.set_tag("topicname", topic_name)
+
+            end
+            if aws_service == "dynamodb"
+              table_name = params.fetch(:table_name, "")
+              span.set_tag("tablename", table_name)
+            end
+            if aws_service == "kinesis"
+              stream_arn = params.fetch(:stream_arn, nil)
+              stream_name = params.fetch(:stream_name, "")
+              if stream_arn
+                  # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
+                  stream_name = stream_arn.split("/")[-1] rescue ""
+                  aws_account = stream_arn.split(":")[-2] rescue ""
+                  span.set_tag("aws_account", aws_account)
+              end
+              puts params.class
+              span.set_tag("streamname", stream_name)
+            end
+            if aws_service == "eventbridge"
+              rule_name = params.fetch(:name, nil) || params.fetch(:rule, nil)
+              span.set_tag("rulename", rule_name)
+            end
+            if aws_service == "states"
+              #CRUD operations:
+              state_machine_name = params.fetch(:name, nil)
+              state_machine_arn = params.fetch(:state_machine_arn, nil)
+              execution_arn = params.fetch(:execution_arn, nil)
+
+              if execution_arn
+                # example execution_arn = 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
+                state_machine_name = execution_arn.split(":")[-2]
+              end
+
+              if state_machine_arn
+                span.set_tag("statemachinearn", state_machine_arn)
+                # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
+                state_machine_name = state_machine_arn.split(":")[-1]
+              end
+              state_machine_account_id = 
+              span.set_tag("aws_account", state_machine_account_id)
+              #state_machine_name = create_state_machine_name || start_execution_state_machine_name
+              span.set_tag("statemachinename", state_machine_name)
+            end
+            if aws_service == "s3"
+              bucket_name = params.fetch(:bucket, nil)
+              span.set_tag("bucketname", bucket_name)
+            end
 
             span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
 
@@ -49,7 +123,9 @@ def annotate!(span, context)
             span.set_tag(Ext::TAG_AGENT, Ext::TAG_DEFAULT_AGENT)
             span.set_tag(Ext::TAG_OPERATION, context.safely(:operation))
             span.set_tag(Ext::TAG_REGION, context.safely(:region))
+            span.set_tag(Ext::TAG_TOP_LEVEL_REGION, context.safely(:region))
             span.set_tag(Ext::TAG_PATH, context.safely(:path))
+            span.set_tag("httpEndpoint", context.safely(:endpoint))
             span.set_tag(Ext::TAG_HOST, context.safely(:host))
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, context.safely(:http_method))
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, context.safely(:status_code))
diff --git a/lib/datadog/tracing/contrib/aws/parsed_context.rb b/lib/datadog/tracing/contrib/aws/parsed_context.rb
index 4e828241652..d6fe3b650d8 100644
--- a/lib/datadog/tracing/contrib/aws/parsed_context.rb
+++ b/lib/datadog/tracing/contrib/aws/parsed_context.rb
@@ -20,6 +20,10 @@ def operation
             context.operation_name
           end
 
+          def params
+            context.params
+          end
+
           def status_code
             context.http_response.status_code
           end
@@ -40,6 +44,17 @@ def path
             context.http_request.endpoint.path
           end
 
+          def endpoint
+            context.http_request.endpoint
+          end
+
+          def metadata
+            context.metadata
+          end
+
+          def config
+            context.config
+          end
           def host
             context.http_request.endpoint.host
           end
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 3955bccf454..991fe82f27a 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -97,10 +97,13 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('s3.list_buckets')
-
+        
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('list_buckets')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('s3')
+        #expect(span.get_tag('bucketname')).to eq('bucket1')
         expect(span.get_tag('path')).to eq('/')
         expect(span.get_tag('host')).to eq('s3.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('GET')
@@ -123,6 +126,40 @@
       end
     end
 
+    describe '#list_objects' do
+      subject!(:list_objects) { client.list_objects(bucket: "bucketname", max_keys:2) }
+
+      let(:responses) do
+        { list_objects: {} }
+      end
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('s3.list_objects')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('list_objects')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('s3')
+        expect(span.get_tag('bucketname')).to eq('bucketname')
+        expect(span.get_tag('path')).to eq('/')
+        expect(span.get_tag('host')).to eq('bucketname.s3.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('GET')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('bucketname.s3.us-stubbed-1.amazonaws.com')
+      end
+    end
+
     describe 'S3::Presigner' do
       let(:presigner) { ::Aws::S3::Presigner.new(client: client) }
 
@@ -146,4 +183,810 @@
       end
     end
   end
+  context 'with an SQS client' do
+    let(:client) { ::Aws::SQS::Client.new(stub_responses: responses) }
+
+    describe '#send_message' do
+      subject!(:send_message) { client.send_message({
+        queue_url: "https://sqs.us-stubbed-1.amazonaws.com/123456789012/MyQueueName",
+        message_body: "Hello, world!"
+      }) }
+
+      let(:responses) do
+        { send_message: { 
+          md5_of_message_body: "msg body",  
+          md5_of_message_attributes: "msg attributes",
+          md5_of_message_system_attributes: "message system attributes",
+          message_id: "123",
+          sequence_number: "456"
+          } }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('sqs.send_message')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('send_message')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('sqs')
+        expect(span.get_tag('aws_account')).to eq('123456789012')
+        expect(span.get_tag('queuename')).to eq('MyQueueName')
+        expect(span.get_tag('path')).to eq('/123456789012/MyQueueName')
+        expect(span.get_tag('host')).to eq('sqs.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('sqs.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#send_message_batch' do
+      subject!(:send_message_batch) { client.send_message_batch({
+        queue_url: "https://sqs.us-stubbed-1.amazonaws.com/123456789012/MyQueueName",
+        entries: [ # required
+            {
+              id: "String", # required
+              message_body: "String", # required
+              delay_seconds: 1,
+              message_attributes: {
+                "String" => {
+                  string_value: "String",
+                  binary_value: "data",
+                  string_list_values: ["String"],
+                  binary_list_values: ["data"],
+                  data_type: "String", # required
+                },
+              },
+              message_system_attributes: {
+                "AWSTraceHeader" => {
+                  string_value: "String",
+                  binary_value: "data",
+                  string_list_values: ["String"],
+                  binary_list_values: ["data"],
+                  data_type: "String", # required
+                },
+              },
+              message_deduplication_id: "String",
+              message_group_id: "String",
+            },
+          ],
+        }) }
+
+      let(:responses) do
+        { send_message_batch: { 
+          successful: [],
+          failed: []
+        } }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('sqs.send_message_batch')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('send_message_batch')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('sqs')
+        expect(span.get_tag('aws_account')).to eq('123456789012')
+        expect(span.get_tag('queuename')).to eq('MyQueueName')
+        expect(span.get_tag('path')).to eq('/123456789012/MyQueueName')
+        expect(span.get_tag('host')).to eq('sqs.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('sqs.us-stubbed-1.amazonaws.com')
+      end
+    end
+  end
+
+  context 'with an SNS client' do
+    let(:client) { ::Aws::SNS::Client.new(stub_responses: responses) }
+
+    describe '#publish' do
+      subject!(:publish) { client.publish({
+        topic_arn: "arn:aws:sns:us-west-2:123456789012:my-topic-name",
+        message: 'Hello, world!'
+      }) }
+
+      let(:responses) do
+        { publish: { 
+            message_id: "1234",
+            sequence_number: "5678"
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('sns.publish')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('publish')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('sns')
+        expect(span.get_tag('aws_account')).to eq('123456789012')
+        expect(span.get_tag('topicname')).to eq('my-topic-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('sns.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('sns.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#publish_batch' do
+      subject!(:publish_batch) { client.publish_batch({
+        topic_arn: "arn:aws:sns:us-west-2:123456789012:my-topic-name",
+        publish_batch_request_entries: [ # required
+          {
+            id: "String", # required
+            message: "message", # required
+            subject: "subject",
+            message_structure: "messageStructure",
+            message_attributes: {
+              "String" => {
+                data_type: "String", # required
+                string_value: "String",
+                binary_value: "data",
+              },
+            },
+            message_deduplication_id: "String",
+            message_group_id: "String",
+          },
+        ],      }) }
+
+      let(:responses) do
+        { publish_batch: { 
+
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('sns.publish_batch')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('publish_batch')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('sns')
+        expect(span.get_tag('aws_account')).to eq('123456789012')
+        expect(span.get_tag('topicname')).to eq('my-topic-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('sns.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('sns.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#create_topic' do
+      subject!(:create_topic) { client.create_topic({
+          name: "topicName", # required
+          attributes: {
+            "attributeName" => "attributeValue",
+          },
+          tags: [
+            {
+              key: "TagKey", # required
+              value: "TagValue", # required
+            },
+          ],
+          data_protection_policy: "attributeValue",
+        }) 
+      }
+
+      let(:responses) do
+        { create_topic: { 
+
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('sns.create_topic')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('create_topic')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('sns')
+        expect(span.get_tag('topicname')).to eq('topicName')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('sns.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('sns.us-stubbed-1.amazonaws.com')
+      end
+    end
+  end
+
+  context 'with an dynamodb client' do
+    let(:client) { ::Aws::DynamoDB::Client.new(stub_responses: responses) }
+
+    describe '#get_item' do
+      subject!(:get_item) { client.get_item(table_name: "my-table-name", key: {'id':'1234'}) }
+
+      let(:responses) do
+        { get_item: { 
+            item: {
+            "AlbumTitle" => "Songs About Life", 
+            "Artist" => "Acme Band", 
+            "SongTitle" => "Happy Day", 
+            }
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('dynamodb.get_item')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('get_item')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('dynamodb')
+        expect(span.get_tag('tablename')).to eq('my-table-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('dynamodb.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('dynamodb.us-stubbed-1.amazonaws.com')
+      end
+    end
+  end
+
+  context 'with an kinesis client' do
+    let(:client) { ::Aws::Kinesis::Client.new(stub_responses: responses) }
+
+    describe '#put_record' do
+      subject!(:put_record) { client.put_record(
+        stream_name: "my-stream-name",
+        stream_arn: "arn:aws:kinesis:us-east-1:123456789012:stream/my-stream-name",
+        partition_key: "parition-1",
+        data: "Hello world!"
+        ) 
+      }
+
+      let(:responses) do
+        { put_record: { 
+            shard_id: "1234",
+            sequence_number: "5678",
+            encryption_type: "NONE"
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('kinesis.put_record')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('put_record')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('kinesis')
+        expect(span.get_tag('aws_account')).to eq('123456789012')
+        expect(span.get_tag('streamname')).to eq('my-stream-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('123456789012.data-kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('123456789012.data-kinesis.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+
+    describe '#get_shard_iterator' do
+      subject!(:get_shard_iterator) { client.get_shard_iterator(
+          stream_name: "StreamName", # required
+          shard_id: "ShardId", # required
+          shard_iterator_type: "AT_SEQUENCE_NUMBER", # required
+        ) 
+      }
+
+      let(:responses) do
+        { get_shard_iterator: { 
+            shard_iterator: "shard-iterator"
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('kinesis.get_shard_iterator')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('get_shard_iterator')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('kinesis')
+        expect(span.get_tag('streamname')).to eq('StreamName')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('kinesis.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+  end
+
+  context 'with an eventbridge client' do
+    let(:client) { ::Aws::EventBridge::Client.new(stub_responses: responses) }
+
+    describe '#put_rule' do
+      subject!(:put_rule) { client.put_rule({
+        name: "RuleName", # required
+        tags: [
+          {
+            key: "TagKey", # required
+            value: "TagValue", # required
+          },
+        ],
+      })
+      }
+
+      let(:responses) do
+        { put_rule: { 
+          rule_arn: "my-rule-arn"
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('eventbridge.put_rule')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('put_rule')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('eventbridge')
+        expect(span.get_tag('rulename')).to eq('RuleName')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('events.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('events.us-stubbed-1.amazonaws.com')
+      end
+    end
+  end
+
+  context 'with a stepfunction client' do
+    let(:client) { ::Aws::States::Client.new(stub_responses: responses) }
+
+    describe '#start_execution' do
+      subject!(:start_execution) { client.start_execution({
+        state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine" # required
+      })
+      }
+
+      let(:responses) do
+        { start_execution: { 
+          execution_arn: "execution-arn",
+          start_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00")
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('states.start_execution')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('start_execution')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('states')
+        expect(span.get_tag('statemachinearn')).to eq('arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine')
+
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+
+        expect(span.get_tag('statemachinename')).to eq('MyStateMachine')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('states.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#create_state_machine' do
+      subject!(:create_state_machine) { client.create_state_machine({
+        name: "my-state-machine-name", # required
+        definition: "Definition", # required
+        role_arn: "Arn", # required
+      })
+      }
+
+      let(:responses) do
+        { create_state_machine: { 
+          state_machine_arn: "arn",
+          creation_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00")
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('states.create_state_machine')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('create_state_machine')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('states')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+
+        expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('states.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#describe_state_machine' do
+      subject!(:describe_state_machine) { client.describe_state_machine({
+          state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name", # required
+        })
+      }
+
+      let(:responses) do
+        { describe_state_machine: {
+            state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:example-state-machine",
+            name: "example-state-machine",
+            status: "ACTIVE",
+            definition: "{\"Comment\":\"An example state machine\",\"StartAt\":\"HelloWorld\",\"States\":{\"HelloWorld\":{\"Type\":\"Task\",\"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:hello-world\",\"End\":true}}}",
+            role_arn: "arn:aws:iam::123456789012:role/StateExecutionRole",
+            type: "STANDARD",
+            creation_date: Time.now,
+            logging_configuration: {
+              level: "ERROR",
+              include_execution_data: true,
+              destinations: [
+                {
+                  cloud_watch_logs_log_group: {
+                    log_group_arn: "arn:aws:logs:us-east-1:123456789012:log-group:/aws/states/example-state-machine"
+                  }
+                }
+              ]
+            },
+            tracing_configuration: {
+              enabled: true
+            },
+            label: "v1"
+        }
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('states.describe_state_machine')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('describe_state_machine')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('states')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+
+        expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('states.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#update_state_machine' do
+      subject!(:update_state_machine) { client.update_state_machine({
+        state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name", # required
+      })
+      }
+
+      let(:responses) do
+        { update_state_machine: { 
+          update_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00")
+          } 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('states.update_state_machine')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('update_state_machine')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('states')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+
+        expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('states.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#delete_state_machine' do
+      subject!(:delete_state_machine) { client.delete_state_machine({
+        state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name", # required
+      })
+      }
+
+      let(:responses) do
+        { delete_state_machine: {} 
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('states.delete_state_machine')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('delete_state_machine')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('states')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+
+        expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('states.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#describe_execution' do
+      subject!(:describe_execution) { client.describe_execution({
+        execution_arn: "arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution",
+        })
+      }
+
+      let(:responses) do
+        { describe_execution: {
+          execution_arn: "string",
+          state_machine_arn: "string",
+          name: "string",
+          status: "string",
+          start_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00"),
+          stop_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00"),
+          input: "string",
+          input_details: {
+            included: true|false,
+          },
+          output: "string",
+          output_details: {
+            included: true|false,
+          },
+          trace_header: "string",
+          map_run_arn: "string",
+          error: "string",
+          cause: "string",
+        }
+        
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('states.describe_execution')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('describe_execution')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('states')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+
+        expect(span.get_tag('statemachinename')).to eq('example-state-machine')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('states.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#stop_execution' do
+      subject!(:stop_execution) { client.stop_execution({
+        execution_arn: "arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution",
+        })
+      }
+
+      let(:responses) do
+        { stop_execution: {
+          stop_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00"),
+        }
+        
+        }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('states.stop_execution')
+        
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('stop_execution')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('states')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+
+        expect(span.get_tag('statemachinename')).to eq('example-state-machine')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('states.us-stubbed-1.amazonaws.com')
+      end
+    end
+  end
 end

From d94697e072e7dcbf001cbec30feff08274a02c24 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 4 Apr 2023 15:36:23 -0700
Subject: [PATCH 03/44] lint and move logic to helper functions

---
 .../tracing/contrib/aws/instrumentation.rb    | 169 +++---
 .../tracing/contrib/aws/parsed_context.rb     |   1 +
 .../contrib/aws/instrumentation_spec.rb       | 517 ++++++++++--------
 3 files changed, 371 insertions(+), 316 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index 69460825b29..9eaa656bd15 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -30,80 +30,10 @@ def annotate!(span, context)
             span.span_type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
             span.name = Ext::SPAN_COMMAND
             span.resource = context.safely(:resource)
-            aws_service = span.resource.split(".")[0]
-            span.set_tag("aws_service", aws_service)
+            aws_service = span.resource.split('.')[0]
+            span.set_tag('aws_service', aws_service)
             params = context.safely(:params)
-            
-            if aws_service == "sqs"
-              queue_url = params.fetch(:queue_url, "")
-              queue_name = params.fetch(:queue_name, "")
-              if queue_url
-                # example queue_url: https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
-                queue_name = queue_url.split("/")[-1]
-                aws_account = queue_url.split("/")[-2]
-                span.set_tag("aws_account", aws_account)
-                #span.set_tag_str("aws.sqs.queue_url", queue_url)
-              end
-              span.set_tag("queuename", queue_name)
-            end
-            
-            if aws_service == "sns"
-              topic_arn = params.fetch(:topic_arn, nil)
-              topic_name = params.fetch(:name, nil)
-              if topic_arn
-                  # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
-                  topic_name = topic_arn.split(":")[-1]
-                  aws_account = topic_arn.split(":")[-2]
-                  span.set_tag("aws_account", aws_account)
-              end
-              span.set_tag("topicname", topic_name)
-
-            end
-            if aws_service == "dynamodb"
-              table_name = params.fetch(:table_name, "")
-              span.set_tag("tablename", table_name)
-            end
-            if aws_service == "kinesis"
-              stream_arn = params.fetch(:stream_arn, nil)
-              stream_name = params.fetch(:stream_name, "")
-              if stream_arn
-                  # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
-                  stream_name = stream_arn.split("/")[-1] rescue ""
-                  aws_account = stream_arn.split(":")[-2] rescue ""
-                  span.set_tag("aws_account", aws_account)
-              end
-              puts params.class
-              span.set_tag("streamname", stream_name)
-            end
-            if aws_service == "eventbridge"
-              rule_name = params.fetch(:name, nil) || params.fetch(:rule, nil)
-              span.set_tag("rulename", rule_name)
-            end
-            if aws_service == "states"
-              #CRUD operations:
-              state_machine_name = params.fetch(:name, nil)
-              state_machine_arn = params.fetch(:state_machine_arn, nil)
-              execution_arn = params.fetch(:execution_arn, nil)
-
-              if execution_arn
-                # example execution_arn = 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
-                state_machine_name = execution_arn.split(":")[-2]
-              end
-
-              if state_machine_arn
-                span.set_tag("statemachinearn", state_machine_arn)
-                # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
-                state_machine_name = state_machine_arn.split(":")[-1]
-              end
-              state_machine_account_id = 
-              span.set_tag("aws_account", state_machine_account_id)
-              #state_machine_name = create_state_machine_name || start_execution_state_machine_name
-              span.set_tag("statemachinename", state_machine_name)
-            end
-            if aws_service == "s3"
-              bucket_name = params.fetch(:bucket, nil)
-              span.set_tag("bucketname", bucket_name)
-            end
+            add_service_specific_tags(span, aws_service, params)
 
             span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
 
@@ -125,12 +55,103 @@ def annotate!(span, context)
             span.set_tag(Ext::TAG_REGION, context.safely(:region))
             span.set_tag(Ext::TAG_TOP_LEVEL_REGION, context.safely(:region))
             span.set_tag(Ext::TAG_PATH, context.safely(:path))
-            span.set_tag("httpEndpoint", context.safely(:endpoint))
+            span.set_tag('httpEndpoint', context.safely(:endpoint))
             span.set_tag(Ext::TAG_HOST, context.safely(:host))
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, context.safely(:http_method))
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, context.safely(:status_code))
           end
 
+          def add_service_specific_tags(span, aws_service, params)
+            case aws_service
+            when 'sqs'
+              add_sqs_tags(span, params)
+            when 'sns'
+              add_sns_tags(span, params)
+            when 'dynamodb'
+              add_dynamodb_tags(span, params)
+            when 'kinesis'
+              add_kinesis_tags(span, params)
+            when 'eventbridge'
+              add_eventbridge_tags(span, params)
+            when 'states'
+              add_states_tags(span, params)
+            when 's3'
+              add_s3_tags(span, params)
+            end
+          end
+
+          def add_sqs_tags(span, params)
+            queue_url = params.fetch(:queue_url, '')
+            queue_name = params.fetch(:queue_name, '')
+            if queue_url
+              # example queue_url: https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
+              queue_name = queue_url.split('/')[-1]
+              aws_account = queue_url.split('/')[-2]
+              span.set_tag('aws_account', aws_account)
+            end
+            span.set_tag('queuename', queue_name)
+          end
+
+          def add_sns_tags(span, params)
+            topic_arn = params.fetch(:topic_arn, nil)
+            topic_name = params.fetch(:name, nil)
+            if topic_arn
+              # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
+              topic_name = topic_arn.split(':')[-1]
+              aws_account = topic_arn.split(':')[-2]
+              span.set_tag('aws_account', aws_account)
+            end
+            span.set_tag('topicname', topic_name)
+          end
+
+          def add_dynamodb_tags(span, params)
+            table_name = params.fetch(:table_name, '')
+            span.set_tag('tablename', table_name)
+          end
+
+          def add_kinesis_tags(span, params)
+            stream_arn = params.fetch(:stream_arn, nil)
+            stream_name = params.fetch(:stream_name, '')
+            if stream_arn
+              # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
+              stream_name = stream_arn.split('/')[-1] rescue ''
+              aws_account = stream_arn.split(':')[-2] rescue ''
+              span.set_tag('aws_account', aws_account)
+            end
+            span.set_tag('streamname', stream_name)
+          end
+
+          def add_eventbridge_tags(span, params)
+            rule_name = params.fetch(:name, nil) || params.fetch(:rule, nil)
+            span.set_tag('rulename', rule_name)
+          end
+
+          def add_states_tags(span, params)
+            state_machine_name = params.fetch(:name, nil)
+            state_machine_arn = params.fetch(:state_machine_arn, nil)
+            execution_arn = params.fetch(:execution_arn, nil)
+
+            if execution_arn
+              # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
+              state_machine_name = execution_arn.split(':')[-2]
+            end
+
+            if state_machine_arn
+              span.set_tag('statemachinearn', state_machine_arn)
+              # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
+              state_machine_name = state_machine_arn.split(':')[-1]
+              state_machine_account_id = state_machine_arn.split(':')[-3]
+            end
+            span.set_tag('aws_account', state_machine_account_id)
+            # state_machine_name = create_state_machine_name || start_execution_state_machine_name
+            span.set_tag('statemachinename', state_machine_name)
+          end
+
+          def add_s3_tags(span, params)
+            bucket_name = params.fetch(:bucket, nil)
+            span.set_tag('bucketname', bucket_name)
+          end
+
           def configuration
             Datadog.configuration.tracing[:aws]
           end
diff --git a/lib/datadog/tracing/contrib/aws/parsed_context.rb b/lib/datadog/tracing/contrib/aws/parsed_context.rb
index d6fe3b650d8..ffe25b1738c 100644
--- a/lib/datadog/tracing/contrib/aws/parsed_context.rb
+++ b/lib/datadog/tracing/contrib/aws/parsed_context.rb
@@ -55,6 +55,7 @@ def metadata
           def config
             context.config
           end
+
           def host
             context.http_request.endpoint.host
           end
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 991fe82f27a..86e5c46d3a8 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -97,13 +97,13 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('s3.list_buckets')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('list_buckets')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('s3')
-        #expect(span.get_tag('bucketname')).to eq('bucket1')
+        # expect(span.get_tag('bucketname')).to eq('bucket1')
         expect(span.get_tag('path')).to eq('/')
         expect(span.get_tag('host')).to eq('s3.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('GET')
@@ -127,7 +127,7 @@
     end
 
     describe '#list_objects' do
-      subject!(:list_objects) { client.list_objects(bucket: "bucketname", max_keys:2) }
+      subject!(:list_objects) { client.list_objects(bucket: 'bucketname', max_keys: 2) }
 
       let(:responses) do
         { list_objects: {} }
@@ -137,7 +137,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('s3.list_objects')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('list_objects')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -183,23 +183,28 @@
       end
     end
   end
+
   context 'with an SQS client' do
     let(:client) { ::Aws::SQS::Client.new(stub_responses: responses) }
 
     describe '#send_message' do
-      subject!(:send_message) { client.send_message({
-        queue_url: "https://sqs.us-stubbed-1.amazonaws.com/123456789012/MyQueueName",
-        message_body: "Hello, world!"
-      }) }
+      subject!(:send_message) do
+        client.send_message(
+          {
+            queue_url: 'https://sqs.us-stubbed-1.amazonaws.com/123456789012/MyQueueName',
+            message_body: 'Hello, world!'
+          }
+        )
+      end
 
       let(:responses) do
-        { send_message: { 
-          md5_of_message_body: "msg body",  
-          md5_of_message_attributes: "msg attributes",
-          md5_of_message_system_attributes: "message system attributes",
-          message_id: "123",
-          sequence_number: "456"
-          } }
+        { send_message: {
+          md5_of_message_body: 'msg body',
+          md5_of_message_attributes: 'msg attributes',
+          md5_of_message_system_attributes: 'message system attributes',
+          message_id: '123',
+          sequence_number: '456'
+        } }
       end
 
       it 'generates a span' do
@@ -207,7 +212,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('sqs.send_message')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('send_message')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -232,39 +237,43 @@
     end
 
     describe '#send_message_batch' do
-      subject!(:send_message_batch) { client.send_message_batch({
-        queue_url: "https://sqs.us-stubbed-1.amazonaws.com/123456789012/MyQueueName",
-        entries: [ # required
-            {
-              id: "String", # required
-              message_body: "String", # required
-              delay_seconds: 1,
-              message_attributes: {
-                "String" => {
-                  string_value: "String",
-                  binary_value: "data",
-                  string_list_values: ["String"],
-                  binary_list_values: ["data"],
-                  data_type: "String", # required
+      subject!(:send_message_batch) do
+        client.send_message_batch(
+          {
+            queue_url: 'https://sqs.us-stubbed-1.amazonaws.com/123456789012/MyQueueName',
+            entries: [ # required
+              {
+                id: 'String', # required
+                message_body: 'String', # required
+                delay_seconds: 1,
+                message_attributes: {
+                  'String' => {
+                    string_value: 'String',
+                    binary_value: 'data',
+                    string_list_values: ['String'],
+                    binary_list_values: ['data'],
+                    data_type: 'String', # required
+                  },
                 },
-              },
-              message_system_attributes: {
-                "AWSTraceHeader" => {
-                  string_value: "String",
-                  binary_value: "data",
-                  string_list_values: ["String"],
-                  binary_list_values: ["data"],
-                  data_type: "String", # required
+                message_system_attributes: {
+                  'AWSTraceHeader' => {
+                    string_value: 'String',
+                    binary_value: 'data',
+                    string_list_values: ['String'],
+                    binary_list_values: ['data'],
+                    data_type: 'String', # required
+                  },
                 },
+                message_deduplication_id: 'String',
+                message_group_id: 'String',
               },
-              message_deduplication_id: "String",
-              message_group_id: "String",
-            },
-          ],
-        }) }
+            ],
+          }
+        )
+      end
 
       let(:responses) do
-        { send_message_batch: { 
+        { send_message_batch: {
           successful: [],
           failed: []
         } }
@@ -275,7 +284,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('sqs.send_message_batch')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('send_message_batch')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -304,17 +313,20 @@
     let(:client) { ::Aws::SNS::Client.new(stub_responses: responses) }
 
     describe '#publish' do
-      subject!(:publish) { client.publish({
-        topic_arn: "arn:aws:sns:us-west-2:123456789012:my-topic-name",
-        message: 'Hello, world!'
-      }) }
+      subject!(:publish) do
+        client.publish(
+          {
+            topic_arn: 'arn:aws:sns:us-west-2:123456789012:my-topic-name',
+            message: 'Hello, world!'
+          }
+        )
+      end
 
       let(:responses) do
-        { publish: { 
-            message_id: "1234",
-            sequence_number: "5678"
-          } 
-        }
+        { publish: {
+          message_id: '1234',
+          sequence_number: '5678'
+        } }
       end
 
       it 'generates a span' do
@@ -322,7 +334,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('sns.publish')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('publish')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -347,31 +359,35 @@
     end
 
     describe '#publish_batch' do
-      subject!(:publish_batch) { client.publish_batch({
-        topic_arn: "arn:aws:sns:us-west-2:123456789012:my-topic-name",
-        publish_batch_request_entries: [ # required
+      subject!(:publish_batch) do
+        client.publish_batch(
           {
-            id: "String", # required
-            message: "message", # required
-            subject: "subject",
-            message_structure: "messageStructure",
-            message_attributes: {
-              "String" => {
-                data_type: "String", # required
-                string_value: "String",
-                binary_value: "data",
+            topic_arn: 'arn:aws:sns:us-west-2:123456789012:my-topic-name',
+            publish_batch_request_entries: [ # required
+              {
+                id: 'String', # required
+                message: 'message', # required
+                subject: 'subject',
+                message_structure: 'messageStructure',
+                message_attributes: {
+                  'String' => {
+                    data_type: 'String', # required
+                    string_value: 'String',
+                    binary_value: 'data',
+                  },
+                },
+                message_deduplication_id: 'String',
+                message_group_id: 'String',
               },
-            },
-            message_deduplication_id: "String",
-            message_group_id: "String",
-          },
-        ],      }) }
+            ],
+          }
+        )
+      end
 
       let(:responses) do
-        { publish_batch: { 
+        { publish_batch: {
 
-          } 
-        }
+        } }
       end
 
       it 'generates a span' do
@@ -379,7 +395,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('sns.publish_batch')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('publish_batch')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -404,26 +420,28 @@
     end
 
     describe '#create_topic' do
-      subject!(:create_topic) { client.create_topic({
-          name: "topicName", # required
-          attributes: {
-            "attributeName" => "attributeValue",
-          },
-          tags: [
-            {
-              key: "TagKey", # required
-              value: "TagValue", # required
+      subject!(:create_topic) do
+        client.create_topic(
+          {
+            name: 'topicName', # required
+            attributes: {
+              'attributeName' => 'attributeValue',
             },
-          ],
-          data_protection_policy: "attributeValue",
-        }) 
-      }
+            tags: [
+              {
+                key: 'TagKey', # required
+                value: 'TagValue', # required
+              },
+            ],
+            data_protection_policy: 'attributeValue',
+          }
+        )
+      end
 
       let(:responses) do
-        { create_topic: { 
+        { create_topic: {
 
-          } 
-        }
+        } }
       end
 
       it 'generates a span' do
@@ -431,7 +449,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('sns.create_topic')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('create_topic')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -459,17 +477,16 @@
     let(:client) { ::Aws::DynamoDB::Client.new(stub_responses: responses) }
 
     describe '#get_item' do
-      subject!(:get_item) { client.get_item(table_name: "my-table-name", key: {'id':'1234'}) }
+      subject!(:get_item) { client.get_item(table_name: 'my-table-name', key: { id: '1234' }) }
 
       let(:responses) do
-        { get_item: { 
-            item: {
-            "AlbumTitle" => "Songs About Life", 
-            "Artist" => "Acme Band", 
-            "SongTitle" => "Happy Day", 
-            }
-          } 
-        }
+        { get_item: {
+          item: {
+            'AlbumTitle' => 'Songs About Life',
+            'Artist' => 'Acme Band',
+            'SongTitle' => 'Happy Day',
+          }
+        } }
       end
 
       it 'generates a span' do
@@ -477,7 +494,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('dynamodb.get_item')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('get_item')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -505,21 +522,21 @@
     let(:client) { ::Aws::Kinesis::Client.new(stub_responses: responses) }
 
     describe '#put_record' do
-      subject!(:put_record) { client.put_record(
-        stream_name: "my-stream-name",
-        stream_arn: "arn:aws:kinesis:us-east-1:123456789012:stream/my-stream-name",
-        partition_key: "parition-1",
-        data: "Hello world!"
-        ) 
-      }
+      subject!(:put_record) do
+        client.put_record(
+          stream_name: 'my-stream-name',
+          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream-name',
+          partition_key: 'parition-1',
+          data: 'Hello world!'
+        )
+      end
 
       let(:responses) do
-        { put_record: { 
-            shard_id: "1234",
-            sequence_number: "5678",
-            encryption_type: "NONE"
-          } 
-        }
+        { put_record: {
+          shard_id: '1234',
+          sequence_number: '5678',
+          encryption_type: 'NONE'
+        } }
       end
 
       it 'generates a span' do
@@ -527,7 +544,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('kinesis.put_record')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('put_record')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -551,20 +568,19 @@
       end
     end
 
-
     describe '#get_shard_iterator' do
-      subject!(:get_shard_iterator) { client.get_shard_iterator(
-          stream_name: "StreamName", # required
-          shard_id: "ShardId", # required
-          shard_iterator_type: "AT_SEQUENCE_NUMBER", # required
-        ) 
-      }
+      subject!(:get_shard_iterator) do
+        client.get_shard_iterator(
+          stream_name: 'StreamName', # required
+          shard_id: 'ShardId', # required
+          shard_iterator_type: 'AT_SEQUENCE_NUMBER', # required
+        )
+      end
 
       let(:responses) do
-        { get_shard_iterator: { 
-            shard_iterator: "shard-iterator"
-          } 
-        }
+        { get_shard_iterator: {
+          shard_iterator: 'shard-iterator'
+        } }
       end
 
       it 'generates a span' do
@@ -572,7 +588,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('kinesis.get_shard_iterator')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('get_shard_iterator')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -594,29 +610,30 @@
           .to eq('kinesis.us-stubbed-1.amazonaws.com')
       end
     end
-
   end
 
   context 'with an eventbridge client' do
     let(:client) { ::Aws::EventBridge::Client.new(stub_responses: responses) }
 
     describe '#put_rule' do
-      subject!(:put_rule) { client.put_rule({
-        name: "RuleName", # required
-        tags: [
+      subject!(:put_rule) do
+        client.put_rule(
           {
-            key: "TagKey", # required
-            value: "TagValue", # required
-          },
-        ],
-      })
-      }
+            name: 'RuleName', # required
+            tags: [
+              {
+                key: 'TagKey', # required
+                value: 'TagValue', # required
+              },
+            ],
+          }
+        )
+      end
 
       let(:responses) do
-        { put_rule: { 
-          rule_arn: "my-rule-arn"
-          } 
-        }
+        { put_rule: {
+          rule_arn: 'my-rule-arn'
+        } }
       end
 
       it 'generates a span' do
@@ -624,7 +641,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('eventbridge.put_rule')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('put_rule')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -652,17 +669,19 @@
     let(:client) { ::Aws::States::Client.new(stub_responses: responses) }
 
     describe '#start_execution' do
-      subject!(:start_execution) { client.start_execution({
-        state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine" # required
-      })
-      }
+      subject!(:start_execution) do
+        client.start_execution(
+          {
+            state_machine_arn: 'arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine' # required
+          }
+        )
+      end
 
       let(:responses) do
-        { start_execution: { 
-          execution_arn: "execution-arn",
-          start_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00")
-          } 
-        }
+        { start_execution: {
+          execution_arn: 'execution-arn',
+          start_date: Time.new(2023, 3, 31, 12, 30, 0, '-04:00')
+        } }
       end
 
       it 'generates a span' do
@@ -670,13 +689,13 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('states.start_execution')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('start_execution')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
         expect(span.get_tag('statemachinearn')).to eq('arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine')
-
+        expect(span.get_tag('aws_account')).to eq('123456789012')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
 
         expect(span.get_tag('statemachinename')).to eq('MyStateMachine')
@@ -697,19 +716,21 @@
     end
 
     describe '#create_state_machine' do
-      subject!(:create_state_machine) { client.create_state_machine({
-        name: "my-state-machine-name", # required
-        definition: "Definition", # required
-        role_arn: "Arn", # required
-      })
-      }
+      subject!(:create_state_machine) do
+        client.create_state_machine(
+          {
+            name: 'my-state-machine-name', # required
+            definition: 'Definition', # required
+            role_arn: 'Arn', # required
+          }
+        )
+      end
 
       let(:responses) do
-        { create_state_machine: { 
-          state_machine_arn: "arn",
-          creation_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00")
-          } 
-        }
+        { create_state_machine: {
+          state_machine_arn: 'arn',
+          creation_date: Time.new(2023, 3, 31, 12, 30, 0, '-04:00')
+        } }
       end
 
       it 'generates a span' do
@@ -717,7 +738,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('states.create_state_machine')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('create_state_machine')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -742,37 +763,43 @@
     end
 
     describe '#describe_state_machine' do
-      subject!(:describe_state_machine) { client.describe_state_machine({
-          state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name", # required
-        })
-      }
+      subject!(:describe_state_machine) do
+        client.describe_state_machine(
+          {
+            state_machine_arn: 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name', # required
+          }
+        )
+      end
 
       let(:responses) do
         { describe_state_machine: {
-            state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:example-state-machine",
-            name: "example-state-machine",
-            status: "ACTIVE",
-            definition: "{\"Comment\":\"An example state machine\",\"StartAt\":\"HelloWorld\",\"States\":{\"HelloWorld\":{\"Type\":\"Task\",\"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:hello-world\",\"End\":true}}}",
-            role_arn: "arn:aws:iam::123456789012:role/StateExecutionRole",
-            type: "STANDARD",
-            creation_date: Time.now,
-            logging_configuration: {
-              level: "ERROR",
-              include_execution_data: true,
-              destinations: [
-                {
-                  cloud_watch_logs_log_group: {
-                    log_group_arn: "arn:aws:logs:us-east-1:123456789012:log-group:/aws/states/example-state-machine"
-                  }
+          state_machine_arn: 'arn:aws:states:us-east-1:123456789012:stateMachine:example-state-machine',
+          name: 'example-state-machine',
+          status: 'ACTIVE',
+          definition: '{\'Comment\':\'An example state machine\',
+                        \'StartAt\':\'HelloWorld\',
+                        \'States\':{\'HelloWorld\':{\'Type\':\'Task\',
+                        \'Resource\':\'arn:aws:lambda:us-east-1:123456789012:function:hello-world\',
+                        \'End\':true}}}',
+          role_arn: 'arn:aws:iam::123456789012:role/StateExecutionRole',
+          type: 'STANDARD',
+          creation_date: Time.now,
+          logging_configuration: {
+            level: 'ERROR',
+            include_execution_data: true,
+            destinations: [
+              {
+                cloud_watch_logs_log_group: {
+                  log_group_arn: 'arn:aws:logs:us-east-1:123456789012:log-group:/aws/states/example-state-machine'
                 }
-              ]
-            },
-            tracing_configuration: {
-              enabled: true
-            },
-            label: "v1"
-        }
-        }
+              }
+            ]
+          },
+          tracing_configuration: {
+            enabled: true
+          },
+          label: 'v1'
+        } }
       end
 
       it 'generates a span' do
@@ -780,7 +807,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('states.describe_state_machine')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('describe_state_machine')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -805,16 +832,18 @@
     end
 
     describe '#update_state_machine' do
-      subject!(:update_state_machine) { client.update_state_machine({
-        state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name", # required
-      })
-      }
+      subject!(:update_state_machine) do
+        client.update_state_machine(
+          {
+            state_machine_arn: 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name', # required
+          }
+        )
+      end
 
       let(:responses) do
-        { update_state_machine: { 
-          update_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00")
-          } 
-        }
+        { update_state_machine: {
+          update_date: Time.new(2023, 3, 31, 12, 30, 0, '-04:00')
+        } }
       end
 
       it 'generates a span' do
@@ -822,7 +851,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('states.update_state_machine')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('update_state_machine')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -847,14 +876,16 @@
     end
 
     describe '#delete_state_machine' do
-      subject!(:delete_state_machine) { client.delete_state_machine({
-        state_machine_arn: "arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name", # required
-      })
-      }
+      subject!(:delete_state_machine) do
+        client.delete_state_machine(
+          {
+            state_machine_arn: 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine-name', # required
+          }
+        )
+      end
 
       let(:responses) do
-        { delete_state_machine: {} 
-        }
+        { delete_state_machine: {} }
       end
 
       it 'generates a span' do
@@ -862,7 +893,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('states.delete_state_machine')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('delete_state_machine')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -887,34 +918,35 @@
     end
 
     describe '#describe_execution' do
-      subject!(:describe_execution) { client.describe_execution({
-        execution_arn: "arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution",
-        })
-      }
+      subject!(:describe_execution) do
+        client.describe_execution(
+          {
+            execution_arn: 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution',
+          }
+        )
+      end
 
       let(:responses) do
         { describe_execution: {
-          execution_arn: "string",
-          state_machine_arn: "string",
-          name: "string",
-          status: "string",
-          start_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00"),
-          stop_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00"),
-          input: "string",
+          execution_arn: 'string',
+          state_machine_arn: 'string',
+          name: 'string',
+          status: 'string',
+          start_date: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+          stop_date: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+          input: 'string',
           input_details: {
-            included: true|false,
+            included: true | false,
           },
-          output: "string",
+          output: 'string',
           output_details: {
-            included: true|false,
+            included: true | false,
           },
-          trace_header: "string",
-          map_run_arn: "string",
-          error: "string",
-          cause: "string",
-        }
-        
-        }
+          trace_header: 'string',
+          map_run_arn: 'string',
+          error: 'string',
+          cause: 'string',
+        } }
       end
 
       it 'generates a span' do
@@ -922,7 +954,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('states.describe_execution')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('describe_execution')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
@@ -947,17 +979,18 @@
     end
 
     describe '#stop_execution' do
-      subject!(:stop_execution) { client.stop_execution({
-        execution_arn: "arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution",
-        })
-      }
+      subject!(:stop_execution) do
+        client.stop_execution(
+          {
+            execution_arn: 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution',
+          }
+        )
+      end
 
       let(:responses) do
         { stop_execution: {
-          stop_date: Time.new(2023, 3, 31, 12, 30, 0, "-04:00"),
-        }
-        
-        }
+          stop_date: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+        } }
       end
 
       it 'generates a span' do
@@ -965,7 +998,7 @@
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
         expect(span.resource).to eq('states.stop_execution')
-        
+
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('stop_execution')
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')

From 4ada87bfa1b83bfa50358b71c1dd73efc1db18a0 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Wed, 5 Apr 2023 09:58:00 -0700
Subject: [PATCH 04/44] fix unit tests breaking in ci

---
 .../contrib/aws/instrumentation_spec.rb       | 92 +------------------
 1 file changed, 5 insertions(+), 87 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 86e5c46d3a8..1aacb964bc1 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -358,67 +358,6 @@
       end
     end
 
-    describe '#publish_batch' do
-      subject!(:publish_batch) do
-        client.publish_batch(
-          {
-            topic_arn: 'arn:aws:sns:us-west-2:123456789012:my-topic-name',
-            publish_batch_request_entries: [ # required
-              {
-                id: 'String', # required
-                message: 'message', # required
-                subject: 'subject',
-                message_structure: 'messageStructure',
-                message_attributes: {
-                  'String' => {
-                    data_type: 'String', # required
-                    string_value: 'String',
-                    binary_value: 'data',
-                  },
-                },
-                message_deduplication_id: 'String',
-                message_group_id: 'String',
-              },
-            ],
-          }
-        )
-      end
-
-      let(:responses) do
-        { publish_batch: {
-
-        } }
-      end
-
-      it 'generates a span' do
-        expect(span.name).to eq('aws.command')
-        expect(span.service).to eq('aws')
-        expect(span.span_type).to eq('http')
-        expect(span.resource).to eq('sns.publish_batch')
-
-        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
-        expect(span.get_tag('aws.operation')).to eq('publish_batch')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
-        expect(span.get_tag('region')).to eq('us-stubbed-1')
-        expect(span.get_tag('aws_service')).to eq('sns')
-        expect(span.get_tag('aws_account')).to eq('123456789012')
-        expect(span.get_tag('topicname')).to eq('my-topic-name')
-        expect(span.get_tag('path')).to eq('')
-        expect(span.get_tag('host')).to eq('sns.us-stubbed-1.amazonaws.com')
-        expect(span.get_tag('http.method')).to eq('POST')
-        expect(span.get_tag('http.status_code')).to eq('200')
-        expect(span.get_tag('span.kind')).to eq('client')
-
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
-          .to eq('command')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
-          .to eq('aws')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-          .to eq('sns.us-stubbed-1.amazonaws.com')
-      end
-    end
-
     describe '#create_topic' do
       subject!(:create_topic) do
         client.create_topic(
@@ -432,8 +371,7 @@
                 key: 'TagKey', # required
                 value: 'TagValue', # required
               },
-            ],
-            data_protection_policy: 'attributeValue',
+            ]
           }
         )
       end
@@ -525,7 +463,6 @@
       subject!(:put_record) do
         client.put_record(
           stream_name: 'my-stream-name',
-          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream-name',
           partition_key: 'parition-1',
           data: 'Hello world!'
         )
@@ -550,10 +487,9 @@
         expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('kinesis')
-        expect(span.get_tag('aws_account')).to eq('123456789012')
         expect(span.get_tag('streamname')).to eq('my-stream-name')
         expect(span.get_tag('path')).to eq('')
-        expect(span.get_tag('host')).to eq('123456789012.data-kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('POST')
         expect(span.get_tag('http.status_code')).to eq('200')
         expect(span.get_tag('span.kind')).to eq('client')
@@ -564,7 +500,7 @@
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
           .to eq('aws')
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-          .to eq('123456789012.data-kinesis.us-stubbed-1.amazonaws.com')
+          .to eq('kinesis.us-stubbed-1.amazonaws.com')
       end
     end
 
@@ -783,22 +719,7 @@
                         \'End\':true}}}',
           role_arn: 'arn:aws:iam::123456789012:role/StateExecutionRole',
           type: 'STANDARD',
-          creation_date: Time.now,
-          logging_configuration: {
-            level: 'ERROR',
-            include_execution_data: true,
-            destinations: [
-              {
-                cloud_watch_logs_log_group: {
-                  log_group_arn: 'arn:aws:logs:us-east-1:123456789012:log-group:/aws/states/example-state-machine'
-                }
-              }
-            ]
-          },
-          tracing_configuration: {
-            enabled: true
-          },
-          label: 'v1'
+          creation_date: Time.now
         } }
       end
 
@@ -942,10 +863,7 @@
           output_details: {
             included: true | false,
           },
-          trace_header: 'string',
-          map_run_arn: 'string',
-          error: 'string',
-          cause: 'string',
+          trace_header: 'string'
         } }
       end
 

From 56a99043411e0f9fb325c1403c363410c767d3f8 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 6 Apr 2023 09:36:58 -0700
Subject: [PATCH 05/44] only run instrumentation spec when ruby version is
 2.2.0 or greater

---
 .../tracing/contrib/aws/instrumentation_spec.rb    | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 1aacb964bc1..7fc9ffe99dc 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -74,7 +74,7 @@
     end
   end
 
-  context 'with an S3 client' do
+  context 'with an S3 client' if: RUBY_VERSION >= '2.2.0' do
     let(:client) { ::Aws::S3::Client.new(stub_responses: responses) }
 
     describe '#list_buckets' do
@@ -184,7 +184,7 @@
     end
   end
 
-  context 'with an SQS client' do
+  context 'with an SQS client' if: RUBY_VERSION >= '2.2.0' do
     let(:client) { ::Aws::SQS::Client.new(stub_responses: responses) }
 
     describe '#send_message' do
@@ -309,7 +309,7 @@
     end
   end
 
-  context 'with an SNS client' do
+  context 'with an SNS client' if: RUBY_VERSION >= '2.2.0' do
     let(:client) { ::Aws::SNS::Client.new(stub_responses: responses) }
 
     describe '#publish' do
@@ -411,7 +411,7 @@
     end
   end
 
-  context 'with an dynamodb client' do
+  context 'with an dynamodb client' if: RUBY_VERSION >= '2.2.0' do
     let(:client) { ::Aws::DynamoDB::Client.new(stub_responses: responses) }
 
     describe '#get_item' do
@@ -456,7 +456,7 @@
     end
   end
 
-  context 'with an kinesis client' do
+  context 'with an kinesis client' if: RUBY_VERSION >= '2.2.0' do
     let(:client) { ::Aws::Kinesis::Client.new(stub_responses: responses) }
 
     describe '#put_record' do
@@ -548,7 +548,7 @@
     end
   end
 
-  context 'with an eventbridge client' do
+  context 'with an eventbridge client' if: RUBY_VERSION >= '2.2.0' do
     let(:client) { ::Aws::EventBridge::Client.new(stub_responses: responses) }
 
     describe '#put_rule' do
@@ -601,7 +601,7 @@
     end
   end
 
-  context 'with a stepfunction client' do
+  context 'with a stepfunction client' if: RUBY_VERSION >= '2.2.0' do
     let(:client) { ::Aws::States::Client.new(stub_responses: responses) }
 
     describe '#start_execution' do

From 035aeb193162c5d1c9c54a1fca7d32b81a3b880e Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Wed, 12 Apr 2023 17:32:40 -0700
Subject: [PATCH 06/44] remove unneeded parsed context, and edit tests

---
 .../tracing/contrib/aws/parsed_context.rb        | 12 ------------
 .../tracing/contrib/aws/instrumentation_spec.rb  | 16 ++++++++--------
 2 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/parsed_context.rb b/lib/datadog/tracing/contrib/aws/parsed_context.rb
index ffe25b1738c..95cb44c3c26 100644
--- a/lib/datadog/tracing/contrib/aws/parsed_context.rb
+++ b/lib/datadog/tracing/contrib/aws/parsed_context.rb
@@ -44,18 +44,6 @@ def path
             context.http_request.endpoint.path
           end
 
-          def endpoint
-            context.http_request.endpoint
-          end
-
-          def metadata
-            context.metadata
-          end
-
-          def config
-            context.config
-          end
-
           def host
             context.http_request.endpoint.host
           end
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 7fc9ffe99dc..1ca59637bd9 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -26,7 +26,7 @@
     Datadog.registry[:aws].reset_configuration!
   end
 
-  context 'with a core AWS SDK client', if: RUBY_VERSION >= '2.2.0' do
+  context 'with a core AWS SDK client', if: RUBY_VERSION >= '2.3.0' do
     before { hide_const('Aws::S3') }
 
     let(:client) { ::Aws::STS::Client.new(stub_responses: responses) } # STS is part of aws-sdk-core
@@ -74,7 +74,7 @@
     end
   end
 
-  context 'with an S3 client' if: RUBY_VERSION >= '2.2.0' do
+  context 'with an S3 client', if: RUBY_VERSION >= '2.3.0' do
     let(:client) { ::Aws::S3::Client.new(stub_responses: responses) }
 
     describe '#list_buckets' do
@@ -184,7 +184,7 @@
     end
   end
 
-  context 'with an SQS client' if: RUBY_VERSION >= '2.2.0' do
+  context 'with an SQS client', if: RUBY_VERSION >= '2.3.0' do
     let(:client) { ::Aws::SQS::Client.new(stub_responses: responses) }
 
     describe '#send_message' do
@@ -309,7 +309,7 @@
     end
   end
 
-  context 'with an SNS client' if: RUBY_VERSION >= '2.2.0' do
+  context 'with an SNS client', if: RUBY_VERSION >= '2.3.0' do
     let(:client) { ::Aws::SNS::Client.new(stub_responses: responses) }
 
     describe '#publish' do
@@ -411,7 +411,7 @@
     end
   end
 
-  context 'with an dynamodb client' if: RUBY_VERSION >= '2.2.0' do
+  context 'with an dynamodb client', if: RUBY_VERSION >= '2.3.0' do
     let(:client) { ::Aws::DynamoDB::Client.new(stub_responses: responses) }
 
     describe '#get_item' do
@@ -456,7 +456,7 @@
     end
   end
 
-  context 'with an kinesis client' if: RUBY_VERSION >= '2.2.0' do
+  context 'with an kinesis client', if: RUBY_VERSION >= '2.3.0' do
     let(:client) { ::Aws::Kinesis::Client.new(stub_responses: responses) }
 
     describe '#put_record' do
@@ -548,7 +548,7 @@
     end
   end
 
-  context 'with an eventbridge client' if: RUBY_VERSION >= '2.2.0' do
+  context 'with an eventbridge client', if: RUBY_VERSION >= '2.3.0' do
     let(:client) { ::Aws::EventBridge::Client.new(stub_responses: responses) }
 
     describe '#put_rule' do
@@ -601,7 +601,7 @@
     end
   end
 
-  context 'with a stepfunction client' if: RUBY_VERSION >= '2.2.0' do
+  context 'with a stepfunction client', if: RUBY_VERSION >= '2.3.0' do
     let(:client) { ::Aws::States::Client.new(stub_responses: responses) }
 
     describe '#start_execution' do

From 2c549e1218f73ee724b2105980e3900d875c7dfc Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Wed, 12 Apr 2023 17:48:27 -0700
Subject: [PATCH 07/44] Trigger CI build


From 01dac1b5fb4b02807d4f8d8e425bb338eb8d64e8 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 10:51:51 -0700
Subject: [PATCH 08/44] remove duplicate aws.region tag, add test coverage for
 different sdk requests, and move tag keys to constants file

---
 lib/datadog/tracing/contrib/aws/ext.rb        |  12 +-
 .../tracing/contrib/aws/instrumentation.rb    |  31 ++--
 .../contrib/aws/instrumentation_spec.rb       | 144 +++++++++++++-----
 3 files changed, 129 insertions(+), 58 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/ext.rb b/lib/datadog/tracing/contrib/aws/ext.rb
index 6acde9f4703..5a6fcc6bab0 100644
--- a/lib/datadog/tracing/contrib/aws/ext.rb
+++ b/lib/datadog/tracing/contrib/aws/ext.rb
@@ -18,8 +18,16 @@ module Ext
           TAG_OPERATION = 'aws.operation'.freeze
           TAG_OPERATION_COMMAND = 'command'.freeze
           TAG_PATH = 'path'.freeze
-          TAG_REGION = 'aws.region'.freeze
-          TAG_TOP_LEVEL_REGION = 'region'.freeze
+          TAG_REGION = 'region'.freeze
+          TAG_AWS_SERVICE = 'aws_service'.freeze
+          TAG_AWS_ACCOUNT = 'aws_account'.freeze
+          TAG_QUEUE_NAME = 'queuename'.freeze
+          TAG_TOPIC_NAME = 'topicname'.freeze
+          TAG_TABLE_NAME = 'tablename'.freeze
+          TAG_STREAM_NAME = 'streamname'.freeze
+          TAG_RULE_NAME = 'rulename'.freeze
+          TAG_STATE_MACHINE_NAME = 'statemachinename'.freeze
+          TAG_BUCKET_NAME = 'bucketname'.freeze
         end
       end
     end
diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index 9eaa656bd15..63367e4e958 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -31,7 +31,7 @@ def annotate!(span, context)
             span.name = Ext::SPAN_COMMAND
             span.resource = context.safely(:resource)
             aws_service = span.resource.split('.')[0]
-            span.set_tag('aws_service', aws_service)
+            span.set_tag(Ext::TAG_AWS_SERVICE, aws_service)
             params = context.safely(:params)
             add_service_specific_tags(span, aws_service, params)
 
@@ -53,9 +53,7 @@ def annotate!(span, context)
             span.set_tag(Ext::TAG_AGENT, Ext::TAG_DEFAULT_AGENT)
             span.set_tag(Ext::TAG_OPERATION, context.safely(:operation))
             span.set_tag(Ext::TAG_REGION, context.safely(:region))
-            span.set_tag(Ext::TAG_TOP_LEVEL_REGION, context.safely(:region))
             span.set_tag(Ext::TAG_PATH, context.safely(:path))
-            span.set_tag('httpEndpoint', context.safely(:endpoint))
             span.set_tag(Ext::TAG_HOST, context.safely(:host))
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, context.safely(:http_method))
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, context.safely(:status_code))
@@ -81,15 +79,15 @@ def add_service_specific_tags(span, aws_service, params)
           end
 
           def add_sqs_tags(span, params)
-            queue_url = params.fetch(:queue_url, '')
-            queue_name = params.fetch(:queue_name, '')
+            queue_url = params.fetch(:queue_url, nil)
+            queue_name = params.fetch(:queue_name, nil)
             if queue_url
               # example queue_url: https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
               queue_name = queue_url.split('/')[-1]
               aws_account = queue_url.split('/')[-2]
-              span.set_tag('aws_account', aws_account)
+              span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
             end
-            span.set_tag('queuename', queue_name)
+            span.set_tag(Ext::TAG_QUEUE_NAME, queue_name)
           end
 
           def add_sns_tags(span, params)
@@ -99,14 +97,14 @@ def add_sns_tags(span, params)
               # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
               topic_name = topic_arn.split(':')[-1]
               aws_account = topic_arn.split(':')[-2]
-              span.set_tag('aws_account', aws_account)
+              span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
             end
-            span.set_tag('topicname', topic_name)
+            span.set_tag(Ext::TAG_TOPIC_NAME, topic_name)
           end
 
           def add_dynamodb_tags(span, params)
             table_name = params.fetch(:table_name, '')
-            span.set_tag('tablename', table_name)
+            span.set_tag(Ext::TAG_TABLE_NAME, table_name)
           end
 
           def add_kinesis_tags(span, params)
@@ -116,14 +114,14 @@ def add_kinesis_tags(span, params)
               # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
               stream_name = stream_arn.split('/')[-1] rescue ''
               aws_account = stream_arn.split(':')[-2] rescue ''
-              span.set_tag('aws_account', aws_account)
+              span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
             end
-            span.set_tag('streamname', stream_name)
+            span.set_tag(Ext::TAG_STREAM_NAME, stream_name)
           end
 
           def add_eventbridge_tags(span, params)
             rule_name = params.fetch(:name, nil) || params.fetch(:rule, nil)
-            span.set_tag('rulename', rule_name)
+            span.set_tag(Ext::TAG_RULE_NAME, rule_name)
           end
 
           def add_states_tags(span, params)
@@ -137,19 +135,18 @@ def add_states_tags(span, params)
             end
 
             if state_machine_arn
-              span.set_tag('statemachinearn', state_machine_arn)
               # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
               state_machine_name = state_machine_arn.split(':')[-1]
               state_machine_account_id = state_machine_arn.split(':')[-3]
             end
-            span.set_tag('aws_account', state_machine_account_id)
+            span.set_tag(Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
             # state_machine_name = create_state_machine_name || start_execution_state_machine_name
-            span.set_tag('statemachinename', state_machine_name)
+            span.set_tag(Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
           end
 
           def add_s3_tags(span, params)
             bucket_name = params.fetch(:bucket, nil)
-            span.set_tag('bucketname', bucket_name)
+            span.set_tag(Ext::TAG_BUCKET_NAME, bucket_name)
           end
 
           def configuration
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 1ca59637bd9..5cb67050e5e 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -52,7 +52,7 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('get_access_key_info')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('sts.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('POST')
@@ -100,7 +100,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('list_buckets')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('s3')
         # expect(span.get_tag('bucketname')).to eq('bucket1')
@@ -140,7 +139,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('list_objects')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('s3')
         expect(span.get_tag('bucketname')).to eq('bucketname')
@@ -215,7 +213,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('send_message')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('sqs')
         expect(span.get_tag('aws_account')).to eq('123456789012')
@@ -287,7 +284,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('send_message_batch')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('sqs')
         expect(span.get_tag('aws_account')).to eq('123456789012')
@@ -307,6 +303,49 @@
           .to eq('sqs.us-stubbed-1.amazonaws.com')
       end
     end
+
+    describe '#get_queue_url' do
+      subject!(:get_queue_url) do
+        client.get_queue_url(
+          {
+            queue_name: 'MyQueueName',
+            queue_owner_aws_account_id: '1234',
+          }
+        )
+      end
+
+      let(:responses) do
+        { get_queue_url: {
+          queue_url: "myQueueURL"
+        } }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('sqs.get_queue_url')
+
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('get_queue_url')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('sqs')
+        expect(span.get_tag('queuename')).to eq('MyQueueName')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('sqs.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('sqs.us-stubbed-1.amazonaws.com')
+      end
+    end
   end
 
   context 'with an SNS client', if: RUBY_VERSION >= '2.3.0' do
@@ -337,7 +376,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('publish')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('sns')
         expect(span.get_tag('aws_account')).to eq('123456789012')
@@ -390,7 +428,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('create_topic')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('sns')
         expect(span.get_tag('topicname')).to eq('topicName')
@@ -435,7 +472,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('get_item')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('dynamodb')
         expect(span.get_tag('tablename')).to eq('my-table-name')
@@ -484,7 +520,6 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('put_record')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('kinesis')
         expect(span.get_tag('streamname')).to eq('my-stream-name')
@@ -504,18 +539,24 @@
       end
     end
 
-    describe '#get_shard_iterator' do
-      subject!(:get_shard_iterator) do
-        client.get_shard_iterator(
-          stream_name: 'StreamName', # required
-          shard_id: 'ShardId', # required
-          shard_iterator_type: 'AT_SEQUENCE_NUMBER', # required
+    describe '#describe_stream_consumer' do
+      subject!(:describe_stream_consumer) do
+        client.describe_stream_consumer(
+          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
+          consumer_name: 'cosumerName', # required
+          consumer_arn: 'consumerArn', # required
         )
       end
 
       let(:responses) do
-        { get_shard_iterator: {
-          shard_iterator: 'shard-iterator'
+        { describe_stream_consumer: {
+            consumer_description: {
+              consumer_name: "John Doe",
+              consumer_arn: "consumerArn",
+              consumer_status: "CREATING",
+              consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+              stream_arn: "streamArn"
+            }
         } }
       end
 
@@ -523,16 +564,15 @@
         expect(span.name).to eq('aws.command')
         expect(span.service).to eq('aws')
         expect(span.span_type).to eq('http')
-        expect(span.resource).to eq('kinesis.get_shard_iterator')
+        expect(span.resource).to eq('kinesis.describe_stream_consumer')
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
-        expect(span.get_tag('aws.operation')).to eq('get_shard_iterator')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('kinesis')
-        expect(span.get_tag('streamname')).to eq('StreamName')
+        expect(span.get_tag('streamname')).to eq('my-stream')
         expect(span.get_tag('path')).to eq('')
-        expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('POST')
         expect(span.get_tag('http.status_code')).to eq('200')
         expect(span.get_tag('span.kind')).to eq('client')
@@ -543,7 +583,7 @@
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
           .to eq('aws')
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-          .to eq('kinesis.us-stubbed-1.amazonaws.com')
+          .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
       end
     end
   end
@@ -580,7 +620,48 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('put_rule')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('eventbridge')
+        expect(span.get_tag('rulename')).to eq('RuleName')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('events.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('events.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    describe '#list_targets_by_rule' do
+      subject!(:list_targets_by_rule) do
+        client.list_targets_by_rule(
+          {
+            rule: 'RuleName', # required
+          }
+        )
+      end
+
+      let(:responses) do
+        { list_targets_by_rule: {
+          targets: []
+        } }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('eventbridge.list_targets_by_rule')
+
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('list_targets_by_rule')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('eventbridge')
         expect(span.get_tag('rulename')).to eq('RuleName')
@@ -628,12 +709,9 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('start_execution')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
-        expect(span.get_tag('statemachinearn')).to eq('arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine')
         expect(span.get_tag('aws_account')).to eq('123456789012')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
-
         expect(span.get_tag('statemachinename')).to eq('MyStateMachine')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
@@ -677,10 +755,8 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('create_state_machine')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
-
         expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
@@ -731,10 +807,8 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('describe_state_machine')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
-
         expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
@@ -775,10 +849,8 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('update_state_machine')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
-
         expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
@@ -817,10 +889,8 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('delete_state_machine')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
-
         expect(span.get_tag('statemachinename')).to eq('my-state-machine-name')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
@@ -875,10 +945,8 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('describe_execution')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
-
         expect(span.get_tag('statemachinename')).to eq('example-state-machine')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')
@@ -919,10 +987,8 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('stop_execution')
-        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('states')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
-
         expect(span.get_tag('statemachinename')).to eq('example-state-machine')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('states.us-stubbed-1.amazonaws.com')

From a32a05e858ab9601e460a468f61d3841605ffca5 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 11:16:49 -0700
Subject: [PATCH 09/44] lint

---
 .../tracing/contrib/aws/instrumentation_spec.rb  | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 5cb67050e5e..c55ee8bdab9 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -316,7 +316,7 @@
 
       let(:responses) do
         { get_queue_url: {
-          queue_url: "myQueueURL"
+          queue_url: 'myQueueURL'
         } }
       end
 
@@ -550,13 +550,13 @@
 
       let(:responses) do
         { describe_stream_consumer: {
-            consumer_description: {
-              consumer_name: "John Doe",
-              consumer_arn: "consumerArn",
-              consumer_status: "CREATING",
-              consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
-              stream_arn: "streamArn"
-            }
+          consumer_description: {
+            consumer_name: 'John Doe',
+            consumer_arn: 'consumerArn',
+            consumer_status: 'CREATING',
+            consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+            stream_arn: 'streamArn'
+          }
         } }
       end
 

From c5d9c4448fe236dcc2351fcfe86b1af644948735 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 13:09:44 -0700
Subject: [PATCH 10/44] edit ruby 2.1 apprasail sdk gem

---
 Appraisals                                    |  2 +-
 .../contrib/aws/instrumentation_spec.rb       | 20 +++++++++----------
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/Appraisals b/Appraisals
index fc43bd05294..52ee6067f9c 100644
--- a/Appraisals
+++ b/Appraisals
@@ -137,7 +137,7 @@ if ruby_version?('2.1')
     gem 'active_model_serializers', '~> 0.9.0'
     gem 'activerecord', '3.2.22.5'
     gem 'activerecord-mysql-adapter'
-    gem 'aws-sdk', '~> 2.0'
+    gem 'aws-sdk'
     gem 'concurrent-ruby'
     gem 'dalli', '< 3.0.0' # Dalli 3.0 dropped support for Ruby < 2.5
     gem 'delayed_job'
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index c55ee8bdab9..c364afdc1c3 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -26,7 +26,7 @@
     Datadog.registry[:aws].reset_configuration!
   end
 
-  context 'with a core AWS SDK client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with a core AWS SDK client', if: RUBY_VERSION >= '2.2.0' do
     before { hide_const('Aws::S3') }
 
     let(:client) { ::Aws::STS::Client.new(stub_responses: responses) } # STS is part of aws-sdk-core
@@ -74,7 +74,7 @@
     end
   end
 
-  context 'with an S3 client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with an S3 client' do
     let(:client) { ::Aws::S3::Client.new(stub_responses: responses) }
 
     describe '#list_buckets' do
@@ -182,7 +182,7 @@
     end
   end
 
-  context 'with an SQS client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with an SQS client' do
     let(:client) { ::Aws::SQS::Client.new(stub_responses: responses) }
 
     describe '#send_message' do
@@ -348,7 +348,7 @@
     end
   end
 
-  context 'with an SNS client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with an SNS client' do
     let(:client) { ::Aws::SNS::Client.new(stub_responses: responses) }
 
     describe '#publish' do
@@ -448,7 +448,7 @@
     end
   end
 
-  context 'with an dynamodb client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with an dynamodb client' do
     let(:client) { ::Aws::DynamoDB::Client.new(stub_responses: responses) }
 
     describe '#get_item' do
@@ -492,7 +492,7 @@
     end
   end
 
-  context 'with an kinesis client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with an kinesis client' do
     let(:client) { ::Aws::Kinesis::Client.new(stub_responses: responses) }
 
     describe '#put_record' do
@@ -572,7 +572,7 @@
         expect(span.get_tag('aws_service')).to eq('kinesis')
         expect(span.get_tag('streamname')).to eq('my-stream')
         expect(span.get_tag('path')).to eq('')
-        expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('POST')
         expect(span.get_tag('http.status_code')).to eq('200')
         expect(span.get_tag('span.kind')).to eq('client')
@@ -583,12 +583,12 @@
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
           .to eq('aws')
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-          .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+          .to eq('kinesis.us-stubbed-1.amazonaws.com')
       end
     end
   end
 
-  context 'with an eventbridge client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with an eventbridge client' do
     let(:client) { ::Aws::EventBridge::Client.new(stub_responses: responses) }
 
     describe '#put_rule' do
@@ -682,7 +682,7 @@
     end
   end
 
-  context 'with a stepfunction client', if: RUBY_VERSION >= '2.3.0' do
+  context 'with a stepfunction client' do
     let(:client) { ::Aws::States::Client.new(stub_responses: responses) }
 
     describe '#start_execution' do

From ff0bcebd91b01c3a717c2bb1435396beb6b0ce97 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 13:24:28 -0700
Subject: [PATCH 11/44] add describe_stream_consumer test for ruby version >= 
 2.2.0 and a different one for ruby version < 2.2.0 as the host differs

---
 .../contrib/aws/instrumentation_spec.rb       | 49 ++++++++++++++++++-
 1 file changed, 48 insertions(+), 1 deletion(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index c364afdc1c3..11c27dc31d7 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -539,7 +539,54 @@
       end
     end
 
-    describe '#describe_stream_consumer' do
+    describe '#describe_stream_consumer', if: RUBY_VERSION >= '2.2.0' do
+      subject!(:describe_stream_consumer) do
+        client.describe_stream_consumer(
+          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
+          consumer_name: 'cosumerName', # required
+          consumer_arn: 'consumerArn', # required
+        )
+      end
+
+      let(:responses) do
+        { describe_stream_consumer: {
+          consumer_description: {
+            consumer_name: 'John Doe',
+            consumer_arn: 'consumerArn',
+            consumer_status: 'CREATING',
+            consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+            stream_arn: 'streamArn'
+          }
+        } }
+      end
+
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('kinesis.describe_stream_consumer')
+
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('kinesis')
+        expect(span.get_tag('streamname')).to eq('my-stream')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+      end
+    end
+    describe '#describe_stream_consumer', if: RUBY_VERSION < '2.2.0' do
       subject!(:describe_stream_consumer) do
         client.describe_stream_consumer(
           stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required

From 56ba8728e7445185c6efd3ec6b8a6b1aad17b1ed Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 13:34:27 -0700
Subject: [PATCH 12/44] lint

---
 spec/datadog/tracing/contrib/aws/instrumentation_spec.rb | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 11c27dc31d7..5c5de8e9c0f 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -586,6 +586,7 @@
           .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
       end
     end
+    
     describe '#describe_stream_consumer', if: RUBY_VERSION < '2.2.0' do
       subject!(:describe_stream_consumer) do
         client.describe_stream_consumer(

From 9419d82a9a2e16660bf283f31b82b1a614d5ed01 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 13:43:14 -0700
Subject: [PATCH 13/44] whitespace

---
 spec/datadog/tracing/contrib/aws/instrumentation_spec.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 5c5de8e9c0f..989e12e2192 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -586,7 +586,7 @@
           .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
       end
     end
-    
+
     describe '#describe_stream_consumer', if: RUBY_VERSION < '2.2.0' do
       subject!(:describe_stream_consumer) do
         client.describe_stream_consumer(

From 3547e653e145238b770e304dea70829dea3d7463 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 14:09:45 -0700
Subject: [PATCH 14/44] switch ruby version in test for CI

---
 spec/datadog/tracing/contrib/aws/instrumentation_spec.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 989e12e2192..5515b33af0b 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -539,7 +539,7 @@
       end
     end
 
-    describe '#describe_stream_consumer', if: RUBY_VERSION >= '2.2.0' do
+    describe '#describe_stream_consumer', if: RUBY_VERSION >= '2.3.0' do
       subject!(:describe_stream_consumer) do
         client.describe_stream_consumer(
           stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
@@ -587,7 +587,7 @@
       end
     end
 
-    describe '#describe_stream_consumer', if: RUBY_VERSION < '2.2.0' do
+    describe '#describe_stream_consumer', if: RUBY_VERSION < '2.3.0' do
       subject!(:describe_stream_consumer) do
         client.describe_stream_consumer(
           stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required

From b9140cb8bbc17493375bd4f7d0b89034b459d933 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Thu, 13 Apr 2023 15:31:17 -0700
Subject: [PATCH 15/44] add gem file changes

---
 gemfiles/ruby_2.1.10_contrib.gemfile                      | 2 +-
 gemfiles/ruby_2.1.10_contrib.gemfile.lock                 | 8 ++++----
 gemfiles/ruby_2.1.10_core_old.gemfile.lock                | 6 +++---
 gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock          | 6 +++---
 gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock        | 6 +++---
 gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock  | 6 +++---
 .../ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock     | 6 +++---
 gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock           | 6 +++---
 gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock         | 6 +++---
 gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock   | 6 +++---
 gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock  | 6 +++---
 gemfiles/ruby_2.1.10_redis_3.gemfile.lock                 | 6 +++---
 gemfiles/ruby_2.1.10_sinatra.gemfile.lock                 | 6 +++---
 gemfiles/ruby_3.0.4_contrib.gemfile.lock                  | 6 ++----
 gemfiles/ruby_3.0.4_contrib_old.gemfile.lock              | 6 ++----
 gemfiles/ruby_3.0.4_core_old.gemfile.lock                 | 6 ++----
 gemfiles/ruby_3.0.4_cucumber3.gemfile.lock                | 6 ++----
 gemfiles/ruby_3.0.4_cucumber4.gemfile.lock                | 6 ++----
 gemfiles/ruby_3.0.4_cucumber5.gemfile.lock                | 6 ++----
 gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock            | 6 ++----
 gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock           | 6 ++----
 gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock         | 6 ++----
 gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock   | 6 ++----
 gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock | 6 ++----
 gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock  | 6 ++----
 gemfiles/ruby_3.0.4_redis_3.gemfile.lock                  | 6 ++----
 gemfiles/ruby_3.0.4_redis_4.gemfile.lock                  | 6 ++----
 gemfiles/ruby_3.0.4_redis_5.gemfile.lock                  | 6 ++----
 gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock           | 6 ++----
 gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock           | 6 ++----
 gemfiles/ruby_3.0.4_sinatra.gemfile.lock                  | 6 ++----
 31 files changed, 74 insertions(+), 110 deletions(-)

diff --git a/gemfiles/ruby_2.1.10_contrib.gemfile b/gemfiles/ruby_2.1.10_contrib.gemfile
index f35a8982b17..7e80d89db0b 100644
--- a/gemfiles/ruby_2.1.10_contrib.gemfile
+++ b/gemfiles/ruby_2.1.10_contrib.gemfile
@@ -38,7 +38,7 @@ gem "msgpack", "~> 1.3.3"
 gem "active_model_serializers", "~> 0.9.0"
 gem "activerecord", "3.2.22.5"
 gem "activerecord-mysql-adapter"
-gem "aws-sdk", "~> 2.0"
+gem "aws-sdk"
 gem "dalli", "< 3.0.0"
 gem "delayed_job"
 gem "delayed_job_active_record"
diff --git a/gemfiles/ruby_2.1.10_contrib.gemfile.lock b/gemfiles/ruby_2.1.10_contrib.gemfile.lock
index d2adc594984..721282a45b6 100644
--- a/gemfiles/ruby_2.1.10_contrib.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_contrib.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -124,8 +124,8 @@ GEM
     json (1.8.6)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     makara (0.4.1)
       activerecord (>= 3.0.0)
@@ -261,7 +261,7 @@ DEPENDENCIES
   activerecord-mysql-adapter
   addressable (~> 2.4.0)
   appraisal (~> 2.2.0)
-  aws-sdk (~> 2.0)
+  aws-sdk
   benchmark-ips (~> 2.8)
   benchmark-memory (< 0.2)
   builder
diff --git a/gemfiles/ruby_2.1.10_core_old.gemfile.lock b/gemfiles/ruby_2.1.10_core_old.gemfile.lock
index 629778c820f..a6908ec2038 100644
--- a/gemfiles/ruby_2.1.10_core_old.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_core_old.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -36,8 +36,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.12)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock
index a5f7d7d0180..4c4bd4ae254 100644
--- a/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -73,8 +73,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     mail (2.5.5)
       mime-types (~> 1.16)
diff --git a/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock
index 2e846650e25..6968fd40f5c 100644
--- a/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -69,8 +69,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     mail (2.5.5)
       mime-types (~> 1.16)
diff --git a/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock
index fc282fbe4a0..b4621305bd4 100644
--- a/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -69,8 +69,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     mail (2.5.5)
       mime-types (~> 1.16)
diff --git a/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock
index 2cadbf6bb2d..ee71a728c48 100644
--- a/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -70,8 +70,8 @@ GEM
     json (1.8.6)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     mail (2.5.5)
       mime-types (~> 1.16)
diff --git a/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock
index 86ee4a24242..2ea7321392b 100644
--- a/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -77,8 +77,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.11.2)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock
index c95c250ec39..f6079cce78f 100644
--- a/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -77,8 +77,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.11.2)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock
index 5cb46503062..35cf829c5d0 100644
--- a/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -77,8 +77,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.11.2)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock
index a54ea6fab07..c2cfba9b49b 100644
--- a/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -77,8 +77,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     loofah (2.19.1)
       crass (~> 1.0.2)
diff --git a/gemfiles/ruby_2.1.10_redis_3.gemfile.lock b/gemfiles/ruby_2.1.10_redis_3.gemfile.lock
index e907f20fa33..8920e75a0be 100644
--- a/gemfiles/ruby_2.1.10_redis_3.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_redis_3.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -36,8 +36,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.12)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_2.1.10_sinatra.gemfile.lock b/gemfiles/ruby_2.1.10_sinatra.gemfile.lock
index 8982f812e88..94b24978298 100644
--- a/gemfiles/ruby_2.1.10_sinatra.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_sinatra.gemfile.lock
@@ -4,7 +4,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -36,8 +36,8 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libdatadog (2.0.0.1.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.12)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_contrib.gemfile.lock b/gemfiles/ruby_3.0.4_contrib.gemfile.lock
index bc03af8f0b8..09b4f2692ec 100644
--- a/gemfiles/ruby_3.0.4_contrib.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_contrib.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -1571,9 +1571,7 @@ GEM
     king_konf (1.0.1)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock b/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock
index 6123f09911d..cd5e3a1c6e5 100644
--- a/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -75,9 +75,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_core_old.gemfile.lock b/gemfiles/ruby_3.0.4_core_old.gemfile.lock
index 639f0c44a38..3ba1bc12cba 100644
--- a/gemfiles/ruby_3.0.4_core_old.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_core_old.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -55,9 +55,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock b/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock
index 8a440af8049..4002ed0aceb 100644
--- a/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -73,9 +73,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock b/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock
index 45c92a0d771..7a535140681 100644
--- a/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -93,9 +93,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock b/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock
index c85acb3f14f..0f1f8b6ebe7 100644
--- a/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -93,9 +93,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock b/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock
index 5902233b5b6..ea5587dcf4c 100755
--- a/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -55,9 +55,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock
index e6e9c83c57c..86a3e840f95 100644
--- a/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -121,9 +121,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock
index be7866503c0..693a0d0b64f 100644
--- a/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -121,9 +121,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock
index 570f7d9214d..91811f36314 100644
--- a/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -121,9 +121,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock
index cff9d9db3dc..137948ebf65 100644
--- a/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -122,9 +122,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock
index d539adc9865..57a991d8aeb 100644
--- a/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -121,9 +121,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     loofah (2.19.1)
       crass (~> 1.0.2)
diff --git a/gemfiles/ruby_3.0.4_redis_3.gemfile.lock b/gemfiles/ruby_3.0.4_redis_3.gemfile.lock
index 0d85b904591..970a8e0c462 100644
--- a/gemfiles/ruby_3.0.4_redis_3.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_redis_3.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -55,9 +55,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_redis_4.gemfile.lock b/gemfiles/ruby_3.0.4_redis_4.gemfile.lock
index 9908d5611ed..95c5e0c5812 100644
--- a/gemfiles/ruby_3.0.4_redis_4.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_redis_4.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -55,9 +55,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_redis_5.gemfile.lock b/gemfiles/ruby_3.0.4_redis_5.gemfile.lock
index c0de033af84..54f4610d5a2 100644
--- a/gemfiles/ruby_3.0.4_redis_5.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_redis_5.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -56,9 +56,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock b/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock
index d1e40c568b9..6db301e9baf 100644
--- a/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -55,9 +55,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock b/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock
index ba89da09dad..29a32f2f20f 100644
--- a/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -56,9 +56,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_sinatra.gemfile.lock b/gemfiles/ruby_3.0.4_sinatra.gemfile.lock
index 22a7b953061..c2566f5b41b 100644
--- a/gemfiles/ruby_3.0.4_sinatra.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_sinatra.gemfile.lock
@@ -14,7 +14,7 @@ PATH
     ddtrace (1.10.1)
       debase-ruby_core_source (>= 0.10.16, <= 3.2.0)
       libdatadog (~> 2.0.0.1.0)
-      libddwaf (~> 1.6.2.0.0)
+      libddwaf (~> 1.8.2.0.0)
       msgpack
 
 GEM
@@ -55,9 +55,7 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
-      ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)

From 316aaaf9e9500293178a0c74396bb1fc153dcb7c Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Thu, 13 Apr 2023 15:55:11 -0700
Subject: [PATCH 16/44] edit conflicts in gems

---
 gemfiles/ruby_2.1.10_contrib.gemfile.lock                 | 2 +-
 gemfiles/ruby_3.0.4_contrib.gemfile.lock                  | 3 ---
 gemfiles/ruby_3.0.4_contrib_old.gemfile.lock              | 3 ---
 gemfiles/ruby_3.0.4_core_old.gemfile.lock                 | 3 ---
 gemfiles/ruby_3.0.4_cucumber3.gemfile.lock                | 3 ---
 gemfiles/ruby_3.0.4_cucumber4.gemfile.lock                | 3 ---
 gemfiles/ruby_3.0.4_cucumber5.gemfile.lock                | 3 ---
 gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock            | 3 ---
 gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock           | 3 ---
 gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock         | 3 ---
 gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock   | 3 ---
 gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock | 3 ---
 gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock  | 3 ---
 gemfiles/ruby_3.0.4_redis_3.gemfile.lock                  | 3 ---
 gemfiles/ruby_3.0.4_redis_4.gemfile.lock                  | 3 ---
 15 files changed, 1 insertion(+), 43 deletions(-)

diff --git a/gemfiles/ruby_2.1.10_contrib.gemfile.lock b/gemfiles/ruby_2.1.10_contrib.gemfile.lock
index 98a682801e1..e5701b469e3 100644
--- a/gemfiles/ruby_2.1.10_contrib.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_contrib.gemfile.lock
@@ -125,7 +125,7 @@ GEM
     json-schema (2.8.1)
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
     makara (0.4.1)
       activerecord (>= 3.0.0)
diff --git a/gemfiles/ruby_3.0.4_contrib.gemfile.lock b/gemfiles/ruby_3.0.4_contrib.gemfile.lock
index 597c4c0e43c..f3b7580c8cf 100644
--- a/gemfiles/ruby_3.0.4_contrib.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_contrib.gemfile.lock
@@ -1572,11 +1572,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock b/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock
index 16b667b0084..916dfeae0e2 100644
--- a/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_contrib_old.gemfile.lock
@@ -76,11 +76,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_core_old.gemfile.lock b/gemfiles/ruby_3.0.4_core_old.gemfile.lock
index 24434348cbe..71c6d629acd 100644
--- a/gemfiles/ruby_3.0.4_core_old.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_core_old.gemfile.lock
@@ -56,11 +56,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock b/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock
index 8903dbb3177..7398752c108 100644
--- a/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_cucumber3.gemfile.lock
@@ -74,11 +74,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock b/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock
index 82e3e960ef5..19a07749439 100644
--- a/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_cucumber4.gemfile.lock
@@ -94,11 +94,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock b/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock
index ae265cb0960..e9f893e3d9d 100644
--- a/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_cucumber5.gemfile.lock
@@ -94,11 +94,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock b/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock
index a05c72f5de7..eba50d9d695 100755
--- a/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_opentelemetry.gemfile.lock
@@ -56,11 +56,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock
index 09ea3f6a472..6e8585ccb26 100644
--- a/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_mysql2.gemfile.lock
@@ -122,11 +122,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock
index 92c30e467bf..7b8e17c3ac4 100644
--- a/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_postgres.gemfile.lock
@@ -122,11 +122,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock
index 5b8dd70e15f..dda61db62e1 100644
--- a/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_postgres_redis.gemfile.lock
@@ -122,11 +122,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock
index d12dc3cb10c..c3bf784fbb8 100644
--- a/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_postgres_sidekiq.gemfile.lock
@@ -123,11 +123,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     lograge (0.12.0)
       actionpack (>= 4)
diff --git a/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock
index c5e33d5b8fa..72946bdbe97 100644
--- a/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_rails61_semantic_logger.gemfile.lock
@@ -122,11 +122,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     loofah (2.19.1)
       crass (~> 1.0.2)
diff --git a/gemfiles/ruby_3.0.4_redis_3.gemfile.lock b/gemfiles/ruby_3.0.4_redis_3.gemfile.lock
index 2cce18a8054..1d47b64e323 100644
--- a/gemfiles/ruby_3.0.4_redis_3.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_redis_3.gemfile.lock
@@ -56,11 +56,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_redis_4.gemfile.lock b/gemfiles/ruby_3.0.4_redis_4.gemfile.lock
index 6b8f1213a0d..389c92e5789 100644
--- a/gemfiles/ruby_3.0.4_redis_4.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_redis_4.gemfile.lock
@@ -56,11 +56,8 @@ GEM
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
     libddwaf (1.8.2.0.0-aarch64-linux)
-<<<<<<< HEAD
-=======
       ffi (~> 1.0)
     libddwaf (1.8.2.0.0-x86_64-linux)
->>>>>>> master
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)

From 607d02bb7472823dddd94796c9127c10e6e0744a Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Sun, 16 Apr 2023 12:48:47 -0700
Subject: [PATCH 17/44] edit contrib appraisals

---
 Appraisals | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/Appraisals b/Appraisals
index 52ee6067f9c..94d34b2b7ca 100644
--- a/Appraisals
+++ b/Appraisals
@@ -137,7 +137,7 @@ if ruby_version?('2.1')
     gem 'active_model_serializers', '~> 0.9.0'
     gem 'activerecord', '3.2.22.5'
     gem 'activerecord-mysql-adapter'
-    gem 'aws-sdk'
+    gem 'aws-sdk', '~> 2'
     gem 'concurrent-ruby'
     gem 'dalli', '< 3.0.0' # Dalli 3.0 dropped support for Ruby < 2.5
     gem 'delayed_job'
@@ -315,12 +315,15 @@ elsif ruby_version?('2.2')
     gem 'mimemagic', '0.3.9' # Pinned until https://github.com/mimemagicrb/mimemagic/issues/142 is resolved.
   end
 
+  appraise 'aws' do
+    gem 'aws-sdk'
+  end
+
   appraise 'contrib' do
     gem 'actionpack'
     gem 'actionview'
     gem 'active_model_serializers', '>= 0.10.0'
     gem 'activerecord', '< 5.1.5'
-    gem 'aws-sdk'
     gem 'concurrent-ruby'
     gem 'dalli', '< 3.0.0' # Dalli 3.0 dropped support for Ruby < 2.5
     gem 'delayed_job'

From 3537983344eea544cbd86bbe5fbd09e8321c94a3 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Sun, 16 Apr 2023 12:55:35 -0700
Subject: [PATCH 18/44] remove gem edits

---
 gemfiles/ruby_2.1.10_contrib.gemfile                       | 2 +-
 gemfiles/ruby_2.1.10_contrib.gemfile.lock                  | 2 +-
 gemfiles/ruby_2.1.10_core_old.gemfile.lock                 | 2 --
 gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock           | 2 --
 gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock         | 2 --
 gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock   | 2 --
 gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock | 2 --
 gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock            | 2 --
 gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock          | 2 --
 gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock    | 2 --
 gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock   | 2 --
 gemfiles/ruby_2.1.10_redis_3.gemfile.lock                  | 2 --
 gemfiles/ruby_2.1.10_sinatra.gemfile.lock                  | 2 +-
 gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock            | 4 ++--
 gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock            | 4 ++--
 gemfiles/ruby_3.0.4_sinatra.gemfile.lock                   | 4 ++--
 16 files changed, 9 insertions(+), 29 deletions(-)

diff --git a/gemfiles/ruby_2.1.10_contrib.gemfile b/gemfiles/ruby_2.1.10_contrib.gemfile
index 7e80d89db0b..f35a8982b17 100644
--- a/gemfiles/ruby_2.1.10_contrib.gemfile
+++ b/gemfiles/ruby_2.1.10_contrib.gemfile
@@ -38,7 +38,7 @@ gem "msgpack", "~> 1.3.3"
 gem "active_model_serializers", "~> 0.9.0"
 gem "activerecord", "3.2.22.5"
 gem "activerecord-mysql-adapter"
-gem "aws-sdk"
+gem "aws-sdk", "~> 2.0"
 gem "dalli", "< 3.0.0"
 gem "delayed_job"
 gem "delayed_job_active_record"
diff --git a/gemfiles/ruby_2.1.10_contrib.gemfile.lock b/gemfiles/ruby_2.1.10_contrib.gemfile.lock
index e5701b469e3..3af52881cfb 100644
--- a/gemfiles/ruby_2.1.10_contrib.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_contrib.gemfile.lock
@@ -261,7 +261,7 @@ DEPENDENCIES
   activerecord-mysql-adapter
   addressable (~> 2.4.0)
   appraisal (~> 2.2.0)
-  aws-sdk
+  aws-sdk (~> 2.0)
   benchmark-ips (~> 2.8)
   benchmark-memory (< 0.2)
   builder
diff --git a/gemfiles/ruby_2.1.10_core_old.gemfile.lock b/gemfiles/ruby_2.1.10_core_old.gemfile.lock
index cda30288ac3..71a2dd1ff5c 100644
--- a/gemfiles/ruby_2.1.10_core_old.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_core_old.gemfile.lock
@@ -36,8 +36,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock
index a578868d93d..7ffdcdf4736 100644
--- a/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock
@@ -73,8 +73,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock
index 47869324566..2f13ace6275 100644
--- a/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock
@@ -69,8 +69,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock
index ad5ea8c7d2d..c08aff8f629 100644
--- a/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock
@@ -69,8 +69,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock
index 6dfc662f400..ffc5bf8729d 100644
--- a/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock
@@ -70,8 +70,6 @@ GEM
     json (1.8.6)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock
index b9b85be140c..c97a40ebe69 100644
--- a/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock
@@ -77,8 +77,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock
index 85ba2aa893c..65184a34adc 100644
--- a/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock
@@ -77,8 +77,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock
index baab50044e5..4fee96cc6b4 100644
--- a/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock
@@ -77,8 +77,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock b/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock
index 638d46508aa..d670c1159ed 100644
--- a/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock
@@ -77,8 +77,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_redis_3.gemfile.lock b/gemfiles/ruby_2.1.10_redis_3.gemfile.lock
index 250bbcfaea0..482ef2775a2 100644
--- a/gemfiles/ruby_2.1.10_redis_3.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_redis_3.gemfile.lock
@@ -36,8 +36,6 @@ GEM
     json (2.5.1)
     json-schema (2.8.1)
       addressable (>= 2.4)
-    libdatadog (2.0.0.1.0-aarch64-linux)
-    libddwaf (1.8.2.0.0-aarch64-linux)
     libdatadog (2.0.0.1.0)
     libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
diff --git a/gemfiles/ruby_2.1.10_sinatra.gemfile.lock b/gemfiles/ruby_2.1.10_sinatra.gemfile.lock
index 9eec8fe5ec0..5a47b1d2ee7 100644
--- a/gemfiles/ruby_2.1.10_sinatra.gemfile.lock
+++ b/gemfiles/ruby_2.1.10_sinatra.gemfile.lock
@@ -37,7 +37,7 @@ GEM
     json-schema (2.8.1)
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0)
-    libddwaf (1.6.2.0.0)
+    libddwaf (1.8.2.0.0)
       ffi (~> 1.0)
     memory_profiler (0.9.12)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock b/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock
index bcbe7900940..253ba9840e2 100644
--- a/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_resque2_redis3.gemfile.lock
@@ -55,9 +55,9 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-x86_64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock b/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock
index 65d207f15b8..0c6a7c69420 100644
--- a/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_resque2_redis4.gemfile.lock
@@ -56,9 +56,9 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-x86_64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)
diff --git a/gemfiles/ruby_3.0.4_sinatra.gemfile.lock b/gemfiles/ruby_3.0.4_sinatra.gemfile.lock
index 1808c195cb2..fdd2a88ae67 100644
--- a/gemfiles/ruby_3.0.4_sinatra.gemfile.lock
+++ b/gemfiles/ruby_3.0.4_sinatra.gemfile.lock
@@ -55,9 +55,9 @@ GEM
       addressable (>= 2.4)
     libdatadog (2.0.0.1.0-aarch64-linux)
     libdatadog (2.0.0.1.0-x86_64-linux)
-    libddwaf (1.6.2.0.0-aarch64-linux)
+    libddwaf (1.8.2.0.0-aarch64-linux)
       ffi (~> 1.0)
-    libddwaf (1.6.2.0.0-x86_64-linux)
+    libddwaf (1.8.2.0.0-x86_64-linux)
       ffi (~> 1.0)
     memory_profiler (0.9.14)
     method_source (1.0.0)

From bf4acf85e75292963498546938067e9c21ae2aca Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Sun, 16 Apr 2023 13:05:30 -0700
Subject: [PATCH 19/44] appraisal edits

---
 Appraisals | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/Appraisals b/Appraisals
index 94d34b2b7ca..6e51436c510 100644
--- a/Appraisals
+++ b/Appraisals
@@ -137,7 +137,7 @@ if ruby_version?('2.1')
     gem 'active_model_serializers', '~> 0.9.0'
     gem 'activerecord', '3.2.22.5'
     gem 'activerecord-mysql-adapter'
-    gem 'aws-sdk', '~> 2'
+    gem 'aws-sdk', '~> 2.0'
     gem 'concurrent-ruby'
     gem 'dalli', '< 3.0.0' # Dalli 3.0 dropped support for Ruby < 2.5
     gem 'delayed_job'
@@ -315,10 +315,6 @@ elsif ruby_version?('2.2')
     gem 'mimemagic', '0.3.9' # Pinned until https://github.com/mimemagicrb/mimemagic/issues/142 is resolved.
   end
 
-  appraise 'aws' do
-    gem 'aws-sdk'
-  end
-
   appraise 'contrib' do
     gem 'actionpack'
     gem 'actionview'

From 8b8254c7709263c4fc36710a662fcc47bf34dc40 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Sun, 16 Apr 2023 13:06:47 -0700
Subject: [PATCH 20/44] add aws-sdk back

---
 Appraisals | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Appraisals b/Appraisals
index 6e51436c510..fc43bd05294 100644
--- a/Appraisals
+++ b/Appraisals
@@ -320,6 +320,7 @@ elsif ruby_version?('2.2')
     gem 'actionview'
     gem 'active_model_serializers', '>= 0.10.0'
     gem 'activerecord', '< 5.1.5'
+    gem 'aws-sdk'
     gem 'concurrent-ruby'
     gem 'dalli', '< 3.0.0' # Dalli 3.0 dropped support for Ruby < 2.5
     gem 'delayed_job'

From 45c7ef8f24ed9a7881fa4a770bdd955a6546445a Mon Sep 17 00:00:00 2001
From: Tony Hsu <tonyc.t.hsu@gmail.com>
Date: Mon, 17 Apr 2023 12:39:43 +0200
Subject: [PATCH 21/44] Change to aws-sdk 2 in ruby 2.7 appraisal group

---
 Appraisals                               |    2 +-
 gemfiles/ruby_2.7.6_contrib.gemfile      |    2 +-
 gemfiles/ruby_2.7.6_contrib.gemfile.lock | 1379 +---------------------
 3 files changed, 10 insertions(+), 1373 deletions(-)

diff --git a/Appraisals b/Appraisals
index fc43bd05294..6bd58c5a0fd 100644
--- a/Appraisals
+++ b/Appraisals
@@ -1410,7 +1410,7 @@ elsif ruby_version?('2.7')
       gem 'actionview'
       gem 'active_model_serializers', '>= 0.10.0'
       gem 'activerecord'
-      gem 'aws-sdk'
+      gem 'aws-sdk', '~> 2'
       gem 'concurrent-ruby'
       gem 'cucumber', '~> 7' # TODO: Support cucumber 8.x
       gem 'dalli', '>= 3.0.0'
diff --git a/gemfiles/ruby_2.7.6_contrib.gemfile b/gemfiles/ruby_2.7.6_contrib.gemfile
index 7f6a827883e..e89cdc68fc5 100644
--- a/gemfiles/ruby_2.7.6_contrib.gemfile
+++ b/gemfiles/ruby_2.7.6_contrib.gemfile
@@ -42,7 +42,7 @@ gem "actionpack"
 gem "actionview"
 gem "active_model_serializers", ">= 0.10.0"
 gem "activerecord"
-gem "aws-sdk"
+gem "aws-sdk", "~> 2"
 gem "cucumber", "~> 7"
 gem "dalli", ">= 3.0.0"
 gem "delayed_job"
diff --git a/gemfiles/ruby_2.7.6_contrib.gemfile.lock b/gemfiles/ruby_2.7.6_contrib.gemfile.lock
index bbb6b2dc5d6..4150b723999 100644
--- a/gemfiles/ruby_2.7.6_contrib.gemfile.lock
+++ b/gemfiles/ruby_2.7.6_contrib.gemfile.lock
@@ -56,1376 +56,13 @@ GEM
       thor (>= 0.14.0)
     ast (2.4.2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.717.0)
-    aws-sdk (3.1.0)
-      aws-sdk-resources (~> 3)
-    aws-sdk-accessanalyzer (1.34.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-account (1.10.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-acm (1.55.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-acmpca (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-alexaforbusiness (1.58.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-amplify (1.44.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-amplifybackend (1.20.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-amplifyuibuilder (1.9.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-apigateway (1.81.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-apigatewaymanagementapi (1.32.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-apigatewayv2 (1.44.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appconfig (1.30.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appconfigdata (1.8.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appflow (1.36.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appintegrationsservice (1.15.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-applicationautoscaling (1.66.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-applicationcostprofiler (1.11.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-applicationdiscoveryservice (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-applicationinsights (1.33.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appmesh (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appregistry (1.19.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-apprunner (1.21.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appstream (1.70.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-appsync (1.58.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-arczonalshift (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-athena (1.61.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-auditmanager (1.31.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-augmentedairuntime (1.25.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-autoscaling (1.86.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-autoscalingplans (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-backup (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-backupgateway (1.8.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-backupstorage (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-batch (1.67.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-billingconductor (1.6.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-braket (1.21.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-budgets (1.52.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-chime (1.70.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-chimesdkidentity (1.11.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-chimesdkmediapipelines (1.3.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-chimesdkmeetings (1.17.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-chimesdkmessaging (1.15.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-chimesdkvoice (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cleanrooms (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloud9 (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudcontrolapi (1.10.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-clouddirectory (1.44.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudformation (1.76.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudfront (1.76.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudhsm (1.41.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudhsmv2 (1.44.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudsearch (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudsearchdomain (1.34.1)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudtrail (1.58.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudtraildata (1.0.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudwatch (1.71.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudwatchevents (1.59.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudwatchevidently (1.11.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudwatchlogs (1.62.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cloudwatchrum (1.9.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codeartifact (1.25.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codebuild (1.90.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codecatalyst (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-    aws-sdk-codecommit (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codedeploy (1.52.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codeguruprofiler (1.26.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codegurureviewer (1.35.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codepipeline (1.55.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codestar (1.40.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codestarconnections (1.26.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-codestarnotifications (1.22.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cognitoidentity (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cognitoidentityprovider (1.73.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-cognitosync (1.38.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-comprehend (1.65.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-comprehendmedical (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-computeoptimizer (1.38.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-configservice (1.87.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-connect (1.98.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-connectcampaignservice (1.3.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-connectcases (1.4.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-connectcontactlens (1.13.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-connectparticipant (1.28.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-connectwisdomservice (1.12.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-controltower (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-core (3.170.0)
-      aws-eventstream (~> 1, >= 1.0.2)
-      aws-partitions (~> 1, >= 1.651.0)
-      aws-sigv4 (~> 1.5)
-      jmespath (~> 1, >= 1.6.1)
-    aws-sdk-costandusagereportservice (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-costexplorer (1.83.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-customerprofiles (1.27.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-databasemigrationservice (1.75.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-dataexchange (1.30.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-datapipeline (1.38.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-datasync (1.55.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-dax (1.41.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-detective (1.32.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-devicefarm (1.54.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-devopsguru (1.30.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-directconnect (1.56.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-directoryservice (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-dlm (1.55.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-docdb (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-docdbelastic (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-drs (1.11.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-dynamodb (1.81.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-dynamodbstreams (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ebs (1.28.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ec2 (1.366.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ec2instanceconnect (1.27.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ecr (1.58.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ecrpublic (1.15.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ecs (1.111.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-efs (1.59.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-eks (1.83.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-elasticache (1.84.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-elasticbeanstalk (1.54.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-elasticinference (1.23.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-elasticloadbalancing (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-elasticloadbalancingv2 (1.84.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-elasticsearchservice (1.69.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-elastictranscoder (1.40.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-emr (1.66.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-emrcontainers (1.19.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-emrserverless (1.5.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-eventbridge (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-finspace (1.13.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-finspacedata (1.19.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-firehose (1.51.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-fis (1.16.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-fms (1.55.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-forecastqueryservice (1.24.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-forecastservice (1.40.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-frauddetector (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-fsx (1.64.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-gamelift (1.61.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-gamesparks (1.4.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-glacier (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-globalaccelerator (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-glue (1.132.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-gluedatabrew (1.25.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-greengrass (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-greengrassv2 (1.24.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-groundstation (1.32.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-guardduty (1.64.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-health (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-healthlake (1.15.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-honeycode (1.19.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iam (1.75.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-identitystore (1.23.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-imagebuilder (1.44.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-importexport (1.36.1)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv2 (~> 1.0)
-    aws-sdk-inspector (1.45.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-inspector2 (1.10.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-internetmonitor (1.0.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iot (1.100.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iot1clickdevicesservice (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iot1clickprojects (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotanalytics (1.51.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotdataplane (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotdeviceadvisor (1.18.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotevents (1.35.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ioteventsdata (1.29.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotfleethub (1.13.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotfleetwise (1.7.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotjobsdataplane (1.38.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotroborunner (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotsecuretunneling (1.23.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotsitewise (1.48.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotthingsgraph (1.26.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iottwinmaker (1.9.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-iotwireless (1.30.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ivs (1.27.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ivschat (1.8.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kafka (1.54.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kafkaconnect (1.9.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kendra (1.63.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kendraranking (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-keyspaces (1.5.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesis (1.45.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesisanalytics (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesisanalyticsv2 (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesisvideo (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesisvideoarchivedmedia (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesisvideomedia (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesisvideosignalingchannels (1.21.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kinesisvideowebrtcstorage (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-kms (1.62.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lakeformation (1.31.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lambda (1.92.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lambdapreview (1.36.1)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lex (1.47.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lexmodelbuildingservice (1.59.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lexmodelsv2 (1.32.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lexruntimev2 (1.19.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-licensemanager (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-licensemanagerlinuxsubscriptions (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-licensemanagerusersubscriptions (1.3.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lightsail (1.74.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-locationservice (1.29.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lookoutequipment (1.16.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lookoutforvision (1.19.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-lookoutmetrics (1.24.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-machinelearning (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-macie (1.40.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-macie2 (1.52.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mainframemodernization (1.4.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-managedblockchain (1.36.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-managedgrafana (1.13.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-marketplacecatalog (1.25.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-marketplacecommerceanalytics (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-marketplaceentitlementservice (1.37.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-marketplacemetering (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mediaconnect (1.47.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mediaconvert (1.101.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-medialive (1.96.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mediapackage (1.58.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mediapackagevod (1.41.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mediastore (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mediastoredata (1.40.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mediatailor (1.60.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-memorydb (1.12.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mgn (1.17.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-migrationhub (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-migrationhubconfig (1.22.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-migrationhuborchestrator (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-migrationhubrefactorspaces (1.11.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-migrationhubstrategyrecommendations (1.7.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mobile (1.37.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mq (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mturk (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-mwaa (1.19.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-neptune (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-networkfirewall (1.24.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-networkmanager (1.28.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-nimblestudio (1.18.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-oam (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-omics (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-opensearchserverless (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-opensearchservice (1.17.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-opsworks (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-opsworkscm (1.54.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-organizations (1.73.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-outposts (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-panorama (1.12.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-personalize (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-personalizeevents (1.30.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-personalizeruntime (1.35.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-pi (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-pinpoint (1.70.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-pinpointemail (1.37.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-pinpointsmsvoice (1.34.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-pinpointsmsvoicev2 (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-pipes (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-polly (1.66.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-pricing (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-privatenetworks (1.4.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-prometheusservice (1.17.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-proton (1.23.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-qldb (1.27.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-qldbsession (1.24.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-quicksight (1.76.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ram (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-rds (1.172.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-rdsdataservice (1.40.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-recyclebin (1.8.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-redshift (1.91.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-redshiftdataapiservice (1.24.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-redshiftserverless (1.7.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-rekognition (1.74.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-resiliencehub (1.10.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-resourceexplorer2 (1.3.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-resourcegroups (1.48.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-resourcegroupstaggingapi (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-resources (3.160.0)
-      aws-sdk-accessanalyzer (~> 1)
-      aws-sdk-account (~> 1)
-      aws-sdk-acm (~> 1)
-      aws-sdk-acmpca (~> 1)
-      aws-sdk-alexaforbusiness (~> 1)
-      aws-sdk-amplify (~> 1)
-      aws-sdk-amplifybackend (~> 1)
-      aws-sdk-amplifyuibuilder (~> 1)
-      aws-sdk-apigateway (~> 1)
-      aws-sdk-apigatewaymanagementapi (~> 1)
-      aws-sdk-apigatewayv2 (~> 1)
-      aws-sdk-appconfig (~> 1)
-      aws-sdk-appconfigdata (~> 1)
-      aws-sdk-appflow (~> 1)
-      aws-sdk-appintegrationsservice (~> 1)
-      aws-sdk-applicationautoscaling (~> 1)
-      aws-sdk-applicationcostprofiler (~> 1)
-      aws-sdk-applicationdiscoveryservice (~> 1)
-      aws-sdk-applicationinsights (~> 1)
-      aws-sdk-appmesh (~> 1)
-      aws-sdk-appregistry (~> 1)
-      aws-sdk-apprunner (~> 1)
-      aws-sdk-appstream (~> 1)
-      aws-sdk-appsync (~> 1)
-      aws-sdk-arczonalshift (~> 1)
-      aws-sdk-athena (~> 1)
-      aws-sdk-auditmanager (~> 1)
-      aws-sdk-augmentedairuntime (~> 1)
-      aws-sdk-autoscaling (~> 1)
-      aws-sdk-autoscalingplans (~> 1)
-      aws-sdk-backup (~> 1)
-      aws-sdk-backupgateway (~> 1)
-      aws-sdk-backupstorage (~> 1)
-      aws-sdk-batch (~> 1)
-      aws-sdk-billingconductor (~> 1)
-      aws-sdk-braket (~> 1)
-      aws-sdk-budgets (~> 1)
-      aws-sdk-chime (~> 1)
-      aws-sdk-chimesdkidentity (~> 1)
-      aws-sdk-chimesdkmediapipelines (~> 1)
-      aws-sdk-chimesdkmeetings (~> 1)
-      aws-sdk-chimesdkmessaging (~> 1)
-      aws-sdk-chimesdkvoice (~> 1)
-      aws-sdk-cleanrooms (~> 1)
-      aws-sdk-cloud9 (~> 1)
-      aws-sdk-cloudcontrolapi (~> 1)
-      aws-sdk-clouddirectory (~> 1)
-      aws-sdk-cloudformation (~> 1)
-      aws-sdk-cloudfront (~> 1)
-      aws-sdk-cloudhsm (~> 1)
-      aws-sdk-cloudhsmv2 (~> 1)
-      aws-sdk-cloudsearch (~> 1)
-      aws-sdk-cloudsearchdomain (~> 1)
-      aws-sdk-cloudtrail (~> 1)
-      aws-sdk-cloudtraildata (~> 1)
-      aws-sdk-cloudwatch (~> 1)
-      aws-sdk-cloudwatchevents (~> 1)
-      aws-sdk-cloudwatchevidently (~> 1)
-      aws-sdk-cloudwatchlogs (~> 1)
-      aws-sdk-cloudwatchrum (~> 1)
-      aws-sdk-codeartifact (~> 1)
-      aws-sdk-codebuild (~> 1)
-      aws-sdk-codecatalyst (~> 1)
-      aws-sdk-codecommit (~> 1)
-      aws-sdk-codedeploy (~> 1)
-      aws-sdk-codeguruprofiler (~> 1)
-      aws-sdk-codegurureviewer (~> 1)
-      aws-sdk-codepipeline (~> 1)
-      aws-sdk-codestar (~> 1)
-      aws-sdk-codestarconnections (~> 1)
-      aws-sdk-codestarnotifications (~> 1)
-      aws-sdk-cognitoidentity (~> 1)
-      aws-sdk-cognitoidentityprovider (~> 1)
-      aws-sdk-cognitosync (~> 1)
-      aws-sdk-comprehend (~> 1)
-      aws-sdk-comprehendmedical (~> 1)
-      aws-sdk-computeoptimizer (~> 1)
-      aws-sdk-configservice (~> 1)
-      aws-sdk-connect (~> 1)
-      aws-sdk-connectcampaignservice (~> 1)
-      aws-sdk-connectcases (~> 1)
-      aws-sdk-connectcontactlens (~> 1)
-      aws-sdk-connectparticipant (~> 1)
-      aws-sdk-connectwisdomservice (~> 1)
-      aws-sdk-controltower (~> 1)
-      aws-sdk-costandusagereportservice (~> 1)
-      aws-sdk-costexplorer (~> 1)
-      aws-sdk-customerprofiles (~> 1)
-      aws-sdk-databasemigrationservice (~> 1)
-      aws-sdk-dataexchange (~> 1)
-      aws-sdk-datapipeline (~> 1)
-      aws-sdk-datasync (~> 1)
-      aws-sdk-dax (~> 1)
-      aws-sdk-detective (~> 1)
-      aws-sdk-devicefarm (~> 1)
-      aws-sdk-devopsguru (~> 1)
-      aws-sdk-directconnect (~> 1)
-      aws-sdk-directoryservice (~> 1)
-      aws-sdk-dlm (~> 1)
-      aws-sdk-docdb (~> 1)
-      aws-sdk-docdbelastic (~> 1)
-      aws-sdk-drs (~> 1)
-      aws-sdk-dynamodb (~> 1)
-      aws-sdk-dynamodbstreams (~> 1)
-      aws-sdk-ebs (~> 1)
-      aws-sdk-ec2 (~> 1)
-      aws-sdk-ec2instanceconnect (~> 1)
-      aws-sdk-ecr (~> 1)
-      aws-sdk-ecrpublic (~> 1)
-      aws-sdk-ecs (~> 1)
-      aws-sdk-efs (~> 1)
-      aws-sdk-eks (~> 1)
-      aws-sdk-elasticache (~> 1)
-      aws-sdk-elasticbeanstalk (~> 1)
-      aws-sdk-elasticinference (~> 1)
-      aws-sdk-elasticloadbalancing (~> 1)
-      aws-sdk-elasticloadbalancingv2 (~> 1)
-      aws-sdk-elasticsearchservice (~> 1)
-      aws-sdk-elastictranscoder (~> 1)
-      aws-sdk-emr (~> 1)
-      aws-sdk-emrcontainers (~> 1)
-      aws-sdk-emrserverless (~> 1)
-      aws-sdk-eventbridge (~> 1)
-      aws-sdk-finspace (~> 1)
-      aws-sdk-finspacedata (~> 1)
-      aws-sdk-firehose (~> 1)
-      aws-sdk-fis (~> 1)
-      aws-sdk-fms (~> 1)
-      aws-sdk-forecastqueryservice (~> 1)
-      aws-sdk-forecastservice (~> 1)
-      aws-sdk-frauddetector (~> 1)
-      aws-sdk-fsx (~> 1)
-      aws-sdk-gamelift (~> 1)
-      aws-sdk-gamesparks (~> 1)
-      aws-sdk-glacier (~> 1)
-      aws-sdk-globalaccelerator (~> 1)
-      aws-sdk-glue (~> 1)
-      aws-sdk-gluedatabrew (~> 1)
-      aws-sdk-greengrass (~> 1)
-      aws-sdk-greengrassv2 (~> 1)
-      aws-sdk-groundstation (~> 1)
-      aws-sdk-guardduty (~> 1)
-      aws-sdk-health (~> 1)
-      aws-sdk-healthlake (~> 1)
-      aws-sdk-honeycode (~> 1)
-      aws-sdk-iam (~> 1)
-      aws-sdk-identitystore (~> 1)
-      aws-sdk-imagebuilder (~> 1)
-      aws-sdk-importexport (~> 1)
-      aws-sdk-inspector (~> 1)
-      aws-sdk-inspector2 (~> 1)
-      aws-sdk-internetmonitor (~> 1)
-      aws-sdk-iot (~> 1)
-      aws-sdk-iot1clickdevicesservice (~> 1)
-      aws-sdk-iot1clickprojects (~> 1)
-      aws-sdk-iotanalytics (~> 1)
-      aws-sdk-iotdataplane (~> 1)
-      aws-sdk-iotdeviceadvisor (~> 1)
-      aws-sdk-iotevents (~> 1)
-      aws-sdk-ioteventsdata (~> 1)
-      aws-sdk-iotfleethub (~> 1)
-      aws-sdk-iotfleetwise (~> 1)
-      aws-sdk-iotjobsdataplane (~> 1)
-      aws-sdk-iotroborunner (~> 1)
-      aws-sdk-iotsecuretunneling (~> 1)
-      aws-sdk-iotsitewise (~> 1)
-      aws-sdk-iotthingsgraph (~> 1)
-      aws-sdk-iottwinmaker (~> 1)
-      aws-sdk-iotwireless (~> 1)
-      aws-sdk-ivs (~> 1)
-      aws-sdk-ivschat (~> 1)
-      aws-sdk-kafka (~> 1)
-      aws-sdk-kafkaconnect (~> 1)
-      aws-sdk-kendra (~> 1)
-      aws-sdk-kendraranking (~> 1)
-      aws-sdk-keyspaces (~> 1)
-      aws-sdk-kinesis (~> 1)
-      aws-sdk-kinesisanalytics (~> 1)
-      aws-sdk-kinesisanalyticsv2 (~> 1)
-      aws-sdk-kinesisvideo (~> 1)
-      aws-sdk-kinesisvideoarchivedmedia (~> 1)
-      aws-sdk-kinesisvideomedia (~> 1)
-      aws-sdk-kinesisvideosignalingchannels (~> 1)
-      aws-sdk-kinesisvideowebrtcstorage (~> 1)
-      aws-sdk-kms (~> 1)
-      aws-sdk-lakeformation (~> 1)
-      aws-sdk-lambda (~> 1)
-      aws-sdk-lambdapreview (~> 1)
-      aws-sdk-lex (~> 1)
-      aws-sdk-lexmodelbuildingservice (~> 1)
-      aws-sdk-lexmodelsv2 (~> 1)
-      aws-sdk-lexruntimev2 (~> 1)
-      aws-sdk-licensemanager (~> 1)
-      aws-sdk-licensemanagerlinuxsubscriptions (~> 1)
-      aws-sdk-licensemanagerusersubscriptions (~> 1)
-      aws-sdk-lightsail (~> 1)
-      aws-sdk-locationservice (~> 1)
-      aws-sdk-lookoutequipment (~> 1)
-      aws-sdk-lookoutforvision (~> 1)
-      aws-sdk-lookoutmetrics (~> 1)
-      aws-sdk-machinelearning (~> 1)
-      aws-sdk-macie (~> 1)
-      aws-sdk-macie2 (~> 1)
-      aws-sdk-mainframemodernization (~> 1)
-      aws-sdk-managedblockchain (~> 1)
-      aws-sdk-managedgrafana (~> 1)
-      aws-sdk-marketplacecatalog (~> 1)
-      aws-sdk-marketplacecommerceanalytics (~> 1)
-      aws-sdk-marketplaceentitlementservice (~> 1)
-      aws-sdk-marketplacemetering (~> 1)
-      aws-sdk-mediaconnect (~> 1)
-      aws-sdk-mediaconvert (~> 1)
-      aws-sdk-medialive (~> 1)
-      aws-sdk-mediapackage (~> 1)
-      aws-sdk-mediapackagevod (~> 1)
-      aws-sdk-mediastore (~> 1)
-      aws-sdk-mediastoredata (~> 1)
-      aws-sdk-mediatailor (~> 1)
-      aws-sdk-memorydb (~> 1)
-      aws-sdk-mgn (~> 1)
-      aws-sdk-migrationhub (~> 1)
-      aws-sdk-migrationhubconfig (~> 1)
-      aws-sdk-migrationhuborchestrator (~> 1)
-      aws-sdk-migrationhubrefactorspaces (~> 1)
-      aws-sdk-migrationhubstrategyrecommendations (~> 1)
-      aws-sdk-mobile (~> 1)
-      aws-sdk-mq (~> 1)
-      aws-sdk-mturk (~> 1)
-      aws-sdk-mwaa (~> 1)
-      aws-sdk-neptune (~> 1)
-      aws-sdk-networkfirewall (~> 1)
-      aws-sdk-networkmanager (~> 1)
-      aws-sdk-nimblestudio (~> 1)
-      aws-sdk-oam (~> 1)
-      aws-sdk-omics (~> 1)
-      aws-sdk-opensearchserverless (~> 1)
-      aws-sdk-opensearchservice (~> 1)
-      aws-sdk-opsworks (~> 1)
-      aws-sdk-opsworkscm (~> 1)
-      aws-sdk-organizations (~> 1)
-      aws-sdk-outposts (~> 1)
-      aws-sdk-panorama (~> 1)
-      aws-sdk-personalize (~> 1)
-      aws-sdk-personalizeevents (~> 1)
-      aws-sdk-personalizeruntime (~> 1)
-      aws-sdk-pi (~> 1)
-      aws-sdk-pinpoint (~> 1)
-      aws-sdk-pinpointemail (~> 1)
-      aws-sdk-pinpointsmsvoice (~> 1)
-      aws-sdk-pinpointsmsvoicev2 (~> 1)
-      aws-sdk-pipes (~> 1)
-      aws-sdk-polly (~> 1)
-      aws-sdk-pricing (~> 1)
-      aws-sdk-privatenetworks (~> 1)
-      aws-sdk-prometheusservice (~> 1)
-      aws-sdk-proton (~> 1)
-      aws-sdk-qldb (~> 1)
-      aws-sdk-qldbsession (~> 1)
-      aws-sdk-quicksight (~> 1)
-      aws-sdk-ram (~> 1)
-      aws-sdk-rds (~> 1)
-      aws-sdk-rdsdataservice (~> 1)
-      aws-sdk-recyclebin (~> 1)
-      aws-sdk-redshift (~> 1)
-      aws-sdk-redshiftdataapiservice (~> 1)
-      aws-sdk-redshiftserverless (~> 1)
-      aws-sdk-rekognition (~> 1)
-      aws-sdk-resiliencehub (~> 1)
-      aws-sdk-resourceexplorer2 (~> 1)
-      aws-sdk-resourcegroups (~> 1)
-      aws-sdk-resourcegroupstaggingapi (~> 1)
-      aws-sdk-robomaker (~> 1)
-      aws-sdk-rolesanywhere (~> 1)
-      aws-sdk-route53 (~> 1)
-      aws-sdk-route53domains (~> 1)
-      aws-sdk-route53recoverycluster (~> 1)
-      aws-sdk-route53recoverycontrolconfig (~> 1)
-      aws-sdk-route53recoveryreadiness (~> 1)
-      aws-sdk-route53resolver (~> 1)
-      aws-sdk-s3 (~> 1)
-      aws-sdk-s3control (~> 1)
-      aws-sdk-s3outposts (~> 1)
-      aws-sdk-sagemaker (~> 1)
-      aws-sdk-sagemakeredgemanager (~> 1)
-      aws-sdk-sagemakerfeaturestoreruntime (~> 1)
-      aws-sdk-sagemakergeospatial (~> 1)
-      aws-sdk-sagemakermetrics (~> 1)
-      aws-sdk-sagemakerruntime (~> 1)
-      aws-sdk-savingsplans (~> 1)
-      aws-sdk-scheduler (~> 1)
-      aws-sdk-schemas (~> 1)
-      aws-sdk-secretsmanager (~> 1)
-      aws-sdk-securityhub (~> 1)
-      aws-sdk-securitylake (~> 1)
-      aws-sdk-serverlessapplicationrepository (~> 1)
-      aws-sdk-servicecatalog (~> 1)
-      aws-sdk-servicediscovery (~> 1)
-      aws-sdk-servicequotas (~> 1)
-      aws-sdk-ses (~> 1)
-      aws-sdk-sesv2 (~> 1)
-      aws-sdk-shield (~> 1)
-      aws-sdk-signer (~> 1)
-      aws-sdk-simpledb (~> 1)
-      aws-sdk-simspaceweaver (~> 1)
-      aws-sdk-sms (~> 1)
-      aws-sdk-snowball (~> 1)
-      aws-sdk-snowdevicemanagement (~> 1)
-      aws-sdk-sns (~> 1)
-      aws-sdk-sqs (~> 1)
-      aws-sdk-ssm (~> 1)
-      aws-sdk-ssmcontacts (~> 1)
-      aws-sdk-ssmincidents (~> 1)
-      aws-sdk-ssmsap (~> 1)
-      aws-sdk-ssoadmin (~> 1)
-      aws-sdk-states (~> 1)
-      aws-sdk-storagegateway (~> 1)
-      aws-sdk-support (~> 1)
-      aws-sdk-supportapp (~> 1)
-      aws-sdk-swf (~> 1)
-      aws-sdk-synthetics (~> 1)
-      aws-sdk-textract (~> 1)
-      aws-sdk-timestreamquery (~> 1)
-      aws-sdk-timestreamwrite (~> 1)
-      aws-sdk-tnb (~> 1)
-      aws-sdk-transcribeservice (~> 1)
-      aws-sdk-transcribestreamingservice (~> 1)
-      aws-sdk-transfer (~> 1)
-      aws-sdk-translate (~> 1)
-      aws-sdk-voiceid (~> 1)
-      aws-sdk-waf (~> 1)
-      aws-sdk-wafregional (~> 1)
-      aws-sdk-wafv2 (~> 1)
-      aws-sdk-wellarchitected (~> 1)
-      aws-sdk-workdocs (~> 1)
-      aws-sdk-worklink (~> 1)
-      aws-sdk-workmail (~> 1)
-      aws-sdk-workmailmessageflow (~> 1)
-      aws-sdk-workspaces (~> 1)
-      aws-sdk-workspacesweb (~> 1)
-      aws-sdk-xray (~> 1)
-    aws-sdk-robomaker (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-rolesanywhere (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-route53 (1.71.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-route53domains (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-route53recoverycluster (1.13.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-route53recoverycontrolconfig (1.13.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-route53recoveryreadiness (1.12.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-route53resolver (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.119.1)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sdk-kms (~> 1)
-      aws-sigv4 (~> 1.4)
-    aws-sdk-s3control (1.60.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-s3outposts (1.15.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sagemaker (1.166.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sagemakeredgemanager (1.14.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sagemakerfeaturestoreruntime (1.15.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sagemakergeospatial (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sagemakermetrics (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sagemakerruntime (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-savingsplans (1.28.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-scheduler (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-schemas (1.25.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-secretsmanager (1.72.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-securityhub (1.78.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-securitylake (1.2.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-serverlessapplicationrepository (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-servicecatalog (1.76.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-servicediscovery (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-servicequotas (1.25.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ses (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sesv2 (1.31.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-shield (1.51.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-signer (1.40.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-simpledb (1.36.1)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv2 (~> 1.0)
-    aws-sdk-simspaceweaver (1.1.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sms (1.42.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-snowball (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-snowdevicemanagement (1.9.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sns (1.60.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-sqs (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ssm (1.149.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ssmcontacts (1.16.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ssmincidents (1.21.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ssmsap (1.3.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-ssoadmin (1.23.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-states (1.52.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-storagegateway (1.70.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-support (1.45.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-supportapp (1.4.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-swf (1.39.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-synthetics (1.30.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-textract (1.44.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-timestreamquery (1.18.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-timestreamwrite (1.17.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-tnb (1.0.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-transcribeservice (1.81.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-transcribestreamingservice (1.46.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-transfer (1.67.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-translate (1.50.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-voiceid (1.11.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-waf (1.49.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-wafregional (1.50.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-wafv2 (1.50.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-wellarchitected (1.20.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-workdocs (1.43.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-worklink (1.35.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-workmail (1.53.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-workmailmessageflow (1.23.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-workspaces (1.79.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-workspacesweb (1.8.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sdk-xray (1.51.0)
-      aws-sdk-core (~> 3, >= 3.165.0)
-      aws-sigv4 (~> 1.1)
-    aws-sigv2 (1.1.0)
+    aws-sdk (2.11.632)
+      aws-sdk-resources (= 2.11.632)
+    aws-sdk-core (2.11.632)
+      aws-sigv4 (~> 1.0)
+      jmespath (~> 1.0)
+    aws-sdk-resources (2.11.632)
+      aws-sdk-core (= 2.11.632)
     aws-sigv4 (1.5.2)
       aws-eventstream (~> 1, >= 1.0.2)
     benchmark-ips (2.11.0)
@@ -1796,7 +433,7 @@ DEPENDENCIES
   activerecord
   addressable (~> 2.4.0)
   appraisal (~> 2.4.0)
-  aws-sdk
+  aws-sdk (~> 2)
   benchmark-ips (~> 2.8)
   benchmark-memory (< 0.2)
   builder

From efeb877500bb2836c9d77fddfae36d7dc6e49c50 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Mon, 17 Apr 2023 12:46:30 -0700
Subject: [PATCH 22/44] cherry pick parsed_context spec fix

---
 .../contrib/aws/instrumentation_spec.rb        |  2 +-
 .../tracing/contrib/aws/parsed_context_spec.rb | 18 +++++++++++++-----
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 36b9367e908..4789e2ed02c 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -27,7 +27,7 @@
     Datadog.registry[:aws].reset_configuration!
   end
 
-  context 'with a core AWS SDK client', if: RUBY_VERSION >= '2.2.0' do
+  context 'with a core AWS SDK client' do
     before { hide_const('Aws::S3') }
 
     let(:client) { ::Aws::STS::Client.new(stub_responses: responses) } # STS is part of aws-sdk-core
diff --git a/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb b/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb
index 2f2796fd528..f4081bbfcf8 100644
--- a/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb
@@ -6,10 +6,18 @@
 RSpec.describe Datadog::Tracing::Contrib::Aws::ParsedContext do
   subject(:parsed_context) { described_class.new(context) }
 
-  let(:context) { client.list_buckets.context }
-
-  let(:client) { ::Aws::S3::Client.new(region: 'us-west-2', stub_responses: responses) }
-  let(:responses) { true }
+  let(:context) do
+    Seahorse::Client::RequestContext.new(
+      operation_name: :list_buckets,
+      client: double(class: 'Aws::S3::Client', config: double(region: 'us-west-2')),
+      http_request: Seahorse::Client::Http::Request.new(
+        endpoint: URI('http://us-west-2.amazonaws.com.com/')
+      ),
+      http_response: Seahorse::Client::Http::Response.new(
+        status_code: 200
+      )
+    )
+  end
 
   describe '#new' do
     context 'given a context with typical values' do
@@ -41,4 +49,4 @@
       it { is_expected.to eq(fallback) }
     end
   end
-end
+end
\ No newline at end of file

From 02b104e96efbf9aa58c0776a061aaeb9b0bb010d Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Mon, 17 Apr 2023 13:47:21 -0700
Subject: [PATCH 23/44] lint

---
 spec/datadog/tracing/contrib/aws/parsed_context_spec.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb b/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb
index f4081bbfcf8..ca71f5de4da 100644
--- a/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/parsed_context_spec.rb
@@ -49,4 +49,4 @@
       it { is_expected.to eq(fallback) }
     end
   end
-end
\ No newline at end of file
+end

From c8fecad3713c374f2deac09eac2f9290223e5a5d Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Mon, 17 Apr 2023 13:53:55 -0700
Subject: [PATCH 24/44] revert 2.7 changes

---
 Appraisals                                    |    2 +-
 gemfiles/ruby_2.7.6_contrib.gemfile           |    2 +-
 gemfiles/ruby_2.7.6_contrib.gemfile.lock      | 1377 ++++++++++++++++-
 .../contrib/aws/instrumentation_spec.rb       |    1 -
 4 files changed, 1372 insertions(+), 10 deletions(-)

diff --git a/Appraisals b/Appraisals
index 6bd58c5a0fd..fc43bd05294 100644
--- a/Appraisals
+++ b/Appraisals
@@ -1410,7 +1410,7 @@ elsif ruby_version?('2.7')
       gem 'actionview'
       gem 'active_model_serializers', '>= 0.10.0'
       gem 'activerecord'
-      gem 'aws-sdk', '~> 2'
+      gem 'aws-sdk'
       gem 'concurrent-ruby'
       gem 'cucumber', '~> 7' # TODO: Support cucumber 8.x
       gem 'dalli', '>= 3.0.0'
diff --git a/gemfiles/ruby_2.7.6_contrib.gemfile b/gemfiles/ruby_2.7.6_contrib.gemfile
index e89cdc68fc5..7f6a827883e 100644
--- a/gemfiles/ruby_2.7.6_contrib.gemfile
+++ b/gemfiles/ruby_2.7.6_contrib.gemfile
@@ -42,7 +42,7 @@ gem "actionpack"
 gem "actionview"
 gem "active_model_serializers", ">= 0.10.0"
 gem "activerecord"
-gem "aws-sdk", "~> 2"
+gem "aws-sdk"
 gem "cucumber", "~> 7"
 gem "dalli", ">= 3.0.0"
 gem "delayed_job"
diff --git a/gemfiles/ruby_2.7.6_contrib.gemfile.lock b/gemfiles/ruby_2.7.6_contrib.gemfile.lock
index 4150b723999..afd0ec02718 100644
--- a/gemfiles/ruby_2.7.6_contrib.gemfile.lock
+++ b/gemfiles/ruby_2.7.6_contrib.gemfile.lock
@@ -56,13 +56,1376 @@ GEM
       thor (>= 0.14.0)
     ast (2.4.2)
     aws-eventstream (1.2.0)
-    aws-sdk (2.11.632)
-      aws-sdk-resources (= 2.11.632)
-    aws-sdk-core (2.11.632)
-      aws-sigv4 (~> 1.0)
-      jmespath (~> 1.0)
-    aws-sdk-resources (2.11.632)
-      aws-sdk-core (= 2.11.632)
+    aws-partitions (1.717.0)
+    aws-sdk (3.1.0)
+      aws-sdk-resources (~> 3)
+    aws-sdk-accessanalyzer (1.34.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-account (1.10.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-acm (1.55.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-acmpca (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-alexaforbusiness (1.58.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-amplify (1.44.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-amplifybackend (1.20.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-amplifyuibuilder (1.9.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-apigateway (1.81.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-apigatewaymanagementapi (1.32.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-apigatewayv2 (1.44.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appconfig (1.30.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appconfigdata (1.8.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appflow (1.36.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appintegrationsservice (1.15.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-applicationautoscaling (1.66.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-applicationcostprofiler (1.11.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-applicationdiscoveryservice (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-applicationinsights (1.33.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appmesh (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appregistry (1.19.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-apprunner (1.21.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appstream (1.70.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-appsync (1.58.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-arczonalshift (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-athena (1.61.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-auditmanager (1.31.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-augmentedairuntime (1.25.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-autoscaling (1.86.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-autoscalingplans (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-backup (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-backupgateway (1.8.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-backupstorage (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-batch (1.67.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-billingconductor (1.6.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-braket (1.21.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-budgets (1.52.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-chime (1.70.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-chimesdkidentity (1.11.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-chimesdkmediapipelines (1.3.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-chimesdkmeetings (1.17.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-chimesdkmessaging (1.15.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-chimesdkvoice (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cleanrooms (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloud9 (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudcontrolapi (1.10.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-clouddirectory (1.44.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudformation (1.76.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudfront (1.76.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudhsm (1.41.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudhsmv2 (1.44.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudsearch (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudsearchdomain (1.34.1)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudtrail (1.58.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudtraildata (1.0.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudwatch (1.71.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudwatchevents (1.59.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudwatchevidently (1.11.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudwatchlogs (1.62.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cloudwatchrum (1.9.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codeartifact (1.25.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codebuild (1.90.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codecatalyst (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+    aws-sdk-codecommit (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codedeploy (1.52.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codeguruprofiler (1.26.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codegurureviewer (1.35.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codepipeline (1.55.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codestar (1.40.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codestarconnections (1.26.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-codestarnotifications (1.22.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cognitoidentity (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cognitoidentityprovider (1.73.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-cognitosync (1.38.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-comprehend (1.65.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-comprehendmedical (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-computeoptimizer (1.38.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-configservice (1.87.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-connect (1.98.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-connectcampaignservice (1.3.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-connectcases (1.4.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-connectcontactlens (1.13.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-connectparticipant (1.28.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-connectwisdomservice (1.12.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-controltower (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-core (3.170.0)
+      aws-eventstream (~> 1, >= 1.0.2)
+      aws-partitions (~> 1, >= 1.651.0)
+      aws-sigv4 (~> 1.5)
+      jmespath (~> 1, >= 1.6.1)
+    aws-sdk-costandusagereportservice (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-costexplorer (1.83.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-customerprofiles (1.27.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-databasemigrationservice (1.75.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-dataexchange (1.30.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-datapipeline (1.38.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-datasync (1.55.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-dax (1.41.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-detective (1.32.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-devicefarm (1.54.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-devopsguru (1.30.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-directconnect (1.56.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-directoryservice (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-dlm (1.55.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-docdb (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-docdbelastic (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-drs (1.11.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-dynamodb (1.81.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-dynamodbstreams (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ebs (1.28.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ec2 (1.366.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ec2instanceconnect (1.27.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ecr (1.58.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ecrpublic (1.15.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ecs (1.111.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-efs (1.59.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-eks (1.83.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-elasticache (1.84.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-elasticbeanstalk (1.54.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-elasticinference (1.23.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-elasticloadbalancing (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-elasticloadbalancingv2 (1.84.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-elasticsearchservice (1.69.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-elastictranscoder (1.40.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-emr (1.66.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-emrcontainers (1.19.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-emrserverless (1.5.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-eventbridge (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-finspace (1.13.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-finspacedata (1.19.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-firehose (1.51.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-fis (1.16.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-fms (1.55.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-forecastqueryservice (1.24.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-forecastservice (1.40.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-frauddetector (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-fsx (1.64.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-gamelift (1.61.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-gamesparks (1.4.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-glacier (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-globalaccelerator (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-glue (1.132.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-gluedatabrew (1.25.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-greengrass (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-greengrassv2 (1.24.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-groundstation (1.32.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-guardduty (1.64.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-health (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-healthlake (1.15.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-honeycode (1.19.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iam (1.75.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-identitystore (1.23.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-imagebuilder (1.44.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-importexport (1.36.1)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv2 (~> 1.0)
+    aws-sdk-inspector (1.45.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-inspector2 (1.10.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-internetmonitor (1.0.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iot (1.100.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iot1clickdevicesservice (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iot1clickprojects (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotanalytics (1.51.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotdataplane (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotdeviceadvisor (1.18.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotevents (1.35.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ioteventsdata (1.29.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotfleethub (1.13.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotfleetwise (1.7.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotjobsdataplane (1.38.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotroborunner (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotsecuretunneling (1.23.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotsitewise (1.48.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotthingsgraph (1.26.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iottwinmaker (1.9.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-iotwireless (1.30.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ivs (1.27.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ivschat (1.8.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kafka (1.54.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kafkaconnect (1.9.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kendra (1.63.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kendraranking (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-keyspaces (1.5.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesis (1.45.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesisanalytics (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesisanalyticsv2 (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesisvideo (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesisvideoarchivedmedia (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesisvideomedia (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesisvideosignalingchannels (1.21.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kinesisvideowebrtcstorage (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-kms (1.62.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lakeformation (1.31.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lambda (1.92.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lambdapreview (1.36.1)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lex (1.47.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lexmodelbuildingservice (1.59.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lexmodelsv2 (1.32.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lexruntimev2 (1.19.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-licensemanager (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-licensemanagerlinuxsubscriptions (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-licensemanagerusersubscriptions (1.3.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lightsail (1.74.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-locationservice (1.29.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lookoutequipment (1.16.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lookoutforvision (1.19.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-lookoutmetrics (1.24.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-machinelearning (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-macie (1.40.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-macie2 (1.52.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mainframemodernization (1.4.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-managedblockchain (1.36.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-managedgrafana (1.13.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-marketplacecatalog (1.25.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-marketplacecommerceanalytics (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-marketplaceentitlementservice (1.37.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-marketplacemetering (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mediaconnect (1.47.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mediaconvert (1.101.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-medialive (1.96.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mediapackage (1.58.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mediapackagevod (1.41.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mediastore (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mediastoredata (1.40.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mediatailor (1.60.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-memorydb (1.12.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mgn (1.17.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-migrationhub (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-migrationhubconfig (1.22.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-migrationhuborchestrator (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-migrationhubrefactorspaces (1.11.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-migrationhubstrategyrecommendations (1.7.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mobile (1.37.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mq (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mturk (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-mwaa (1.19.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-neptune (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-networkfirewall (1.24.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-networkmanager (1.28.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-nimblestudio (1.18.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-oam (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-omics (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-opensearchserverless (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-opensearchservice (1.17.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-opsworks (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-opsworkscm (1.54.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-organizations (1.73.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-outposts (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-panorama (1.12.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-personalize (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-personalizeevents (1.30.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-personalizeruntime (1.35.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-pi (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-pinpoint (1.70.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-pinpointemail (1.37.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-pinpointsmsvoice (1.34.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-pinpointsmsvoicev2 (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-pipes (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-polly (1.66.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-pricing (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-privatenetworks (1.4.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-prometheusservice (1.17.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-proton (1.23.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-qldb (1.27.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-qldbsession (1.24.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-quicksight (1.76.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ram (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-rds (1.172.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-rdsdataservice (1.40.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-recyclebin (1.8.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-redshift (1.91.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-redshiftdataapiservice (1.24.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-redshiftserverless (1.7.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-rekognition (1.74.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-resiliencehub (1.10.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-resourceexplorer2 (1.3.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-resourcegroups (1.48.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-resourcegroupstaggingapi (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-resources (3.160.0)
+      aws-sdk-accessanalyzer (~> 1)
+      aws-sdk-account (~> 1)
+      aws-sdk-acm (~> 1)
+      aws-sdk-acmpca (~> 1)
+      aws-sdk-alexaforbusiness (~> 1)
+      aws-sdk-amplify (~> 1)
+      aws-sdk-amplifybackend (~> 1)
+      aws-sdk-amplifyuibuilder (~> 1)
+      aws-sdk-apigateway (~> 1)
+      aws-sdk-apigatewaymanagementapi (~> 1)
+      aws-sdk-apigatewayv2 (~> 1)
+      aws-sdk-appconfig (~> 1)
+      aws-sdk-appconfigdata (~> 1)
+      aws-sdk-appflow (~> 1)
+      aws-sdk-appintegrationsservice (~> 1)
+      aws-sdk-applicationautoscaling (~> 1)
+      aws-sdk-applicationcostprofiler (~> 1)
+      aws-sdk-applicationdiscoveryservice (~> 1)
+      aws-sdk-applicationinsights (~> 1)
+      aws-sdk-appmesh (~> 1)
+      aws-sdk-appregistry (~> 1)
+      aws-sdk-apprunner (~> 1)
+      aws-sdk-appstream (~> 1)
+      aws-sdk-appsync (~> 1)
+      aws-sdk-arczonalshift (~> 1)
+      aws-sdk-athena (~> 1)
+      aws-sdk-auditmanager (~> 1)
+      aws-sdk-augmentedairuntime (~> 1)
+      aws-sdk-autoscaling (~> 1)
+      aws-sdk-autoscalingplans (~> 1)
+      aws-sdk-backup (~> 1)
+      aws-sdk-backupgateway (~> 1)
+      aws-sdk-backupstorage (~> 1)
+      aws-sdk-batch (~> 1)
+      aws-sdk-billingconductor (~> 1)
+      aws-sdk-braket (~> 1)
+      aws-sdk-budgets (~> 1)
+      aws-sdk-chime (~> 1)
+      aws-sdk-chimesdkidentity (~> 1)
+      aws-sdk-chimesdkmediapipelines (~> 1)
+      aws-sdk-chimesdkmeetings (~> 1)
+      aws-sdk-chimesdkmessaging (~> 1)
+      aws-sdk-chimesdkvoice (~> 1)
+      aws-sdk-cleanrooms (~> 1)
+      aws-sdk-cloud9 (~> 1)
+      aws-sdk-cloudcontrolapi (~> 1)
+      aws-sdk-clouddirectory (~> 1)
+      aws-sdk-cloudformation (~> 1)
+      aws-sdk-cloudfront (~> 1)
+      aws-sdk-cloudhsm (~> 1)
+      aws-sdk-cloudhsmv2 (~> 1)
+      aws-sdk-cloudsearch (~> 1)
+      aws-sdk-cloudsearchdomain (~> 1)
+      aws-sdk-cloudtrail (~> 1)
+      aws-sdk-cloudtraildata (~> 1)
+      aws-sdk-cloudwatch (~> 1)
+      aws-sdk-cloudwatchevents (~> 1)
+      aws-sdk-cloudwatchevidently (~> 1)
+      aws-sdk-cloudwatchlogs (~> 1)
+      aws-sdk-cloudwatchrum (~> 1)
+      aws-sdk-codeartifact (~> 1)
+      aws-sdk-codebuild (~> 1)
+      aws-sdk-codecatalyst (~> 1)
+      aws-sdk-codecommit (~> 1)
+      aws-sdk-codedeploy (~> 1)
+      aws-sdk-codeguruprofiler (~> 1)
+      aws-sdk-codegurureviewer (~> 1)
+      aws-sdk-codepipeline (~> 1)
+      aws-sdk-codestar (~> 1)
+      aws-sdk-codestarconnections (~> 1)
+      aws-sdk-codestarnotifications (~> 1)
+      aws-sdk-cognitoidentity (~> 1)
+      aws-sdk-cognitoidentityprovider (~> 1)
+      aws-sdk-cognitosync (~> 1)
+      aws-sdk-comprehend (~> 1)
+      aws-sdk-comprehendmedical (~> 1)
+      aws-sdk-computeoptimizer (~> 1)
+      aws-sdk-configservice (~> 1)
+      aws-sdk-connect (~> 1)
+      aws-sdk-connectcampaignservice (~> 1)
+      aws-sdk-connectcases (~> 1)
+      aws-sdk-connectcontactlens (~> 1)
+      aws-sdk-connectparticipant (~> 1)
+      aws-sdk-connectwisdomservice (~> 1)
+      aws-sdk-controltower (~> 1)
+      aws-sdk-costandusagereportservice (~> 1)
+      aws-sdk-costexplorer (~> 1)
+      aws-sdk-customerprofiles (~> 1)
+      aws-sdk-databasemigrationservice (~> 1)
+      aws-sdk-dataexchange (~> 1)
+      aws-sdk-datapipeline (~> 1)
+      aws-sdk-datasync (~> 1)
+      aws-sdk-dax (~> 1)
+      aws-sdk-detective (~> 1)
+      aws-sdk-devicefarm (~> 1)
+      aws-sdk-devopsguru (~> 1)
+      aws-sdk-directconnect (~> 1)
+      aws-sdk-directoryservice (~> 1)
+      aws-sdk-dlm (~> 1)
+      aws-sdk-docdb (~> 1)
+      aws-sdk-docdbelastic (~> 1)
+      aws-sdk-drs (~> 1)
+      aws-sdk-dynamodb (~> 1)
+      aws-sdk-dynamodbstreams (~> 1)
+      aws-sdk-ebs (~> 1)
+      aws-sdk-ec2 (~> 1)
+      aws-sdk-ec2instanceconnect (~> 1)
+      aws-sdk-ecr (~> 1)
+      aws-sdk-ecrpublic (~> 1)
+      aws-sdk-ecs (~> 1)
+      aws-sdk-efs (~> 1)
+      aws-sdk-eks (~> 1)
+      aws-sdk-elasticache (~> 1)
+      aws-sdk-elasticbeanstalk (~> 1)
+      aws-sdk-elasticinference (~> 1)
+      aws-sdk-elasticloadbalancing (~> 1)
+      aws-sdk-elasticloadbalancingv2 (~> 1)
+      aws-sdk-elasticsearchservice (~> 1)
+      aws-sdk-elastictranscoder (~> 1)
+      aws-sdk-emr (~> 1)
+      aws-sdk-emrcontainers (~> 1)
+      aws-sdk-emrserverless (~> 1)
+      aws-sdk-eventbridge (~> 1)
+      aws-sdk-finspace (~> 1)
+      aws-sdk-finspacedata (~> 1)
+      aws-sdk-firehose (~> 1)
+      aws-sdk-fis (~> 1)
+      aws-sdk-fms (~> 1)
+      aws-sdk-forecastqueryservice (~> 1)
+      aws-sdk-forecastservice (~> 1)
+      aws-sdk-frauddetector (~> 1)
+      aws-sdk-fsx (~> 1)
+      aws-sdk-gamelift (~> 1)
+      aws-sdk-gamesparks (~> 1)
+      aws-sdk-glacier (~> 1)
+      aws-sdk-globalaccelerator (~> 1)
+      aws-sdk-glue (~> 1)
+      aws-sdk-gluedatabrew (~> 1)
+      aws-sdk-greengrass (~> 1)
+      aws-sdk-greengrassv2 (~> 1)
+      aws-sdk-groundstation (~> 1)
+      aws-sdk-guardduty (~> 1)
+      aws-sdk-health (~> 1)
+      aws-sdk-healthlake (~> 1)
+      aws-sdk-honeycode (~> 1)
+      aws-sdk-iam (~> 1)
+      aws-sdk-identitystore (~> 1)
+      aws-sdk-imagebuilder (~> 1)
+      aws-sdk-importexport (~> 1)
+      aws-sdk-inspector (~> 1)
+      aws-sdk-inspector2 (~> 1)
+      aws-sdk-internetmonitor (~> 1)
+      aws-sdk-iot (~> 1)
+      aws-sdk-iot1clickdevicesservice (~> 1)
+      aws-sdk-iot1clickprojects (~> 1)
+      aws-sdk-iotanalytics (~> 1)
+      aws-sdk-iotdataplane (~> 1)
+      aws-sdk-iotdeviceadvisor (~> 1)
+      aws-sdk-iotevents (~> 1)
+      aws-sdk-ioteventsdata (~> 1)
+      aws-sdk-iotfleethub (~> 1)
+      aws-sdk-iotfleetwise (~> 1)
+      aws-sdk-iotjobsdataplane (~> 1)
+      aws-sdk-iotroborunner (~> 1)
+      aws-sdk-iotsecuretunneling (~> 1)
+      aws-sdk-iotsitewise (~> 1)
+      aws-sdk-iotthingsgraph (~> 1)
+      aws-sdk-iottwinmaker (~> 1)
+      aws-sdk-iotwireless (~> 1)
+      aws-sdk-ivs (~> 1)
+      aws-sdk-ivschat (~> 1)
+      aws-sdk-kafka (~> 1)
+      aws-sdk-kafkaconnect (~> 1)
+      aws-sdk-kendra (~> 1)
+      aws-sdk-kendraranking (~> 1)
+      aws-sdk-keyspaces (~> 1)
+      aws-sdk-kinesis (~> 1)
+      aws-sdk-kinesisanalytics (~> 1)
+      aws-sdk-kinesisanalyticsv2 (~> 1)
+      aws-sdk-kinesisvideo (~> 1)
+      aws-sdk-kinesisvideoarchivedmedia (~> 1)
+      aws-sdk-kinesisvideomedia (~> 1)
+      aws-sdk-kinesisvideosignalingchannels (~> 1)
+      aws-sdk-kinesisvideowebrtcstorage (~> 1)
+      aws-sdk-kms (~> 1)
+      aws-sdk-lakeformation (~> 1)
+      aws-sdk-lambda (~> 1)
+      aws-sdk-lambdapreview (~> 1)
+      aws-sdk-lex (~> 1)
+      aws-sdk-lexmodelbuildingservice (~> 1)
+      aws-sdk-lexmodelsv2 (~> 1)
+      aws-sdk-lexruntimev2 (~> 1)
+      aws-sdk-licensemanager (~> 1)
+      aws-sdk-licensemanagerlinuxsubscriptions (~> 1)
+      aws-sdk-licensemanagerusersubscriptions (~> 1)
+      aws-sdk-lightsail (~> 1)
+      aws-sdk-locationservice (~> 1)
+      aws-sdk-lookoutequipment (~> 1)
+      aws-sdk-lookoutforvision (~> 1)
+      aws-sdk-lookoutmetrics (~> 1)
+      aws-sdk-machinelearning (~> 1)
+      aws-sdk-macie (~> 1)
+      aws-sdk-macie2 (~> 1)
+      aws-sdk-mainframemodernization (~> 1)
+      aws-sdk-managedblockchain (~> 1)
+      aws-sdk-managedgrafana (~> 1)
+      aws-sdk-marketplacecatalog (~> 1)
+      aws-sdk-marketplacecommerceanalytics (~> 1)
+      aws-sdk-marketplaceentitlementservice (~> 1)
+      aws-sdk-marketplacemetering (~> 1)
+      aws-sdk-mediaconnect (~> 1)
+      aws-sdk-mediaconvert (~> 1)
+      aws-sdk-medialive (~> 1)
+      aws-sdk-mediapackage (~> 1)
+      aws-sdk-mediapackagevod (~> 1)
+      aws-sdk-mediastore (~> 1)
+      aws-sdk-mediastoredata (~> 1)
+      aws-sdk-mediatailor (~> 1)
+      aws-sdk-memorydb (~> 1)
+      aws-sdk-mgn (~> 1)
+      aws-sdk-migrationhub (~> 1)
+      aws-sdk-migrationhubconfig (~> 1)
+      aws-sdk-migrationhuborchestrator (~> 1)
+      aws-sdk-migrationhubrefactorspaces (~> 1)
+      aws-sdk-migrationhubstrategyrecommendations (~> 1)
+      aws-sdk-mobile (~> 1)
+      aws-sdk-mq (~> 1)
+      aws-sdk-mturk (~> 1)
+      aws-sdk-mwaa (~> 1)
+      aws-sdk-neptune (~> 1)
+      aws-sdk-networkfirewall (~> 1)
+      aws-sdk-networkmanager (~> 1)
+      aws-sdk-nimblestudio (~> 1)
+      aws-sdk-oam (~> 1)
+      aws-sdk-omics (~> 1)
+      aws-sdk-opensearchserverless (~> 1)
+      aws-sdk-opensearchservice (~> 1)
+      aws-sdk-opsworks (~> 1)
+      aws-sdk-opsworkscm (~> 1)
+      aws-sdk-organizations (~> 1)
+      aws-sdk-outposts (~> 1)
+      aws-sdk-panorama (~> 1)
+      aws-sdk-personalize (~> 1)
+      aws-sdk-personalizeevents (~> 1)
+      aws-sdk-personalizeruntime (~> 1)
+      aws-sdk-pi (~> 1)
+      aws-sdk-pinpoint (~> 1)
+      aws-sdk-pinpointemail (~> 1)
+      aws-sdk-pinpointsmsvoice (~> 1)
+      aws-sdk-pinpointsmsvoicev2 (~> 1)
+      aws-sdk-pipes (~> 1)
+      aws-sdk-polly (~> 1)
+      aws-sdk-pricing (~> 1)
+      aws-sdk-privatenetworks (~> 1)
+      aws-sdk-prometheusservice (~> 1)
+      aws-sdk-proton (~> 1)
+      aws-sdk-qldb (~> 1)
+      aws-sdk-qldbsession (~> 1)
+      aws-sdk-quicksight (~> 1)
+      aws-sdk-ram (~> 1)
+      aws-sdk-rds (~> 1)
+      aws-sdk-rdsdataservice (~> 1)
+      aws-sdk-recyclebin (~> 1)
+      aws-sdk-redshift (~> 1)
+      aws-sdk-redshiftdataapiservice (~> 1)
+      aws-sdk-redshiftserverless (~> 1)
+      aws-sdk-rekognition (~> 1)
+      aws-sdk-resiliencehub (~> 1)
+      aws-sdk-resourceexplorer2 (~> 1)
+      aws-sdk-resourcegroups (~> 1)
+      aws-sdk-resourcegroupstaggingapi (~> 1)
+      aws-sdk-robomaker (~> 1)
+      aws-sdk-rolesanywhere (~> 1)
+      aws-sdk-route53 (~> 1)
+      aws-sdk-route53domains (~> 1)
+      aws-sdk-route53recoverycluster (~> 1)
+      aws-sdk-route53recoverycontrolconfig (~> 1)
+      aws-sdk-route53recoveryreadiness (~> 1)
+      aws-sdk-route53resolver (~> 1)
+      aws-sdk-s3 (~> 1)
+      aws-sdk-s3control (~> 1)
+      aws-sdk-s3outposts (~> 1)
+      aws-sdk-sagemaker (~> 1)
+      aws-sdk-sagemakeredgemanager (~> 1)
+      aws-sdk-sagemakerfeaturestoreruntime (~> 1)
+      aws-sdk-sagemakergeospatial (~> 1)
+      aws-sdk-sagemakermetrics (~> 1)
+      aws-sdk-sagemakerruntime (~> 1)
+      aws-sdk-savingsplans (~> 1)
+      aws-sdk-scheduler (~> 1)
+      aws-sdk-schemas (~> 1)
+      aws-sdk-secretsmanager (~> 1)
+      aws-sdk-securityhub (~> 1)
+      aws-sdk-securitylake (~> 1)
+      aws-sdk-serverlessapplicationrepository (~> 1)
+      aws-sdk-servicecatalog (~> 1)
+      aws-sdk-servicediscovery (~> 1)
+      aws-sdk-servicequotas (~> 1)
+      aws-sdk-ses (~> 1)
+      aws-sdk-sesv2 (~> 1)
+      aws-sdk-shield (~> 1)
+      aws-sdk-signer (~> 1)
+      aws-sdk-simpledb (~> 1)
+      aws-sdk-simspaceweaver (~> 1)
+      aws-sdk-sms (~> 1)
+      aws-sdk-snowball (~> 1)
+      aws-sdk-snowdevicemanagement (~> 1)
+      aws-sdk-sns (~> 1)
+      aws-sdk-sqs (~> 1)
+      aws-sdk-ssm (~> 1)
+      aws-sdk-ssmcontacts (~> 1)
+      aws-sdk-ssmincidents (~> 1)
+      aws-sdk-ssmsap (~> 1)
+      aws-sdk-ssoadmin (~> 1)
+      aws-sdk-states (~> 1)
+      aws-sdk-storagegateway (~> 1)
+      aws-sdk-support (~> 1)
+      aws-sdk-supportapp (~> 1)
+      aws-sdk-swf (~> 1)
+      aws-sdk-synthetics (~> 1)
+      aws-sdk-textract (~> 1)
+      aws-sdk-timestreamquery (~> 1)
+      aws-sdk-timestreamwrite (~> 1)
+      aws-sdk-tnb (~> 1)
+      aws-sdk-transcribeservice (~> 1)
+      aws-sdk-transcribestreamingservice (~> 1)
+      aws-sdk-transfer (~> 1)
+      aws-sdk-translate (~> 1)
+      aws-sdk-voiceid (~> 1)
+      aws-sdk-waf (~> 1)
+      aws-sdk-wafregional (~> 1)
+      aws-sdk-wafv2 (~> 1)
+      aws-sdk-wellarchitected (~> 1)
+      aws-sdk-workdocs (~> 1)
+      aws-sdk-worklink (~> 1)
+      aws-sdk-workmail (~> 1)
+      aws-sdk-workmailmessageflow (~> 1)
+      aws-sdk-workspaces (~> 1)
+      aws-sdk-workspacesweb (~> 1)
+      aws-sdk-xray (~> 1)
+    aws-sdk-robomaker (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-rolesanywhere (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-route53 (1.71.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-route53domains (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-route53recoverycluster (1.13.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-route53recoverycontrolconfig (1.13.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-route53recoveryreadiness (1.12.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-route53resolver (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-s3 (1.119.1)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sdk-kms (~> 1)
+      aws-sigv4 (~> 1.4)
+    aws-sdk-s3control (1.60.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-s3outposts (1.15.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sagemaker (1.166.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sagemakeredgemanager (1.14.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sagemakerfeaturestoreruntime (1.15.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sagemakergeospatial (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sagemakermetrics (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sagemakerruntime (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-savingsplans (1.28.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-scheduler (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-schemas (1.25.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-secretsmanager (1.72.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-securityhub (1.78.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-securitylake (1.2.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-serverlessapplicationrepository (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-servicecatalog (1.76.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-servicediscovery (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-servicequotas (1.25.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ses (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sesv2 (1.31.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-shield (1.51.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-signer (1.40.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-simpledb (1.36.1)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv2 (~> 1.0)
+    aws-sdk-simspaceweaver (1.1.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sms (1.42.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-snowball (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-snowdevicemanagement (1.9.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sns (1.60.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-sqs (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ssm (1.149.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ssmcontacts (1.16.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ssmincidents (1.21.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ssmsap (1.3.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-ssoadmin (1.23.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-states (1.52.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-storagegateway (1.70.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-support (1.45.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-supportapp (1.4.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-swf (1.39.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-synthetics (1.30.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-textract (1.44.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-timestreamquery (1.18.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-timestreamwrite (1.17.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-tnb (1.0.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-transcribeservice (1.81.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-transcribestreamingservice (1.46.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-transfer (1.67.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-translate (1.50.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-voiceid (1.11.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-waf (1.49.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-wafregional (1.50.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-wafv2 (1.50.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-wellarchitected (1.20.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-workdocs (1.43.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-worklink (1.35.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-workmail (1.53.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-workmailmessageflow (1.23.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-workspaces (1.79.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-workspacesweb (1.8.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sdk-xray (1.51.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
+      aws-sigv4 (~> 1.1)
+    aws-sigv2 (1.1.0)
     aws-sigv4 (1.5.2)
       aws-eventstream (~> 1, >= 1.0.2)
     benchmark-ips (2.11.0)
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 4789e2ed02c..28295d2b65f 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -107,7 +107,6 @@
         expect(span.get_tag('aws.operation')).to eq('list_buckets')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('s3')
-        # expect(span.get_tag('bucketname')).to eq('bucket1')
         expect(span.get_tag('path')).to eq('/')
         expect(span.get_tag('host')).to eq('s3.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('GET')

From 7a69a959bfa827345e21ad4f9319417fc2d8ad07 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Mon, 17 Apr 2023 14:26:38 -0700
Subject: [PATCH 25/44] remove 2.7 gemlock change

---
 gemfiles/ruby_2.7.6_contrib.gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gemfiles/ruby_2.7.6_contrib.gemfile.lock b/gemfiles/ruby_2.7.6_contrib.gemfile.lock
index afd0ec02718..bbb6b2dc5d6 100644
--- a/gemfiles/ruby_2.7.6_contrib.gemfile.lock
+++ b/gemfiles/ruby_2.7.6_contrib.gemfile.lock
@@ -1796,7 +1796,7 @@ DEPENDENCIES
   activerecord
   addressable (~> 2.4.0)
   appraisal (~> 2.4.0)
-  aws-sdk (~> 2)
+  aws-sdk
   benchmark-ips (~> 2.8)
   benchmark-memory (< 0.2)
   builder

From 4a79ed7b17f8abf5e1ce81ffb53179aaac8d1915 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Mon, 17 Apr 2023 16:09:45 -0700
Subject: [PATCH 26/44] remove fetch use normal [] syntax

---
 .../tracing/contrib/aws/instrumentation.rb    | 26 +++++++++----------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index fa65227af3c..4ba5a19493b 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -84,9 +84,9 @@ def add_service_specific_tags(span, aws_service, params)
           end
 
           def add_sqs_tags(span, params)
-            queue_url = params.fetch(:queue_url, nil)
-            queue_name = params.fetch(:queue_name, nil)
-            if queue_url
+            queue_url = params[:queue_url]
+            queue_name = params[:queue_name]
+            if queue_url 
               # example queue_url: https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
               queue_name = queue_url.split('/')[-1]
               aws_account = queue_url.split('/')[-2]
@@ -96,8 +96,8 @@ def add_sqs_tags(span, params)
           end
 
           def add_sns_tags(span, params)
-            topic_arn = params.fetch(:topic_arn, nil)
-            topic_name = params.fetch(:name, nil)
+            topic_arn = params[:topic_arn]
+            topic_name = params[:name]
             if topic_arn
               # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
               topic_name = topic_arn.split(':')[-1]
@@ -108,13 +108,13 @@ def add_sns_tags(span, params)
           end
 
           def add_dynamodb_tags(span, params)
-            table_name = params.fetch(:table_name, '')
+            table_name = params[:table_name]
             span.set_tag(Ext::TAG_TABLE_NAME, table_name)
           end
 
           def add_kinesis_tags(span, params)
-            stream_arn = params.fetch(:stream_arn, nil)
-            stream_name = params.fetch(:stream_name, '')
+            stream_arn = params[:stream_arn]
+            stream_name = params[:stream_name]
             if stream_arn
               # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
               stream_name = stream_arn.split('/')[-1] rescue ''
@@ -125,14 +125,14 @@ def add_kinesis_tags(span, params)
           end
 
           def add_eventbridge_tags(span, params)
-            rule_name = params.fetch(:name, nil) || params.fetch(:rule, nil)
+            rule_name = params[:name] || params[:rule]
             span.set_tag(Ext::TAG_RULE_NAME, rule_name)
           end
 
           def add_states_tags(span, params)
-            state_machine_name = params.fetch(:name, nil)
-            state_machine_arn = params.fetch(:state_machine_arn, nil)
-            execution_arn = params.fetch(:execution_arn, nil)
+            state_machine_name = params[:name]
+            state_machine_arn = params[:state_machine_arn]
+            execution_arn = params[:execution_arn]
 
             if execution_arn
               # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
@@ -150,7 +150,7 @@ def add_states_tags(span, params)
           end
 
           def add_s3_tags(span, params)
-            bucket_name = params.fetch(:bucket, nil)
+            bucket_name = params[:bucket]
             span.set_tag(Ext::TAG_BUCKET_NAME, bucket_name)
           end
 

From 7162e638bf94a76e7177173ebfe734e8ade88fe6 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Mon, 17 Apr 2023 16:31:42 -0700
Subject: [PATCH 27/44] cover if queue_url does not match pattern

---
 .../tracing/contrib/aws/instrumentation.rb    | 10 ++++---
 .../contrib/aws/instrumentation_spec.rb       | 26 +++++++++++++++++++
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index 4ba5a19493b..29c7dcd5b25 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -86,10 +86,12 @@ def add_service_specific_tags(span, aws_service, params)
           def add_sqs_tags(span, params)
             queue_url = params[:queue_url]
             queue_name = params[:queue_name]
-            if queue_url 
-              # example queue_url: https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
-              queue_name = queue_url.split('/')[-1]
-              aws_account = queue_url.split('/')[-2]
+            # Regular expression to match the SQS queue URL pattern
+            # https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
+            pattern = %r{https://sqs\.[^/]+\.amazonaws\.com/(\d+)/([^/]+)}
+
+            if queue_url && (match = queue_url.match(pattern))
+              aws_account, queue_name = match.captures
               span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
             end
             span.set_tag(Ext::TAG_QUEUE_NAME, queue_name)
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 28295d2b65f..e185f8d1bbb 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -239,6 +239,32 @@
       end
     end
 
+    describe '#send_message_invalid_queue_url' do
+      subject!(:send_message) do
+        client.send_message(
+          {
+            queue_url: 'https://sqs.us-stubbed-1/MyQueueName',
+            message_body: 'Hello, world!'
+          }
+        )
+      end
+
+      let(:responses) do
+        { send_message: {
+          md5_of_message_body: 'msg body',
+          md5_of_message_attributes: 'msg attributes',
+          md5_of_message_system_attributes: 'message system attributes',
+          message_id: '123',
+          sequence_number: '456'
+        } }
+      end
+
+      it 'generates a span' do
+        expect(span.get_tag('aws_account')).to eq(nil)
+        expect(span.get_tag('queuename')).to eq('')
+      end
+    end
+
     describe '#send_message_batch' do
       subject!(:send_message_batch) do
         client.send_message_batch(

From 0d46cf234838a484d3b2ec46d65c6b2e18cde212 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Mon, 17 Apr 2023 16:33:26 -0700
Subject: [PATCH 28/44] remove rescue

---
 lib/datadog/tracing/contrib/aws/instrumentation.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index 29c7dcd5b25..cf35cc39f60 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -119,8 +119,8 @@ def add_kinesis_tags(span, params)
             stream_name = params[:stream_name]
             if stream_arn
               # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
-              stream_name = stream_arn.split('/')[-1] rescue ''
-              aws_account = stream_arn.split(':')[-2] rescue ''
+              stream_name = stream_arn.split('/')[-1]
+              aws_account = stream_arn.split(':')[-2]
               span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
             end
             span.set_tag(Ext::TAG_STREAM_NAME, stream_name)

From e572138c7e54e061ed46e62234963e0706b5bee7 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 18 Apr 2023 10:28:53 -0700
Subject: [PATCH 29/44] trigger CI


From 18425194efb6559d0da94b0631d414c5e387050f Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Mon, 24 Apr 2023 17:04:11 -0700
Subject: [PATCH 30/44] add move service's add tags function to their own file

---
 .../tracing/contrib/aws/instrumentation.rb    | 80 ++-----------------
 .../tracing/contrib/aws/services/dynamodb.rb  |  4 +
 .../contrib/aws/services/eventbridge.rb       |  4 +
 .../tracing/contrib/aws/services/kinesis.rb   | 12 +++
 .../tracing/contrib/aws/services/s3.rb        |  4 +
 .../tracing/contrib/aws/services/sns.rb       | 12 +++
 .../tracing/contrib/aws/services/sqs.rb       | 11 +++
 .../contrib/aws/services/stepfunctions.rb     | 20 +++++
 8 files changed, 74 insertions(+), 73 deletions(-)
 create mode 100644 lib/datadog/tracing/contrib/aws/services/dynamodb.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/services/eventbridge.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/services/kinesis.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/services/s3.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/services/sns.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/services/sqs.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/services/stepfunctions.rb

diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index cf35cc39f60..7ec3f8a8196 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -4,6 +4,13 @@
 require_relative '../analytics'
 require_relative 'ext'
 require_relative '../span_attribute_schema'
+require_relative 'services/sqs'
+require_relative 'services/sns'
+require_relative 'services/dynamodb'
+require_relative 'services/kinesis'
+require_relative 'services/eventbridge'
+require_relative 'services/states'
+require_relative 'services/s3'
 
 module Datadog
   module Tracing
@@ -83,79 +90,6 @@ def add_service_specific_tags(span, aws_service, params)
             end
           end
 
-          def add_sqs_tags(span, params)
-            queue_url = params[:queue_url]
-            queue_name = params[:queue_name]
-            # Regular expression to match the SQS queue URL pattern
-            # https://sqs.sa-east-1.amazonaws.com/12345678/MyQueueName
-            pattern = %r{https://sqs\.[^/]+\.amazonaws\.com/(\d+)/([^/]+)}
-
-            if queue_url && (match = queue_url.match(pattern))
-              aws_account, queue_name = match.captures
-              span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
-            end
-            span.set_tag(Ext::TAG_QUEUE_NAME, queue_name)
-          end
-
-          def add_sns_tags(span, params)
-            topic_arn = params[:topic_arn]
-            topic_name = params[:name]
-            if topic_arn
-              # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
-              topic_name = topic_arn.split(':')[-1]
-              aws_account = topic_arn.split(':')[-2]
-              span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
-            end
-            span.set_tag(Ext::TAG_TOPIC_NAME, topic_name)
-          end
-
-          def add_dynamodb_tags(span, params)
-            table_name = params[:table_name]
-            span.set_tag(Ext::TAG_TABLE_NAME, table_name)
-          end
-
-          def add_kinesis_tags(span, params)
-            stream_arn = params[:stream_arn]
-            stream_name = params[:stream_name]
-            if stream_arn
-              # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
-              stream_name = stream_arn.split('/')[-1]
-              aws_account = stream_arn.split(':')[-2]
-              span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
-            end
-            span.set_tag(Ext::TAG_STREAM_NAME, stream_name)
-          end
-
-          def add_eventbridge_tags(span, params)
-            rule_name = params[:name] || params[:rule]
-            span.set_tag(Ext::TAG_RULE_NAME, rule_name)
-          end
-
-          def add_states_tags(span, params)
-            state_machine_name = params[:name]
-            state_machine_arn = params[:state_machine_arn]
-            execution_arn = params[:execution_arn]
-
-            if execution_arn
-              # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
-              state_machine_name = execution_arn.split(':')[-2]
-            end
-
-            if state_machine_arn
-              # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
-              state_machine_name = state_machine_arn.split(':')[-1]
-              state_machine_account_id = state_machine_arn.split(':')[-3]
-            end
-            span.set_tag(Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
-            # state_machine_name = create_state_machine_name || start_execution_state_machine_name
-            span.set_tag(Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
-          end
-
-          def add_s3_tags(span, params)
-            bucket_name = params[:bucket]
-            span.set_tag(Ext::TAG_BUCKET_NAME, bucket_name)
-          end
-
           def configuration
             Datadog.configuration.tracing[:aws]
           end
diff --git a/lib/datadog/tracing/contrib/aws/services/dynamodb.rb b/lib/datadog/tracing/contrib/aws/services/dynamodb.rb
new file mode 100644
index 00000000000..ac554176fea
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/dynamodb.rb
@@ -0,0 +1,4 @@
+def add_dynamodb_tags(span, params)
+    table_name = params[:table_name]
+    span.set_tag(Ext::TAG_TABLE_NAME, table_name)
+end
\ No newline at end of file
diff --git a/lib/datadog/tracing/contrib/aws/services/eventbridge.rb b/lib/datadog/tracing/contrib/aws/services/eventbridge.rb
new file mode 100644
index 00000000000..a70430594fc
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/eventbridge.rb
@@ -0,0 +1,4 @@
+def add_eventbridge_tags(span, params)
+    rule_name = params[:name] || params[:rule]
+    span.set_tag(Ext::TAG_RULE_NAME, rule_name)
+end
\ No newline at end of file
diff --git a/lib/datadog/tracing/contrib/aws/services/kinesis.rb b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
new file mode 100644
index 00000000000..0517a3edd75
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
@@ -0,0 +1,12 @@
+def add_kinesis_tags(span, params)
+    stream_arn = params[:stream_arn]
+    stream_name = params[:stream_name]
+    if stream_arn
+      # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
+      parts = stream_arn.split(':')
+      stream_name = parts[-1]
+      aws_account = parts[-2]
+      span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
+    end
+    span.set_tag(Ext::TAG_STREAM_NAME, stream_name)
+end
\ No newline at end of file
diff --git a/lib/datadog/tracing/contrib/aws/services/s3.rb b/lib/datadog/tracing/contrib/aws/services/s3.rb
new file mode 100644
index 00000000000..e9df6ebea75
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/s3.rb
@@ -0,0 +1,4 @@
+def add_s3_tags(span, params)
+    bucket_name = params[:bucket]
+    span.set_tag(Ext::TAG_BUCKET_NAME, bucket_name)
+end
\ No newline at end of file
diff --git a/lib/datadog/tracing/contrib/aws/services/sns.rb b/lib/datadog/tracing/contrib/aws/services/sns.rb
new file mode 100644
index 00000000000..1870e4c47b3
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/sns.rb
@@ -0,0 +1,12 @@
+def add_sns_tags(span, params)
+    topic_arn = params[:topic_arn]
+    topic_name = params[:name]
+    if topic_arn
+      # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
+      parts = topic_arn.split(':')
+      topic_name = parts[-1]
+      aws_account = parts[-2]
+      span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
+    end
+    span.set_tag(Ext::TAG_TOPIC_NAME, topic_name)
+  end
\ No newline at end of file
diff --git a/lib/datadog/tracing/contrib/aws/services/sqs.rb b/lib/datadog/tracing/contrib/aws/services/sqs.rb
new file mode 100644
index 00000000000..b891e0f052d
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/sqs.rb
@@ -0,0 +1,11 @@
+def add_sqs_tags(span, params)
+    queue_url = params[:queue_url]
+    queue_name = params[:queue_name]
+    if queue_url
+    _, _, _, aws_account, queue_name = queue_url.split('/')
+    aws_account = parts[-2]
+    queue_name = parts[-1]
+    span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
+    end
+    span.set_tag(Ext::TAG_QUEUE_NAME, queue_name)
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
new file mode 100644
index 00000000000..3c71fa0b51c
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
@@ -0,0 +1,20 @@
+def add_states_tags(span, params)
+    state_machine_name = params[:name]
+    state_machine_arn = params[:state_machine_arn]
+    execution_arn = params[:execution_arn]
+
+    if execution_arn
+      # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
+      state_machine_name = execution_arn.split(':')[-2]
+    end
+
+    if state_machine_arn
+      # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
+      parts = state_machine_arn.split(':')
+      state_machine_name = parts[-1]
+      state_machine_account_id = parts[-3]
+    end
+    span.set_tag(Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
+    # state_machine_name = create_state_machine_name || start_execution_state_machine_name
+    span.set_tag(Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
+end
\ No newline at end of file

From 0f36b44672011f891c2f0d2e9e829f39957106c8 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 25 Apr 2023 22:13:50 -0700
Subject: [PATCH 31/44] refactor to seperate files and add more tests

---
 .../tracing/contrib/aws/instrumentation.rb    | 27 +-------
 .../tracing/contrib/aws/services/dynamodb.rb  | 10 ++-
 .../contrib/aws/services/eventbridge.rb       | 10 ++-
 .../tracing/contrib/aws/services/helpers.rb   | 28 ++++++++
 .../tracing/contrib/aws/services/kinesis.rb   | 26 ++++---
 .../tracing/contrib/aws/services/s3.rb        | 10 ++-
 .../tracing/contrib/aws/services/sns.rb       | 26 ++++---
 .../tracing/contrib/aws/services/sqs.rb       | 18 ++---
 .../contrib/aws/services/stepfunctions.rb     | 41 ++++++-----
 .../contrib/aws/instrumentation_spec.rb       | 26 -------
 .../contrib/aws/services/dynamobdb_spec.rb    | 30 ++++++++
 .../contrib/aws/services/eventbrige_spec.rb   | 40 +++++++++++
 .../contrib/aws/services/kinesis_spec.rb      | 40 +++++++++++
 .../tracing/contrib/aws/services/s3_spec.rb   | 29 ++++++++
 .../tracing/contrib/aws/services/sns_spec.rb  | 40 +++++++++++
 .../tracing/contrib/aws/services/sqs_spec.rb  | 34 +++++++++
 .../aws/services/stepfunctions_spec.rb        | 69 +++++++++++++++++++
 17 files changed, 396 insertions(+), 108 deletions(-)
 create mode 100644 lib/datadog/tracing/contrib/aws/services/helpers.rb
 create mode 100644 spec/datadog/tracing/contrib/aws/services/dynamobdb_spec.rb
 create mode 100644 spec/datadog/tracing/contrib/aws/services/eventbrige_spec.rb
 create mode 100644 spec/datadog/tracing/contrib/aws/services/kinesis_spec.rb
 create mode 100644 spec/datadog/tracing/contrib/aws/services/s3_spec.rb
 create mode 100644 spec/datadog/tracing/contrib/aws/services/sns_spec.rb
 create mode 100644 spec/datadog/tracing/contrib/aws/services/sqs_spec.rb
 create mode 100644 spec/datadog/tracing/contrib/aws/services/stepfunctions_spec.rb

diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index 7ec3f8a8196..404cf26a71d 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -4,13 +4,7 @@
 require_relative '../analytics'
 require_relative 'ext'
 require_relative '../span_attribute_schema'
-require_relative 'services/sqs'
-require_relative 'services/sns'
-require_relative 'services/dynamodb'
-require_relative 'services/kinesis'
-require_relative 'services/eventbridge'
-require_relative 'services/states'
-require_relative 'services/s3'
+require_relative 'services/helpers'
 
 module Datadog
   module Tracing
@@ -71,25 +65,6 @@ def annotate!(span, context)
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, context.safely(:status_code))
           end
 
-          def add_service_specific_tags(span, aws_service, params)
-            case aws_service
-            when 'sqs'
-              add_sqs_tags(span, params)
-            when 'sns'
-              add_sns_tags(span, params)
-            when 'dynamodb'
-              add_dynamodb_tags(span, params)
-            when 'kinesis'
-              add_kinesis_tags(span, params)
-            when 'eventbridge'
-              add_eventbridge_tags(span, params)
-            when 'states'
-              add_states_tags(span, params)
-            when 's3'
-              add_s3_tags(span, params)
-            end
-          end
-
           def configuration
             Datadog.configuration.tracing[:aws]
           end
diff --git a/lib/datadog/tracing/contrib/aws/services/dynamodb.rb b/lib/datadog/tracing/contrib/aws/services/dynamodb.rb
index ac554176fea..b53dfe902fd 100644
--- a/lib/datadog/tracing/contrib/aws/services/dynamodb.rb
+++ b/lib/datadog/tracing/contrib/aws/services/dynamodb.rb
@@ -1,4 +1,8 @@
+# frozen_string_literal: true
+
+require_relative '../ext'
+
 def add_dynamodb_tags(span, params)
-    table_name = params[:table_name]
-    span.set_tag(Ext::TAG_TABLE_NAME, table_name)
-end
\ No newline at end of file
+  table_name = params[:table_name]
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_TABLE_NAME, table_name)
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/eventbridge.rb b/lib/datadog/tracing/contrib/aws/services/eventbridge.rb
index a70430594fc..d179a09e8f3 100644
--- a/lib/datadog/tracing/contrib/aws/services/eventbridge.rb
+++ b/lib/datadog/tracing/contrib/aws/services/eventbridge.rb
@@ -1,4 +1,8 @@
+# frozen_string_literal: true
+
+require_relative '../ext'
+
 def add_eventbridge_tags(span, params)
-    rule_name = params[:name] || params[:rule]
-    span.set_tag(Ext::TAG_RULE_NAME, rule_name)
-end
\ No newline at end of file
+  rule_name = params[:name] || params[:rule]
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, rule_name)
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/helpers.rb b/lib/datadog/tracing/contrib/aws/services/helpers.rb
new file mode 100644
index 00000000000..fa21a17282b
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/services/helpers.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require_relative 'sqs'
+require_relative 'sns'
+require_relative 'dynamodb'
+require_relative 'kinesis'
+require_relative 'eventbridge'
+require_relative 'stepfunctions'
+require_relative 's3'
+
+def add_service_specific_tags(span, aws_service, params)
+  case aws_service
+  when 'sqs'
+    add_sqs_tags(span, params)
+  when 'sns'
+    add_sns_tags(span, params)
+  when 'dynamodb'
+    add_dynamodb_tags(span, params)
+  when 'kinesis'
+    add_kinesis_tags(span, params)
+  when 'eventbridge'
+    add_eventbridge_tags(span, params)
+  when 'states'
+    add_states_tags(span, params)
+  when 's3'
+    add_s3_tags(span, params)
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/kinesis.rb b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
index 0517a3edd75..d16926bce81 100644
--- a/lib/datadog/tracing/contrib/aws/services/kinesis.rb
+++ b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
@@ -1,12 +1,16 @@
+# frozen_string_literal: true
+
+require_relative '../ext'
+
 def add_kinesis_tags(span, params)
-    stream_arn = params[:stream_arn]
-    stream_name = params[:stream_name]
-    if stream_arn
-      # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
-      parts = stream_arn.split(':')
-      stream_name = parts[-1]
-      aws_account = parts[-2]
-      span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
-    end
-    span.set_tag(Ext::TAG_STREAM_NAME, stream_name)
-end
\ No newline at end of file
+  stream_arn = params[:stream_arn]
+  stream_name = params[:stream_name]
+  if stream_arn
+    # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
+    parts = stream_arn.split(':')
+    stream_name = parts[-1].split('/')[-1]
+    aws_account = parts[-2]
+    span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
+  end
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, stream_name)
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/s3.rb b/lib/datadog/tracing/contrib/aws/services/s3.rb
index e9df6ebea75..981fa2d3970 100644
--- a/lib/datadog/tracing/contrib/aws/services/s3.rb
+++ b/lib/datadog/tracing/contrib/aws/services/s3.rb
@@ -1,4 +1,8 @@
+# frozen_string_literal: true
+
+require_relative '../ext'
+
 def add_s3_tags(span, params)
-    bucket_name = params[:bucket]
-    span.set_tag(Ext::TAG_BUCKET_NAME, bucket_name)
-end
\ No newline at end of file
+  bucket_name = params[:bucket]
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_BUCKET_NAME, bucket_name)
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/sns.rb b/lib/datadog/tracing/contrib/aws/services/sns.rb
index 1870e4c47b3..aa6378bffd3 100644
--- a/lib/datadog/tracing/contrib/aws/services/sns.rb
+++ b/lib/datadog/tracing/contrib/aws/services/sns.rb
@@ -1,12 +1,16 @@
+# frozen_string_literal: true
+
+require_relative '../ext'
+
 def add_sns_tags(span, params)
-    topic_arn = params[:topic_arn]
-    topic_name = params[:name]
-    if topic_arn
-      # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
-      parts = topic_arn.split(':')
-      topic_name = parts[-1]
-      aws_account = parts[-2]
-      span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
-    end
-    span.set_tag(Ext::TAG_TOPIC_NAME, topic_name)
-  end
\ No newline at end of file
+  topic_arn = params[:topic_arn]
+  topic_name = params[:name]
+  if topic_arn
+    # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
+    parts = topic_arn.split(':')
+    topic_name = parts[-1]
+    aws_account = parts[-2]
+    span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
+  end
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, topic_name)
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/sqs.rb b/lib/datadog/tracing/contrib/aws/services/sqs.rb
index b891e0f052d..bd2a6b85a96 100644
--- a/lib/datadog/tracing/contrib/aws/services/sqs.rb
+++ b/lib/datadog/tracing/contrib/aws/services/sqs.rb
@@ -1,11 +1,13 @@
+# frozen_string_literal: true
+
+require_relative '../ext'
+
 def add_sqs_tags(span, params)
-    queue_url = params[:queue_url]
-    queue_name = params[:queue_name]
-    if queue_url
+  queue_url = params[:queue_url]
+  queue_name = params[:queue_name]
+  if queue_url
     _, _, _, aws_account, queue_name = queue_url.split('/')
-    aws_account = parts[-2]
-    queue_name = parts[-1]
-    span.set_tag(Ext::TAG_AWS_ACCOUNT, aws_account)
-    end
-    span.set_tag(Ext::TAG_QUEUE_NAME, queue_name)
+    span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
+  end
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_QUEUE_NAME, queue_name)
 end
diff --git a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
index 3c71fa0b51c..1063d86527b 100644
--- a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
+++ b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
@@ -1,20 +1,27 @@
+# frozen_string_literal: true
+
+require_relative '../ext'
+
 def add_states_tags(span, params)
-    state_machine_name = params[:name]
-    state_machine_arn = params[:state_machine_arn]
-    execution_arn = params[:execution_arn]
+  state_machine_name = params[:name]
+  state_machine_arn = params[:state_machine_arn]
+  execution_arn = params[:execution_arn]
+  state_machine_account_id = ''
+
+  if execution_arn
+    # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
+    parts = execution_arn.split(':')
+    state_machine_name = parts[-2]
+    state_machine_account_id = parts[4]
 
-    if execution_arn
-      # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
-      state_machine_name = execution_arn.split(':')[-2]
-    end
+  end
 
-    if state_machine_arn
-      # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
-      parts = state_machine_arn.split(':')
-      state_machine_name = parts[-1]
-      state_machine_account_id = parts[-3]
-    end
-    span.set_tag(Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
-    # state_machine_name = create_state_machine_name || start_execution_state_machine_name
-    span.set_tag(Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
-end
\ No newline at end of file
+  if state_machine_arn
+    # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
+    parts = state_machine_arn.split(':')
+    state_machine_name ||= parts[-1]
+    state_machine_account_id = parts[-3]
+  end
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
+  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
+end
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index e185f8d1bbb..28295d2b65f 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -239,32 +239,6 @@
       end
     end
 
-    describe '#send_message_invalid_queue_url' do
-      subject!(:send_message) do
-        client.send_message(
-          {
-            queue_url: 'https://sqs.us-stubbed-1/MyQueueName',
-            message_body: 'Hello, world!'
-          }
-        )
-      end
-
-      let(:responses) do
-        { send_message: {
-          md5_of_message_body: 'msg body',
-          md5_of_message_attributes: 'msg attributes',
-          md5_of_message_system_attributes: 'message system attributes',
-          message_id: '123',
-          sequence_number: '456'
-        } }
-      end
-
-      it 'generates a span' do
-        expect(span.get_tag('aws_account')).to eq(nil)
-        expect(span.get_tag('queuename')).to eq('')
-      end
-    end
-
     describe '#send_message_batch' do
       subject!(:send_message_batch) do
         client.send_message_batch(
diff --git a/spec/datadog/tracing/contrib/aws/services/dynamobdb_spec.rb b/spec/datadog/tracing/contrib/aws/services/dynamobdb_spec.rb
new file mode 100644
index 00000000000..34ae57e75c8
--- /dev/null
+++ b/spec/datadog/tracing/contrib/aws/services/dynamobdb_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'lib/datadog/tracing/contrib/aws/services/dynamodb'
+
+RSpec.describe 'add_dynamodb_tags' do
+  let(:span) { instance_double('Span') }
+  let(:params) { {} }
+
+  before do
+    allow(span).to receive(:set_tag)
+  end
+
+  context 'with table_name provided' do
+    let(:table_name) { 'example-table' }
+    let(:params) { { table_name: table_name } }
+
+    it 'sets the table_name tag' do
+      add_dynamodb_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TABLE_NAME, table_name)
+    end
+  end
+
+  context 'with no table_name provided' do
+    it 'does not set the table_name tag' do
+      add_dynamodb_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TABLE_NAME, nil)
+    end
+  end
+end
diff --git a/spec/datadog/tracing/contrib/aws/services/eventbrige_spec.rb b/spec/datadog/tracing/contrib/aws/services/eventbrige_spec.rb
new file mode 100644
index 00000000000..c533c6e7d72
--- /dev/null
+++ b/spec/datadog/tracing/contrib/aws/services/eventbrige_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'lib/datadog/tracing/contrib/aws/services/eventbridge'
+
+RSpec.describe 'add_eventbridge_tags' do
+  let(:span) { instance_double('Span') }
+  let(:params) { {} }
+
+  before do
+    allow(span).to receive(:set_tag)
+  end
+
+  context 'with rule_name provided in params[:name]' do
+    let(:rule_name) { 'example-rule-name' }
+    let(:params) { { name: rule_name } }
+
+    it 'sets the rule_name based on the params[:name]' do
+      add_eventbridge_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, rule_name)
+    end
+  end
+
+  context 'with rule_name provided in params[:rule]' do
+    let(:rule_name) { 'example-rule-name' }
+    let(:params) { { rule: rule_name } }
+
+    it 'sets the rule_name based on the params[:rule]' do
+      add_eventbridge_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, rule_name)
+    end
+  end
+
+  context 'without rule_name provided' do
+    it 'does not set the rule_name tag' do
+      add_eventbridge_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, nil)
+    end
+  end
+end
diff --git a/spec/datadog/tracing/contrib/aws/services/kinesis_spec.rb b/spec/datadog/tracing/contrib/aws/services/kinesis_spec.rb
new file mode 100644
index 00000000000..2db478caf37
--- /dev/null
+++ b/spec/datadog/tracing/contrib/aws/services/kinesis_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'lib/datadog/tracing/contrib/aws/services/kinesis'
+
+RSpec.describe 'add_kinesis_tags' do
+  let(:span) { instance_double('Span') }
+  let(:params) { {} }
+
+  before do
+    allow(span).to receive(:set_tag)
+  end
+
+  context 'with stream_arn provided' do
+    let(:stream_arn) { 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream' }
+    let(:params) { { stream_arn: stream_arn } }
+
+    it 'sets the stream_name and aws_account based on the stream_arn' do
+      add_kinesis_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, 'my-stream')
+    end
+  end
+
+  context 'with stream_name provided' do
+    let(:params) { { stream_name: 'my-stream' } }
+
+    it 'sets the stream_name based on the provided stream_name' do
+      add_kinesis_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, 'my-stream')
+    end
+  end
+
+  context 'with neither stream_arn nor stream_name provided' do
+    it 'sets the stream_name to nil' do
+      add_kinesis_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, nil)
+    end
+  end
+end
diff --git a/spec/datadog/tracing/contrib/aws/services/s3_spec.rb b/spec/datadog/tracing/contrib/aws/services/s3_spec.rb
new file mode 100644
index 00000000000..614c9e76315
--- /dev/null
+++ b/spec/datadog/tracing/contrib/aws/services/s3_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'lib/datadog/tracing/contrib/aws/services/s3'
+
+RSpec.describe 'add_s3_tags' do
+  let(:span) { instance_double('Span') }
+  let(:params) { {} }
+
+  before do
+    allow(span).to receive(:set_tag)
+  end
+
+  context 'with bucket name provided' do
+    let(:params) { { bucket: 'my-bucket-name' } }
+
+    it 'sets the bucket_name based on the provided bucket name' do
+      add_s3_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_BUCKET_NAME, 'my-bucket-name')
+    end
+  end
+
+  context 'with no bucket name provided' do
+    it 'sets the bucket_name to nil' do
+      add_s3_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_BUCKET_NAME, nil)
+    end
+  end
+end
diff --git a/spec/datadog/tracing/contrib/aws/services/sns_spec.rb b/spec/datadog/tracing/contrib/aws/services/sns_spec.rb
new file mode 100644
index 00000000000..87c0d3c035b
--- /dev/null
+++ b/spec/datadog/tracing/contrib/aws/services/sns_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'lib/datadog/tracing/contrib/aws/services/sns'
+
+RSpec.describe 'add_sns_tags' do
+  let(:span) { instance_double('Span') }
+  let(:params) { {} }
+
+  before do
+    allow(span).to receive(:set_tag)
+  end
+
+  context 'with topic_arn provided' do
+    let(:topic_arn) { 'arn:aws:sns:us-west-2:123456789012:my-topic-name' }
+    let(:params) { { topic_arn: topic_arn } }
+
+    it 'sets the topic_name and aws_account based on the topic_arn' do
+      add_sns_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, 'my-topic-name')
+    end
+  end
+
+  context 'with name provided' do
+    let(:params) { { name: 'my-topic-name' } }
+
+    it 'sets the topic_name based on the provided name' do
+      add_sns_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, 'my-topic-name')
+    end
+  end
+
+  context 'with neither topic_arn nor name provided' do
+    it 'sets the topic_name to nil' do
+      add_sns_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, nil)
+    end
+  end
+end
diff --git a/spec/datadog/tracing/contrib/aws/services/sqs_spec.rb b/spec/datadog/tracing/contrib/aws/services/sqs_spec.rb
new file mode 100644
index 00000000000..dec10cf5460
--- /dev/null
+++ b/spec/datadog/tracing/contrib/aws/services/sqs_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'lib/datadog/tracing/contrib/aws/services/sqs'
+require 'spec_helper'
+
+RSpec.describe 'add_sqs_tags' do
+  let(:span) { instance_double('Span') }
+  let(:params) { {} }
+
+  before do
+    allow(span).to receive(:set_tag)
+  end
+
+  context 'when queue_url is present' do
+    let(:queue_url) { 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueueName' }
+    let(:params) { { queue_url: queue_url } }
+
+    it 'sets AWS account and queue name tags' do
+      add_sqs_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_QUEUE_NAME, 'MyQueueName')
+    end
+  end
+
+  context 'when queue_name is present' do
+    let(:queue_name) { 'AnotherQueueName' }
+    let(:params) { { queue_name: queue_name } }
+
+    it 'sets queue name tag' do
+      add_sqs_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_QUEUE_NAME, 'AnotherQueueName')
+    end
+  end
+end
diff --git a/spec/datadog/tracing/contrib/aws/services/stepfunctions_spec.rb b/spec/datadog/tracing/contrib/aws/services/stepfunctions_spec.rb
new file mode 100644
index 00000000000..97c39a4f831
--- /dev/null
+++ b/spec/datadog/tracing/contrib/aws/services/stepfunctions_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'rspec'
+require 'lib/datadog/tracing/contrib/aws/services/stepfunctions'
+
+RSpec.describe 'add_states_tags' do
+  let(:span) { instance_double('Span') }
+  let(:params) { {} }
+
+  before do
+    allow(span).to receive(:set_tag)
+  end
+
+  context 'with execution_arn provided' do
+    let(:execution_arn) { 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution' }
+    let(:params) { { execution_arn: execution_arn } }
+
+    it 'sets the state_machine_name based on the execution_arn' do
+      add_states_tags(span, params)
+      expect(span).to have_received(:set_tag).with(
+        Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,
+        'example-state-machine'
+      )
+    end
+  end
+
+  context 'with state_machine_arn provided' do
+    let(:state_machine_arn) { 'arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine' }
+    let(:params) { { state_machine_arn: state_machine_arn } }
+
+    it 'sets the state_machine_name based on the state_machine_arn' do
+      add_states_tags(span, params)
+      expect(span).to have_received(:set_tag).with(
+        Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,
+        'MyStateMachine'
+      )
+    end
+
+    it 'sets the state_machine_account_id based on the state_machine_arn' do
+      add_states_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
+    end
+  end
+
+  context 'with both execution_arn and state_machine_arn provided' do
+    let(:execution_arn) { 'arn:aws:states:us-east-1:987654321098:execution:example-state-machine:example-execution' }
+    let(:state_machine_arn) { 'arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine' }
+
+    it 'sets the state_machine_name and state_machine_account_id based on the state_machine_arn' do
+      params = { state_machine_arn: state_machine_arn }
+      add_states_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
+      expect(span).to have_received(:set_tag).with(
+        Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,
+        'MyStateMachine'
+      )
+    end
+
+    it 'sets the state_machine_name and state_machine_account_id based on the execution_arn' do
+      params = { execution_arn: execution_arn }
+      add_states_tags(span, params)
+      expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '987654321098')
+      expect(span).to have_received(:set_tag).with(
+        Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,
+        'example-state-machine'
+      )
+    end
+  end
+end

From 89ce6c46356db2d9307650ae2fcac875f1fbb766 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 25 Apr 2023 23:21:15 -0700
Subject: [PATCH 32/44] use arnparser instead of manually parsing

---
 .../tracing/contrib/aws/services/kinesis.rb     | 10 ++++++----
 lib/datadog/tracing/contrib/aws/services/sns.rb | 10 ++++++----
 .../contrib/aws/services/stepfunctions.rb       | 17 ++++++++---------
 3 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/services/kinesis.rb b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
index d16926bce81..0f6d25f78f0 100644
--- a/lib/datadog/tracing/contrib/aws/services/kinesis.rb
+++ b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
@@ -1,16 +1,18 @@
 # frozen_string_literal: true
 
 require_relative '../ext'
+require 'aws-sdk'
 
 def add_kinesis_tags(span, params)
   stream_arn = params[:stream_arn]
   stream_name = params[:stream_name]
+
   if stream_arn
-    # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
-    parts = stream_arn.split(':')
-    stream_name = parts[-1].split('/')[-1]
-    aws_account = parts[-2]
+    arn = Aws::ARNParser.parse(stream_arn)
+    stream_name = arn.resource.split('/').last
+    aws_account = arn.account_id
     span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
   end
+
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, stream_name)
 end
diff --git a/lib/datadog/tracing/contrib/aws/services/sns.rb b/lib/datadog/tracing/contrib/aws/services/sns.rb
index aa6378bffd3..de22d192813 100644
--- a/lib/datadog/tracing/contrib/aws/services/sns.rb
+++ b/lib/datadog/tracing/contrib/aws/services/sns.rb
@@ -1,16 +1,18 @@
 # frozen_string_literal: true
 
 require_relative '../ext'
+require 'aws-sdk'
 
 def add_sns_tags(span, params)
   topic_arn = params[:topic_arn]
   topic_name = params[:name]
+
   if topic_arn
-    # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
-    parts = topic_arn.split(':')
-    topic_name = parts[-1]
-    aws_account = parts[-2]
+    arn = Aws::ARNParser.parse(topic_arn)
+    topic_name = arn.resource.split(':').last
+    aws_account = arn.account_id
     span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
   end
+
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, topic_name)
 end
diff --git a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
index 1063d86527b..ae1bb6f365d 100644
--- a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
+++ b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
 require_relative '../ext'
+require 'aws-sdk'
 
 def add_states_tags(span, params)
   state_machine_name = params[:name]
@@ -9,19 +10,17 @@ def add_states_tags(span, params)
   state_machine_account_id = ''
 
   if execution_arn
-    # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
-    parts = execution_arn.split(':')
-    state_machine_name = parts[-2]
-    state_machine_account_id = parts[4]
-
+    arn = Aws::ARNParser.parse(execution_arn)
+    state_machine_name = arn.resource.split(':')[-2]
+    state_machine_account_id = arn.account_id
   end
 
   if state_machine_arn
-    # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
-    parts = state_machine_arn.split(':')
-    state_machine_name ||= parts[-1]
-    state_machine_account_id = parts[-3]
+    arn = Aws::ARNParser.parse(state_machine_arn)
+    state_machine_name ||= arn.resource.split(':').last
+    state_machine_account_id = arn.account_id
   end
+
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
 end

From c653881ec7ff2211d0f561bbeec3fa542e7d6222 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Fri, 28 Apr 2023 10:35:10 -0700
Subject: [PATCH 33/44] revert back to not using arn parser as it makes things
 more complicated and slower

---
 .../tracing/contrib/aws/services/kinesis.rb     | 12 +++++-------
 lib/datadog/tracing/contrib/aws/services/sns.rb | 12 +++++-------
 .../contrib/aws/services/stepfunctions.rb       | 17 +++++++++--------
 3 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/services/kinesis.rb b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
index 0f6d25f78f0..0e1c513e369 100644
--- a/lib/datadog/tracing/contrib/aws/services/kinesis.rb
+++ b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
@@ -1,18 +1,16 @@
 # frozen_string_literal: true
 
 require_relative '../ext'
-require 'aws-sdk'
 
 def add_kinesis_tags(span, params)
   stream_arn = params[:stream_arn]
   stream_name = params[:stream_name]
-
   if stream_arn
-    arn = Aws::ARNParser.parse(stream_arn)
-    stream_name = arn.resource.split('/').last
-    aws_account = arn.account_id
+    # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
+    parts = stream_arn.split(':')
+    stream_name = parts[-1].split('/')[-1]
+    aws_account = parts[-2]
     span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
   end
-
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, stream_name)
-end
+end
\ No newline at end of file
diff --git a/lib/datadog/tracing/contrib/aws/services/sns.rb b/lib/datadog/tracing/contrib/aws/services/sns.rb
index de22d192813..906efea79b5 100644
--- a/lib/datadog/tracing/contrib/aws/services/sns.rb
+++ b/lib/datadog/tracing/contrib/aws/services/sns.rb
@@ -1,18 +1,16 @@
 # frozen_string_literal: true
 
 require_relative '../ext'
-require 'aws-sdk'
 
 def add_sns_tags(span, params)
   topic_arn = params[:topic_arn]
   topic_name = params[:name]
-
   if topic_arn
-    arn = Aws::ARNParser.parse(topic_arn)
-    topic_name = arn.resource.split(':').last
-    aws_account = arn.account_id
+    # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
+    parts = topic_arn.split(':')
+    topic_name = parts[-1]
+    aws_account = parts[-2]
     span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
   end
-
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, topic_name)
-end
+end
\ No newline at end of file
diff --git a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
index ae1bb6f365d..1063d86527b 100644
--- a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
+++ b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
@@ -1,7 +1,6 @@
 # frozen_string_literal: true
 
 require_relative '../ext'
-require 'aws-sdk'
 
 def add_states_tags(span, params)
   state_machine_name = params[:name]
@@ -10,17 +9,19 @@ def add_states_tags(span, params)
   state_machine_account_id = ''
 
   if execution_arn
-    arn = Aws::ARNParser.parse(execution_arn)
-    state_machine_name = arn.resource.split(':')[-2]
-    state_machine_account_id = arn.account_id
+    # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
+    parts = execution_arn.split(':')
+    state_machine_name = parts[-2]
+    state_machine_account_id = parts[4]
+
   end
 
   if state_machine_arn
-    arn = Aws::ARNParser.parse(state_machine_arn)
-    state_machine_name ||= arn.resource.split(':').last
-    state_machine_account_id = arn.account_id
+    # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
+    parts = state_machine_arn.split(':')
+    state_machine_name ||= parts[-1]
+    state_machine_account_id = parts[-3]
   end
-
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
 end

From d0028a800ab6369b55992bc19fe2ca5f9ba19398 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Fri, 28 Apr 2023 10:42:50 -0700
Subject: [PATCH 34/44] only be additive, do not remove old tags

---
 lib/datadog/tracing/contrib/aws/ext.rb                   | 1 +
 lib/datadog/tracing/contrib/aws/instrumentation.rb       | 1 +
 spec/datadog/tracing/contrib/aws/instrumentation_spec.rb | 2 ++
 3 files changed, 4 insertions(+)

diff --git a/lib/datadog/tracing/contrib/aws/ext.rb b/lib/datadog/tracing/contrib/aws/ext.rb
index 5a6fcc6bab0..fef44a4cd76 100644
--- a/lib/datadog/tracing/contrib/aws/ext.rb
+++ b/lib/datadog/tracing/contrib/aws/ext.rb
@@ -18,6 +18,7 @@ module Ext
           TAG_OPERATION = 'aws.operation'.freeze
           TAG_OPERATION_COMMAND = 'command'.freeze
           TAG_PATH = 'path'.freeze
+          TAG_AWS_REGION = 'region'.freeze
           TAG_REGION = 'region'.freeze
           TAG_AWS_SERVICE = 'aws_service'.freeze
           TAG_AWS_ACCOUNT = 'aws_account'.freeze
diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index 404cf26a71d..cc80db28751 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -59,6 +59,7 @@ def annotate!(span, context)
             span.set_tag(Ext::TAG_AGENT, Ext::TAG_DEFAULT_AGENT)
             span.set_tag(Ext::TAG_OPERATION, context.safely(:operation))
             span.set_tag(Ext::TAG_REGION, context.safely(:region))
+            span.set_tag(Ext::TAG_AWS_REGION, context.safely(:region))
             span.set_tag(Ext::TAG_PATH, context.safely(:path))
             span.set_tag(Ext::TAG_HOST, context.safely(:host))
             span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, context.safely(:http_method))
diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 28295d2b65f..e3e0197dfe7 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -54,6 +54,7 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('get_access_key_info')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('path')).to eq('')
         expect(span.get_tag('host')).to eq('sts.us-stubbed-1.amazonaws.com')
@@ -105,6 +106,7 @@
 
         expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
         expect(span.get_tag('aws.operation')).to eq('list_buckets')
+        expect(span.get_tag('aws.region')).to eq('us-stubbed-1')
         expect(span.get_tag('region')).to eq('us-stubbed-1')
         expect(span.get_tag('aws_service')).to eq('s3')
         expect(span.get_tag('path')).to eq('/')

From b30a8c6cddea2138190653d1ef74c348d875113a Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Fri, 28 Apr 2023 10:44:46 -0700
Subject: [PATCH 35/44] rubocop

---
 lib/datadog/tracing/contrib/aws/services/kinesis.rb | 2 +-
 lib/datadog/tracing/contrib/aws/services/sns.rb     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/datadog/tracing/contrib/aws/services/kinesis.rb b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
index 0e1c513e369..d16926bce81 100644
--- a/lib/datadog/tracing/contrib/aws/services/kinesis.rb
+++ b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
@@ -13,4 +13,4 @@ def add_kinesis_tags(span, params)
     span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
   end
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, stream_name)
-end
\ No newline at end of file
+end
diff --git a/lib/datadog/tracing/contrib/aws/services/sns.rb b/lib/datadog/tracing/contrib/aws/services/sns.rb
index 906efea79b5..aa6378bffd3 100644
--- a/lib/datadog/tracing/contrib/aws/services/sns.rb
+++ b/lib/datadog/tracing/contrib/aws/services/sns.rb
@@ -13,4 +13,4 @@ def add_sns_tags(span, params)
     span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
   end
   span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, topic_name)
-end
\ No newline at end of file
+end

From c878ee9368d446acb7ae5f3012beb36612d6ab99 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Fri, 28 Apr 2023 11:32:00 -0700
Subject: [PATCH 36/44] fix aws.region tests

---
 lib/datadog/tracing/contrib/aws/ext.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/datadog/tracing/contrib/aws/ext.rb b/lib/datadog/tracing/contrib/aws/ext.rb
index fef44a4cd76..2827596088c 100644
--- a/lib/datadog/tracing/contrib/aws/ext.rb
+++ b/lib/datadog/tracing/contrib/aws/ext.rb
@@ -18,7 +18,7 @@ module Ext
           TAG_OPERATION = 'aws.operation'.freeze
           TAG_OPERATION_COMMAND = 'command'.freeze
           TAG_PATH = 'path'.freeze
-          TAG_AWS_REGION = 'region'.freeze
+          TAG_AWS_REGION = 'aws.region'.freeze
           TAG_REGION = 'region'.freeze
           TAG_AWS_SERVICE = 'aws_service'.freeze
           TAG_AWS_ACCOUNT = 'aws_account'.freeze

From 0c289273557256825bb089f67122ba503ce87cee Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Mon, 1 May 2023 17:04:38 -0700
Subject: [PATCH 37/44] address comments by using modules and classes, fix the
 tests, rename services to service directory

---
 .../tracing/contrib/aws/instrumentation.rb    |  5 ++-
 .../tracing/contrib/aws/service/base.rb       | 16 ++++++++
 .../tracing/contrib/aws/service/dynamodb.rb   | 19 ++++++++++
 .../contrib/aws/service/eventbridge.rb        | 19 ++++++++++
 .../tracing/contrib/aws/service/kinesis.rb    | 29 +++++++++++++++
 lib/datadog/tracing/contrib/aws/service/s3.rb | 19 ++++++++++
 .../tracing/contrib/aws/service/sns.rb        | 27 ++++++++++++++
 .../tracing/contrib/aws/service/sqs.rb        | 24 ++++++++++++
 .../contrib/aws/service/stepfunctions.rb      | 37 +++++++++++++++++++
 lib/datadog/tracing/contrib/aws/services.rb   | 10 +++++
 .../tracing/contrib/aws/services/dynamodb.rb  |  8 ----
 .../contrib/aws/services/eventbridge.rb       |  8 ----
 .../tracing/contrib/aws/services/helpers.rb   | 28 --------------
 .../tracing/contrib/aws/services/kinesis.rb   | 16 --------
 .../tracing/contrib/aws/services/s3.rb        |  8 ----
 .../tracing/contrib/aws/services/sns.rb       | 16 --------
 .../tracing/contrib/aws/services/sqs.rb       | 13 -------
 .../contrib/aws/services/stepfunctions.rb     | 27 --------------
 .../{services => service}/dynamobdb_spec.rb   | 10 +++--
 .../{services => service}/eventbrige_spec.rb  | 12 +++---
 .../aws/{services => service}/kinesis_spec.rb | 12 +++---
 .../aws/{services => service}/s3_spec.rb      | 10 +++--
 .../aws/{services => service}/sns_spec.rb     | 12 +++---
 .../aws/{services => service}/sqs_spec.rb     | 11 ++++--
 .../stepfunctions_spec.rb                     | 16 ++++----
 25 files changed, 252 insertions(+), 160 deletions(-)
 create mode 100644 lib/datadog/tracing/contrib/aws/service/base.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/service/dynamodb.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/service/eventbridge.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/service/kinesis.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/service/s3.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/service/sns.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/service/sqs.rb
 create mode 100644 lib/datadog/tracing/contrib/aws/service/stepfunctions.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/dynamodb.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/eventbridge.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/helpers.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/kinesis.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/s3.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/sns.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/sqs.rb
 delete mode 100644 lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
 rename spec/datadog/tracing/contrib/aws/{services => service}/dynamobdb_spec.rb (69%)
 rename spec/datadog/tracing/contrib/aws/{services => service}/eventbrige_spec.rb (74%)
 rename spec/datadog/tracing/contrib/aws/{services => service}/kinesis_spec.rb (78%)
 rename spec/datadog/tracing/contrib/aws/{services => service}/s3_spec.rb (71%)
 rename spec/datadog/tracing/contrib/aws/{services => service}/sns_spec.rb (79%)
 rename spec/datadog/tracing/contrib/aws/{services => service}/sqs_spec.rb (76%)
 rename spec/datadog/tracing/contrib/aws/{services => service}/stepfunctions_spec.rb (84%)

diff --git a/lib/datadog/tracing/contrib/aws/instrumentation.rb b/lib/datadog/tracing/contrib/aws/instrumentation.rb
index cc80db28751..259f5aab875 100644
--- a/lib/datadog/tracing/contrib/aws/instrumentation.rb
+++ b/lib/datadog/tracing/contrib/aws/instrumentation.rb
@@ -4,7 +4,6 @@
 require_relative '../analytics'
 require_relative 'ext'
 require_relative '../span_attribute_schema'
-require_relative 'services/helpers'
 
 module Datadog
   module Tracing
@@ -37,7 +36,9 @@ def annotate!(span, context)
             aws_service = span.resource.split('.')[0]
             span.set_tag(Ext::TAG_AWS_SERVICE, aws_service)
             params = context.safely(:params)
-            add_service_specific_tags(span, aws_service, params)
+            if (handler = Datadog::Tracing::Contrib::Aws::SERVICE_HANDLERS[aws_service])
+              handler.add_tags(span, params)
+            end
 
             span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
 
diff --git a/lib/datadog/tracing/contrib/aws/service/base.rb b/lib/datadog/tracing/contrib/aws/service/base.rb
new file mode 100644
index 00000000000..c6b496c1df7
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/base.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # Base class for all AWS service-specific tag handlers.
+          class Base
+            def add_tags(span, params); end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/service/dynamodb.rb b/lib/datadog/tracing/contrib/aws/service/dynamodb.rb
new file mode 100644
index 00000000000..d51210e115d
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/dynamodb.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # DynamoDB tag handlers.
+          class DynamoDB < Base
+            def add_tags(span, params)
+              table_name = params[:table_name]
+              span.set_tag(Aws::Ext::TAG_TABLE_NAME, table_name)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/service/eventbridge.rb b/lib/datadog/tracing/contrib/aws/service/eventbridge.rb
new file mode 100644
index 00000000000..484e2f1d7b9
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/eventbridge.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # EventBridge tag handlers.
+          class EventBridge < Base
+            def add_tags(span, params)
+              rule_name = params[:name] || params[:rule]
+              span.set_tag(Aws::Ext::TAG_RULE_NAME, rule_name)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/service/kinesis.rb b/lib/datadog/tracing/contrib/aws/service/kinesis.rb
new file mode 100644
index 00000000000..ef48cfb515f
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/kinesis.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # Kinesis tag handlers.
+          class Kinesis < Base
+            def add_tags(span, params)
+              stream_arn = params[:stream_arn]
+              stream_name = params[:stream_name]
+
+              if stream_arn
+                # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
+                parts = stream_arn.split(':')
+                stream_name = parts[-1].split('/')[-1]
+                aws_account = parts[-2]
+                span.set_tag(Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
+              end
+
+              span.set_tag(Aws::Ext::TAG_STREAM_NAME, stream_name)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/service/s3.rb b/lib/datadog/tracing/contrib/aws/service/s3.rb
new file mode 100644
index 00000000000..297ac00370d
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/s3.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # S3 tag handlers.
+          class S3 < Base
+            def add_tags(span, params)
+              bucket_name = params[:bucket]
+              span.set_tag(Aws::Ext::TAG_BUCKET_NAME, bucket_name)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/service/sns.rb b/lib/datadog/tracing/contrib/aws/service/sns.rb
new file mode 100644
index 00000000000..5b0f4dadf14
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/sns.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # SNS tag handlers.
+          class SNS < Base
+            def add_tags(span, params)
+              topic_arn = params[:topic_arn]
+              topic_name = params[:name]
+              if topic_arn
+                # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
+                parts = topic_arn.split(':')
+                topic_name = parts[-1]
+                aws_account = parts[-2]
+                span.set_tag(Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
+              end
+              span.set_tag(Aws::Ext::TAG_TOPIC_NAME, topic_name)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/service/sqs.rb b/lib/datadog/tracing/contrib/aws/service/sqs.rb
new file mode 100644
index 00000000000..a44abe85b95
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/sqs.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # SQS tag handlers.
+          class SQS < Base
+            def add_tags(span, params)
+              queue_url = params[:queue_url]
+              queue_name = params[:queue_name]
+              if queue_url
+                _, _, _, aws_account, queue_name = queue_url.split('/')
+                span.set_tag(Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
+              end
+              span.set_tag(Aws::Ext::TAG_QUEUE_NAME, queue_name)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/service/stepfunctions.rb b/lib/datadog/tracing/contrib/aws/service/stepfunctions.rb
new file mode 100644
index 00000000000..d4a2220efc0
--- /dev/null
+++ b/lib/datadog/tracing/contrib/aws/service/stepfunctions.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Datadog
+  module Tracing
+    module Contrib
+      module Aws
+        module Service
+          # States tag handlers.
+          class States < Base
+            def add_tags(span, params)
+              state_machine_name = params[:name]
+              state_machine_arn = params[:state_machine_arn]
+              execution_arn = params[:execution_arn]
+              state_machine_account_id = ''
+
+              if execution_arn
+                # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
+                parts = execution_arn.split(':')
+                state_machine_name = parts[-2]
+                state_machine_account_id = parts[4]
+              end
+
+              if state_machine_arn
+                # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
+                parts = state_machine_arn.split(':')
+                state_machine_name ||= parts[-1]
+                state_machine_account_id = parts[-3]
+              end
+              span.set_tag(Aws::Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
+              span.set_tag(Aws::Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/datadog/tracing/contrib/aws/services.rb b/lib/datadog/tracing/contrib/aws/services.rb
index ca55ddf3dbf..f2267988441 100644
--- a/lib/datadog/tracing/contrib/aws/services.rb
+++ b/lib/datadog/tracing/contrib/aws/services.rb
@@ -113,6 +113,16 @@ module Aws
           WorkSpaces
           XRay
         ].freeze
+
+        SERVICE_HANDLERS = {
+          'sqs' => Service::SQS.new,
+          'sns' => Service::SNS.new,
+          'dynamodb' => Service::DynamoDB.new,
+          'kinesis' => Service::Kinesis.new,
+          'eventbridge' => Service::EventBridge.new,
+          'states' => Service::States.new,
+          's3' => Service::S3.new
+        }.freeze
       end
     end
   end
diff --git a/lib/datadog/tracing/contrib/aws/services/dynamodb.rb b/lib/datadog/tracing/contrib/aws/services/dynamodb.rb
deleted file mode 100644
index b53dfe902fd..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/dynamodb.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../ext'
-
-def add_dynamodb_tags(span, params)
-  table_name = params[:table_name]
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_TABLE_NAME, table_name)
-end
diff --git a/lib/datadog/tracing/contrib/aws/services/eventbridge.rb b/lib/datadog/tracing/contrib/aws/services/eventbridge.rb
deleted file mode 100644
index d179a09e8f3..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/eventbridge.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../ext'
-
-def add_eventbridge_tags(span, params)
-  rule_name = params[:name] || params[:rule]
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, rule_name)
-end
diff --git a/lib/datadog/tracing/contrib/aws/services/helpers.rb b/lib/datadog/tracing/contrib/aws/services/helpers.rb
deleted file mode 100644
index fa21a17282b..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/helpers.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-require_relative 'sqs'
-require_relative 'sns'
-require_relative 'dynamodb'
-require_relative 'kinesis'
-require_relative 'eventbridge'
-require_relative 'stepfunctions'
-require_relative 's3'
-
-def add_service_specific_tags(span, aws_service, params)
-  case aws_service
-  when 'sqs'
-    add_sqs_tags(span, params)
-  when 'sns'
-    add_sns_tags(span, params)
-  when 'dynamodb'
-    add_dynamodb_tags(span, params)
-  when 'kinesis'
-    add_kinesis_tags(span, params)
-  when 'eventbridge'
-    add_eventbridge_tags(span, params)
-  when 'states'
-    add_states_tags(span, params)
-  when 's3'
-    add_s3_tags(span, params)
-  end
-end
diff --git a/lib/datadog/tracing/contrib/aws/services/kinesis.rb b/lib/datadog/tracing/contrib/aws/services/kinesis.rb
deleted file mode 100644
index d16926bce81..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/kinesis.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../ext'
-
-def add_kinesis_tags(span, params)
-  stream_arn = params[:stream_arn]
-  stream_name = params[:stream_name]
-  if stream_arn
-    # example stream_arn: arn:aws:kinesis:us-east-1:123456789012:stream/my-stream
-    parts = stream_arn.split(':')
-    stream_name = parts[-1].split('/')[-1]
-    aws_account = parts[-2]
-    span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
-  end
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, stream_name)
-end
diff --git a/lib/datadog/tracing/contrib/aws/services/s3.rb b/lib/datadog/tracing/contrib/aws/services/s3.rb
deleted file mode 100644
index 981fa2d3970..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/s3.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../ext'
-
-def add_s3_tags(span, params)
-  bucket_name = params[:bucket]
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_BUCKET_NAME, bucket_name)
-end
diff --git a/lib/datadog/tracing/contrib/aws/services/sns.rb b/lib/datadog/tracing/contrib/aws/services/sns.rb
deleted file mode 100644
index aa6378bffd3..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/sns.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../ext'
-
-def add_sns_tags(span, params)
-  topic_arn = params[:topic_arn]
-  topic_name = params[:name]
-  if topic_arn
-    # example topic_arn: arn:aws:sns:us-west-2:123456789012:my-topic-name
-    parts = topic_arn.split(':')
-    topic_name = parts[-1]
-    aws_account = parts[-2]
-    span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
-  end
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, topic_name)
-end
diff --git a/lib/datadog/tracing/contrib/aws/services/sqs.rb b/lib/datadog/tracing/contrib/aws/services/sqs.rb
deleted file mode 100644
index bd2a6b85a96..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/sqs.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../ext'
-
-def add_sqs_tags(span, params)
-  queue_url = params[:queue_url]
-  queue_name = params[:queue_name]
-  if queue_url
-    _, _, _, aws_account, queue_name = queue_url.split('/')
-    span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, aws_account)
-  end
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_QUEUE_NAME, queue_name)
-end
diff --git a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb b/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
deleted file mode 100644
index 1063d86527b..00000000000
--- a/lib/datadog/tracing/contrib/aws/services/stepfunctions.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../ext'
-
-def add_states_tags(span, params)
-  state_machine_name = params[:name]
-  state_machine_arn = params[:state_machine_arn]
-  execution_arn = params[:execution_arn]
-  state_machine_account_id = ''
-
-  if execution_arn
-    # 'arn:aws:states:us-east-1:123456789012:execution:example-state-machine:example-execution'
-    parts = execution_arn.split(':')
-    state_machine_name = parts[-2]
-    state_machine_account_id = parts[4]
-
-  end
-
-  if state_machine_arn
-    # example statemachinearn: arn:aws:states:us-east-1:123456789012:stateMachine:MyStateMachine
-    parts = state_machine_arn.split(':')
-    state_machine_name ||= parts[-1]
-    state_machine_account_id = parts[-3]
-  end
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, state_machine_account_id)
-  span.set_tag(Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME, state_machine_name)
-end
diff --git a/spec/datadog/tracing/contrib/aws/services/dynamobdb_spec.rb b/spec/datadog/tracing/contrib/aws/service/dynamobdb_spec.rb
similarity index 69%
rename from spec/datadog/tracing/contrib/aws/services/dynamobdb_spec.rb
rename to spec/datadog/tracing/contrib/aws/service/dynamobdb_spec.rb
index 34ae57e75c8..2f4580dc7bd 100644
--- a/spec/datadog/tracing/contrib/aws/services/dynamobdb_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/service/dynamobdb_spec.rb
@@ -1,11 +1,13 @@
 # frozen_string_literal: true
 
 require 'rspec'
-require 'lib/datadog/tracing/contrib/aws/services/dynamodb'
+require 'lib/datadog/tracing/contrib/aws/service/base'
+require 'lib/datadog/tracing/contrib/aws/service/dynamodb'
 
-RSpec.describe 'add_dynamodb_tags' do
+RSpec.describe Datadog::Tracing::Contrib::Aws::Service::DynamoDB do
   let(:span) { instance_double('Span') }
   let(:params) { {} }
+  let(:dynamodb) { described_class.new }
 
   before do
     allow(span).to receive(:set_tag)
@@ -16,14 +18,14 @@
     let(:params) { { table_name: table_name } }
 
     it 'sets the table_name tag' do
-      add_dynamodb_tags(span, params)
+      dynamodb.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TABLE_NAME, table_name)
     end
   end
 
   context 'with no table_name provided' do
     it 'does not set the table_name tag' do
-      add_dynamodb_tags(span, params)
+      dynamodb.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TABLE_NAME, nil)
     end
   end
diff --git a/spec/datadog/tracing/contrib/aws/services/eventbrige_spec.rb b/spec/datadog/tracing/contrib/aws/service/eventbrige_spec.rb
similarity index 74%
rename from spec/datadog/tracing/contrib/aws/services/eventbrige_spec.rb
rename to spec/datadog/tracing/contrib/aws/service/eventbrige_spec.rb
index c533c6e7d72..f9b8074fefa 100644
--- a/spec/datadog/tracing/contrib/aws/services/eventbrige_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/service/eventbrige_spec.rb
@@ -1,11 +1,13 @@
 # frozen_string_literal: true
 
 require 'rspec'
-require 'lib/datadog/tracing/contrib/aws/services/eventbridge'
+require 'lib/datadog/tracing/contrib/aws/service/base'
+require 'lib/datadog/tracing/contrib/aws/service/eventbridge'
 
-RSpec.describe 'add_eventbridge_tags' do
+RSpec.describe Datadog::Tracing::Contrib::Aws::Service::EventBridge do
   let(:span) { instance_double('Span') }
   let(:params) { {} }
+  let(:event_bridge) { described_class.new }
 
   before do
     allow(span).to receive(:set_tag)
@@ -16,7 +18,7 @@
     let(:params) { { name: rule_name } }
 
     it 'sets the rule_name based on the params[:name]' do
-      add_eventbridge_tags(span, params)
+      event_bridge.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, rule_name)
     end
   end
@@ -26,14 +28,14 @@
     let(:params) { { rule: rule_name } }
 
     it 'sets the rule_name based on the params[:rule]' do
-      add_eventbridge_tags(span, params)
+      event_bridge.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, rule_name)
     end
   end
 
   context 'without rule_name provided' do
     it 'does not set the rule_name tag' do
-      add_eventbridge_tags(span, params)
+      event_bridge.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_RULE_NAME, nil)
     end
   end
diff --git a/spec/datadog/tracing/contrib/aws/services/kinesis_spec.rb b/spec/datadog/tracing/contrib/aws/service/kinesis_spec.rb
similarity index 78%
rename from spec/datadog/tracing/contrib/aws/services/kinesis_spec.rb
rename to spec/datadog/tracing/contrib/aws/service/kinesis_spec.rb
index 2db478caf37..4d086afd64f 100644
--- a/spec/datadog/tracing/contrib/aws/services/kinesis_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/service/kinesis_spec.rb
@@ -1,11 +1,13 @@
 # frozen_string_literal: true
 
 require 'rspec'
-require 'lib/datadog/tracing/contrib/aws/services/kinesis'
+require 'lib/datadog/tracing/contrib/aws/service/base'
+require 'lib/datadog/tracing/contrib/aws/service/kinesis'
 
-RSpec.describe 'add_kinesis_tags' do
+RSpec.describe Datadog::Tracing::Contrib::Aws::Service::Kinesis do
   let(:span) { instance_double('Span') }
   let(:params) { {} }
+  let(:kinesis) { described_class.new }
 
   before do
     allow(span).to receive(:set_tag)
@@ -16,7 +18,7 @@
     let(:params) { { stream_arn: stream_arn } }
 
     it 'sets the stream_name and aws_account based on the stream_arn' do
-      add_kinesis_tags(span, params)
+      kinesis.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, 'my-stream')
     end
@@ -26,14 +28,14 @@
     let(:params) { { stream_name: 'my-stream' } }
 
     it 'sets the stream_name based on the provided stream_name' do
-      add_kinesis_tags(span, params)
+      kinesis.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, 'my-stream')
     end
   end
 
   context 'with neither stream_arn nor stream_name provided' do
     it 'sets the stream_name to nil' do
-      add_kinesis_tags(span, params)
+      kinesis.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_STREAM_NAME, nil)
     end
   end
diff --git a/spec/datadog/tracing/contrib/aws/services/s3_spec.rb b/spec/datadog/tracing/contrib/aws/service/s3_spec.rb
similarity index 71%
rename from spec/datadog/tracing/contrib/aws/services/s3_spec.rb
rename to spec/datadog/tracing/contrib/aws/service/s3_spec.rb
index 614c9e76315..baf2eb5c5a4 100644
--- a/spec/datadog/tracing/contrib/aws/services/s3_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/service/s3_spec.rb
@@ -1,11 +1,13 @@
 # frozen_string_literal: true
 
 require 'rspec'
-require 'lib/datadog/tracing/contrib/aws/services/s3'
+require 'lib/datadog/tracing/contrib/aws/service/base'
+require 'lib/datadog/tracing/contrib/aws/service/s3'
 
-RSpec.describe 'add_s3_tags' do
+RSpec.describe Datadog::Tracing::Contrib::Aws::Service::S3 do
   let(:span) { instance_double('Span') }
   let(:params) { {} }
+  let(:s3) { described_class.new }
 
   before do
     allow(span).to receive(:set_tag)
@@ -15,14 +17,14 @@
     let(:params) { { bucket: 'my-bucket-name' } }
 
     it 'sets the bucket_name based on the provided bucket name' do
-      add_s3_tags(span, params)
+      s3.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_BUCKET_NAME, 'my-bucket-name')
     end
   end
 
   context 'with no bucket name provided' do
     it 'sets the bucket_name to nil' do
-      add_s3_tags(span, params)
+      s3.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_BUCKET_NAME, nil)
     end
   end
diff --git a/spec/datadog/tracing/contrib/aws/services/sns_spec.rb b/spec/datadog/tracing/contrib/aws/service/sns_spec.rb
similarity index 79%
rename from spec/datadog/tracing/contrib/aws/services/sns_spec.rb
rename to spec/datadog/tracing/contrib/aws/service/sns_spec.rb
index 87c0d3c035b..f871b16b7c8 100644
--- a/spec/datadog/tracing/contrib/aws/services/sns_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/service/sns_spec.rb
@@ -1,11 +1,13 @@
 # frozen_string_literal: true
 
 require 'rspec'
-require 'lib/datadog/tracing/contrib/aws/services/sns'
+require 'lib/datadog/tracing/contrib/aws/service/base'
+require 'lib/datadog/tracing/contrib/aws/service/sns'
 
-RSpec.describe 'add_sns_tags' do
+RSpec.describe Datadog::Tracing::Contrib::Aws::Service::SNS do
   let(:span) { instance_double('Span') }
   let(:params) { {} }
+  let(:sns) { described_class.new }
 
   before do
     allow(span).to receive(:set_tag)
@@ -16,7 +18,7 @@
     let(:params) { { topic_arn: topic_arn } }
 
     it 'sets the topic_name and aws_account based on the topic_arn' do
-      add_sns_tags(span, params)
+      sns.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, 'my-topic-name')
     end
@@ -26,14 +28,14 @@
     let(:params) { { name: 'my-topic-name' } }
 
     it 'sets the topic_name based on the provided name' do
-      add_sns_tags(span, params)
+      sns.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, 'my-topic-name')
     end
   end
 
   context 'with neither topic_arn nor name provided' do
     it 'sets the topic_name to nil' do
-      add_sns_tags(span, params)
+      sns.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_TOPIC_NAME, nil)
     end
   end
diff --git a/spec/datadog/tracing/contrib/aws/services/sqs_spec.rb b/spec/datadog/tracing/contrib/aws/service/sqs_spec.rb
similarity index 76%
rename from spec/datadog/tracing/contrib/aws/services/sqs_spec.rb
rename to spec/datadog/tracing/contrib/aws/service/sqs_spec.rb
index dec10cf5460..bf87bfb697a 100644
--- a/spec/datadog/tracing/contrib/aws/services/sqs_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/service/sqs_spec.rb
@@ -1,11 +1,14 @@
 # frozen_string_literal: true
 
-require 'lib/datadog/tracing/contrib/aws/services/sqs'
+require 'lib/datadog/tracing/contrib/aws/service/base'
+require 'lib/datadog/tracing/contrib/aws/service/sqs'
 require 'spec_helper'
+require 'rspec'
 
-RSpec.describe 'add_sqs_tags' do
+RSpec.describe Datadog::Tracing::Contrib::Aws::Service::SQS do
   let(:span) { instance_double('Span') }
   let(:params) { {} }
+  let(:sqs) { described_class.new }
 
   before do
     allow(span).to receive(:set_tag)
@@ -16,7 +19,7 @@
     let(:params) { { queue_url: queue_url } }
 
     it 'sets AWS account and queue name tags' do
-      add_sqs_tags(span, params)
+      sqs.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_QUEUE_NAME, 'MyQueueName')
     end
@@ -27,7 +30,7 @@
     let(:params) { { queue_name: queue_name } }
 
     it 'sets queue name tag' do
-      add_sqs_tags(span, params)
+      sqs.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_QUEUE_NAME, 'AnotherQueueName')
     end
   end
diff --git a/spec/datadog/tracing/contrib/aws/services/stepfunctions_spec.rb b/spec/datadog/tracing/contrib/aws/service/stepfunctions_spec.rb
similarity index 84%
rename from spec/datadog/tracing/contrib/aws/services/stepfunctions_spec.rb
rename to spec/datadog/tracing/contrib/aws/service/stepfunctions_spec.rb
index 97c39a4f831..128d6f3202e 100644
--- a/spec/datadog/tracing/contrib/aws/services/stepfunctions_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/service/stepfunctions_spec.rb
@@ -1,11 +1,13 @@
 # frozen_string_literal: true
 
 require 'rspec'
-require 'lib/datadog/tracing/contrib/aws/services/stepfunctions'
+require 'lib/datadog/tracing/contrib/aws/service/base'
+require 'lib/datadog/tracing/contrib/aws/service/stepfunctions'
 
-RSpec.describe 'add_states_tags' do
+RSpec.describe Datadog::Tracing::Contrib::Aws::Service::States do
   let(:span) { instance_double('Span') }
   let(:params) { {} }
+  let(:step_functions) { described_class.new }
 
   before do
     allow(span).to receive(:set_tag)
@@ -16,7 +18,7 @@
     let(:params) { { execution_arn: execution_arn } }
 
     it 'sets the state_machine_name based on the execution_arn' do
-      add_states_tags(span, params)
+      step_functions.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(
         Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,
         'example-state-machine'
@@ -29,7 +31,7 @@
     let(:params) { { state_machine_arn: state_machine_arn } }
 
     it 'sets the state_machine_name based on the state_machine_arn' do
-      add_states_tags(span, params)
+      step_functions.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(
         Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,
         'MyStateMachine'
@@ -37,7 +39,7 @@
     end
 
     it 'sets the state_machine_account_id based on the state_machine_arn' do
-      add_states_tags(span, params)
+      step_functions.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
     end
   end
@@ -48,7 +50,7 @@
 
     it 'sets the state_machine_name and state_machine_account_id based on the state_machine_arn' do
       params = { state_machine_arn: state_machine_arn }
-      add_states_tags(span, params)
+      step_functions.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '123456789012')
       expect(span).to have_received(:set_tag).with(
         Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,
@@ -58,7 +60,7 @@
 
     it 'sets the state_machine_name and state_machine_account_id based on the execution_arn' do
       params = { execution_arn: execution_arn }
-      add_states_tags(span, params)
+      step_functions.add_tags(span, params)
       expect(span).to have_received(:set_tag).with(Datadog::Tracing::Contrib::Aws::Ext::TAG_AWS_ACCOUNT, '987654321098')
       expect(span).to have_received(:set_tag).with(
         Datadog::Tracing::Contrib::Aws::Ext::TAG_STATE_MACHINE_NAME,

From 7321f75b436cfafd11a8680001f1b71e2718cb92 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <49878080+zARODz11z@users.noreply.github.com>
Date: Tue, 2 May 2023 11:30:47 -0700
Subject: [PATCH 38/44] remove conditional check for test

---
 spec/datadog/tracing/contrib/aws/instrumentation_spec.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 6a7ce9a83fc..e1594d6c926 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -547,7 +547,7 @@
       end
     end
 
-    describe '#describe_stream_consumer', if: RUBY_VERSION >= '2.3.0' do
+    describe '#describe_stream_consumer' do
       subject!(:describe_stream_consumer) do
         client.describe_stream_consumer(
           stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
@@ -595,7 +595,7 @@
       end
     end
 
-    describe '#describe_stream_consumer', if: RUBY_VERSION < '2.3.0' do
+    describe '#describe_stream_consumer' do
       subject!(:describe_stream_consumer) do
         client.describe_stream_consumer(
           stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required

From f5b7ac7a8b9d2b858bc0372b72483cc76c85fdd0 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 2 May 2023 12:23:22 -0700
Subject: [PATCH 39/44] fix kinesis assertions

---
 spec/datadog/tracing/contrib/aws/instrumentation_spec.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index e1594d6c926..a048c9ff67b 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -628,7 +628,7 @@
         expect(span.get_tag('aws_service')).to eq('kinesis')
         expect(span.get_tag('streamname')).to eq('my-stream')
         expect(span.get_tag('path')).to eq('')
-        expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
         expect(span.get_tag('http.method')).to eq('POST')
         expect(span.get_tag('http.status_code')).to eq('200')
         expect(span.get_tag('span.kind')).to eq('client')
@@ -639,7 +639,7 @@
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
           .to eq('aws')
         expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-          .to eq('kinesis.us-stubbed-1.amazonaws.com')
+          .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
       end
     end
   end

From a73d645937f4da1c0b5b49cb66b944aa68e3d36b Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 2 May 2023 12:31:54 -0700
Subject: [PATCH 40/44] fix test and lint

---
 .../contrib/aws/instrumentation_spec.rb       | 48 -------------------
 1 file changed, 48 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index a048c9ff67b..a9e6d722839 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -594,54 +594,6 @@
           .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
       end
     end
-
-    describe '#describe_stream_consumer' do
-      subject!(:describe_stream_consumer) do
-        client.describe_stream_consumer(
-          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
-          consumer_name: 'cosumerName', # required
-          consumer_arn: 'consumerArn', # required
-        )
-      end
-
-      let(:responses) do
-        { describe_stream_consumer: {
-          consumer_description: {
-            consumer_name: 'John Doe',
-            consumer_arn: 'consumerArn',
-            consumer_status: 'CREATING',
-            consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
-            stream_arn: 'streamArn'
-          }
-        } }
-      end
-
-      it 'generates a span' do
-        expect(span.name).to eq('aws.command')
-        expect(span.service).to eq('aws')
-        expect(span.span_type).to eq('http')
-        expect(span.resource).to eq('kinesis.describe_stream_consumer')
-
-        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
-        expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
-        expect(span.get_tag('region')).to eq('us-stubbed-1')
-        expect(span.get_tag('aws_service')).to eq('kinesis')
-        expect(span.get_tag('streamname')).to eq('my-stream')
-        expect(span.get_tag('path')).to eq('')
-        expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
-        expect(span.get_tag('http.method')).to eq('POST')
-        expect(span.get_tag('http.status_code')).to eq('200')
-        expect(span.get_tag('span.kind')).to eq('client')
-
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
-          .to eq('command')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
-          .to eq('aws')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-          .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
-      end
-    end
   end
 
   context 'with an eventbridge client' do

From 2781bf6ffcc76051ede4b391eff9bfcc2b77918e Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 2 May 2023 14:48:45 -0700
Subject: [PATCH 41/44] add back conditional

---
 .../contrib/aws/instrumentation_spec.rb       | 132 ++++++++++++------
 1 file changed, 87 insertions(+), 45 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index a9e6d722839..4c6b294ae75 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -546,52 +546,94 @@
           .to eq('kinesis.us-stubbed-1.amazonaws.com')
       end
     end
-
-    describe '#describe_stream_consumer' do
-      subject!(:describe_stream_consumer) do
-        client.describe_stream_consumer(
-          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
-          consumer_name: 'cosumerName', # required
-          consumer_arn: 'consumerArn', # required
-        )
-      end
-
-      let(:responses) do
-        { describe_stream_consumer: {
-          consumer_description: {
-            consumer_name: 'John Doe',
-            consumer_arn: 'consumerArn',
-            consumer_status: 'CREATING',
-            consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
-            stream_arn: 'streamArn'
-          }
-        } }
+    #aws-sdk >= (3.1.0)->aws-sdk-kinesis >= (1.45.0) resolves to a different host name
+    describe '#describe_stream_consumer', if: RUBY_VERSION >= '2.3.0' do
+        subject!(:describe_stream_consumer) do
+          client.describe_stream_consumer(
+            stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
+            consumer_name: 'cosumerName', # required
+            consumer_arn: 'consumerArn', # required
+          )
+        end
+        let(:responses) do
+          { describe_stream_consumer: {
+            consumer_description: {
+              consumer_name: 'John Doe',
+              consumer_arn: 'consumerArn',
+              consumer_status: 'CREATING',
+              consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+              stream_arn: 'streamArn'
+            }
+          } }
+        end
+        it 'generates a span' do
+          expect(span.name).to eq('aws.command')
+          expect(span.service).to eq('aws')
+          expect(span.span_type).to eq('http')
+          expect(span.resource).to eq('kinesis.describe_stream_consumer')
+          expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+          expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
+          expect(span.get_tag('region')).to eq('us-stubbed-1')
+          expect(span.get_tag('aws_service')).to eq('kinesis')
+          expect(span.get_tag('streamname')).to eq('my-stream')
+          expect(span.get_tag('path')).to eq('')
+          expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+          expect(span.get_tag('http.method')).to eq('POST')
+          expect(span.get_tag('http.status_code')).to eq('200')
+          expect(span.get_tag('span.kind')).to eq('client')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+            .to eq('command')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+            .to eq('aws')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+            .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+        end
       end
-
-      it 'generates a span' do
-        expect(span.name).to eq('aws.command')
-        expect(span.service).to eq('aws')
-        expect(span.span_type).to eq('http')
-        expect(span.resource).to eq('kinesis.describe_stream_consumer')
-
-        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
-        expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
-        expect(span.get_tag('region')).to eq('us-stubbed-1')
-        expect(span.get_tag('aws_service')).to eq('kinesis')
-        expect(span.get_tag('streamname')).to eq('my-stream')
-        expect(span.get_tag('path')).to eq('')
-        expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
-        expect(span.get_tag('http.method')).to eq('POST')
-        expect(span.get_tag('http.status_code')).to eq('200')
-        expect(span.get_tag('span.kind')).to eq('client')
-
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
-          .to eq('command')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
-          .to eq('aws')
-        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-          .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+  
+      #aws-sdk <= (3.0.2)->aws-sdk-kinesis >= (1.34.0) resolves to a different host name
+      describe '#describe_stream_consumer', if: RUBY_VERSION < '2.3.0' do
+        subject!(:describe_stream_consumer) do
+          client.describe_stream_consumer(
+            stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
+            consumer_name: 'cosumerName', # required
+            consumer_arn: 'consumerArn', # required
+          )
+        end
+        let(:responses) do
+          { describe_stream_consumer: {
+            consumer_description: {
+              consumer_name: 'John Doe',
+              consumer_arn: 'consumerArn',
+              consumer_status: 'CREATING',
+              consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+              stream_arn: 'streamArn'
+            }
+          } }
+        end
+        it 'generates a span' do
+          expect(span.name).to eq('aws.command')
+          expect(span.service).to eq('aws')
+          expect(span.span_type).to eq('http')
+          expect(span.resource).to eq('kinesis.describe_stream_consumer')
+          expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+          expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
+          expect(span.get_tag('region')).to eq('us-stubbed-1')
+          expect(span.get_tag('aws_service')).to eq('kinesis')
+          expect(span.get_tag('streamname')).to eq('my-stream')
+          expect(span.get_tag('path')).to eq('')
+          expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
+          expect(span.get_tag('http.method')).to eq('POST')
+          expect(span.get_tag('http.status_code')).to eq('200')
+          expect(span.get_tag('span.kind')).to eq('client')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+            .to eq('command')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+            .to eq('aws')
+          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+            .to eq('kinesis.us-stubbed-1.amazonaws.com')
+        end
       end
     end
   end

From 551f2bb082580ba49c726c2525ed97789c966030 Mon Sep 17 00:00:00 2001
From: Andrew Rodriguez <andrew.rodriguez@datadoghq.com>
Date: Tue, 2 May 2023 15:20:27 -0700
Subject: [PATCH 42/44] fix sytax error

---
 .../contrib/aws/instrumentation_spec.rb       | 172 +++++++++---------
 1 file changed, 86 insertions(+), 86 deletions(-)

diff --git a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
index 4c6b294ae75..30a2e7612f2 100644
--- a/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
+++ b/spec/datadog/tracing/contrib/aws/instrumentation_spec.rb
@@ -546,94 +546,94 @@
           .to eq('kinesis.us-stubbed-1.amazonaws.com')
       end
     end
-    #aws-sdk >= (3.1.0)->aws-sdk-kinesis >= (1.45.0) resolves to a different host name
+
+    # aws-sdk >= (3.1.0)->aws-sdk-kinesis >= (1.45.0) resolves to a different host name
     describe '#describe_stream_consumer', if: RUBY_VERSION >= '2.3.0' do
-        subject!(:describe_stream_consumer) do
-          client.describe_stream_consumer(
-            stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
-            consumer_name: 'cosumerName', # required
-            consumer_arn: 'consumerArn', # required
-          )
-        end
-        let(:responses) do
-          { describe_stream_consumer: {
-            consumer_description: {
-              consumer_name: 'John Doe',
-              consumer_arn: 'consumerArn',
-              consumer_status: 'CREATING',
-              consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
-              stream_arn: 'streamArn'
-            }
-          } }
-        end
-        it 'generates a span' do
-          expect(span.name).to eq('aws.command')
-          expect(span.service).to eq('aws')
-          expect(span.span_type).to eq('http')
-          expect(span.resource).to eq('kinesis.describe_stream_consumer')
-          expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
-          expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
-          expect(span.get_tag('region')).to eq('us-stubbed-1')
-          expect(span.get_tag('aws_service')).to eq('kinesis')
-          expect(span.get_tag('streamname')).to eq('my-stream')
-          expect(span.get_tag('path')).to eq('')
-          expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
-          expect(span.get_tag('http.method')).to eq('POST')
-          expect(span.get_tag('http.status_code')).to eq('200')
-          expect(span.get_tag('span.kind')).to eq('client')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
-            .to eq('command')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
-            .to eq('aws')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-            .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
-        end
+      subject!(:describe_stream_consumer) do
+        client.describe_stream_consumer(
+          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
+          consumer_name: 'cosumerName', # required
+          consumer_arn: 'consumerArn', # required
+        )
       end
-  
-      #aws-sdk <= (3.0.2)->aws-sdk-kinesis >= (1.34.0) resolves to a different host name
-      describe '#describe_stream_consumer', if: RUBY_VERSION < '2.3.0' do
-        subject!(:describe_stream_consumer) do
-          client.describe_stream_consumer(
-            stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
-            consumer_name: 'cosumerName', # required
-            consumer_arn: 'consumerArn', # required
-          )
-        end
-        let(:responses) do
-          { describe_stream_consumer: {
-            consumer_description: {
-              consumer_name: 'John Doe',
-              consumer_arn: 'consumerArn',
-              consumer_status: 'CREATING',
-              consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
-              stream_arn: 'streamArn'
-            }
-          } }
-        end
-        it 'generates a span' do
-          expect(span.name).to eq('aws.command')
-          expect(span.service).to eq('aws')
-          expect(span.span_type).to eq('http')
-          expect(span.resource).to eq('kinesis.describe_stream_consumer')
-          expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
-          expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
-          expect(span.get_tag('region')).to eq('us-stubbed-1')
-          expect(span.get_tag('aws_service')).to eq('kinesis')
-          expect(span.get_tag('streamname')).to eq('my-stream')
-          expect(span.get_tag('path')).to eq('')
-          expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
-          expect(span.get_tag('http.method')).to eq('POST')
-          expect(span.get_tag('http.status_code')).to eq('200')
-          expect(span.get_tag('span.kind')).to eq('client')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
-            .to eq('command')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
-            .to eq('aws')
-          expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
-            .to eq('kinesis.us-stubbed-1.amazonaws.com')
-        end
+      let(:responses) do
+        { describe_stream_consumer: {
+          consumer_description: {
+            consumer_name: 'John Doe',
+            consumer_arn: 'consumerArn',
+            consumer_status: 'CREATING',
+            consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+            stream_arn: 'streamArn'
+          }
+        } }
+      end
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('kinesis.describe_stream_consumer')
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('kinesis')
+        expect(span.get_tag('streamname')).to eq('my-stream')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('123456789012.control-kinesis.us-stubbed-1.amazonaws.com')
+      end
+    end
+
+    # aws-sdk <= (3.0.2)->aws-sdk-kinesis >= (1.34.0) resolves to a different host name
+    describe '#describe_stream_consumer', if: RUBY_VERSION < '2.3.0' do
+      subject!(:describe_stream_consumer) do
+        client.describe_stream_consumer(
+          stream_arn: 'arn:aws:kinesis:us-east-1:123456789012:stream/my-stream', # required
+          consumer_name: 'cosumerName', # required
+          consumer_arn: 'consumerArn', # required
+        )
+      end
+      let(:responses) do
+        { describe_stream_consumer: {
+          consumer_description: {
+            consumer_name: 'John Doe',
+            consumer_arn: 'consumerArn',
+            consumer_status: 'CREATING',
+            consumer_creation_timestamp: Time.new(2023, 3, 31, 12, 30, 0, '-04:00'),
+            stream_arn: 'streamArn'
+          }
+        } }
+      end
+      it 'generates a span' do
+        expect(span.name).to eq('aws.command')
+        expect(span.service).to eq('aws')
+        expect(span.span_type).to eq('http')
+        expect(span.resource).to eq('kinesis.describe_stream_consumer')
+        expect(span.get_tag('aws.agent')).to eq('aws-sdk-ruby')
+        expect(span.get_tag('aws.operation')).to eq('describe_stream_consumer')
+        expect(span.get_tag('region')).to eq('us-stubbed-1')
+        expect(span.get_tag('aws_service')).to eq('kinesis')
+        expect(span.get_tag('streamname')).to eq('my-stream')
+        expect(span.get_tag('path')).to eq('')
+        expect(span.get_tag('host')).to eq('kinesis.us-stubbed-1.amazonaws.com')
+        expect(span.get_tag('http.method')).to eq('POST')
+        expect(span.get_tag('http.status_code')).to eq('200')
+        expect(span.get_tag('span.kind')).to eq('client')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT)).to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION))
+          .to eq('command')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_SERVICE))
+          .to eq('aws')
+        expect(span.get_tag(Datadog::Tracing::Metadata::Ext::TAG_PEER_HOSTNAME))
+          .to eq('kinesis.us-stubbed-1.amazonaws.com')
       end
     end
   end

From 79e5926817cbe9063afc2b8b4fc0d8c236cba536 Mon Sep 17 00:00:00 2001
From: Marco Costa <marco.costa@datadoghq.com>
Date: Wed, 3 May 2023 12:14:24 -0700
Subject: [PATCH 43/44] Reset config on test runs

---
 spec/spec_helper.rb | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 3644f730422..0e862a5c8e9 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -228,6 +228,15 @@
   config.around do |example|
     example.run.tap do
       tracer_shutdown!
+
+      # Reset all configuration
+      Datadog.configuration.reset!
+
+      # Rebuild components with reset configuration
+      # DEV: This is slow, but necessary due to tests not necessarily rebuilding components before running.
+      # DEV: This is specially concerning for tests that use the Datadog.logger, which can be set to debug mode by
+      # DEV: a prior test example.
+      Datadog.configure {}
     end
   end
 end

From c46b33f1aad00e8317ff4e7578f9562dab5e35e1 Mon Sep 17 00:00:00 2001
From: Marco Costa <marco.costa@datadoghq.com>
Date: Wed, 3 May 2023 13:49:51 -0700
Subject: [PATCH 44/44] Reset temp_logger between test runs

---
 lib/datadog/core/configuration.rb | 6 +++++-
 spec/spec_helper.rb               | 9 ---------
 2 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/lib/datadog/core/configuration.rb b/lib/datadog/core/configuration.rb
index a08e40ae6a2..3442f9d9036 100644
--- a/lib/datadog/core/configuration.rb
+++ b/lib/datadog/core/configuration.rb
@@ -208,7 +208,11 @@ def components(allow_initialization: true)
       # Used internally to ensure a clean environment between test runs.
       def reset!
         safely_synchronize do |write_components|
-          @components.shutdown! if components?
+          if components?
+            @components.shutdown!
+            @temp_logger = nil # Reset to ensure instance and log level are reset for next run
+          end
+
           write_components.call(nil)
           configuration.reset!
         end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 0e862a5c8e9..3644f730422 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -228,15 +228,6 @@
   config.around do |example|
     example.run.tap do
       tracer_shutdown!
-
-      # Reset all configuration
-      Datadog.configuration.reset!
-
-      # Rebuild components with reset configuration
-      # DEV: This is slow, but necessary due to tests not necessarily rebuilding components before running.
-      # DEV: This is specially concerning for tests that use the Datadog.logger, which can be set to debug mode by
-      # DEV: a prior test example.
-      Datadog.configure {}
     end
   end
 end