Skip to content

Commit

Permalink
Add instana.AWSDynamoDBSpanType
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrey Slotin committed Jan 22, 2021
1 parent e261979 commit 0bdccc0
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
52 changes: 52 additions & 0 deletions json_span.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ const (
AWSSQSSpanType = RegisteredSpanType("sqs")
// AWS SNS client span
AWSSNSSpanType = RegisteredSpanType("sns")
// AWS DynamoDB client span
AWSDynamoDBSpanType = RegisteredSpanType("dynamodb")
)

// RegisteredSpanType represents the span type supported by Instana
Expand All @@ -75,6 +77,8 @@ func (st RegisteredSpanType) ExtractData(span *spanS) typedSpanData {
return NewAWSSQSSpanData(span)
case AWSSNSSpanType:
return NewAWSSNSSpanData(span)
case AWSDynamoDBSpanType:
return NewAWSDynamoDBSpanData(span)
default:
return NewSDKSpanData(span)
}
Expand Down Expand Up @@ -1108,6 +1112,54 @@ func NewAWSSNSSpanTags(span *spanS) AWSSNSSpanTags {
return tags
}

// AWSDynamoDBSpanData represents the `data` section of a AWS DynamoDB span sent within an OT span document
type AWSDynamoDBSpanData struct {
SpanData
Tags AWSDynamoDBSpanTags `json:"sns"`
}

// NewAWSDynamoDBSpanData initializes a new AWS DynamoDB span data from tracer span
func NewAWSDynamoDBSpanData(span *spanS) AWSDynamoDBSpanData {
data := AWSDynamoDBSpanData{
SpanData: NewSpanData(span, AWSDynamoDBSpanType),
Tags: NewAWSDynamoDBSpanTags(span),
}

return data
}

// Kind returns the span kind for a AWS DynamoDB span
func (d AWSDynamoDBSpanData) Kind() SpanKind {
return ExitSpanKind
}

// AWSDynamoDBSpanTags contains fields within the `data.sns` section of an OT span document
type AWSDynamoDBSpanTags struct {
// Table is the name of DynamoDB table
Table string `json:"table,omitempty"`
// Operation is the operation name
Operation string `json:"op,omitempty"`
// Error is an optional name returned by AWS API
Error string `json:"error,omitempty"`
}

// NewAWSDynamoDBSpanTags extracts AWS DynamoDB span tags from a tracer span
func NewAWSDynamoDBSpanTags(span *spanS) AWSDynamoDBSpanTags {
var tags AWSDynamoDBSpanTags
for k, v := range span.Tags {
switch k {
case "dynamodb.table":
readStringTag(&tags.Table, v)
case "dynamodb.op":
readStringTag(&tags.Operation, v)
case "dynamodb.error":
readStringTag(&tags.Error, v)
}
}

return tags
}

// readStringTag populates the &dst with the tag value if it's of either string or []byte type
func readStringTag(dst *string, tag interface{}) {
switch s := tag.(type) {
Expand Down
4 changes: 4 additions & 0 deletions json_span_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ func TestRegisteredSpanType_ExtractData(t *testing.T) {
Operation: "sns",
Expected: instana.AWSSNSSpanData{},
},
"aws dynamodb": {
Operation: "dynamodb",
Expected: instana.AWSDynamoDBSpanData{},
},
}

for name, example := range examples {
Expand Down

0 comments on commit 0bdccc0

Please sign in to comment.