diff --git a/CHANGELOG.md b/CHANGELOG.md index 1acd31dd0..c3bc2c904 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 3.35.1 +### Fixed + - Security Agent Bug Hotfix: Do not update the security agent unti the go agent has completed its connect process [PR](https://github.com/newrelic/go-agent/pull/978) + - Faster Trace ID generation + - Community Member @ankon contributed [this change](https://github.com/newrelic/go-agent/pull/977) + +### Support statement +We use the latest version of the Go language. At minimum, you should be using no version of Go older than what is supported by the Go team themselves. +See the [Go agent EOL Policy](/docs/apm/agents/go-agent/get-started/go-agent-eol-policy) for details about supported versions of the Go agent and third-party components. + ## 3.35.0 ### Added - Enhanced security features (adds support for secure cookie even reporting) diff --git a/v3/internal/trace_id_generator.go b/v3/internal/trace_id_generator.go index 4a1f5ba9d..9892d0e4d 100644 --- a/v3/internal/trace_id_generator.go +++ b/v3/internal/trace_id_generator.go @@ -4,7 +4,6 @@ package internal import ( - "encoding/hex" "math/rand" "sync" ) @@ -39,6 +38,10 @@ const ( maxIDByteLen = 16 ) +const ( + hextable = "0123456789abcdef" +) + // GenerateTraceID creates a new trace identifier, which is a 32 character hex string. func (tg *TraceIDGenerator) GenerateTraceID() string { return tg.generateID(traceIDByteLen) @@ -50,9 +53,15 @@ func (tg *TraceIDGenerator) GenerateSpanID() string { } func (tg *TraceIDGenerator) generateID(len int) string { - var bits [maxIDByteLen]byte + var bits [maxIDByteLen * 2]byte tg.Lock() defer tg.Unlock() tg.rnd.Read(bits[:len]) - return hex.EncodeToString(bits[:len]) + + // In-place encode + for i := len - 1; i >= 0; i-- { + bits[i*2+1] = hextable[bits[i]&0x0f] + bits[i*2] = hextable[bits[i]>>4] + } + return string(bits[:len*2]) } diff --git a/v3/internal/trace_id_generator_test.go b/v3/internal/trace_id_generator_test.go index 570380259..aa786779d 100644 --- a/v3/internal/trace_id_generator_test.go +++ b/v3/internal/trace_id_generator_test.go @@ -32,3 +32,18 @@ func BenchmarkTraceIDGenerator(b *testing.B) { } } } + +func BenchmarkTraceIDGeneratorParallel(b *testing.B) { + tg := NewTraceIDGenerator(12345) + + b.ResetTimer() + b.ReportAllocs() + + b.RunParallel(func(p *testing.PB) { + for p.Next() { + if id := tg.GenerateSpanID(); id == "" { + b.Fatal(id) + } + } + }) +} diff --git a/v3/newrelic/version.go b/v3/newrelic/version.go index f3dfeb30d..eb4982544 100644 --- a/v3/newrelic/version.go +++ b/v3/newrelic/version.go @@ -11,7 +11,7 @@ import ( const ( // Version is the full string version of this Go Agent. - Version = "3.35.0" + Version = "3.35.1" ) var (