From 4edb4b5eff7ade6369742346cf8e7111df4fefb6 Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Wed, 12 Feb 2020 17:27:30 -0800 Subject: [PATCH 1/9] DummySegment and DummySubSegment creation --- xray/segment.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/xray/segment.go b/xray/segment.go index 80ba264e..936e6120 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -52,6 +52,25 @@ func BeginFacadeSegment(ctx context.Context, name string, h *header.Header) (con return context.WithValue(ctx, ContextKey, seg), seg } +// Begin DummySegment creates a segment in the case of no sampling to reduce memory footprint +func BeginDummySegment(ctx context.Context, name string) (context.Context, *Segment) { + dummySeg := &Segment{parent:nil} + dummySeg.ParentSegment = dummySeg + logger.Debugf("Beginning segment named %s", name) + + cfg := GetRecorder(ctx) + dummySeg.assignConfiguration(cfg) + + dummySeg.Lock() + defer dummySeg.Unlock() + + dummySeg.Name = name + dummySeg.TraceID = "dummy segment" + dummySeg.Sampled = false + + return context.WithValue(ctx, ContextKey, dummySeg), dummySeg +} + // BeginSegment creates a Segment for a given name and context. func BeginSegment(ctx context.Context, name string) (context.Context, *Segment) { seg := basicSegment(name, nil) @@ -158,6 +177,35 @@ func (seg *Segment) assignConfiguration(cfg *Config) { seg.Unlock() } +// Begin DummySubSegment creates a in the case of no sampling to reduce memory footprint +func BeginDummySubSegment(ctx context.Context, name string) (context.Context, *Segment) { + var parent *Segment + + parent = GetSegment(ctx) + if parent == nil { + cfg := GetRecorder(ctx) + failedMessage := fmt.Sprintf("failed to begin subsegment named '%v': segment cannot be found.", name) + if cfg != nil && cfg.ContextMissingStrategy != nil { + cfg.ContextMissingStrategy.ContextMissing(failedMessage) + } else { + globalCfg.ContextMissingStrategy().ContextMissing(failedMessage) + } + return ctx, nil + } + + dummySubSeg := &Segment{parent: parent} + logger.Debugf("Beginning subsegment named %s", name) + + dummySubSeg.Lock() + defer dummySubSeg.Unlock() + + dummySubSeg.ParentSegment = parent.ParentSegment + dummySubSeg.Name = name + dummySubSeg.TraceID = "dummy subsegment" + + return context.WithValue(ctx, ContextKey, dummySubSeg), dummySubSeg +} + // BeginSubsegment creates a subsegment for a given name and context. func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segment) { if len(name) > 200 { From 0442d84841441d4b5db9bfbe1f7c3769baae0249 Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Wed, 12 Feb 2020 17:30:26 -0800 Subject: [PATCH 2/9] Revert "DummySegment and DummySubSegment creation" This reverts commit 4edb4b5eff7ade6369742346cf8e7111df4fefb6. --- xray/segment.go | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) diff --git a/xray/segment.go b/xray/segment.go index 936e6120..80ba264e 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -52,25 +52,6 @@ func BeginFacadeSegment(ctx context.Context, name string, h *header.Header) (con return context.WithValue(ctx, ContextKey, seg), seg } -// Begin DummySegment creates a segment in the case of no sampling to reduce memory footprint -func BeginDummySegment(ctx context.Context, name string) (context.Context, *Segment) { - dummySeg := &Segment{parent:nil} - dummySeg.ParentSegment = dummySeg - logger.Debugf("Beginning segment named %s", name) - - cfg := GetRecorder(ctx) - dummySeg.assignConfiguration(cfg) - - dummySeg.Lock() - defer dummySeg.Unlock() - - dummySeg.Name = name - dummySeg.TraceID = "dummy segment" - dummySeg.Sampled = false - - return context.WithValue(ctx, ContextKey, dummySeg), dummySeg -} - // BeginSegment creates a Segment for a given name and context. func BeginSegment(ctx context.Context, name string) (context.Context, *Segment) { seg := basicSegment(name, nil) @@ -177,35 +158,6 @@ func (seg *Segment) assignConfiguration(cfg *Config) { seg.Unlock() } -// Begin DummySubSegment creates a in the case of no sampling to reduce memory footprint -func BeginDummySubSegment(ctx context.Context, name string) (context.Context, *Segment) { - var parent *Segment - - parent = GetSegment(ctx) - if parent == nil { - cfg := GetRecorder(ctx) - failedMessage := fmt.Sprintf("failed to begin subsegment named '%v': segment cannot be found.", name) - if cfg != nil && cfg.ContextMissingStrategy != nil { - cfg.ContextMissingStrategy.ContextMissing(failedMessage) - } else { - globalCfg.ContextMissingStrategy().ContextMissing(failedMessage) - } - return ctx, nil - } - - dummySubSeg := &Segment{parent: parent} - logger.Debugf("Beginning subsegment named %s", name) - - dummySubSeg.Lock() - defer dummySubSeg.Unlock() - - dummySubSeg.ParentSegment = parent.ParentSegment - dummySubSeg.Name = name - dummySubSeg.TraceID = "dummy subsegment" - - return context.WithValue(ctx, ContextKey, dummySubSeg), dummySubSeg -} - // BeginSubsegment creates a subsegment for a given name and context. func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segment) { if len(name) > 200 { From a9d172a9f69e8672416617334a26afa989953a69 Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Wed, 12 Feb 2020 17:38:41 -0800 Subject: [PATCH 3/9] Revert "Revert "DummySegment and DummySubSegment creation"" This reverts commit 0442d84841441d4b5db9bfbe1f7c3769baae0249. --- xray/segment.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/xray/segment.go b/xray/segment.go index 80ba264e..936e6120 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -52,6 +52,25 @@ func BeginFacadeSegment(ctx context.Context, name string, h *header.Header) (con return context.WithValue(ctx, ContextKey, seg), seg } +// Begin DummySegment creates a segment in the case of no sampling to reduce memory footprint +func BeginDummySegment(ctx context.Context, name string) (context.Context, *Segment) { + dummySeg := &Segment{parent:nil} + dummySeg.ParentSegment = dummySeg + logger.Debugf("Beginning segment named %s", name) + + cfg := GetRecorder(ctx) + dummySeg.assignConfiguration(cfg) + + dummySeg.Lock() + defer dummySeg.Unlock() + + dummySeg.Name = name + dummySeg.TraceID = "dummy segment" + dummySeg.Sampled = false + + return context.WithValue(ctx, ContextKey, dummySeg), dummySeg +} + // BeginSegment creates a Segment for a given name and context. func BeginSegment(ctx context.Context, name string) (context.Context, *Segment) { seg := basicSegment(name, nil) @@ -158,6 +177,35 @@ func (seg *Segment) assignConfiguration(cfg *Config) { seg.Unlock() } +// Begin DummySubSegment creates a in the case of no sampling to reduce memory footprint +func BeginDummySubSegment(ctx context.Context, name string) (context.Context, *Segment) { + var parent *Segment + + parent = GetSegment(ctx) + if parent == nil { + cfg := GetRecorder(ctx) + failedMessage := fmt.Sprintf("failed to begin subsegment named '%v': segment cannot be found.", name) + if cfg != nil && cfg.ContextMissingStrategy != nil { + cfg.ContextMissingStrategy.ContextMissing(failedMessage) + } else { + globalCfg.ContextMissingStrategy().ContextMissing(failedMessage) + } + return ctx, nil + } + + dummySubSeg := &Segment{parent: parent} + logger.Debugf("Beginning subsegment named %s", name) + + dummySubSeg.Lock() + defer dummySubSeg.Unlock() + + dummySubSeg.ParentSegment = parent.ParentSegment + dummySubSeg.Name = name + dummySubSeg.TraceID = "dummy subsegment" + + return context.WithValue(ctx, ContextKey, dummySubSeg), dummySubSeg +} + // BeginSubsegment creates a subsegment for a given name and context. func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segment) { if len(name) > 200 { From 7b60842ba77d7b01772f227f408c01d15fd4b55c Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Thu, 13 Feb 2020 11:12:40 -0800 Subject: [PATCH 4/9] ran gofmt command to remove golint warnings --- xray/segment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xray/segment.go b/xray/segment.go index 936e6120..2f517912 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -54,7 +54,7 @@ func BeginFacadeSegment(ctx context.Context, name string, h *header.Header) (con // Begin DummySegment creates a segment in the case of no sampling to reduce memory footprint func BeginDummySegment(ctx context.Context, name string) (context.Context, *Segment) { - dummySeg := &Segment{parent:nil} + dummySeg := &Segment{parent: nil} dummySeg.ParentSegment = dummySeg logger.Debugf("Beginning segment named %s", name) From ca86dc6ee651ed60f68ddc15ec45cc5692961908 Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Thu, 13 Feb 2020 11:16:44 -0800 Subject: [PATCH 5/9] remove redundent declaration --- xray/segment.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/xray/segment.go b/xray/segment.go index 2f517912..3dd09d8b 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -179,9 +179,7 @@ func (seg *Segment) assignConfiguration(cfg *Config) { // Begin DummySubSegment creates a in the case of no sampling to reduce memory footprint func BeginDummySubSegment(ctx context.Context, name string) (context.Context, *Segment) { - var parent *Segment - - parent = GetSegment(ctx) + parent := GetSegment(ctx) if parent == nil { cfg := GetRecorder(ctx) failedMessage := fmt.Sprintf("failed to begin subsegment named '%v': segment cannot be found.", name) From a6facdddca939e04177a2ac09986eced765e3137 Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Thu, 27 Feb 2020 16:34:35 -0800 Subject: [PATCH 6/9] Added Dummysegment creation logic --- xray/segment.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xray/segment.go b/xray/segment.go index 8dc0a977..e53540dc 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -135,7 +135,11 @@ func BeginSegmentWithSampling(ctx context.Context, name string, r *http.Request, }() } - return context.WithValue(ctx, ContextKey, seg), seg + if seg.Sampled { + return context.WithValue(ctx, ContextKey, seg), seg + } else { + return BeginDummySegment(ctx, "Dummy Seg") + } } func basicSegment(name string, h *header.Header) *Segment { @@ -288,7 +292,11 @@ func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segmen seg.StartTime = float64(time.Now().UnixNano()) / float64(time.Second) seg.InProgress = true - return context.WithValue(ctx, ContextKey, seg), seg + if seg.ParentSegment.Sampled { + return context.WithValue(ctx, ContextKey, seg), seg + } else { + return BeginDummySegment(ctx, "Dummy SubSeg") + } } // NewSegmentFromHeader creates a segment for downstream call and add information to the segment that gets from HTTP header. From 6b620c65f695476a1ae59b77529eb5e78905f52a Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Thu, 27 Feb 2020 16:39:07 -0800 Subject: [PATCH 7/9] Added reviewdog suggestions --- xray/segment.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xray/segment.go b/xray/segment.go index e53540dc..58359c0c 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -137,9 +137,9 @@ func BeginSegmentWithSampling(ctx context.Context, name string, r *http.Request, if seg.Sampled { return context.WithValue(ctx, ContextKey, seg), seg - } else { - return BeginDummySegment(ctx, "Dummy Seg") } + + return BeginDummySegment(ctx, "Dummy Seg") } func basicSegment(name string, h *header.Header) *Segment { @@ -294,9 +294,9 @@ func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segmen if seg.ParentSegment.Sampled { return context.WithValue(ctx, ContextKey, seg), seg - } else { - return BeginDummySegment(ctx, "Dummy SubSeg") } + + return BeginDummySegment(ctx, "Dummy SubSeg") } // NewSegmentFromHeader creates a segment for downstream call and add information to the segment that gets from HTTP header. From e6cacdfa5187ef10c4972bb116895d594f5047cc Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Tue, 3 Mar 2020 14:32:26 -0800 Subject: [PATCH 8/9] modified code based on feedback --- xray/segment.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/xray/segment.go b/xray/segment.go index 58359c0c..f0725c44 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -58,7 +58,7 @@ func BeginFacadeSegment(ctx context.Context, name string, h *header.Header) (con func BeginDummySegment(ctx context.Context, name string) (context.Context, *Segment) { dummySeg := &Segment{parent: nil} dummySeg.ParentSegment = dummySeg - logger.Debugf("Beginning segment named %s", name) + logger.Debugf("Beginning dummy segment named %s", name) cfg := GetRecorder(ctx) dummySeg.assignConfiguration(cfg) @@ -67,7 +67,7 @@ func BeginDummySegment(ctx context.Context, name string) (context.Context, *Segm defer dummySeg.Unlock() dummySeg.Name = name - dummySeg.TraceID = "dummy segment" + dummySeg.TraceID = NewTraceID() dummySeg.Sampled = false return context.WithValue(ctx, ContextKey, dummySeg), dummySeg @@ -139,7 +139,7 @@ func BeginSegmentWithSampling(ctx context.Context, name string, r *http.Request, return context.WithValue(ctx, ContextKey, seg), seg } - return BeginDummySegment(ctx, "Dummy Seg") + return BeginDummySegment(ctx, "DummySegment") } func basicSegment(name string, h *header.Header) *Segment { @@ -221,7 +221,7 @@ func (seg *Segment) assignConfiguration(cfg *Config) { seg.Unlock() } -// Begin DummySubSegment creates a in the case of no sampling to reduce memory footprint +// Begin DummySubSegment creates a subsegment in the case of no sampling to reduce memory footprint func BeginDummySubSegment(ctx context.Context, name string) (context.Context, *Segment) { parent := GetSegment(ctx) if parent == nil { @@ -236,14 +236,13 @@ func BeginDummySubSegment(ctx context.Context, name string) (context.Context, *S } dummySubSeg := &Segment{parent: parent} - logger.Debugf("Beginning subsegment named %s", name) + logger.Debugf("Beginning dummy subsegment named %s", name) dummySubSeg.Lock() defer dummySubSeg.Unlock() dummySubSeg.ParentSegment = parent.ParentSegment dummySubSeg.Name = name - dummySubSeg.TraceID = "dummy subsegment" return context.WithValue(ctx, ContextKey, dummySubSeg), dummySubSeg } @@ -296,7 +295,7 @@ func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segmen return context.WithValue(ctx, ContextKey, seg), seg } - return BeginDummySegment(ctx, "Dummy SubSeg") + return BeginDummySegment(ctx, "DummySubSegment") } // NewSegmentFromHeader creates a segment for downstream call and add information to the segment that gets from HTTP header. From fa1830f82e6ad558a1b72082c86b9b300d0bfbde Mon Sep 17 00:00:00 2001 From: Bhautik Pipaliya Date: Mon, 9 Mar 2020 15:33:31 -0700 Subject: [PATCH 9/9] Prepare for release 1.0.0- rc.15 --- CHANGELOG.md | 27 +++++++++++++++++++++++ xray/segment.go | 57 ++----------------------------------------------- 2 files changed, 29 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41853528..44f74442 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,30 @@ +Release v1.0.0-rc.15 (2019-03-09) +================================ +### SDK Breaking Changes +* Custom SQL driver. [PR #169](https://github.com/aws/aws-xray-sdk-go/pull/169) + +### SDK Enhancements +* Efficient implementation of wildcard matching. [PR #149](https://github.com/aws/aws-xray-sdk-go/pull/149) +* Whitelisting Sagemaker runtime InvokeEndpoint operation. [PR #154](https://github.com/aws/aws-xray-sdk-go/pull/154/files) +* Added context missing environment variable support. [PR #161](https://github.com/aws/aws-xray-sdk-go/pull/161) +* Added stale bot support for Github Repository. [PR #162](https://github.com/aws/aws-xray-sdk-go/pull/162) +* Upgrade golangci-lint version. [PR #166](https://github.com/aws/aws-xray-sdk-go/pull/166) +* Fixes golint warnings. [PR #170](https://github.com/aws/aws-xray-sdk-go/pull/170) +* Added support for Git Actions. [PR #172](https://github.com/aws/aws-xray-sdk-go/pull/172) +* README update for presign request. [PR #176](https://github.com/aws/aws-xray-sdk-go/pull/176) +* Fix data races in testing. [PR #177](https://github.com/aws/aws-xray-sdk-go/pull/177) +* Fixes sampling issue in calling BeginSegment API directly. [PR #187](https://github.com/aws/aws-xray-sdk-go/pull/187) +* Captures error type from panic. [PR #195](https://github.com/aws/aws-xray-sdk-go/pull/195) +* Upgrades Sqlmock to 1.4.1 . [PR #190](https://github.com/aws/aws-xray-sdk-go/pull/190) +* Fixes data race in default sampling strategy. [PR #196](https://github.com/aws/aws-xray-sdk-go/pull/196) +* Added benchmark support to data races and performance issues. [PR #197](https://github.com/aws/aws-xray-sdk-go/pull/197) +* Upgrades Travis CI to add Go 1.14 . [PR #198](https://github.com/aws/aws-xray-sdk-go/pull/198) +* Fixes data race in emitter. [PR #200](https://github.com/aws/aws-xray-sdk-go/pull/200) + +### SDK Bugs +* Fixes break logging tools. [PR #185](https://github.com/aws/aws-xray-sdk-go/pull/185) +* Fixes memory leak in BeginSegment method. [PR #156](https://github.com/aws/aws-xray-sdk-go/pull/156) + Release v1.0.0-rc.14 (2019-09-03) ================================ ### SDK Enhancements diff --git a/xray/segment.go b/xray/segment.go index f0725c44..b3f6ffe1 100644 --- a/xray/segment.go +++ b/xray/segment.go @@ -54,25 +54,6 @@ func BeginFacadeSegment(ctx context.Context, name string, h *header.Header) (con return context.WithValue(ctx, ContextKey, seg), seg } -// Begin DummySegment creates a segment in the case of no sampling to reduce memory footprint -func BeginDummySegment(ctx context.Context, name string) (context.Context, *Segment) { - dummySeg := &Segment{parent: nil} - dummySeg.ParentSegment = dummySeg - logger.Debugf("Beginning dummy segment named %s", name) - - cfg := GetRecorder(ctx) - dummySeg.assignConfiguration(cfg) - - dummySeg.Lock() - defer dummySeg.Unlock() - - dummySeg.Name = name - dummySeg.TraceID = NewTraceID() - dummySeg.Sampled = false - - return context.WithValue(ctx, ContextKey, dummySeg), dummySeg -} - // BeginSegment creates a Segment for a given name and context. func BeginSegment(ctx context.Context, name string) (context.Context, *Segment) { @@ -135,11 +116,7 @@ func BeginSegmentWithSampling(ctx context.Context, name string, r *http.Request, }() } - if seg.Sampled { - return context.WithValue(ctx, ContextKey, seg), seg - } - - return BeginDummySegment(ctx, "DummySegment") + return context.WithValue(ctx, ContextKey, seg), seg } func basicSegment(name string, h *header.Header) *Segment { @@ -221,32 +198,6 @@ func (seg *Segment) assignConfiguration(cfg *Config) { seg.Unlock() } -// Begin DummySubSegment creates a subsegment in the case of no sampling to reduce memory footprint -func BeginDummySubSegment(ctx context.Context, name string) (context.Context, *Segment) { - parent := GetSegment(ctx) - if parent == nil { - cfg := GetRecorder(ctx) - failedMessage := fmt.Sprintf("failed to begin subsegment named '%v': segment cannot be found.", name) - if cfg != nil && cfg.ContextMissingStrategy != nil { - cfg.ContextMissingStrategy.ContextMissing(failedMessage) - } else { - globalCfg.ContextMissingStrategy().ContextMissing(failedMessage) - } - return ctx, nil - } - - dummySubSeg := &Segment{parent: parent} - logger.Debugf("Beginning dummy subsegment named %s", name) - - dummySubSeg.Lock() - defer dummySubSeg.Unlock() - - dummySubSeg.ParentSegment = parent.ParentSegment - dummySubSeg.Name = name - - return context.WithValue(ctx, ContextKey, dummySubSeg), dummySubSeg -} - // BeginSubsegment creates a subsegment for a given name and context. func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segment) { if len(name) > 200 { @@ -291,11 +242,7 @@ func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segmen seg.StartTime = float64(time.Now().UnixNano()) / float64(time.Second) seg.InProgress = true - if seg.ParentSegment.Sampled { - return context.WithValue(ctx, ContextKey, seg), seg - } - - return BeginDummySegment(ctx, "DummySubSegment") + return context.WithValue(ctx, ContextKey, seg), seg } // NewSegmentFromHeader creates a segment for downstream call and add information to the segment that gets from HTTP header.