Skip to content

Commit

Permalink
Optimize evictedQueue implementation and use (#2556)
Browse files Browse the repository at this point in the history
* Optimize evictedQueue impl and use

Avoid unnecessary allocations in the recordingSpan by using an
evictedQueue type instead of a pointer to one.

Lazy allocate the evictedQueue queue to prevent unnecessary operations
for spans without any use of the queue.

Document the evictedQueue

* Fix grammar
  • Loading branch information
MrAlias authored Jan 27, 2022
1 parent 310c7be commit d3bb038
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 10 deletions.
17 changes: 9 additions & 8 deletions sdk/trace/evictedqueue.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,25 @@

package trace // import "go.opentelemetry.io/otel/sdk/trace"

// evictedQueue is a FIFO queue with a configurable capacity.
type evictedQueue struct {
queue []interface{}
capacity int
droppedCount int
}

func newEvictedQueue(capacity int) *evictedQueue {
eq := &evictedQueue{
capacity: capacity,
queue: make([]interface{}, 0),
}

return eq
func newEvictedQueue(capacity int) evictedQueue {
// Do not pre-allocate queue, do this lazily.
return evictedQueue{capacity: capacity}
}

// add adds value to the evictedQueue eq. If eq is at capacity, the oldest
// queued value will be discarded and the drop count incremented.
func (eq *evictedQueue) add(value interface{}) {
if len(eq.queue) == eq.capacity {
eq.queue = eq.queue[1:]
// Drop first-in while avoiding allocating more capacity to eq.queue.
copy(eq.queue[:eq.capacity-1], eq.queue[1:])
eq.queue = eq.queue[:eq.capacity-1]
eq.droppedCount++
}
eq.queue = append(eq.queue, value)
Expand Down
4 changes: 2 additions & 2 deletions sdk/trace/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,10 @@ type recordingSpan struct {
attributes *attributesMap

// events are stored in FIFO queue capped by configured limit.
events *evictedQueue
events evictedQueue

// links are stored in FIFO queue capped by configured limit.
links *evictedQueue
links evictedQueue

// executionTracerTaskEnd ends the execution tracer span.
executionTracerTaskEnd func()
Expand Down

0 comments on commit d3bb038

Please sign in to comment.