Skip to content

Commit d7e0af4

Browse files
committed
fix linter and create persistent_queue_context
1 parent 700b678 commit d7e0af4

File tree

4 files changed

+544
-508
lines changed

4 files changed

+544
-508
lines changed

exporter/exporterhelper/internal/queuebatch/persistent_queue.go

Lines changed: 1 addition & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,18 @@ package queuebatch // import "go.opentelemetry.io/collector/exporter/exporterhel
66
import (
77
"context"
88
"encoding/binary"
9-
"encoding/hex"
109
"encoding/json"
1110
"errors"
1211
"fmt"
1312
"strconv"
1413
"sync"
1514

16-
"go.opentelemetry.io/otel/trace"
1715
"go.uber.org/zap"
1816

1917
"go.opentelemetry.io/collector/component"
2018
"go.opentelemetry.io/collector/exporter/exporterhelper/internal/experr"
2119
"go.opentelemetry.io/collector/exporter/exporterhelper/internal/request"
2220
"go.opentelemetry.io/collector/extension/xextension/storage"
23-
"go.opentelemetry.io/collector/featuregate"
2421
"go.opentelemetry.io/collector/pipeline"
2522
)
2623

@@ -37,24 +34,14 @@ const (
3734
// queueMetadataKey is the new single key for all queue metadata.
3835
// TODO: Enable when https://github.com/open-telemetry/opentelemetry-collector/issues/12890 is done
3936
//nolint:unused
40-
queueMetadataKey = "qmv0"
41-
errInvalidTraceFlagsLength = "trace flags must only be 1 byte"
37+
queueMetadataKey = "qmv0"
4238
)
4339

4440
var (
4541
errValueNotSet = errors.New("value not set")
4642
errInvalidValue = errors.New("invalid value")
4743
errNoStorageClient = errors.New("no storage client extension found")
4844
errWrongExtensionType = errors.New("requested extension is not a storage extension")
49-
50-
// persistRequestContextFeatureGate controls whether request context should be persisted in the queue.
51-
persistRequestContextFeatureGate = featuregate.GlobalRegistry().MustRegister(
52-
"exporter.PersistRequestContext",
53-
featuregate.StageAlpha,
54-
featuregate.WithRegisterFromVersion("v0.127.0"),
55-
featuregate.WithRegisterDescription("controls whether context should be stored alongside requests in the persistent queue"),
56-
featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector/pull/12934"),
57-
)
5845
)
5946

