util/common/traces/xray/generator.go (93 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT package xray import ( "context" "errors" "log" "os" "path" "time" "github.com/aws/aws-xray-sdk-go/strategy/sampling" "github.com/aws/aws-xray-sdk-go/xray" "github.com/aws/aws-xray-sdk-go/xraylog" "github.com/aws/amazon-cloudwatch-agent-test/util/common/traces/base" ) var generatorError = errors.New("Generator error") type XrayTracesGenerator struct { base.TraceGenerator base.TraceGeneratorInterface } func (g *XrayTracesGenerator) StartSendingTraces(ctx context.Context) error { ticker := time.NewTicker(g.Cfg.Interval) for { select { case <-g.Done: ticker.Stop() return nil case <-ticker.C: if err := g.Generate(ctx); err != nil { return err } } } } func (g *XrayTracesGenerator) StopSendingTraces() { close(g.Done) } func NewLoadGenerator(cfg *base.TraceGeneratorConfig) *XrayTracesGenerator { s, err := sampling.NewLocalizedStrategyFromFilePath( path.Join("resources", "sampling-rule.json")) if err != nil { log.Fatalf("Couldn't apply sampling rule : %s", err) } xray.Configure(xray.Config{SamplingStrategy: s}) xray.SetLogger(xraylog.NewDefaultLogger(os.Stdout, xraylog.LogLevelWarn)) return &XrayTracesGenerator{ TraceGenerator: base.TraceGenerator{ Cfg: cfg, Done: make(chan struct{}), SegmentsGenerationCount: 0, SegmentsEndedCount: 0, }, } } func (g *XrayTracesGenerator) Generate(ctx context.Context) error { rootCtx, root := xray.BeginSegment(ctx, "load-generator") g.SegmentsGenerationCount++ defer func() { root.Close(nil) g.SegmentsEndedCount++ }() for key, value := range g.Cfg.Annotations { if err := root.AddAnnotation(key, value); err != nil { return err } } for namespace, metadata := range g.Cfg.Metadata { for key, value := range metadata { if err := root.AddMetadataToNamespace(namespace, key, value); err != nil { return err } } } _, subSeg := xray.BeginSubsegment(rootCtx, "with-error") defer subSeg.Close(nil) if err := subSeg.AddError(generatorError); err != nil { return err } return nil } func (g *XrayTracesGenerator) GetSegmentCount() (int, int) { return g.SegmentsGenerationCount, g.SegmentsEndedCount } func (g *XrayTracesGenerator) GetAgentConfigPath() string { return g.AgentConfigPath } func (g *XrayTracesGenerator) GetAgentRuntime() time.Duration { return g.AgentRuntime } func (g *XrayTracesGenerator) GetName() string { return g.Name } func (g *XrayTracesGenerator) GetGeneratorConfig() *base.TraceGeneratorConfig { return g.Cfg }