5252import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_GUARDRAIL_ARN ;
5353import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_GUARDRAIL_ID ;
5454import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_KNOWLEDGE_BASE_ID ;
55+ import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_LAMBDA_ARN ;
56+ import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_LAMBDA_NAME ;
5557import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_LAMBDA_RESOURCE_ID ;
5658import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_LOCAL_OPERATION ;
5759import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_LOCAL_SERVICE ;
5860import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_QUEUE_NAME ;
5961import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_QUEUE_URL ;
6062import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_REMOTE_DB_USER ;
63+ import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_REMOTE_ENVIRONMENT ;
6164import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_REMOTE_OPERATION ;
6265import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_REMOTE_RESOURCE_IDENTIFIER ;
6366import  static  software .amazon .opentelemetry .javaagent .providers .AwsAttributeKeys .AWS_REMOTE_RESOURCE_TYPE ;
@@ -518,6 +521,29 @@ private static void setRemoteResourceTypeAndIdentifier(SpanData span, Attributes
518521                Optional .ofNullable (escapeDelimiters (span .getAttributes ().get (AWS_SECRET_ARN ))));
519522        cloudformationPrimaryIdentifier  =
520523            Optional .ofNullable (escapeDelimiters (span .getAttributes ().get (AWS_SECRET_ARN )));
524+       } else  if  (isKeyPresent (span , AWS_LAMBDA_NAME )) {
525+         if  ("Invoke" .equals (getRemoteOperation (span , RPC_METHOD ))) {
526+           String  remoteService  =
527+               Optional .ofNullable (System .getenv ("LAMBDA_APPLICATION_SIGNALS_REMOTE_SERVICE" ))
528+                   .filter (s  -> !s .isEmpty ())
529+                   .orElse (span .getAttributes ().get (AWS_LAMBDA_NAME ));
530+           if  (remoteService  != null ) {
531+             builder .put (AWS_REMOTE_SERVICE , remoteService );
532+           }
533+ 
534+           String  remoteEnvironment  =
535+               Optional .ofNullable (System .getenv ("LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT" ))
536+                   .filter (s  -> !s .isEmpty ())
537+                   .orElse ("default" );
538+           builder .put (AWS_REMOTE_ENVIRONMENT , "lambda:"  + remoteEnvironment );
539+         } else  {
540+           remoteResourceType  = Optional .of (NORMALIZED_LAMBDA_SERVICE_NAME  + "::Function" );
541+           remoteResourceIdentifier  =
542+               getLambdaFunctionNameFromArn (
543+                   Optional .ofNullable (escapeDelimiters (span .getAttributes ().get (AWS_LAMBDA_NAME ))));
544+           cloudformationPrimaryIdentifier  =
545+               Optional .ofNullable (escapeDelimiters (span .getAttributes ().get (AWS_LAMBDA_ARN )));
546+         }
521547      } else  if  (isKeyPresent (span , AWS_LAMBDA_RESOURCE_ID )) {
522548        remoteResourceType  = Optional .of (NORMALIZED_LAMBDA_SERVICE_NAME  + "::EventSourceMapping" );
523549        remoteResourceIdentifier  =
@@ -539,6 +565,14 @@ private static void setRemoteResourceTypeAndIdentifier(SpanData span, Attributes
539565    }
540566  }
541567
568+   private  static  Optional <String > getLambdaFunctionNameFromArn (Optional <String > stringArn ) {
569+     if  (stringArn .isPresent () && stringArn .get ().startsWith ("arn:aws:lambda:" )) {
570+       Arn  resourceArn  = Arn .fromString (stringArn .get ());
571+       return  Optional .of (resourceArn .getResource ().toString ().split (":" )[1 ]);
572+     }
573+     return  stringArn ;
574+   }
575+ 
542576  private  static  Optional <String > getSecretsManagerResourceNameFromArn (Optional <String > stringArn ) {
543577    Arn  resourceArn  = Arn .fromString (stringArn .get ());
544578    return  Optional .of (resourceArn .getResource ().toString ().split (":" )[1 ]);
0 commit comments