Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package otelaws
import (
"testing"

"github.com/aws/aws-sdk-go-v2/aws"
awsMiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
"github.com/aws/aws-sdk-go-v2/service/sqs"
"github.com/aws/smithy-go/middleware"
Expand Down Expand Up @@ -52,15 +53,18 @@ func TestDefaultAttributeBuilderNotSupportedService(t *testing.T) {

func TestDefaultAttributeBuilderOnSupportedService(t *testing.T) {
testCtx := awsMiddleware.SetServiceID(t.Context(), sqs.ServiceID)
testQueueURL := "test-queue-url"

attr := DefaultAttributeBuilder(testCtx, middleware.InitializeInput{
Parameters: &sqs.SendMessageInput{
QueueUrl: &testQueueURL,
MessageBody: aws.String(""),
QueueUrl: &queueUrl,
},
}, middleware.InitializeOutput{})
assert.ElementsMatch(t, []attribute.KeyValue{
semconv.MessagingSystemAWSSQS,
semconv.ServerAddress(testQueueURL),
}, attr)

assert.Contains(t, attr, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attr, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attr, semconv.MessagingMessageBodySize(0))
assert.Contains(t, attr, semconv.MessagingOperationTypeSend)
assert.Contains(t, attr, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attr, semconv.ServerAddress(serverAddress))
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ package otelaws // import "go.opentelemetry.io/contrib/instrumentation/github.co

import (
"context"
"net"
"net/url"
"strconv"
"strings"

"github.com/aws/aws-sdk-go-v2/service/sqs"
"github.com/aws/smithy-go/middleware"
Expand All @@ -18,34 +22,71 @@ func SQSAttributeBuilder(_ context.Context, in middleware.InitializeInput, _ mid

switch v := in.Parameters.(type) {
case *sqs.DeleteMessageBatchInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl), semconv.MessagingOperationTypeSettle, semconv.MessagingBatchMessageCount(len(v.Entries)))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.DeleteMessageInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl), semconv.MessagingOperationTypeSettle)
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.DeleteQueueInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.GetQueueAttributesInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.ListDeadLetterSourceQueuesInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.ListQueueTagsInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.PurgeQueueInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.ReceiveMessageInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl), semconv.MessagingOperationTypeReceive)
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.RemovePermissionInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.SendMessageBatchInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl), semconv.MessagingOperationTypeSend, semconv.MessagingBatchMessageCount(len(v.Entries)))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.SendMessageInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl), semconv.MessagingOperationTypeSend, semconv.MessagingMessageBodySize(len(*v.MessageBody)))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.SetQueueAttributesInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.TagQueueInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
case *sqs.UntagQueueInput:
sqsAttributes = append(sqsAttributes, semconv.ServerAddress(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, semconv.AWSSQSQueueURL(*v.QueueUrl))
sqsAttributes = append(sqsAttributes, queueUrlAttrs(*v.QueueUrl)...)
}

return sqsAttributes
}

func queueUrlAttrs(queueUrl string) []attribute.KeyValue {
var attrs []attribute.KeyValue

parts, err := url.Parse(queueUrl)
if err != nil {
return nil
}

if addr, port, err := net.SplitHostPort(parts.Host); err == nil {
if port, err := strconv.Atoi(port); err == nil {
attrs = append(attrs, semconv.ServerAddress(addr), semconv.ServerPort(port))
}
} else {
attrs = append(attrs, semconv.ServerAddress(parts.Host))
}

if _, queuename, found := strings.Cut(strings.TrimPrefix(parts.Path, "/"), "/"); found {
attrs = append(attrs, semconv.MessagingDestinationName(queuename))
}

return attrs
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package otelaws

import (
"fmt"
"testing"

"github.com/aws/aws-sdk-go-v2/aws"
Expand All @@ -13,170 +14,227 @@ import (
semconv "go.opentelemetry.io/otel/semconv/v1.37.0"
)

var (
serverAddress = "sqs.us-east-1.amazonaws.com"
queueName = "some_queue_name"
queueUrl = fmt.Sprintf("https://%s/000000000000/%s", serverAddress, queueName)
)

func TestSQSDeleteMessageBatchInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.DeleteMessageBatchInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingBatchMessageCount(0))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingOperationTypeSettle)
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSDeleteMessageInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.DeleteMessageInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingOperationTypeSettle)
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSDeleteQueueInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.DeleteQueueInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSGetQueueAttributesInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.GetQueueAttributesInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSListDeadLetterSourceQueuesInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.ListDeadLetterSourceQueuesInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSListQueueTagsInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.ListQueueTagsInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSPurgeQueueInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.PurgeQueueInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSReceiveMessageInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.ReceiveMessageInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingOperationTypeReceive)
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSRemovePermissionInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.RemovePermissionInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSSendMessageBatchInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.SendMessageBatchInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingBatchMessageCount(0))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingOperationTypeSend)
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSSendMessageInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.SendMessageInput{
QueueUrl: aws.String("test-queue-url"),
MessageBody: aws.String(""),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingMessageBodySize(0))
assert.Contains(t, attributes, semconv.MessagingOperationTypeSend)
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSSetQueueAttributesInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.SetQueueAttributesInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSTagQueueInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.TagQueueInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}

func TestSQSUntagQueueInput(t *testing.T) {
input := middleware.InitializeInput{
Parameters: &sqs.UntagQueueInput{
QueueUrl: aws.String("test-queue-url"),
QueueUrl: &queueUrl,
},
}

attributes := SQSAttributeBuilder(t.Context(), input, middleware.InitializeOutput{})

assert.Contains(t, attributes, semconv.ServerAddress("test-queue-url"))
assert.Contains(t, attributes, semconv.AWSSQSQueueURL(queueUrl))
assert.Contains(t, attributes, semconv.MessagingDestinationName(queueName))
assert.Contains(t, attributes, semconv.MessagingSystemAWSSQS)
assert.Contains(t, attributes, semconv.ServerAddress(serverAddress))
}
Loading