util/awsservice/xray.go (81 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package awsservice
import (
"context"
"encoding/json"
"fmt"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/xray"
"github.com/aws/aws-sdk-go-v2/service/xray/types"
)
const (
// BatchGetTraces has a max trace ID size of 5.
batchGetTraceSizes = 5
)
func FilterExpression(annotations map[string]interface{}) string {
var expression string
for key, value := range annotations {
result, err := json.Marshal(value)
if err != nil {
continue
}
if len(expression) != 0 {
expression += " AND "
}
expression += fmt.Sprintf("annotation.%s = %s", key, result)
}
return expression
}
func GetTraceIDs(startTime time.Time, endTime time.Time, filter string) ([]string, error) {
var traceIDs []string
input := &xray.GetTraceSummariesInput{StartTime: aws.Time(startTime), EndTime: aws.Time(endTime), FilterExpression: aws.String(filter)}
for {
output, err := XrayClient.GetTraceSummaries(context.Background(), input)
if err != nil {
return nil, err
}
for _, summary := range output.TraceSummaries {
traceIDs = append(traceIDs, *summary.Id)
}
if output.NextToken == nil {
break
}
input.NextToken = output.NextToken
}
return traceIDs, nil
}
func GetSegments(traceIDs []string) ([]types.Segment, error) {
var segments []types.Segment
traces, err := GetBatchTraces(traceIDs)
if err != nil {
return nil, err
}
for _, trace := range traces {
segments = append(segments, trace.Segments...)
}
return segments, nil
}
func GetBatchTraces(traceIDs []string) ([]types.Trace, error) {
var traces []types.Trace
length := len(traceIDs)
for i := 0; i < length; i += batchGetTraceSizes {
j := i + batchGetTraceSizes
if j > length {
j = length
}
input := &xray.BatchGetTracesInput{TraceIds: traceIDs[i:j]}
for {
output, err := XrayClient.BatchGetTraces(context.Background(), input)
if err != nil {
return nil, err
}
for _, trace := range output.Traces {
traces = append(traces, trace)
}
if output.NextToken == nil {
break
}
input.NextToken = output.NextToken
}
}
return traces, nil
}