Skip to content

Commit 71bb4b0

Browse files
authored
Updates to OTel-Arrow v0.24.0 deps (#33518)
**Description:** This is a copy of the otel-arrow repository exporter and receiver components at open-telemetry/otel-arrow@dd6e224 Updates both go.mods to OTel-Arrow v0.24.0 dependencies, the current release. Applies repo-specific `make gci` logic. **Link to tracking Issue:** #26491
1 parent 7519485 commit 71bb4b0

File tree

22 files changed

+1014
-339
lines changed

22 files changed

+1014
-339
lines changed

.chloggen/otel-arrow-v024.yaml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
7+
component: OTel-Arrow
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Update to OTel-Arrow v0.24.0
11+
12+
# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
13+
issues: [26491]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext:
19+
20+
# If your change doesn't affect end users or the exported elements of any package,
21+
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
22+
# Optional: The change log or logs in which this entry should be included.
23+
# e.g. '[user]' or '[user, api]'
24+
# Include 'user' if the change is relevant to end users.
25+
# Include 'api' if there is a change to a library API.
26+
# Default: '[user]'
27+
change_logs: [user]

exporter/otelarrowexporter/go.mod

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/otelar
33
go 1.21.0
44

55
require (
6-
github.com/apache/arrow/go/v14 v14.0.2
6+
github.com/apache/arrow/go/v16 v16.1.0
77
github.com/open-telemetry/otel-arrow v0.24.0
8-
github.com/open-telemetry/otel-arrow/collector v0.23.0
8+
github.com/open-telemetry/otel-arrow/collector v0.24.0
99
github.com/stretchr/testify v1.9.0
1010
go.opentelemetry.io/collector v0.102.2-0.20240611143128-7dfb57b9ad1c
1111
go.opentelemetry.io/collector/component v0.102.2-0.20240611143128-7dfb57b9ad1c
@@ -36,7 +36,6 @@ require (
3636

3737
require (
3838
github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect
39-
github.com/apache/arrow/go/v16 v16.1.0 // indirect
4039
github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc // indirect
4140
github.com/beorn7/perks v1.0.1 // indirect
4241
github.com/cenkalti/backoff/v4 v4.3.0 // indirect

exporter/otelarrowexporter/go.sum

Lines changed: 2 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

exporter/otelarrowexporter/internal/arrow/bestofn.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import (
88
"math/rand"
99
"runtime"
1010
"sort"
11+
"time"
12+
13+
"google.golang.org/grpc/codes"
14+
"google.golang.org/grpc/status"
1115
)
1216

1317
// bestOfNPrioritizer is a prioritizer that selects a less-loaded stream to write.
@@ -42,16 +46,17 @@ type streamSorter struct {
4246

4347
var _ streamPrioritizer = &bestOfNPrioritizer{}
4448

45-
func newBestOfNPrioritizer(dc doneCancel, numChoices, numStreams int, lf loadFunc) (*bestOfNPrioritizer, []*streamWorkState) {
49+
func newBestOfNPrioritizer(dc doneCancel, numChoices, numStreams int, lf loadFunc, maxLifetime time.Duration) (*bestOfNPrioritizer, []*streamWorkState) {
4650
var state []*streamWorkState
4751

4852
// Limit numChoices to the number of streams.
4953
numChoices = min(numStreams, numChoices)
5054

5155
for i := 0; i < numStreams; i++ {
5256
ws := &streamWorkState{
53-
waiters: map[int64]chan<- error{},
54-
toWrite: make(chan writeItem, 1),
57+
maxStreamLifetime: addJitter(maxLifetime),
58+
waiters: map[int64]chan<- error{},
59+
toWrite: make(chan writeItem, 1),
5560
}
5661

5762
state = append(state, ws)
@@ -112,7 +117,7 @@ func (lp *bestOfNPrioritizer) sendAndWait(ctx context.Context, errCh <-chan erro
112117
case <-lp.done:
113118
return ErrStreamRestarting
114119
case <-ctx.Done():
115-
return context.Canceled
120+
return status.Errorf(codes.Canceled, "stream wait: %v", ctx.Err())
116121
case lp.input <- wri:
117122
return waitForWrite(ctx, errCh, lp.done)
118123
}

exporter/otelarrowexporter/internal/arrow/exporter.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import (
2020
"go.opentelemetry.io/collector/pdata/ptrace"
2121
"go.uber.org/zap"
2222
"google.golang.org/grpc"
23+
"google.golang.org/grpc/codes"
2324
"google.golang.org/grpc/credentials"
25+
"google.golang.org/grpc/status"
2426
)
2527

2628
// Exporter is 1:1 with exporter, isolates arrow-specific
@@ -32,9 +34,7 @@ type Exporter struct {
3234
// prioritizerName the name of a balancer policy.
3335
prioritizerName PrioritizerName
3436

35-
// maxStreamLifetime is a limit on duration for streams. A
36-
// slight "jitter" is applied relative to this value on a
37-
// per-stream basis.
37+
// maxStreamLifetime is a limit on duration for streams.
3838
maxStreamLifetime time.Duration
3939

4040
// disableDowngrade prevents downgrade from occurring, supports
@@ -156,7 +156,7 @@ func (e *Exporter) Start(ctx context.Context) error {
156156
downCtx, downDc := newDoneCancel(ctx)
157157

158158
var sws []*streamWorkState
159-
e.ready, sws = newStreamPrioritizer(downDc, e.prioritizerName, e.numStreams)
159+
e.ready, sws = newStreamPrioritizer(downDc, e.prioritizerName, e.numStreams, e.maxStreamLifetime)
160160

161161
for _, ws := range sws {
162162
e.startArrowStream(downCtx, ws)
@@ -236,7 +236,6 @@ func (e *Exporter) runArrowStream(ctx context.Context, dc doneCancel, state *str
236236
producer := e.newProducer()
237237

238238
stream := newStream(producer, e.ready, e.telemetry, e.netReporter, state)
239-
stream.maxStreamLifetime = addJitter(e.maxStreamLifetime)
240239

241240
defer func() {
242241
if err := producer.Close(); err != nil {
@@ -258,6 +257,14 @@ func (e *Exporter) runArrowStream(ctx context.Context, dc doneCancel, state *str
258257
//
259258
// consumer should fall back to standard OTLP, (true, nil)
260259
func (e *Exporter) SendAndWait(ctx context.Context, data any) (bool, error) {
260+
// If the incoming context is already canceled, return the
261+
// same error condition a unary gRPC or HTTP exporter would do.
262+
select {
263+
case <-ctx.Done():
264+
return false, status.Errorf(codes.Canceled, "context done before send: %v", ctx.Err())
265+
default:
266+
}
267+
261268
errCh := make(chan error, 1)
262269

263270
// Note that if the OTLP exporter's gRPC Headers field was
@@ -343,7 +350,7 @@ func waitForWrite(ctx context.Context, errCh <-chan error, down <-chan struct{})
343350
select {
344351
case <-ctx.Done():
345352
// This caller's context timed out.
346-
return ctx.Err()
353+
return status.Errorf(codes.Canceled, "send wait: %v", ctx.Err())
347354
case <-down:
348355
return ErrStreamRestarting
349356
case err := <-errCh:

exporter/otelarrowexporter/internal/arrow/exporter_test.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package arrow
66
import (
77
"context"
88
"encoding/json"
9-
"errors"
109
"fmt"
1110
"sync"
1211
"sync/atomic"
@@ -31,7 +30,9 @@ import (
3130
"go.uber.org/zap/zaptest"
3231
"golang.org/x/net/http2/hpack"
3332
"google.golang.org/grpc"
33+
"google.golang.org/grpc/codes"
3434
"google.golang.org/grpc/metadata"
35+
"google.golang.org/grpc/status"
3536
)
3637

3738
var AllPrioritizers = []PrioritizerName{LeastLoadedPrioritizer, LeastLoadedTwoPrioritizer}
@@ -278,7 +279,18 @@ func TestArrowExporterTimeout(t *testing.T) {
278279
sent, err := tc.exporter.SendAndWait(ctx, twoTraces)
279280
require.True(t, sent)
280281
require.Error(t, err)
281-
require.True(t, errors.Is(err, context.Canceled))
282+
283+
stat, is := status.FromError(err)
284+
require.True(t, is, "is a gRPC status")
285+
require.Equal(t, codes.Canceled, stat.Code())
286+
287+
// Repeat the request, will get immediate timeout.
288+
sent, err = tc.exporter.SendAndWait(ctx, twoTraces)
289+
require.False(t, sent)
290+
stat, is = status.FromError(err)
291+
require.True(t, is, "is a gRPC status error: %v", err)
292+
require.Equal(t, "context done before send: context canceled", stat.Message())
293+
require.Equal(t, codes.Canceled, stat.Code())
282294

283295
require.NoError(t, tc.exporter.Shutdown(ctx))
284296
})
@@ -406,7 +418,10 @@ func TestArrowExporterConnectTimeout(t *testing.T) {
406418
}()
407419
_, err := tc.exporter.SendAndWait(ctx, twoTraces)
408420
require.Error(t, err)
409-
require.True(t, errors.Is(err, context.Canceled))
421+
422+
stat, is := status.FromError(err)
423+
require.True(t, is, "is a gRPC status error: %v", err)
424+
require.Equal(t, codes.Canceled, stat.Code())
410425

411426
require.NoError(t, tc.exporter.Shutdown(bg))
412427
})
@@ -489,7 +504,10 @@ func TestArrowExporterStreamRace(t *testing.T) {
489504
// This blocks until the cancelation.
490505
_, err := tc.exporter.SendAndWait(callctx, twoTraces)
491506
require.Error(t, err)
492-
require.True(t, errors.Is(err, context.Canceled))
507+
508+
stat, is := status.FromError(err)
509+
require.True(t, is, "is a gRPC status error: %v", err)
510+
require.Equal(t, codes.Canceled, stat.Code())
493511
}()
494512
}
495513

exporter/otelarrowexporter/internal/arrow/prioritizer.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"strconv"
1010
"strings"
11+
"time"
1112

1213
"go.opentelemetry.io/collector/component"
1314
"google.golang.org/grpc/codes"
@@ -50,18 +51,18 @@ type streamWriter interface {
5051
sendAndWait(context.Context, <-chan error, writeItem) error
5152
}
5253

53-
func newStreamPrioritizer(dc doneCancel, name PrioritizerName, numStreams int) (streamPrioritizer, []*streamWorkState) {
54+
func newStreamPrioritizer(dc doneCancel, name PrioritizerName, numStreams int, maxLifetime time.Duration) (streamPrioritizer, []*streamWorkState) {
5455
if name == unsetPrioritizer {
5556
name = DefaultPrioritizer
5657
}
5758
if strings.HasPrefix(string(name), llPrefix) {
5859
// error was checked and reported in Validate
5960
n, err := strconv.Atoi(string(name[len(llPrefix):]))
6061
if err == nil {
61-
return newBestOfNPrioritizer(dc, n, numStreams, pendingRequests)
62+
return newBestOfNPrioritizer(dc, n, numStreams, pendingRequests, maxLifetime)
6263
}
6364
}
64-
return newBestOfNPrioritizer(dc, numStreams, numStreams, pendingRequests)
65+
return newBestOfNPrioritizer(dc, numStreams, numStreams, pendingRequests, maxLifetime)
6566
}
6667

6768
// pendingRequests is the load function used by leastloadedN.

0 commit comments

Comments
 (0)