6047
var indexDonePool = sync.Pool{
@@ -258,80 +245,6 @@ func (pq *persistentQueue[T]) Offer(ctx context.Context, req T) error {
258245
return pq.putInternal(ctx, req)
259246
}
260247

261-
// necessary due to SpanContext and SpanContextConfig not supporting Unmarshal interface,
262-
// see https://github.com/open-telemetry/opentelemetry-go/issues/1819.
263-
type spanContext struct {
264-
TraceID string
265-
SpanID string
266-
TraceFlags string
267-
TraceState string
268-
Remote bool
269-
}
270-
271-
func localSpanContextFromTraceSpanContext(sc trace.SpanContext) spanContext {
272-
return spanContext{
273-
TraceID: sc.TraceID().String(),
274-
SpanID: sc.SpanID().String(),
275-
TraceFlags: sc.TraceFlags().String(),
276-
TraceState: sc.TraceState().String(),
277-
Remote: sc.IsRemote(),
278-
}
279-
}
280-
281-
func contextWithLocalSpanContext(ctx context.Context, sc spanContext) context.Context {
282-
traceID, err := trace.TraceIDFromHex(sc.TraceID)
283-
if err != nil {
284-
return ctx
285-
}
286-
spanID, err := trace.SpanIDFromHex(sc.SpanID)
287-
if err != nil {
288-
return ctx
289-
}
290-
traceFlags, err := traceFlagsFromHex(sc.TraceFlags)
291-
if err != nil {
292-
return ctx
293-
}
294-
traceState, err := trace.ParseTraceState(sc.TraceState)
295-
if err != nil {
296-
return ctx
297-
}
298-
299-
return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{
300-
TraceID: traceID,
301-
SpanID: spanID,
302-
TraceFlags: *traceFlags,
303-
TraceState: traceState,
304-
Remote: sc.Remote,
305-
}))
306-
}
307-
308-
// requestContext wraps trace.SpanContext to allow for unmarshaling as well as
309-
// future metadata key/value pairs to be added.
310-
type requestContext struct {
311-
SpanContext spanContext
312-
}
313-
314-
// reverse of code in trace library https://github.com/open-telemetry/opentelemetry-go/blob/v1.35.0/trace/trace.go#L143-L168
315-
func traceFlagsFromHex(hexStr string) (*trace.TraceFlags, error) {
316-
decoded, err := hex.DecodeString(hexStr)
317-
if err != nil {
318-
return nil, err
319-
}
320-
if len(decoded) != 1 {
321-
return nil, errors.New(errInvalidTraceFlagsLength)
322-
}
323-
traceFlags := trace.TraceFlags(decoded[0])
324-
return &traceFlags, nil
325-
}
326-
327-
func getAndMarshalSpanContext(ctx context.Context) ([]byte, error) {
328-
if !persistRequestContextFeatureGate.IsEnabled() {
329-
return nil, nil
330-
}
331-
rc := localSpanContextFromTraceSpanContext(trace.SpanContextFromContext(ctx))
332-
return json.Marshal(requestContext{SpanContext: rc})
333-
}
334-
335248
// putInternal is the internal version that requires caller to hold the mutex lock.
336249
func (pq *persistentQueue[T]) putInternal(ctx context.Context, req T) error {
337250
reqSize := pq.set.sizer.Sizeof(req)
@@ -668,10 +581,6 @@ func getItemKey(index uint64) string {
668581
return strconv.FormatUint(index, 10)
669582
}
670583

671-
func getContextKey(index uint64) string {
672-
return strconv.FormatUint(index, 10) + "_context"
673-
}
674-
675584
func itemIndexToBytes(value uint64) []byte {
676585
return binary.LittleEndian.AppendUint64([]byte{}, value)
677586
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package queuebatch // import "go.opentelemetry.io/collector/exporter/exporterhelper/internal/queuebatch"
5+
6+
import (
7+
"context"
8+
"encoding/hex"
9+
"encoding/json"
10+
"errors"
11+
"strconv"
12+
13+
"go.opentelemetry.io/otel/trace"
14+
15+
"go.opentelemetry.io/collector/featuregate"
16+
)
17+
18+
const (
19+
errInvalidTraceFlagsLength = "trace flags must only be 1 byte"
20+
)
21+
22+
// persistRequestContextFeatureGate controls whether request context should be persisted in the queue.
23+
var persistRequestContextFeatureGate = featuregate.GlobalRegistry().MustRegister(
24+
"exporter.PersistRequestContext",
25+
featuregate.StageAlpha,
26+
featuregate.WithRegisterFromVersion("v0.127.0"),
27+
featuregate.WithRegisterDescription("controls whether context should be stored alongside requests in the persistent queue"),
28+
featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector/pull/12934"),
29+
)
30+
31+
// necessary due to SpanContext and SpanContextConfig not supporting Unmarshal interface,
32+
// see https://github.com/open-telemetry/opentelemetry-go/issues/1819.
33+
type spanContext struct {
34+
TraceID string
35+
SpanID string
36+
TraceFlags string
37+
TraceState string
38+
Remote bool
39+
}
40+
41+
func localSpanContextFromTraceSpanContext(sc trace.SpanContext) spanContext {
42+
return spanContext{
43+
TraceID: sc.TraceID().String(),
44+
SpanID: sc.SpanID().String(),
45+
TraceFlags: sc.TraceFlags().String(),
46+
TraceState: sc.TraceState().String(),
47+
Remote: sc.IsRemote(),
48+
}
49+
}
50+
51+
func contextWithLocalSpanContext(ctx context.Context, sc spanContext) context.Context {
52+
traceID, err := trace.TraceIDFromHex(sc.TraceID)
53+
if err != nil {
54+
return ctx
55+
}
56+
spanID, err := trace.SpanIDFromHex(sc.SpanID)
57+
if err != nil {
58+
return ctx
59+
}
60+
traceFlags, err := traceFlagsFromHex(sc.TraceFlags)
61+
if err != nil {
62+
return ctx
63+
}
64+
traceState, err := trace.ParseTraceState(sc.TraceState)
65+
if err != nil {
66+
return ctx
67+
}
68+
69+
return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{
70+
TraceID: traceID,
71+
SpanID: spanID,
72+
TraceFlags: *traceFlags,
73+
TraceState: traceState,
74+
Remote: sc.Remote,
75+
}))
76+
}
77+
78+
// requestContext wraps trace.SpanContext to allow for unmarshaling as well as
79+
// future metadata key/value pairs to be added.
80+
type requestContext struct {
81+
SpanContext spanContext
82+
}
83+
84+
// reverse of code in trace library https://github.com/open-telemetry/opentelemetry-go/blob/v1.35.0/trace/trace.go#L143-L168
85+
func traceFlagsFromHex(hexStr string) (*trace.TraceFlags, error) {
86+
decoded, err := hex.DecodeString(hexStr)
87+
if err != nil {
88+
return nil, err
89+
}
90+
if len(decoded) != 1 {
91+
return nil, errors.New(errInvalidTraceFlagsLength)
92+
}
93+
traceFlags := trace.TraceFlags(decoded[0])
94+
return &traceFlags, nil
95+
}
96+
97+
func getAndMarshalSpanContext(ctx context.Context) ([]byte, error) {
98+
if !persistRequestContextFeatureGate.IsEnabled() {
99+
return nil, nil
100+
}
101+
rc := localSpanContextFromTraceSpanContext(trace.SpanContextFromContext(ctx))
102+
return json.Marshal(requestContext{SpanContext: rc})
103+
}
104+
105+
func getContextKey(index uint64) string {
106+
return strconv.FormatUint(index, 10) + "_context"
107+
}

0 commit comments

Comments
 (0)