@@ -1765,3 +1765,90 @@ def test_set_remote_environment(self):
17651765 DEPENDENCY_METRIC
17661766 )
17671767 self .assertIsNone (actual_attributes .get (AWS_REMOTE_ENVIRONMENT ))
1768+
1769+ def test_cloudformation_primary_identifier_fallback_to_remote_resource_identifier (self ):
1770+ """Test that when cloudformationPrimaryIdentifier is not explicitly set,
1771+ it falls back to use the same value as remoteResourceIdentifier."""
1772+ keys = []
1773+ values = []
1774+
1775+ keys , values = self ._mock_attribute ([SpanAttributes .RPC_SYSTEM ], ["aws-api" ], keys , values )
1776+ self .span_mock .kind = SpanKind .CLIENT
1777+
1778+ # Test case 1: S3 Bucket (no ARN available, should use bucket name for both)
1779+ keys , values = self ._mock_attribute (
1780+ [SpanAttributes .RPC_SERVICE , SpanAttributes .AWS_S3_BUCKET ], ["S3" , "my-test-bucket" ], keys , values
1781+ )
1782+ self ._validate_remote_resource_attributes ("AWS::S3::Bucket" , "my-test-bucket" )
1783+
1784+ # Test S3 bucket with special characters
1785+ keys , values = self ._mock_attribute ([SpanAttributes .AWS_S3_BUCKET ], ["my-test|bucket^name" ], keys , values )
1786+ self ._validate_remote_resource_attributes ("AWS::S3::Bucket" , "my-test^|bucket^^name" )
1787+ keys , values = self ._mock_attribute (
1788+ [SpanAttributes .RPC_SERVICE , SpanAttributes .AWS_S3_BUCKET ], [None , None ], keys , values
1789+ )
1790+
1791+ # Test case 2: SQS Queue by name (no ARN, should use queue name for both)
1792+ keys , values = self ._mock_attribute (
1793+ [SpanAttributes .RPC_SERVICE , AWS_SQS_QUEUE_NAME ], ["SQS" , "my-test-queue" ], keys , values
1794+ )
1795+ self ._validate_remote_resource_attributes ("AWS::SQS::Queue" , "my-test-queue" )
1796+
1797+ # Test SQS queue with special characters
1798+ keys , values = self ._mock_attribute ([AWS_SQS_QUEUE_NAME ], ["my^queue|name" ], keys , values )
1799+ self ._validate_remote_resource_attributes ("AWS::SQS::Queue" , "my^^queue^|name" )
1800+ keys , values = self ._mock_attribute (
1801+ [SpanAttributes .RPC_SERVICE , AWS_SQS_QUEUE_NAME ], [None , None ], keys , values
1802+ )
1803+
1804+ # Test case 3: DynamoDB Table (no ARN, should use table name for both)
1805+ keys , values = self ._mock_attribute (
1806+ [SpanAttributes .RPC_SERVICE , SpanAttributes .AWS_DYNAMODB_TABLE_NAMES ],
1807+ ["DynamoDB" , ["my-test-table" ]],
1808+ keys ,
1809+ values ,
1810+ )
1811+ self ._validate_remote_resource_attributes ("AWS::DynamoDB::Table" , "my-test-table" )
1812+
1813+ # Test DynamoDB table with special characters
1814+ keys , values = self ._mock_attribute (
1815+ [SpanAttributes .AWS_DYNAMODB_TABLE_NAMES ], [["my|test^table" ]], keys , values
1816+ )
1817+ self ._validate_remote_resource_attributes ("AWS::DynamoDB::Table" , "my^|test^^table" )
1818+ keys , values = self ._mock_attribute (
1819+ [SpanAttributes .RPC_SERVICE , SpanAttributes .AWS_DYNAMODB_TABLE_NAMES ], [None , None ], keys , values
1820+ )
1821+
1822+ # Test case 4: Kinesis Stream
1823+ keys , values = self ._mock_attribute (
1824+ [SpanAttributes .RPC_SERVICE , AWS_KINESIS_STREAM_NAME ], ["Kinesis" , "my-test-stream" ], keys , values
1825+ )
1826+ self ._validate_remote_resource_attributes ("AWS::Kinesis::Stream" , "my-test-stream" )
1827+
1828+ # Test Kinesis stream with special characters
1829+ keys , values = self ._mock_attribute ([AWS_KINESIS_STREAM_NAME ], ["my-stream^with|chars" ], keys , values )
1830+ self ._validate_remote_resource_attributes ("AWS::Kinesis::Stream" , "my-stream^^with^|chars" )
1831+ keys , values = self ._mock_attribute (
1832+ [SpanAttributes .RPC_SERVICE , AWS_KINESIS_STREAM_NAME ], [None , None ], keys , values
1833+ )
1834+
1835+ # Test case 5: Lambda Function (non-invoke operation, no ARN)
1836+ keys , values = self ._mock_attribute (
1837+ [SpanAttributes .RPC_SERVICE , SpanAttributes .RPC_METHOD , AWS_LAMBDA_FUNCTION_NAME ],
1838+ ["Lambda" , "GetFunction" , "my-test-function" ],
1839+ keys ,
1840+ values ,
1841+ )
1842+ self ._validate_remote_resource_attributes ("AWS::Lambda::Function" , "my-test-function" )
1843+
1844+ # Test Lambda function with special characters
1845+ keys , values = self ._mock_attribute ([AWS_LAMBDA_FUNCTION_NAME ], ["my-function|with^chars" ], keys , values )
1846+ self ._validate_remote_resource_attributes ("AWS::Lambda::Function" , "my-function^|with^^chars" )
1847+ keys , values = self ._mock_attribute (
1848+ [SpanAttributes .RPC_SERVICE , SpanAttributes .RPC_METHOD , AWS_LAMBDA_FUNCTION_NAME ],
1849+ [None , None , None ],
1850+ keys ,
1851+ values ,
1852+ )
1853+
1854+ keys , values = self ._mock_attribute ([SpanAttributes .RPC_SYSTEM ], [None ], keys , values )
0 commit comments