forked from toolshed/abra
		
	
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright The OpenTelemetry Authors
 | 
						|
// SPDX-License-Identifier: Apache-2.0
 | 
						|
 | 
						|
package trace // import "go.opentelemetry.io/otel/sdk/trace"
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"encoding/binary"
 | 
						|
	"math/rand/v2"
 | 
						|
 | 
						|
	"go.opentelemetry.io/otel/trace"
 | 
						|
)
 | 
						|
 | 
						|
// IDGenerator allows custom generators for TraceID and SpanID.
 | 
						|
type IDGenerator interface {
 | 
						|
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
						|
	// must never be done outside of a new major release.
 | 
						|
 | 
						|
	// NewIDs returns a new trace and span ID.
 | 
						|
	NewIDs(ctx context.Context) (trace.TraceID, trace.SpanID)
 | 
						|
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
						|
	// must never be done outside of a new major release.
 | 
						|
 | 
						|
	// NewSpanID returns a ID for a new span in the trace with traceID.
 | 
						|
	NewSpanID(ctx context.Context, traceID trace.TraceID) trace.SpanID
 | 
						|
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
						|
	// must never be done outside of a new major release.
 | 
						|
}
 | 
						|
 | 
						|
type randomIDGenerator struct{}
 | 
						|
 | 
						|
var _ IDGenerator = &randomIDGenerator{}
 | 
						|
 | 
						|
// NewSpanID returns a non-zero span ID from a randomly-chosen sequence.
 | 
						|
func (gen *randomIDGenerator) NewSpanID(ctx context.Context, traceID trace.TraceID) trace.SpanID {
 | 
						|
	sid := trace.SpanID{}
 | 
						|
	for {
 | 
						|
		binary.NativeEndian.PutUint64(sid[:], rand.Uint64())
 | 
						|
		if sid.IsValid() {
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return sid
 | 
						|
}
 | 
						|
 | 
						|
// NewIDs returns a non-zero trace ID and a non-zero span ID from a
 | 
						|
// randomly-chosen sequence.
 | 
						|
func (gen *randomIDGenerator) NewIDs(ctx context.Context) (trace.TraceID, trace.SpanID) {
 | 
						|
	tid := trace.TraceID{}
 | 
						|
	sid := trace.SpanID{}
 | 
						|
	for {
 | 
						|
		binary.NativeEndian.PutUint64(tid[:8], rand.Uint64())
 | 
						|
		binary.NativeEndian.PutUint64(tid[8:], rand.Uint64())
 | 
						|
		if tid.IsValid() {
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
	for {
 | 
						|
		binary.NativeEndian.PutUint64(sid[:], rand.Uint64())
 | 
						|
		if sid.IsValid() {
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return tid, sid
 | 
						|
}
 | 
						|
 | 
						|
func defaultIDGenerator() IDGenerator {
 | 
						|
	return &randomIDGenerator{}
 | 
						|
}
 |