You've already forked opentelemetry-go
mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-09-16 09:26:25 +02:00
Centralize the retry package for the otlp exporters (#2427)
* Centralize the retry package for the otlp exporters * Add dependabot config * Use unified internal/retry module in otlp exporters * Remove otlpmetric and otlptrace internal/retry module * Run go mod tidy in otlp{metric,trace}
This commit is contained in:
10
.github/dependabot.yml
vendored
10
.github/dependabot.yml
vendored
@@ -266,6 +266,16 @@ updates:
|
||||
schedule:
|
||||
day: sunday
|
||||
interval: weekly
|
||||
-
|
||||
package-ecosystem: gomod
|
||||
directory: /exporters/otlp/internal/retry
|
||||
labels:
|
||||
- dependencies
|
||||
- go
|
||||
- "Skip Changelog"
|
||||
schedule:
|
||||
day: sunday
|
||||
interval: weekly
|
||||
-
|
||||
package-ecosystem: gomod
|
||||
directory: /exporters/otlp/otlptrace
|
||||
|
@@ -75,3 +75,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ./test
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -71,3 +71,5 @@ replace go.opentelemetry.io/otel/trace => ../../../trace
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../../exporters/otlp/internal/retry
|
||||
|
@@ -71,3 +71,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../opencensus/test
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -70,3 +70,5 @@ replace go.opentelemetry.io/otel/trace => ../../trace
|
||||
replace go.opentelemetry.io/otel/example/fib => ./
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -71,3 +71,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -74,3 +74,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -75,3 +75,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -74,3 +74,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -74,3 +74,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -73,3 +73,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -72,3 +72,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -30,8 +30,6 @@ replace go.opentelemetry.io/otel/example/zipkin => ../../example/zipkin
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/prometheus => ../prometheus
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp => ../otlp
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/jaeger => ./
|
||||
|
||||
replace go.opentelemetry.io/otel/internal/tools => ../../internal/tools
|
||||
@@ -75,3 +73,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../otlp/internal/retry
|
||||
|
72
exporters/otlp/internal/retry/go.mod
Normal file
72
exporters/otlp/internal/retry/go.mod
Normal file
@@ -0,0 +1,72 @@
|
||||
module go.opentelemetry.io/otel/exporters/otlp/internal/retry
|
||||
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/cenkalti/backoff/v4 v4.1.2
|
||||
github.com/stretchr/testify v1.7.0
|
||||
)
|
||||
|
||||
replace go.opentelemetry.io/otel => ../../../..
|
||||
|
||||
replace go.opentelemetry.io/otel/bridge/opencensus => ../../../../bridge/opencensus
|
||||
|
||||
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/opencensus/test
|
||||
|
||||
replace go.opentelemetry.io/otel/bridge/opentracing => ../../../../bridge/opentracing
|
||||
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/example/jaeger => ../../../../example/jaeger
|
||||
|
||||
replace go.opentelemetry.io/otel/example/namedtracer => ../../../../example/namedtracer
|
||||
|
||||
replace go.opentelemetry.io/otel/example/opencensus => ../../../../example/opencensus
|
||||
|
||||
replace go.opentelemetry.io/otel/example/otel-collector => ../../../../example/otel-collector
|
||||
|
||||
replace go.opentelemetry.io/otel/example/passthrough => ../../../../example/passthrough
|
||||
|
||||
replace go.opentelemetry.io/otel/example/prometheus => ../../../../example/prometheus
|
||||
|
||||
replace go.opentelemetry.io/otel/example/zipkin => ../../../../example/zipkin
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/jaeger => ../../../jaeger
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ./
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ../../otlpmetric
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc => ../../otlpmetric/otlpmetricgrpc
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp => ../../otlpmetric/otlpmetrichttp
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../../otlptrace
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => ../../otlptrace/otlptracegrpc
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp => ../../otlptrace/otlptracehttp
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/prometheus => ../../../prometheus
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/stdout/stdoutmetric => ../../../stdout/stdoutmetric
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../../stdout/stdouttrace
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/zipkin => ../../../zipkin
|
||||
|
||||
replace go.opentelemetry.io/otel/internal/metric => ../../../../internal/metric
|
||||
|
||||
replace go.opentelemetry.io/otel/internal/tools => ../../../../internal/tools
|
||||
|
||||
replace go.opentelemetry.io/otel/metric => ../../../../metric
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/sdk => ../../../../sdk
|
||||
|
||||
replace go.opentelemetry.io/otel/sdk/export/metric => ../../../../sdk/export/metric
|
||||
|
||||
replace go.opentelemetry.io/otel/sdk/metric => ../../../../sdk/metric
|
||||
|
||||
replace go.opentelemetry.io/otel/trace => ../../../../trace
|
13
exporters/otlp/internal/retry/go.sum
Normal file
13
exporters/otlp/internal/retry/go.sum
Normal file
@@ -0,0 +1,13 @@
|
||||
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
|
||||
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
@@ -12,7 +12,10 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package retry // import "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/retry"
|
||||
// Package retry provides request retry functionality that can perform
|
||||
// configurable exponential backoff for transient errors and honor any
|
||||
// explicit throttle responses received.
|
||||
package retry // import "go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -54,8 +57,18 @@ type RequestFunc func(context.Context, func(context.Context) error) error
|
||||
|
||||
// EvaluateFunc returns if an error is retry-able and if an explicit throttle
|
||||
// duration should be honored that was included in the error.
|
||||
//
|
||||
// The function must return true if the error argument is retry-able,
|
||||
// otherwise it must return false for the first return parameter.
|
||||
//
|
||||
// The function must return a non-zero time.Duration if the error contains
|
||||
// explicit throttle duration that should be honored, otherwise it must return
|
||||
// a zero valued time.Duration.
|
||||
type EvaluateFunc func(error) (bool, time.Duration)
|
||||
|
||||
// RequestFunc returns a RequestFunc using the evaluate function to determine
|
||||
// if requests can be retried and based on the exponential backoff
|
||||
// configuration of c.
|
||||
func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc {
|
||||
if !c.Enabled {
|
||||
return func(ctx context.Context, fn func(context.Context) error) error {
|
@@ -3,10 +3,10 @@ module go.opentelemetry.io/otel/exporters/otlp/otlpmetric
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/cenkalti/backoff/v4 v4.1.2
|
||||
github.com/google/go-cmp v0.5.6
|
||||
github.com/stretchr/testify v1.7.0
|
||||
go.opentelemetry.io/otel v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v0.0.0-00010101000000-000000000000
|
||||
go.opentelemetry.io/otel/metric v0.25.0
|
||||
go.opentelemetry.io/otel/sdk v1.2.0
|
||||
go.opentelemetry.io/otel/sdk/export/metric v0.25.0
|
||||
@@ -20,8 +20,6 @@ replace go.opentelemetry.io/otel => ../../..
|
||||
|
||||
replace go.opentelemetry.io/otel/sdk => ../../../sdk
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp => ../
|
||||
|
||||
replace go.opentelemetry.io/otel/metric => ../../../metric
|
||||
|
||||
replace go.opentelemetry.io/otel/trace => ../../../trace
|
||||
@@ -50,6 +48,8 @@ replace go.opentelemetry.io/otel/example/prometheus => ../../../example/promethe
|
||||
|
||||
replace go.opentelemetry.io/otel/example/zipkin => ../../../example/zipkin
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../internal/retry
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ./
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc => ./otlpmetricgrpc
|
||||
|
@@ -24,7 +24,7 @@ import (
|
||||
"google.golang.org/grpc/credentials"
|
||||
"google.golang.org/grpc/encoding/gzip"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@@ -26,9 +26,9 @@ import (
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/retry"
|
||||
colmetricpb "go.opentelemetry.io/proto/otlp/collector/metrics/v1"
|
||||
metricpb "go.opentelemetry.io/proto/otlp/metrics/v1"
|
||||
)
|
||||
|
@@ -5,6 +5,7 @@ go 1.16
|
||||
require (
|
||||
github.com/stretchr/testify v1.7.0
|
||||
go.opentelemetry.io/otel v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v0.0.0-00010101000000-000000000000
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.25.0
|
||||
go.opentelemetry.io/otel/metric v0.25.0
|
||||
go.opentelemetry.io/otel/sdk v1.2.0
|
||||
@@ -21,8 +22,6 @@ replace go.opentelemetry.io/otel/sdk => ../../../../sdk
|
||||
|
||||
replace go.opentelemetry.io/otel/sdk/metric => ../../../../sdk/metric
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp => ../..
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ../
|
||||
|
||||
replace go.opentelemetry.io/otel/metric => ../../../../metric
|
||||
@@ -80,3 +79,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/op
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry
|
||||
|
@@ -22,8 +22,8 @@ import (
|
||||
"google.golang.org/grpc/credentials"
|
||||
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/retry"
|
||||
)
|
||||
|
||||
// Option applies an option to the gRPC driver.
|
||||
|
@@ -31,9 +31,9 @@ import (
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/retry"
|
||||
colmetricpb "go.opentelemetry.io/proto/otlp/collector/metrics/v1"
|
||||
metricpb "go.opentelemetry.io/proto/otlp/metrics/v1"
|
||||
)
|
||||
|
@@ -4,6 +4,7 @@ go 1.16
|
||||
|
||||
require (
|
||||
github.com/stretchr/testify v1.7.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v0.0.0-00010101000000-000000000000
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.25.0
|
||||
go.opentelemetry.io/otel/sdk v1.2.0
|
||||
go.opentelemetry.io/proto/otlp v0.11.0
|
||||
@@ -16,8 +17,6 @@ replace go.opentelemetry.io/otel/sdk => ../../../../sdk
|
||||
|
||||
replace go.opentelemetry.io/otel/sdk/metric => ../../../../sdk/metric
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp => ../..
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ../
|
||||
|
||||
replace go.opentelemetry.io/otel/metric => ../../../../metric
|
||||
@@ -81,3 +80,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/op
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry
|
||||
|
@@ -18,8 +18,8 @@ import (
|
||||
"crypto/tls"
|
||||
"time"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/retry"
|
||||
)
|
||||
|
||||
// Compression describes the compression used for payloads sent to the
|
||||
|
@@ -3,10 +3,10 @@ module go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/cenkalti/backoff/v4 v4.1.2
|
||||
github.com/google/go-cmp v0.5.6
|
||||
github.com/stretchr/testify v1.7.0
|
||||
go.opentelemetry.io/otel v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v0.0.0-00010101000000-000000000000
|
||||
go.opentelemetry.io/otel/sdk v1.2.0
|
||||
go.opentelemetry.io/otel/trace v1.2.0
|
||||
go.opentelemetry.io/proto/otlp v0.11.0
|
||||
@@ -77,3 +77,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../bridge/openc
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../internal/retry
|
||||
|
@@ -24,7 +24,7 @@ import (
|
||||
"google.golang.org/grpc/credentials"
|
||||
"google.golang.org/grpc/encoding/gzip"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@@ -1,137 +0,0 @@
|
||||
// Copyright The OpenTelemetry Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package retry // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/cenkalti/backoff/v4"
|
||||
)
|
||||
|
||||
// DefaultConfig are the recommended defaults to use.
|
||||
var DefaultConfig = Config{
|
||||
Enabled: true,
|
||||
InitialInterval: 5 * time.Second,
|
||||
MaxInterval: 30 * time.Second,
|
||||
MaxElapsedTime: time.Minute,
|
||||
}
|
||||
|
||||
// Config defines configuration for retrying batches in case of export failure
|
||||
// using an exponential backoff.
|
||||
type Config struct {
|
||||
// Enabled indicates whether to not retry sending batches in case of
|
||||
// export failure.
|
||||
Enabled bool
|
||||
// InitialInterval the time to wait after the first failure before
|
||||
// retrying.
|
||||
InitialInterval time.Duration
|
||||
// MaxInterval is the upper bound on backoff interval. Once this value is
|
||||
// reached the delay between consecutive retries will always be
|
||||
// `MaxInterval`.
|
||||
MaxInterval time.Duration
|
||||
// MaxElapsedTime is the maximum amount of time (including retries) spent
|
||||
// trying to send a request/batch. Once this value is reached, the data
|
||||
// is discarded.
|
||||
MaxElapsedTime time.Duration
|
||||
}
|
||||
|
||||
// RequestFunc wraps a request with retry logic.
|
||||
type RequestFunc func(context.Context, func(context.Context) error) error
|
||||
|
||||
// EvaluateFunc returns if an error is retry-able and if an explicit throttle
|
||||
// duration should be honored that was included in the error.
|
||||
type EvaluateFunc func(error) (bool, time.Duration)
|
||||
|
||||
func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc {
|
||||
if !c.Enabled {
|
||||
return func(ctx context.Context, fn func(context.Context) error) error {
|
||||
return fn(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
// Do not use NewExponentialBackOff since it calls Reset and the code here
|
||||
// must call Reset after changing the InitialInterval (this saves an
|
||||
// unnecessary call to Now).
|
||||
b := &backoff.ExponentialBackOff{
|
||||
InitialInterval: c.InitialInterval,
|
||||
RandomizationFactor: backoff.DefaultRandomizationFactor,
|
||||
Multiplier: backoff.DefaultMultiplier,
|
||||
MaxInterval: c.MaxInterval,
|
||||
MaxElapsedTime: c.MaxElapsedTime,
|
||||
Stop: backoff.Stop,
|
||||
Clock: backoff.SystemClock,
|
||||
}
|
||||
b.Reset()
|
||||
|
||||
return func(ctx context.Context, fn func(context.Context) error) error {
|
||||
for {
|
||||
err := fn(ctx)
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
retryable, throttle := evaluate(err)
|
||||
if !retryable {
|
||||
return err
|
||||
}
|
||||
|
||||
bOff := b.NextBackOff()
|
||||
if bOff == backoff.Stop {
|
||||
return fmt.Errorf("max retry time elapsed: %w", err)
|
||||
}
|
||||
|
||||
// Wait for the greater of the backoff or throttle delay.
|
||||
var delay time.Duration
|
||||
if bOff > throttle {
|
||||
delay = bOff
|
||||
} else {
|
||||
elapsed := b.GetElapsedTime()
|
||||
if b.MaxElapsedTime != 0 && elapsed+throttle > b.MaxElapsedTime {
|
||||
return fmt.Errorf("max retry time would elapse: %w", err)
|
||||
}
|
||||
delay = throttle
|
||||
}
|
||||
|
||||
if err := waitFunc(ctx, delay); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Allow override for testing.
|
||||
var waitFunc = wait
|
||||
|
||||
func wait(ctx context.Context, delay time.Duration) error {
|
||||
timer := time.NewTimer(delay)
|
||||
defer timer.Stop()
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
// Handle the case where the timer and context deadline end
|
||||
// simultaneously by prioritizing the timer expiration nil value
|
||||
// response.
|
||||
select {
|
||||
case <-timer.C:
|
||||
default:
|
||||
return ctx.Err()
|
||||
}
|
||||
case <-timer.C:
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
@@ -1,197 +0,0 @@
|
||||
// Copyright The OpenTelemetry Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package retry
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestWait(t *testing.T) {
|
||||
tests := []struct {
|
||||
ctx context.Context
|
||||
delay time.Duration
|
||||
expected error
|
||||
}{
|
||||
{
|
||||
ctx: context.Background(),
|
||||
delay: time.Duration(0),
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
ctx: context.Background(),
|
||||
delay: time.Duration(1),
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
ctx: context.Background(),
|
||||
delay: time.Duration(-1),
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
ctx: func() context.Context {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
return ctx
|
||||
}(),
|
||||
// Ensure the timer and context do not end simultaneously.
|
||||
delay: 1 * time.Hour,
|
||||
expected: context.Canceled,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
assert.Equal(t, test.expected, wait(test.ctx, test.delay))
|
||||
}
|
||||
}
|
||||
|
||||
func TestNonRetryableError(t *testing.T) {
|
||||
ev := func(error) (bool, time.Duration) { return false, 0 }
|
||||
|
||||
reqFunc := Config{
|
||||
Enabled: true,
|
||||
InitialInterval: 1 * time.Nanosecond,
|
||||
MaxInterval: 1 * time.Nanosecond,
|
||||
// Never stop retrying.
|
||||
MaxElapsedTime: 0,
|
||||
}.RequestFunc(ev)
|
||||
ctx := context.Background()
|
||||
assert.NoError(t, reqFunc(ctx, func(context.Context) error {
|
||||
return nil
|
||||
}))
|
||||
assert.ErrorIs(t, reqFunc(ctx, func(context.Context) error {
|
||||
return assert.AnError
|
||||
}), assert.AnError)
|
||||
}
|
||||
|
||||
func TestThrottledRetry(t *testing.T) {
|
||||
// Ensure the throttle delay is used by making longer than backoff delay.
|
||||
throttleDelay, backoffDelay := time.Second, time.Nanosecond
|
||||
|
||||
ev := func(error) (bool, time.Duration) {
|
||||
// Retry everything with a throttle delay.
|
||||
return true, throttleDelay
|
||||
}
|
||||
|
||||
reqFunc := Config{
|
||||
Enabled: true,
|
||||
InitialInterval: backoffDelay,
|
||||
MaxInterval: backoffDelay,
|
||||
// Never stop retrying.
|
||||
MaxElapsedTime: 0,
|
||||
}.RequestFunc(ev)
|
||||
|
||||
origWait := waitFunc
|
||||
var done bool
|
||||
waitFunc = func(_ context.Context, delay time.Duration) error {
|
||||
assert.Equal(t, throttleDelay, delay, "retry not throttled")
|
||||
// Try twice to ensure call is attempted again after delay.
|
||||
if done {
|
||||
return assert.AnError
|
||||
}
|
||||
done = true
|
||||
return nil
|
||||
}
|
||||
defer func() { waitFunc = origWait }()
|
||||
|
||||
ctx := context.Background()
|
||||
assert.ErrorIs(t, reqFunc(ctx, func(context.Context) error {
|
||||
return errors.New("not this error")
|
||||
}), assert.AnError)
|
||||
}
|
||||
|
||||
func TestBackoffRetry(t *testing.T) {
|
||||
ev := func(error) (bool, time.Duration) { return true, 0 }
|
||||
|
||||
delay := time.Nanosecond
|
||||
reqFunc := Config{
|
||||
Enabled: true,
|
||||
InitialInterval: delay,
|
||||
MaxInterval: delay,
|
||||
// Never stop retrying.
|
||||
MaxElapsedTime: 0,
|
||||
}.RequestFunc(ev)
|
||||
|
||||
origWait := waitFunc
|
||||
var done bool
|
||||
waitFunc = func(_ context.Context, d time.Duration) error {
|
||||
assert.Equal(t, delay, d, "retry not backoffed")
|
||||
// Try twice to ensure call is attempted again after delay.
|
||||
if done {
|
||||
return assert.AnError
|
||||
}
|
||||
done = true
|
||||
return nil
|
||||
}
|
||||
defer func() { waitFunc = origWait }()
|
||||
|
||||
ctx := context.Background()
|
||||
assert.ErrorIs(t, reqFunc(ctx, func(context.Context) error {
|
||||
return errors.New("not this error")
|
||||
}), assert.AnError)
|
||||
}
|
||||
|
||||
func TestThrottledRetryGreaterThanMaxElapsedTime(t *testing.T) {
|
||||
// Ensure the throttle delay is used by making longer than backoff delay.
|
||||
tDelay, bDelay := time.Hour, time.Nanosecond
|
||||
ev := func(error) (bool, time.Duration) { return true, tDelay }
|
||||
reqFunc := Config{
|
||||
Enabled: true,
|
||||
InitialInterval: bDelay,
|
||||
MaxInterval: bDelay,
|
||||
MaxElapsedTime: tDelay - (time.Nanosecond),
|
||||
}.RequestFunc(ev)
|
||||
|
||||
ctx := context.Background()
|
||||
assert.Contains(t, reqFunc(ctx, func(context.Context) error {
|
||||
return assert.AnError
|
||||
}).Error(), "max retry time would elapse: ")
|
||||
}
|
||||
|
||||
func TestMaxElapsedTime(t *testing.T) {
|
||||
ev := func(error) (bool, time.Duration) { return true, 0 }
|
||||
delay := time.Nanosecond
|
||||
reqFunc := Config{
|
||||
Enabled: true,
|
||||
// InitialInterval > MaxElapsedTime means immediate return.
|
||||
InitialInterval: 2 * delay,
|
||||
MaxElapsedTime: delay,
|
||||
}.RequestFunc(ev)
|
||||
|
||||
ctx := context.Background()
|
||||
assert.Contains(t, reqFunc(ctx, func(context.Context) error {
|
||||
return assert.AnError
|
||||
}).Error(), "max retry time elapsed: ")
|
||||
}
|
||||
|
||||
func TestRetryNotEnabled(t *testing.T) {
|
||||
ev := func(error) (bool, time.Duration) {
|
||||
t.Error("evaluated retry when not enabled")
|
||||
return false, 0
|
||||
}
|
||||
|
||||
reqFunc := Config{}.RequestFunc(ev)
|
||||
ctx := context.Background()
|
||||
assert.NoError(t, reqFunc(ctx, func(context.Context) error {
|
||||
return nil
|
||||
}))
|
||||
assert.ErrorIs(t, reqFunc(ctx, func(context.Context) error {
|
||||
return assert.AnError
|
||||
}), assert.AnError)
|
||||
}
|
@@ -26,9 +26,9 @@ import (
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
||||
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||
)
|
||||
|
@@ -5,6 +5,7 @@ go 1.16
|
||||
require (
|
||||
github.com/stretchr/testify v1.7.0
|
||||
go.opentelemetry.io/otel v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v0.0.0-00010101000000-000000000000
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.2.0
|
||||
go.opentelemetry.io/otel/sdk v1.2.0
|
||||
go.opentelemetry.io/proto/otlp v0.11.0
|
||||
@@ -77,3 +78,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/op
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry
|
||||
|
@@ -22,8 +22,8 @@ import (
|
||||
"google.golang.org/grpc/credentials"
|
||||
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
||||
)
|
||||
|
||||
// Option applies an option to the gRPC driver.
|
||||
|
@@ -31,9 +31,9 @@ import (
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
||||
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||
)
|
||||
|
@@ -5,6 +5,7 @@ go 1.16
|
||||
require (
|
||||
github.com/stretchr/testify v1.7.0
|
||||
go.opentelemetry.io/otel v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v0.0.0-00010101000000-000000000000
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.2.0
|
||||
go.opentelemetry.io/otel/sdk v1.2.0
|
||||
go.opentelemetry.io/otel/trace v1.2.0
|
||||
@@ -75,3 +76,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/op
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry
|
||||
|
@@ -18,8 +18,8 @@ import (
|
||||
"crypto/tls"
|
||||
"time"
|
||||
|
||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
||||
)
|
||||
|
||||
// Compression describes the compression used for payloads sent to the
|
||||
|
@@ -34,8 +34,6 @@ replace go.opentelemetry.io/otel/example/prometheus => ../../example/prometheus
|
||||
|
||||
replace go.opentelemetry.io/otel/example/zipkin => ../../example/zipkin
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp => ../otlp
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../otlp/otlptrace
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => ../otlp/otlptrace/otlptracegrpc
|
||||
@@ -77,3 +75,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../otlp/internal/retry
|
||||
|
@@ -75,3 +75,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../bridge/openc
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../otlp/internal/retry
|
||||
|
@@ -73,3 +73,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../bridge/openc
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../otlp/internal/retry
|
||||
|
@@ -31,8 +31,6 @@ replace go.opentelemetry.io/otel/example/zipkin => ../../example/zipkin
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/prometheus => ../prometheus
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp => ../otlp
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/jaeger => ../jaeger
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/zipkin => ./
|
||||
@@ -76,3 +74,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../otlp/internal/retry
|
||||
|
2
go.mod
2
go.mod
@@ -73,3 +73,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ./bridge/opencensus/t
|
||||
replace go.opentelemetry.io/otel/example/fib => ./example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ./schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ./exporters/otlp/internal/retry
|
||||
|
@@ -71,3 +71,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -78,3 +78,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -72,3 +72,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../bridge/opencensus/
|
||||
replace go.opentelemetry.io/otel/example/fib => ../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../exporters/otlp/internal/retry
|
||||
|
@@ -69,3 +69,5 @@ replace go.opentelemetry.io/otel/sdk/export/metric => ../sdk/export/metric
|
||||
replace go.opentelemetry.io/otel/sdk/metric => ../sdk/metric
|
||||
|
||||
replace go.opentelemetry.io/otel/trace => ../trace
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../exporters/otlp/internal/retry
|
||||
|
@@ -72,3 +72,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../bridge/openc
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../../exporters/otlp/internal/retry
|
||||
|
@@ -73,3 +73,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../bridge/opencensus/
|
||||
replace go.opentelemetry.io/otel/example/fib => ../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../exporters/otlp/internal/retry
|
||||
|
@@ -75,3 +75,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../bridge/opencens
|
||||
replace go.opentelemetry.io/otel/example/fib => ../../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
|
||||
|
@@ -71,3 +71,5 @@ replace go.opentelemetry.io/otel/bridge/opencensus/test => ../bridge/opencensus/
|
||||
replace go.opentelemetry.io/otel/example/fib => ../example/fib
|
||||
|
||||
replace go.opentelemetry.io/otel/schema => ../schema
|
||||
|
||||
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../exporters/otlp/internal/retry
|
||||
|
Reference in New Issue
Block a user