You've already forked opentelemetry-go
mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-06-23 00:07:52 +02:00
Add the golines
golangci-lint formatter (#6513)
Ensure consistent line wrapping (<= 120 characters) within the project.
This commit is contained in:
@ -235,10 +235,13 @@ formatters:
|
|||||||
enable:
|
enable:
|
||||||
- gofumpt
|
- gofumpt
|
||||||
- goimports
|
- goimports
|
||||||
|
- golines
|
||||||
settings:
|
settings:
|
||||||
goimports:
|
goimports:
|
||||||
local-prefixes:
|
local-prefixes:
|
||||||
- go.opentelemetry.io
|
- go.opentelemetry.io
|
||||||
|
golines:
|
||||||
|
max-len: 120
|
||||||
exclusions:
|
exclusions:
|
||||||
generated: lax
|
generated: lax
|
||||||
paths:
|
paths:
|
||||||
|
@ -43,14 +43,47 @@ func TestSetDedup(t *testing.T) {
|
|||||||
cases := []testCase{
|
cases := []testCase{
|
||||||
expect("A=B", attribute.String("A", "2"), attribute.String("A", "B")),
|
expect("A=B", attribute.String("A", "2"), attribute.String("A", "B")),
|
||||||
expect("A=B", attribute.String("A", "2"), attribute.Int("A", 1), attribute.String("A", "B")),
|
expect("A=B", attribute.String("A", "2"), attribute.Int("A", 1), attribute.String("A", "B")),
|
||||||
expect("A=B", attribute.String("A", "B"), attribute.String("A", "C"), attribute.String("A", "D"), attribute.String("A", "B")),
|
expect(
|
||||||
|
"A=B",
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
attribute.String("A", "C"),
|
||||||
|
attribute.String("A", "D"),
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
),
|
||||||
|
|
||||||
expect("A=B,C=D", attribute.String("A", "1"), attribute.String("C", "D"), attribute.String("A", "B")),
|
expect("A=B,C=D", attribute.String("A", "1"), attribute.String("C", "D"), attribute.String("A", "B")),
|
||||||
expect("A=B,C=D", attribute.String("A", "2"), attribute.String("A", "B"), attribute.String("C", "D")),
|
expect("A=B,C=D", attribute.String("A", "2"), attribute.String("A", "B"), attribute.String("C", "D")),
|
||||||
expect("A=B,C=D", attribute.Float64("C", 1.2), attribute.String("A", "2"), attribute.String("A", "B"), attribute.String("C", "D")),
|
expect(
|
||||||
expect("A=B,C=D", attribute.String("C", "D"), attribute.String("A", "B"), attribute.String("A", "C"), attribute.String("A", "D"), attribute.String("A", "B")),
|
"A=B,C=D",
|
||||||
expect("A=B,C=D", attribute.String("A", "B"), attribute.String("C", "D"), attribute.String("A", "C"), attribute.String("A", "D"), attribute.String("A", "B")),
|
attribute.Float64("C", 1.2),
|
||||||
expect("A=B,C=D", attribute.String("A", "B"), attribute.String("A", "C"), attribute.String("A", "D"), attribute.String("A", "B"), attribute.String("C", "D")),
|
attribute.String("A", "2"),
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
attribute.String("C", "D"),
|
||||||
|
),
|
||||||
|
expect(
|
||||||
|
"A=B,C=D",
|
||||||
|
attribute.String("C", "D"),
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
attribute.String("A", "C"),
|
||||||
|
attribute.String("A", "D"),
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
),
|
||||||
|
expect(
|
||||||
|
"A=B,C=D",
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
attribute.String("C", "D"),
|
||||||
|
attribute.String("A", "C"),
|
||||||
|
attribute.String("A", "D"),
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
),
|
||||||
|
expect(
|
||||||
|
"A=B,C=D",
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
attribute.String("A", "C"),
|
||||||
|
attribute.String("A", "D"),
|
||||||
|
attribute.String("A", "B"),
|
||||||
|
attribute.String("C", "D"),
|
||||||
|
),
|
||||||
}
|
}
|
||||||
enc := attribute.DefaultEncoder()
|
enc := attribute.DefaultEncoder()
|
||||||
|
|
||||||
|
@ -1173,7 +1173,9 @@ func BenchmarkParse(b *testing.B) {
|
|||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
benchBaggage, _ = Parse("userId=alice,serverNode = DF28 , isProduction = false,hasProp=stuff;propKey;propWValue=value, invalidUtf8=pr%ffo%ffp%fcValue")
|
benchBaggage, _ = Parse(
|
||||||
|
"userId=alice,serverNode = DF28 , isProduction = false,hasProp=stuff;propKey;propWValue=value, invalidUtf8=pr%ffo%ffp%fcValue",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,11 @@ func TestAttributesFromMap(t *testing.T) {
|
|||||||
gotAttributeSet := attribute.NewSet(got...)
|
gotAttributeSet := attribute.NewSet(got...)
|
||||||
wantAttributeSet := attribute.NewSet(want...)
|
wantAttributeSet := attribute.NewSet(want...)
|
||||||
if !gotAttributeSet.Equals(&wantAttributeSet) {
|
if !gotAttributeSet.Equals(&wantAttributeSet) {
|
||||||
t.Errorf("Attributes conversion want %v, got %v", wantAttributeSet.Encoded(attribute.DefaultEncoder()), gotAttributeSet.Encoded(attribute.DefaultEncoder()))
|
t.Errorf(
|
||||||
|
"Attributes conversion want %v, got %v",
|
||||||
|
wantAttributeSet.Encoded(attribute.DefaultEncoder()),
|
||||||
|
gotAttributeSet.Encoded(attribute.DefaultEncoder()),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@ var (
|
|||||||
errNegativeCount = errors.New("distribution or summary count is negative")
|
errNegativeCount = errors.New("distribution or summary count is negative")
|
||||||
errNegativeBucketCount = errors.New("distribution bucket count is negative")
|
errNegativeBucketCount = errors.New("distribution bucket count is negative")
|
||||||
errMismatchedAttributeKeyValues = errors.New("mismatched number of attribute keys and values")
|
errMismatchedAttributeKeyValues = errors.New("mismatched number of attribute keys and values")
|
||||||
errInvalidExemplarSpanContext = errors.New("span context exemplar attachment does not contain an OpenCensus SpanContext")
|
errInvalidExemplarSpanContext = errors.New(
|
||||||
|
"span context exemplar attachment does not contain an OpenCensus SpanContext",
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConvertMetrics converts metric data from OpenCensus to OpenTelemetry.
|
// ConvertMetrics converts metric data from OpenCensus to OpenTelemetry.
|
||||||
@ -76,20 +78,29 @@ func convertAggregation(metric *ocmetricdata.Metric) (metricdata.Aggregation, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
// convertGauge converts an OpenCensus gauge to an OpenTelemetry gauge aggregation.
|
// convertGauge converts an OpenCensus gauge to an OpenTelemetry gauge aggregation.
|
||||||
func convertGauge[N int64 | float64](labelKeys []ocmetricdata.LabelKey, ts []*ocmetricdata.TimeSeries) (metricdata.Gauge[N], error) {
|
func convertGauge[N int64 | float64](
|
||||||
|
labelKeys []ocmetricdata.LabelKey,
|
||||||
|
ts []*ocmetricdata.TimeSeries,
|
||||||
|
) (metricdata.Gauge[N], error) {
|
||||||
points, err := convertNumberDataPoints[N](labelKeys, ts)
|
points, err := convertNumberDataPoints[N](labelKeys, ts)
|
||||||
return metricdata.Gauge[N]{DataPoints: points}, err
|
return metricdata.Gauge[N]{DataPoints: points}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertSum converts an OpenCensus cumulative to an OpenTelemetry sum aggregation.
|
// convertSum converts an OpenCensus cumulative to an OpenTelemetry sum aggregation.
|
||||||
func convertSum[N int64 | float64](labelKeys []ocmetricdata.LabelKey, ts []*ocmetricdata.TimeSeries) (metricdata.Sum[N], error) {
|
func convertSum[N int64 | float64](
|
||||||
|
labelKeys []ocmetricdata.LabelKey,
|
||||||
|
ts []*ocmetricdata.TimeSeries,
|
||||||
|
) (metricdata.Sum[N], error) {
|
||||||
points, err := convertNumberDataPoints[N](labelKeys, ts)
|
points, err := convertNumberDataPoints[N](labelKeys, ts)
|
||||||
// OpenCensus sums are always Cumulative
|
// OpenCensus sums are always Cumulative
|
||||||
return metricdata.Sum[N]{DataPoints: points, Temporality: metricdata.CumulativeTemporality, IsMonotonic: true}, err
|
return metricdata.Sum[N]{DataPoints: points, Temporality: metricdata.CumulativeTemporality, IsMonotonic: true}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertNumberDataPoints converts OpenCensus TimeSeries to OpenTelemetry DataPoints.
|
// convertNumberDataPoints converts OpenCensus TimeSeries to OpenTelemetry DataPoints.
|
||||||
func convertNumberDataPoints[N int64 | float64](labelKeys []ocmetricdata.LabelKey, ts []*ocmetricdata.TimeSeries) ([]metricdata.DataPoint[N], error) {
|
func convertNumberDataPoints[N int64 | float64](
|
||||||
|
labelKeys []ocmetricdata.LabelKey,
|
||||||
|
ts []*ocmetricdata.TimeSeries,
|
||||||
|
) ([]metricdata.DataPoint[N], error) {
|
||||||
var points []metricdata.DataPoint[N]
|
var points []metricdata.DataPoint[N]
|
||||||
var err error
|
var err error
|
||||||
for _, t := range ts {
|
for _, t := range ts {
|
||||||
@ -117,7 +128,10 @@ func convertNumberDataPoints[N int64 | float64](labelKeys []ocmetricdata.LabelKe
|
|||||||
|
|
||||||
// convertHistogram converts OpenCensus Distribution timeseries to an
|
// convertHistogram converts OpenCensus Distribution timeseries to an
|
||||||
// OpenTelemetry Histogram aggregation.
|
// OpenTelemetry Histogram aggregation.
|
||||||
func convertHistogram(labelKeys []ocmetricdata.LabelKey, ts []*ocmetricdata.TimeSeries) (metricdata.Histogram[float64], error) {
|
func convertHistogram(
|
||||||
|
labelKeys []ocmetricdata.LabelKey,
|
||||||
|
ts []*ocmetricdata.TimeSeries,
|
||||||
|
) (metricdata.Histogram[float64], error) {
|
||||||
points := make([]metricdata.HistogramDataPoint[float64], 0, len(ts))
|
points := make([]metricdata.HistogramDataPoint[float64], 0, len(ts))
|
||||||
var err error
|
var err error
|
||||||
for _, t := range ts {
|
for _, t := range ts {
|
||||||
@ -390,7 +404,12 @@ func convertQuantiles(snapshot ocmetricdata.Snapshot) []metricdata.QuantileValue
|
|||||||
// OpenTelemetry attribute Set.
|
// OpenTelemetry attribute Set.
|
||||||
func convertAttrs(keys []ocmetricdata.LabelKey, values []ocmetricdata.LabelValue) (attribute.Set, error) {
|
func convertAttrs(keys []ocmetricdata.LabelKey, values []ocmetricdata.LabelValue) (attribute.Set, error) {
|
||||||
if len(keys) != len(values) {
|
if len(keys) != len(values) {
|
||||||
return attribute.NewSet(), fmt.Errorf("%w: keys(%q) values(%q)", errMismatchedAttributeKeyValues, len(keys), len(values))
|
return attribute.NewSet(), fmt.Errorf(
|
||||||
|
"%w: keys(%q) values(%q)",
|
||||||
|
errMismatchedAttributeKeyValues,
|
||||||
|
len(keys),
|
||||||
|
len(values),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
attrs := []attribute.KeyValue{}
|
attrs := []attribute.KeyValue{}
|
||||||
for i, lv := range values {
|
for i, lv := range values {
|
||||||
|
@ -989,10 +989,22 @@ func TestConvertAttributes(t *testing.T) {
|
|||||||
t.Run(tc.desc, func(t *testing.T) {
|
t.Run(tc.desc, func(t *testing.T) {
|
||||||
output, err := convertAttrs(tc.inputKeys, tc.inputValues)
|
output, err := convertAttrs(tc.inputKeys, tc.inputValues)
|
||||||
if !errors.Is(err, tc.expectedErr) {
|
if !errors.Is(err, tc.expectedErr) {
|
||||||
t.Errorf("convertAttrs(keys: %v, values: %v) = err(%v), want err(%v)", tc.inputKeys, tc.inputValues, err, tc.expectedErr)
|
t.Errorf(
|
||||||
|
"convertAttrs(keys: %v, values: %v) = err(%v), want err(%v)",
|
||||||
|
tc.inputKeys,
|
||||||
|
tc.inputValues,
|
||||||
|
err,
|
||||||
|
tc.expectedErr,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if !output.Equals(tc.expected) {
|
if !output.Equals(tc.expected) {
|
||||||
t.Errorf("convertAttrs(keys: %v, values: %v) = %+v, want %+v", tc.inputKeys, tc.inputValues, output.ToSlice(), tc.expected.ToSlice())
|
t.Errorf(
|
||||||
|
"convertAttrs(keys: %v, values: %v) = %+v, want %+v",
|
||||||
|
tc.inputKeys,
|
||||||
|
tc.inputValues,
|
||||||
|
output.ToSlice(),
|
||||||
|
tc.expected.ToSlice(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -124,10 +124,18 @@ func TestSpanSetStatus(t *testing.T) {
|
|||||||
ocS.SetStatus(status)
|
ocS.SetStatus(status)
|
||||||
|
|
||||||
if s.sCode != tt.wantCode {
|
if s.sCode != tt.wantCode {
|
||||||
t.Errorf("span.SetStatus failed to set OpenTelemetry status code. Expected %d, got %d", tt.wantCode, s.sCode)
|
t.Errorf(
|
||||||
|
"span.SetStatus failed to set OpenTelemetry status code. Expected %d, got %d",
|
||||||
|
tt.wantCode,
|
||||||
|
s.sCode,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if s.sMsg != tt.message {
|
if s.sMsg != tt.message {
|
||||||
t.Errorf("span.SetStatus failed to set OpenTelemetry status description. Expected %s, got %s", tt.message, s.sMsg)
|
t.Errorf(
|
||||||
|
"span.SetStatus failed to set OpenTelemetry status description. Expected %s, got %s",
|
||||||
|
tt.message,
|
||||||
|
s.sMsg,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -295,12 +303,22 @@ func TestSpanAddLinkFails(t *testing.T) {
|
|||||||
|
|
||||||
for i, l := range s.links {
|
for i, l := range s.links {
|
||||||
if !l.SpanContext.Equal(wantLinks[i].SpanContext) {
|
if !l.SpanContext.Equal(wantLinks[i].SpanContext) {
|
||||||
t.Errorf("link[%v] has the wrong span context; want %+v, got %+v", i, wantLinks[i].SpanContext, l.SpanContext)
|
t.Errorf(
|
||||||
|
"link[%v] has the wrong span context; want %+v, got %+v",
|
||||||
|
i,
|
||||||
|
wantLinks[i].SpanContext,
|
||||||
|
l.SpanContext,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
gotAttributeSet := attribute.NewSet(l.Attributes...)
|
gotAttributeSet := attribute.NewSet(l.Attributes...)
|
||||||
wantAttributeSet := attribute.NewSet(wantLinks[i].Attributes...)
|
wantAttributeSet := attribute.NewSet(wantLinks[i].Attributes...)
|
||||||
if !gotAttributeSet.Equals(&wantAttributeSet) {
|
if !gotAttributeSet.Equals(&wantAttributeSet) {
|
||||||
t.Errorf("link[%v] has the wrong attributes; want %v, got %v", i, wantAttributeSet.Encoded(attribute.DefaultEncoder()), gotAttributeSet.Encoded(attribute.DefaultEncoder()))
|
t.Errorf(
|
||||||
|
"link[%v] has the wrong attributes; want %v, got %v",
|
||||||
|
i,
|
||||||
|
wantAttributeSet.Encoded(attribute.DefaultEncoder()),
|
||||||
|
gotAttributeSet.Encoded(attribute.DefaultEncoder()),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,11 @@ func NewTracer(tracer trace.Tracer) octrace.Tracer {
|
|||||||
|
|
||||||
// StartSpan starts a new child span of the current span in the context. If
|
// StartSpan starts a new child span of the current span in the context. If
|
||||||
// there is no span in the context, it creates a new trace and span.
|
// there is no span in the context, it creates a new trace and span.
|
||||||
func (o *Tracer) StartSpan(ctx context.Context, name string, s ...octrace.StartOption) (context.Context, *octrace.Span) {
|
func (o *Tracer) StartSpan(
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
s ...octrace.StartOption,
|
||||||
|
) (context.Context, *octrace.Span) {
|
||||||
otelOpts, err := oc2otel.StartOptions(s)
|
otelOpts, err := oc2otel.StartOptions(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Handle(fmt.Errorf("starting span %q: %w", name, err))
|
Handle(fmt.Errorf("starting span %q: %w", name, err))
|
||||||
@ -36,7 +40,12 @@ func (o *Tracer) StartSpan(ctx context.Context, name string, s ...octrace.StartO
|
|||||||
|
|
||||||
// StartSpanWithRemoteParent starts a new child span of the span from the
|
// StartSpanWithRemoteParent starts a new child span of the span from the
|
||||||
// given parent.
|
// given parent.
|
||||||
func (o *Tracer) StartSpanWithRemoteParent(ctx context.Context, name string, parent octrace.SpanContext, s ...octrace.StartOption) (context.Context, *octrace.Span) {
|
func (o *Tracer) StartSpanWithRemoteParent(
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
parent octrace.SpanContext,
|
||||||
|
s ...octrace.StartOption,
|
||||||
|
) (context.Context, *octrace.Span) {
|
||||||
// make sure span context is zeroed out so we use the remote parent
|
// make sure span context is zeroed out so we use the remote parent
|
||||||
ctx = trace.ContextWithSpan(ctx, nil)
|
ctx = trace.ContextWithSpan(ctx, nil)
|
||||||
ctx = trace.ContextWithRemoteSpanContext(ctx, oc2otel.SpanContext(parent))
|
ctx = trace.ContextWithRemoteSpanContext(ctx, oc2otel.SpanContext(parent))
|
||||||
@ -53,6 +62,8 @@ func (o *Tracer) NewContext(parent context.Context, s *octrace.Span) context.Con
|
|||||||
if otSpan, ok := s.Internal().(*Span); ok {
|
if otSpan, ok := s.Internal().(*Span); ok {
|
||||||
return trace.ContextWithSpan(parent, otSpan.otelSpan)
|
return trace.ContextWithSpan(parent, otSpan.otelSpan)
|
||||||
}
|
}
|
||||||
Handle(fmt.Errorf("unable to create context with span %q, since it was created using a different tracer", s.String()))
|
Handle(
|
||||||
|
fmt.Errorf("unable to create context with span %q, since it was created using a different tracer", s.String()),
|
||||||
|
)
|
||||||
return parent
|
return parent
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,11 @@ func TestStartSpanWithRemoteParent(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
ctx, parent := tracer.Start(ctx, "OpenTelemetrySpan1")
|
ctx, parent := tracer.Start(ctx, "OpenTelemetrySpan1")
|
||||||
|
|
||||||
_, span := octrace.StartSpanWithRemoteParent(ctx, "OpenCensusSpan", ocbridge.OTelSpanContextToOC(parent.SpanContext()))
|
_, span := octrace.StartSpanWithRemoteParent(
|
||||||
|
ctx,
|
||||||
|
"OpenCensusSpan",
|
||||||
|
ocbridge.OTelSpanContextToOC(parent.SpanContext()),
|
||||||
|
)
|
||||||
span.End()
|
span.End()
|
||||||
|
|
||||||
spans := sr.Ended()
|
spans := sr.Ended()
|
||||||
|
@ -283,7 +283,9 @@ type bridgeSetTracer struct {
|
|||||||
func (s *bridgeSetTracer) tracer() trace.Tracer {
|
func (s *bridgeSetTracer) tracer() trace.Tracer {
|
||||||
if !s.isSet {
|
if !s.isSet {
|
||||||
s.warnOnce.Do(func() {
|
s.warnOnce.Do(func() {
|
||||||
s.warningHandler("The OpenTelemetry tracer is not set, default no-op tracer is used! Call SetOpenTelemetryTracer to set it up.\n")
|
s.warningHandler(
|
||||||
|
"The OpenTelemetry tracer is not set, default no-op tracer is used! Call SetOpenTelemetryTracer to set it up.\n",
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return s.otelTracer
|
return s.otelTracer
|
||||||
@ -362,7 +364,9 @@ func (t *BridgeTracer) baggageSetHook(ctx context.Context, list iBaggage.List) c
|
|||||||
}
|
}
|
||||||
bSpan, ok := span.(*bridgeSpan)
|
bSpan, ok := span.(*bridgeSpan)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.warningHandler("Encountered a foreign OpenTracing span, will not propagate the baggage items from OpenTelemetry context\n")
|
t.warningHandler(
|
||||||
|
"Encountered a foreign OpenTracing span, will not propagate the baggage items from OpenTelemetry context\n",
|
||||||
|
)
|
||||||
return ctx
|
return ctx
|
||||||
}
|
}
|
||||||
for k, v := range list {
|
for k, v := range list {
|
||||||
@ -374,12 +378,16 @@ func (t *BridgeTracer) baggageSetHook(ctx context.Context, list iBaggage.List) c
|
|||||||
func (t *BridgeTracer) baggageGetHook(ctx context.Context, list iBaggage.List) iBaggage.List {
|
func (t *BridgeTracer) baggageGetHook(ctx context.Context, list iBaggage.List) iBaggage.List {
|
||||||
span := ot.SpanFromContext(ctx)
|
span := ot.SpanFromContext(ctx)
|
||||||
if span == nil {
|
if span == nil {
|
||||||
t.warningHandler("No active OpenTracing span, can not propagate the baggage items from OpenTracing span context\n")
|
t.warningHandler(
|
||||||
|
"No active OpenTracing span, can not propagate the baggage items from OpenTracing span context\n",
|
||||||
|
)
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
bSpan, ok := span.(*bridgeSpan)
|
bSpan, ok := span.(*bridgeSpan)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.warningHandler("Encountered a foreign OpenTracing span, will not propagate the baggage items from OpenTracing span context\n")
|
t.warningHandler(
|
||||||
|
"Encountered a foreign OpenTracing span, will not propagate the baggage items from OpenTracing span context\n",
|
||||||
|
)
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
items := bSpan.extraBaggageItems
|
items := bSpan.extraBaggageItems
|
||||||
@ -427,7 +435,9 @@ func (t *BridgeTracer) StartSpan(operationName string, opts ...ot.StartSpanOptio
|
|||||||
)
|
)
|
||||||
if ot.SpanFromContext(checkCtx2) != nil {
|
if ot.SpanFromContext(checkCtx2) != nil {
|
||||||
t.warnOnce.Do(func() {
|
t.warnOnce.Do(func() {
|
||||||
t.warningHandler("SDK should have deferred the context setup, see the documentation of go.opentelemetry.io/otel/bridge/opentracing/migration\n")
|
t.warningHandler(
|
||||||
|
"SDK should have deferred the context setup, see the documentation of go.opentelemetry.io/otel/bridge/opentracing/migration\n",
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if hadTrueErrorTag {
|
if hadTrueErrorTag {
|
||||||
@ -473,7 +483,9 @@ func (t *BridgeTracer) ContextWithBridgeSpan(ctx context.Context, span trace.Spa
|
|||||||
func (t *BridgeTracer) ContextWithSpanHook(ctx context.Context, span ot.Span) context.Context {
|
func (t *BridgeTracer) ContextWithSpanHook(ctx context.Context, span ot.Span) context.Context {
|
||||||
bSpan, ok := span.(*bridgeSpan)
|
bSpan, ok := span.(*bridgeSpan)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.warningHandler("Encountered a foreign OpenTracing span, will not run a possible deferred context setup hook\n")
|
t.warningHandler(
|
||||||
|
"Encountered a foreign OpenTracing span, will not run a possible deferred context setup hook\n",
|
||||||
|
)
|
||||||
return ctx
|
return ctx
|
||||||
}
|
}
|
||||||
if bSpan.skipDeferHook {
|
if bSpan.skipDeferHook {
|
||||||
|
@ -368,7 +368,11 @@ type nonDeferWrapperTracer struct {
|
|||||||
*WrapperTracer
|
*WrapperTracer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *nonDeferWrapperTracer) Start(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
|
func (t *nonDeferWrapperTracer) Start(
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
opts ...trace.SpanStartOption,
|
||||||
|
) (context.Context, trace.Span) {
|
||||||
// Run start on the parent wrapper with a brand new context
|
// Run start on the parent wrapper with a brand new context
|
||||||
// so `WithDeferredSetup` hasn't been called, and the OpenTracing context is injected.
|
// so `WithDeferredSetup` hasn't been called, and the OpenTracing context is injected.
|
||||||
return t.WrapperTracer.Start(context.Background(), name, opts...)
|
return t.WrapperTracer.Start(context.Background(), name, opts...)
|
||||||
|
@ -63,7 +63,11 @@ func NewMockTracer() *MockTracer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *MockTracer) Start(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
|
func (t *MockTracer) Start(
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
opts ...trace.SpanStartOption,
|
||||||
|
) (context.Context, trace.Span) {
|
||||||
config := trace.NewSpanStartConfig(opts...)
|
config := trace.NewSpanStartConfig(opts...)
|
||||||
startTime := config.Timestamp()
|
startTime := config.Timestamp()
|
||||||
if startTime.IsZero() {
|
if startTime.IsZero() {
|
||||||
|
@ -177,20 +177,38 @@ func (cast *currentActiveSpanTest) setup(t *testing.T, tracer *internal.MockTrac
|
|||||||
func (cast *currentActiveSpanTest) check(t *testing.T, tracer *internal.MockTracer) {
|
func (cast *currentActiveSpanTest) check(t *testing.T, tracer *internal.MockTracer) {
|
||||||
checkTraceAndSpans(t, tracer, cast.traceID, cast.spanIDs)
|
checkTraceAndSpans(t, tracer, cast.traceID, cast.spanIDs)
|
||||||
if len(cast.recordedCurrentOtelSpanIDs) != len(cast.spanIDs) {
|
if len(cast.recordedCurrentOtelSpanIDs) != len(cast.spanIDs) {
|
||||||
t.Errorf("Expected to have %d recorded Otel current spans, got %d", len(cast.spanIDs), len(cast.recordedCurrentOtelSpanIDs))
|
t.Errorf(
|
||||||
|
"Expected to have %d recorded Otel current spans, got %d",
|
||||||
|
len(cast.spanIDs),
|
||||||
|
len(cast.recordedCurrentOtelSpanIDs),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if len(cast.recordedActiveOTSpanIDs) != len(cast.spanIDs) {
|
if len(cast.recordedActiveOTSpanIDs) != len(cast.spanIDs) {
|
||||||
t.Errorf("Expected to have %d recorded OT active spans, got %d", len(cast.spanIDs), len(cast.recordedActiveOTSpanIDs))
|
t.Errorf(
|
||||||
|
"Expected to have %d recorded OT active spans, got %d",
|
||||||
|
len(cast.spanIDs),
|
||||||
|
len(cast.recordedActiveOTSpanIDs),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
minLen := min(len(cast.recordedCurrentOtelSpanIDs), len(cast.spanIDs))
|
minLen := min(len(cast.recordedCurrentOtelSpanIDs), len(cast.spanIDs))
|
||||||
minLen = min(minLen, len(cast.recordedActiveOTSpanIDs))
|
minLen = min(minLen, len(cast.recordedActiveOTSpanIDs))
|
||||||
for i := 0; i < minLen; i++ {
|
for i := 0; i < minLen; i++ {
|
||||||
if cast.recordedCurrentOtelSpanIDs[i] != cast.spanIDs[i] {
|
if cast.recordedCurrentOtelSpanIDs[i] != cast.spanIDs[i] {
|
||||||
t.Errorf("Expected span idx %d (%d) to be recorded as current span in Otel, got %d", i, cast.spanIDs[i], cast.recordedCurrentOtelSpanIDs[i])
|
t.Errorf(
|
||||||
|
"Expected span idx %d (%d) to be recorded as current span in Otel, got %d",
|
||||||
|
i,
|
||||||
|
cast.spanIDs[i],
|
||||||
|
cast.recordedCurrentOtelSpanIDs[i],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if cast.recordedActiveOTSpanIDs[i] != cast.spanIDs[i] {
|
if cast.recordedActiveOTSpanIDs[i] != cast.spanIDs[i] {
|
||||||
t.Errorf("Expected span idx %d (%d) to be recorded as active span in OT, got %d", i, cast.spanIDs[i], cast.recordedActiveOTSpanIDs[i])
|
t.Errorf(
|
||||||
|
"Expected span idx %d (%d) to be recorded as active span in OT, got %d",
|
||||||
|
i,
|
||||||
|
cast.spanIDs[i],
|
||||||
|
cast.recordedActiveOTSpanIDs[i],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -264,7 +282,11 @@ func (coin *contextIntactTest) setup(t *testing.T, tracer *internal.MockTracer)
|
|||||||
|
|
||||||
func (coin *contextIntactTest) check(t *testing.T, tracer *internal.MockTracer) {
|
func (coin *contextIntactTest) check(t *testing.T, tracer *internal.MockTracer) {
|
||||||
if len(coin.recordedContextValues) != len(coin.contextKeyValues) {
|
if len(coin.recordedContextValues) != len(coin.contextKeyValues) {
|
||||||
t.Errorf("Expected to have %d recorded context values, got %d", len(coin.contextKeyValues), len(coin.recordedContextValues))
|
t.Errorf(
|
||||||
|
"Expected to have %d recorded context values, got %d",
|
||||||
|
len(coin.contextKeyValues),
|
||||||
|
len(coin.recordedContextValues),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
minLen := min(len(coin.recordedContextValues), len(coin.contextKeyValues))
|
minLen := min(len(coin.recordedContextValues), len(coin.contextKeyValues))
|
||||||
@ -344,7 +366,12 @@ func (bip *baggageItemsPreservationTest) check(t *testing.T, tracer *internal.Mo
|
|||||||
for i := 0; i < minLen; i++ {
|
for i := 0; i < minLen; i++ {
|
||||||
recordedItems := bip.recordedBaggage[i]
|
recordedItems := bip.recordedBaggage[i]
|
||||||
if len(recordedItems) != i+1 {
|
if len(recordedItems) != i+1 {
|
||||||
t.Errorf("Expected %d recorded baggage items in recording %d, got %d", i+1, i+1, len(bip.recordedBaggage[i]))
|
t.Errorf(
|
||||||
|
"Expected %d recorded baggage items in recording %d, got %d",
|
||||||
|
i+1,
|
||||||
|
i+1,
|
||||||
|
len(bip.recordedBaggage[i]),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
minItemLen := min(len(bip.baggageItems), i+1)
|
minItemLen := min(len(bip.baggageItems), i+1)
|
||||||
for j := 0; j < minItemLen; j++ {
|
for j := 0; j < minItemLen; j++ {
|
||||||
@ -452,7 +479,13 @@ func checkBIORecording(t *testing.T, apiDesc string, initialItems []bipBaggage,
|
|||||||
recordedItems := recordings[i]
|
recordedItems := recordings[i]
|
||||||
expectedItemsInStep := (i + 1) * 2
|
expectedItemsInStep := (i + 1) * 2
|
||||||
if expectedItemsInStep != len(recordedItems) {
|
if expectedItemsInStep != len(recordedItems) {
|
||||||
t.Errorf("Expected %d recorded items in recording %d from %s, got %d", expectedItemsInStep, i, apiDesc, len(recordedItems))
|
t.Errorf(
|
||||||
|
"Expected %d recorded items in recording %d from %s, got %d",
|
||||||
|
expectedItemsInStep,
|
||||||
|
i,
|
||||||
|
apiDesc,
|
||||||
|
len(recordedItems),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
recordedItemsCopy := make(map[string]string, len(recordedItems))
|
recordedItemsCopy := make(map[string]string, len(recordedItems))
|
||||||
for k, v := range recordedItems {
|
for k, v := range recordedItems {
|
||||||
@ -464,7 +497,14 @@ func checkBIORecording(t *testing.T, apiDesc string, initialItems []bipBaggage,
|
|||||||
for _, k := range []string{otKey, otelKey} {
|
for _, k := range []string{otKey, otelKey} {
|
||||||
if v, ok := recordedItemsCopy[k]; ok {
|
if v, ok := recordedItemsCopy[k]; ok {
|
||||||
if value != v {
|
if value != v {
|
||||||
t.Errorf("Expected value %s under key %s in recording %d from %s, got %s", value, k, i, apiDesc, v)
|
t.Errorf(
|
||||||
|
"Expected value %s under key %s in recording %d from %s, got %s",
|
||||||
|
value,
|
||||||
|
k,
|
||||||
|
i,
|
||||||
|
apiDesc,
|
||||||
|
v,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
delete(recordedItemsCopy, k)
|
delete(recordedItemsCopy, k)
|
||||||
} else {
|
} else {
|
||||||
@ -537,7 +577,12 @@ func generateBaggageKeys(key string) (otKey, otelKey string) {
|
|||||||
|
|
||||||
// helpers
|
// helpers
|
||||||
|
|
||||||
func checkTraceAndSpans(t *testing.T, tracer *internal.MockTracer, expectedTraceID trace.TraceID, expectedSpanIDs []trace.SpanID) {
|
func checkTraceAndSpans(
|
||||||
|
t *testing.T,
|
||||||
|
tracer *internal.MockTracer,
|
||||||
|
expectedTraceID trace.TraceID,
|
||||||
|
expectedSpanIDs []trace.SpanID,
|
||||||
|
) {
|
||||||
expectedSpanCount := len(expectedSpanIDs)
|
expectedSpanCount := len(expectedSpanIDs)
|
||||||
|
|
||||||
// reverse spanIDs, since first span ID belongs to root, that
|
// reverse spanIDs, since first span ID belongs to root, that
|
||||||
@ -562,7 +607,13 @@ func checkTraceAndSpans(t *testing.T, tracer *internal.MockTracer, expectedTrace
|
|||||||
for idx, span := range tracer.FinishedSpans {
|
for idx, span := range tracer.FinishedSpans {
|
||||||
sctx := span.SpanContext()
|
sctx := span.SpanContext()
|
||||||
if sctx.TraceID() != expectedTraceID {
|
if sctx.TraceID() != expectedTraceID {
|
||||||
t.Errorf("Expected trace ID %v in span %d (%d), got %v", expectedTraceID, idx, sctx.SpanID(), sctx.TraceID())
|
t.Errorf(
|
||||||
|
"Expected trace ID %v in span %d (%d), got %v",
|
||||||
|
expectedTraceID,
|
||||||
|
idx,
|
||||||
|
sctx.SpanID(),
|
||||||
|
sctx.TraceID(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
expectedSpanID := spanIDs[idx]
|
expectedSpanID := spanIDs[idx]
|
||||||
expectedParentSpanID := parentSpanIDs[idx]
|
expectedParentSpanID := parentSpanIDs[idx]
|
||||||
@ -570,10 +621,22 @@ func checkTraceAndSpans(t *testing.T, tracer *internal.MockTracer, expectedTrace
|
|||||||
t.Errorf("Expected finished span %d to have span ID %d, but got %d", idx, expectedSpanID, sctx.SpanID())
|
t.Errorf("Expected finished span %d to have span ID %d, but got %d", idx, expectedSpanID, sctx.SpanID())
|
||||||
}
|
}
|
||||||
if span.ParentSpanID != expectedParentSpanID {
|
if span.ParentSpanID != expectedParentSpanID {
|
||||||
t.Errorf("Expected finished span %d (span ID: %d) to have parent span ID %d, but got %d", idx, sctx.SpanID(), expectedParentSpanID, span.ParentSpanID)
|
t.Errorf(
|
||||||
|
"Expected finished span %d (span ID: %d) to have parent span ID %d, but got %d",
|
||||||
|
idx,
|
||||||
|
sctx.SpanID(),
|
||||||
|
expectedParentSpanID,
|
||||||
|
span.ParentSpanID,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if span.SpanKind != sks[span.SpanContext().SpanID()] {
|
if span.SpanKind != sks[span.SpanContext().SpanID()] {
|
||||||
t.Errorf("Expected finished span %d (span ID: %d) to have span.kind to be '%v' but was '%v'", idx, sctx.SpanID(), sks[span.SpanContext().SpanID()], span.SpanKind)
|
t.Errorf(
|
||||||
|
"Expected finished span %d (span ID: %d) to have span.kind to be '%v' but was '%v'",
|
||||||
|
idx,
|
||||||
|
sctx.SpanID(),
|
||||||
|
sks[span.SpanContext().SpanID()],
|
||||||
|
span.SpanKind,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -600,7 +663,12 @@ func simpleSpanIDs(count int) []trace.SpanID {
|
|||||||
return base[:count]
|
return base[:count]
|
||||||
}
|
}
|
||||||
|
|
||||||
func runOtelOTOtel(t *testing.T, ctx context.Context, name string, callback func(*testing.T, context.Context) context.Context) {
|
func runOtelOTOtel(
|
||||||
|
t *testing.T,
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
callback func(*testing.T, context.Context) context.Context,
|
||||||
|
) {
|
||||||
tr := otel.Tracer("")
|
tr := otel.Tracer("")
|
||||||
ctx, span := tr.Start(ctx, fmt.Sprintf("%s_Otel_OTOtel", name), trace.WithSpanKind(trace.SpanKindClient))
|
ctx, span := tr.Start(ctx, fmt.Sprintf("%s_Otel_OTOtel", name), trace.WithSpanKind(trace.SpanKindClient))
|
||||||
defer span.End()
|
defer span.End()
|
||||||
@ -610,16 +678,29 @@ func runOtelOTOtel(t *testing.T, ctx context.Context, name string, callback func
|
|||||||
defer span.Finish()
|
defer span.Finish()
|
||||||
ctx2 = callback(t, ctx2)
|
ctx2 = callback(t, ctx2)
|
||||||
func(ctx3 context.Context) {
|
func(ctx3 context.Context) {
|
||||||
ctx3, span := tr.Start(ctx3, fmt.Sprintf("%sOtelOT_Otel_", name), trace.WithSpanKind(trace.SpanKindProducer))
|
ctx3, span := tr.Start(
|
||||||
|
ctx3,
|
||||||
|
fmt.Sprintf("%sOtelOT_Otel_", name),
|
||||||
|
trace.WithSpanKind(trace.SpanKindProducer),
|
||||||
|
)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
_ = callback(t, ctx3)
|
_ = callback(t, ctx3)
|
||||||
}(ctx2)
|
}(ctx2)
|
||||||
}(ctx)
|
}(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runOTOtelOT(t *testing.T, ctx context.Context, name string, callback func(*testing.T, context.Context) context.Context) {
|
func runOTOtelOT(
|
||||||
|
t *testing.T,
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
callback func(*testing.T, context.Context) context.Context,
|
||||||
|
) {
|
||||||
tr := otel.Tracer("")
|
tr := otel.Tracer("")
|
||||||
span, ctx := ot.StartSpanFromContext(ctx, fmt.Sprintf("%s_OT_OtelOT", name), ot.Tag{Key: "span.kind", Value: "client"})
|
span, ctx := ot.StartSpanFromContext(
|
||||||
|
ctx,
|
||||||
|
fmt.Sprintf("%s_OT_OtelOT", name),
|
||||||
|
ot.Tag{Key: "span.kind", Value: "client"},
|
||||||
|
)
|
||||||
defer span.Finish()
|
defer span.Finish()
|
||||||
ctx = callback(t, ctx)
|
ctx = callback(t, ctx)
|
||||||
func(ctx2 context.Context) {
|
func(ctx2 context.Context) {
|
||||||
@ -627,7 +708,11 @@ func runOTOtelOT(t *testing.T, ctx context.Context, name string, callback func(*
|
|||||||
defer span.End()
|
defer span.End()
|
||||||
ctx2 = callback(t, ctx2)
|
ctx2 = callback(t, ctx2)
|
||||||
func(ctx3 context.Context) {
|
func(ctx3 context.Context) {
|
||||||
span, ctx3 := ot.StartSpanFromContext(ctx3, fmt.Sprintf("%sOTOtel_OT_", name), ot.Tag{Key: "span.kind", Value: "producer"})
|
span, ctx3 := ot.StartSpanFromContext(
|
||||||
|
ctx3,
|
||||||
|
fmt.Sprintf("%sOTOtel_OT_", name),
|
||||||
|
ot.Tag{Key: "span.kind", Value: "producer"},
|
||||||
|
)
|
||||||
defer span.Finish()
|
defer span.Finish()
|
||||||
_ = callback(t, ctx3)
|
_ = callback(t, ctx3)
|
||||||
}(ctx2)
|
}(ctx2)
|
||||||
|
@ -73,7 +73,11 @@ func TestTracerProvider(t *testing.T) {
|
|||||||
return provider.Tracer(foobar, trace.WithInstrumentationAttributes(attribute.String("foo", "bar")))
|
return provider.Tracer(foobar, trace.WithInstrumentationAttributes(attribute.String("foo", "bar")))
|
||||||
},
|
},
|
||||||
func() trace.Tracer {
|
func() trace.Tracer {
|
||||||
return provider.Tracer(foobar, trace.WithSchemaURL("https://opentelemetry.io/schemas/1.2.0"), trace.WithInstrumentationAttributes(attribute.String("foo", "bar")))
|
return provider.Tracer(
|
||||||
|
foobar,
|
||||||
|
trace.WithSchemaURL("https://opentelemetry.io/schemas/1.2.0"),
|
||||||
|
trace.WithInstrumentationAttributes(attribute.String("foo", "bar")),
|
||||||
|
)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,10 @@ func NewTracerPair(tracer trace.Tracer) (*BridgeTracer, *WrapperTracerProvider)
|
|||||||
// NewTracerPairWithContext is a convenience function. It calls NewTracerPair
|
// NewTracerPairWithContext is a convenience function. It calls NewTracerPair
|
||||||
// and returns a hooked version of ctx with the created BridgeTracer along
|
// and returns a hooked version of ctx with the created BridgeTracer along
|
||||||
// with the BridgeTracer and WrapperTracerProvider.
|
// with the BridgeTracer and WrapperTracerProvider.
|
||||||
func NewTracerPairWithContext(ctx context.Context, tracer trace.Tracer) (context.Context, *BridgeTracer, *WrapperTracerProvider) {
|
func NewTracerPairWithContext(
|
||||||
|
ctx context.Context,
|
||||||
|
tracer trace.Tracer,
|
||||||
|
) (context.Context, *BridgeTracer, *WrapperTracerProvider) {
|
||||||
bridgeTracer, wrapperProvider := NewTracerPair(tracer)
|
bridgeTracer, wrapperProvider := NewTracerPair(tracer)
|
||||||
ctx = bridgeTracer.NewHookedContext(ctx)
|
ctx = bridgeTracer.NewHookedContext(ctx)
|
||||||
return ctx, bridgeTracer, wrapperProvider
|
return ctx, bridgeTracer, wrapperProvider
|
||||||
|
@ -76,7 +76,11 @@ func (t *WrapperTracer) otelTracer() trace.Tracer {
|
|||||||
// Start forwards the call to the wrapped tracer. It also tries to
|
// Start forwards the call to the wrapped tracer. It also tries to
|
||||||
// override the tracer of the returned span if the span implements the
|
// override the tracer of the returned span if the span implements the
|
||||||
// OverrideTracerSpanExtension interface.
|
// OverrideTracerSpanExtension interface.
|
||||||
func (t *WrapperTracer) Start(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
|
func (t *WrapperTracer) Start(
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
opts ...trace.SpanStartOption,
|
||||||
|
) (context.Context, trace.Span) {
|
||||||
ctx, span := t.otelTracer().Start(ctx, name, opts...)
|
ctx, span := t.otelTracer().Start(ctx, name, opts...)
|
||||||
if spanWithExtension, ok := span.(migration.OverrideTracerSpanExtension); ok {
|
if spanWithExtension, ok := span.(migration.OverrideTracerSpanExtension); ok {
|
||||||
spanWithExtension.OverrideTracer(t)
|
spanWithExtension.OverrideTracer(t)
|
||||||
|
@ -427,7 +427,10 @@ func newGRPCCollector(endpoint string, resultCh <-chan exportResult) (*grpcColle
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Export handles the export req.
|
// Export handles the export req.
|
||||||
func (c *grpcCollector) Export(ctx context.Context, req *collogpb.ExportLogsServiceRequest) (*collogpb.ExportLogsServiceResponse, error) {
|
func (c *grpcCollector) Export(
|
||||||
|
ctx context.Context,
|
||||||
|
req *collogpb.ExportLogsServiceRequest,
|
||||||
|
) (*collogpb.ExportLogsServiceResponse, error) {
|
||||||
c.storage.Add(req)
|
c.storage.Add(req)
|
||||||
|
|
||||||
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
||||||
|
@ -229,7 +229,11 @@ type httpCollector struct {
|
|||||||
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
||||||
// sent on that channel. This means that if errCh is not nil Export calls will
|
// sent on that channel. This means that if errCh is not nil Export calls will
|
||||||
// block until an error is received.
|
// block until an error is received.
|
||||||
func newHTTPCollector(endpoint string, resultCh <-chan exportResult, opts ...func(*httpCollector)) (*httpCollector, error) {
|
func newHTTPCollector(
|
||||||
|
endpoint string,
|
||||||
|
resultCh <-chan exportResult,
|
||||||
|
opts ...func(*httpCollector),
|
||||||
|
) (*httpCollector, error) {
|
||||||
u, err := url.Parse(endpoint)
|
u, err := url.Parse(endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -80,8 +80,16 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
}),
|
}),
|
||||||
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithCertPool("METRICS_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("METRICS_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithClientCert("CLIENT_CERTIFICATE", "CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
envconfig.WithClientCert(
|
||||||
envconfig.WithClientCert("METRICS_CLIENT_CERTIFICATE", "METRICS_CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
"CLIENT_CERTIFICATE",
|
||||||
|
"CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
|
envconfig.WithClientCert(
|
||||||
|
"METRICS_CLIENT_CERTIFICATE",
|
||||||
|
"METRICS_CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
envconfig.WithBool("METRICS_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("METRICS_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
@ -91,8 +99,14 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
WithEnvCompression("METRICS_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
WithEnvCompression("METRICS_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
||||||
envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
envconfig.WithDuration("METRICS_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
envconfig.WithDuration("METRICS_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
withEnvTemporalityPreference("METRICS_TEMPORALITY_PREFERENCE", func(t metric.TemporalitySelector) { opts = append(opts, WithTemporalitySelector(t)) }),
|
withEnvTemporalityPreference(
|
||||||
withEnvAggPreference("METRICS_DEFAULT_HISTOGRAM_AGGREGATION", func(a metric.AggregationSelector) { opts = append(opts, WithAggregationSelector(a)) }),
|
"METRICS_TEMPORALITY_PREFERENCE",
|
||||||
|
func(t metric.TemporalitySelector) { opts = append(opts, WithTemporalitySelector(t)) },
|
||||||
|
),
|
||||||
|
withEnvAggPreference(
|
||||||
|
"METRICS_DEFAULT_HISTOGRAM_AGGREGATION",
|
||||||
|
func(a metric.AggregationSelector) { opts = append(opts, WithAggregationSelector(a)) },
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return opts
|
return opts
|
||||||
@ -157,7 +171,11 @@ func withEnvTemporalityPreference(n string, fn func(metric.TemporalitySelector))
|
|||||||
case "lowmemory":
|
case "lowmemory":
|
||||||
fn(lowMemory)
|
fn(lowMemory)
|
||||||
default:
|
default:
|
||||||
global.Warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to an invalid value, ignoring.", "value", s)
|
global.Warn(
|
||||||
|
"OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to an invalid value, ignoring.",
|
||||||
|
"value",
|
||||||
|
s,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,7 +221,11 @@ func withEnvAggPreference(n string, fn func(metric.AggregationSelector)) func(e
|
|||||||
return metric.DefaultAggregationSelector(kind)
|
return metric.DefaultAggregationSelector(kind)
|
||||||
})
|
})
|
||||||
default:
|
default:
|
||||||
global.Warn("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION is set to an invalid value, ignoring.", "value", s)
|
global.Warn(
|
||||||
|
"OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION is set to an invalid value, ignoring.",
|
||||||
|
"value",
|
||||||
|
s,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,12 +113,24 @@ func TestWithEnvAggPreference(t *testing.T) {
|
|||||||
name: "explicit_bucket_histogram",
|
name: "explicit_bucket_histogram",
|
||||||
envValue: "explicit_bucket_histogram",
|
envValue: "explicit_bucket_histogram",
|
||||||
want: map[metric.InstrumentKind]metric.Aggregation{
|
want: map[metric.InstrumentKind]metric.Aggregation{
|
||||||
metric.InstrumentKindCounter: metric.DefaultAggregationSelector(metric.InstrumentKindCounter),
|
metric.InstrumentKindCounter: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindHistogram: metric.DefaultAggregationSelector(metric.InstrumentKindHistogram),
|
metric.InstrumentKindCounter,
|
||||||
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindUpDownCounter),
|
),
|
||||||
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableCounter),
|
metric.InstrumentKindHistogram: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableUpDownCounter),
|
metric.InstrumentKindHistogram,
|
||||||
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(metric.InstrumentKindObservableGauge),
|
),
|
||||||
|
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableGauge,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -131,10 +143,18 @@ func TestWithEnvAggPreference(t *testing.T) {
|
|||||||
MaxScale: 20,
|
MaxScale: 20,
|
||||||
NoMinMax: false,
|
NoMinMax: false,
|
||||||
},
|
},
|
||||||
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindUpDownCounter),
|
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableCounter),
|
metric.InstrumentKindUpDownCounter,
|
||||||
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableUpDownCounter),
|
),
|
||||||
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(metric.InstrumentKindObservableGauge),
|
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableGauge,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,10 @@ func (c *GRPCCollector) Headers() map[string][]string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Export handles the export req.
|
// Export handles the export req.
|
||||||
func (c *GRPCCollector) Export(ctx context.Context, req *collpb.ExportMetricsServiceRequest) (*collpb.ExportMetricsServiceResponse, error) {
|
func (c *GRPCCollector) Export(
|
||||||
|
ctx context.Context,
|
||||||
|
req *collpb.ExportMetricsServiceRequest,
|
||||||
|
) (*collpb.ExportMetricsServiceResponse, error) {
|
||||||
c.storage.Add(req)
|
c.storage.Add(req)
|
||||||
|
|
||||||
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
||||||
@ -208,7 +211,11 @@ type HTTPCollector struct {
|
|||||||
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
||||||
// sent on that channel. This means that if errCh is not nil Export calls will
|
// sent on that channel. This means that if errCh is not nil Export calls will
|
||||||
// block until an error is received.
|
// block until an error is received.
|
||||||
func NewHTTPCollector(endpoint string, resultCh <-chan ExportResult, opts ...func(*HTTPCollector)) (*HTTPCollector, error) {
|
func NewHTTPCollector(
|
||||||
|
endpoint string,
|
||||||
|
resultCh <-chan ExportResult,
|
||||||
|
opts ...func(*HTTPCollector),
|
||||||
|
) (*HTTPCollector, error) {
|
||||||
u, err := url.Parse(endpoint)
|
u, err := url.Parse(endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -28,6 +28,10 @@ func requireErrorString(t *testing.T, expect string, err error) {
|
|||||||
func TestPartialSuccessFormat(t *testing.T) {
|
func TestPartialSuccessFormat(t *testing.T) {
|
||||||
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
||||||
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
||||||
requireErrorString(t, "what happened (10 metric data points rejected)", MetricPartialSuccessError(10, "what happened"))
|
requireErrorString(
|
||||||
|
t,
|
||||||
|
"what happened (10 metric data points rejected)",
|
||||||
|
MetricPartialSuccessError(10, "what happened"),
|
||||||
|
)
|
||||||
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
||||||
}
|
}
|
||||||
|
@ -203,7 +203,9 @@ func HistogramDataPoints[N int64 | float64](dPts []metricdata.HistogramDataPoint
|
|||||||
|
|
||||||
// ExponentialHistogram returns an OTLP Metric_ExponentialHistogram generated from h. An error is
|
// ExponentialHistogram returns an OTLP Metric_ExponentialHistogram generated from h. An error is
|
||||||
// returned if the temporality of h is unknown.
|
// returned if the temporality of h is unknown.
|
||||||
func ExponentialHistogram[N int64 | float64](h metricdata.ExponentialHistogram[N]) (*mpb.Metric_ExponentialHistogram, error) {
|
func ExponentialHistogram[N int64 | float64](
|
||||||
|
h metricdata.ExponentialHistogram[N],
|
||||||
|
) (*mpb.Metric_ExponentialHistogram, error) {
|
||||||
t, err := Temporality(h.Temporality)
|
t, err := Temporality(h.Temporality)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -218,7 +220,9 @@ func ExponentialHistogram[N int64 | float64](h metricdata.ExponentialHistogram[N
|
|||||||
|
|
||||||
// ExponentialHistogramDataPoints returns a slice of OTLP ExponentialHistogramDataPoint generated
|
// ExponentialHistogramDataPoints returns a slice of OTLP ExponentialHistogramDataPoint generated
|
||||||
// from dPts.
|
// from dPts.
|
||||||
func ExponentialHistogramDataPoints[N int64 | float64](dPts []metricdata.ExponentialHistogramDataPoint[N]) []*mpb.ExponentialHistogramDataPoint {
|
func ExponentialHistogramDataPoints[N int64 | float64](
|
||||||
|
dPts []metricdata.ExponentialHistogramDataPoint[N],
|
||||||
|
) []*mpb.ExponentialHistogramDataPoint {
|
||||||
out := make([]*mpb.ExponentialHistogramDataPoint, 0, len(dPts))
|
out := make([]*mpb.ExponentialHistogramDataPoint, 0, len(dPts))
|
||||||
for _, dPt := range dPts {
|
for _, dPt := range dPts {
|
||||||
sum := float64(dPt.Sum)
|
sum := float64(dPt.Sum)
|
||||||
@ -250,7 +254,9 @@ func ExponentialHistogramDataPoints[N int64 | float64](dPts []metricdata.Exponen
|
|||||||
|
|
||||||
// ExponentialHistogramDataPointBuckets returns an OTLP ExponentialHistogramDataPoint_Buckets generated
|
// ExponentialHistogramDataPointBuckets returns an OTLP ExponentialHistogramDataPoint_Buckets generated
|
||||||
// from bucket.
|
// from bucket.
|
||||||
func ExponentialHistogramDataPointBuckets(bucket metricdata.ExponentialBucket) *mpb.ExponentialHistogramDataPoint_Buckets {
|
func ExponentialHistogramDataPointBuckets(
|
||||||
|
bucket metricdata.ExponentialBucket,
|
||||||
|
) *mpb.ExponentialHistogramDataPoint_Buckets {
|
||||||
return &mpb.ExponentialHistogramDataPoint_Buckets{
|
return &mpb.ExponentialHistogramDataPoint_Buckets{
|
||||||
Offset: bucket.Offset,
|
Offset: bucket.Offset,
|
||||||
BucketCounts: bucket.Counts,
|
BucketCounts: bucket.Counts,
|
||||||
|
@ -80,8 +80,16 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
}),
|
}),
|
||||||
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithCertPool("METRICS_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("METRICS_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithClientCert("CLIENT_CERTIFICATE", "CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
envconfig.WithClientCert(
|
||||||
envconfig.WithClientCert("METRICS_CLIENT_CERTIFICATE", "METRICS_CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
"CLIENT_CERTIFICATE",
|
||||||
|
"CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
|
envconfig.WithClientCert(
|
||||||
|
"METRICS_CLIENT_CERTIFICATE",
|
||||||
|
"METRICS_CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
envconfig.WithBool("METRICS_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("METRICS_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
@ -91,8 +99,14 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
WithEnvCompression("METRICS_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
WithEnvCompression("METRICS_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
||||||
envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
envconfig.WithDuration("METRICS_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
envconfig.WithDuration("METRICS_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
withEnvTemporalityPreference("METRICS_TEMPORALITY_PREFERENCE", func(t metric.TemporalitySelector) { opts = append(opts, WithTemporalitySelector(t)) }),
|
withEnvTemporalityPreference(
|
||||||
withEnvAggPreference("METRICS_DEFAULT_HISTOGRAM_AGGREGATION", func(a metric.AggregationSelector) { opts = append(opts, WithAggregationSelector(a)) }),
|
"METRICS_TEMPORALITY_PREFERENCE",
|
||||||
|
func(t metric.TemporalitySelector) { opts = append(opts, WithTemporalitySelector(t)) },
|
||||||
|
),
|
||||||
|
withEnvAggPreference(
|
||||||
|
"METRICS_DEFAULT_HISTOGRAM_AGGREGATION",
|
||||||
|
func(a metric.AggregationSelector) { opts = append(opts, WithAggregationSelector(a)) },
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return opts
|
return opts
|
||||||
@ -157,7 +171,11 @@ func withEnvTemporalityPreference(n string, fn func(metric.TemporalitySelector))
|
|||||||
case "lowmemory":
|
case "lowmemory":
|
||||||
fn(lowMemory)
|
fn(lowMemory)
|
||||||
default:
|
default:
|
||||||
global.Warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to an invalid value, ignoring.", "value", s)
|
global.Warn(
|
||||||
|
"OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to an invalid value, ignoring.",
|
||||||
|
"value",
|
||||||
|
s,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,7 +221,11 @@ func withEnvAggPreference(n string, fn func(metric.AggregationSelector)) func(e
|
|||||||
return metric.DefaultAggregationSelector(kind)
|
return metric.DefaultAggregationSelector(kind)
|
||||||
})
|
})
|
||||||
default:
|
default:
|
||||||
global.Warn("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION is set to an invalid value, ignoring.", "value", s)
|
global.Warn(
|
||||||
|
"OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION is set to an invalid value, ignoring.",
|
||||||
|
"value",
|
||||||
|
s,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,12 +113,24 @@ func TestWithEnvAggPreference(t *testing.T) {
|
|||||||
name: "explicit_bucket_histogram",
|
name: "explicit_bucket_histogram",
|
||||||
envValue: "explicit_bucket_histogram",
|
envValue: "explicit_bucket_histogram",
|
||||||
want: map[metric.InstrumentKind]metric.Aggregation{
|
want: map[metric.InstrumentKind]metric.Aggregation{
|
||||||
metric.InstrumentKindCounter: metric.DefaultAggregationSelector(metric.InstrumentKindCounter),
|
metric.InstrumentKindCounter: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindHistogram: metric.DefaultAggregationSelector(metric.InstrumentKindHistogram),
|
metric.InstrumentKindCounter,
|
||||||
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindUpDownCounter),
|
),
|
||||||
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableCounter),
|
metric.InstrumentKindHistogram: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableUpDownCounter),
|
metric.InstrumentKindHistogram,
|
||||||
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(metric.InstrumentKindObservableGauge),
|
),
|
||||||
|
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableGauge,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -131,10 +143,18 @@ func TestWithEnvAggPreference(t *testing.T) {
|
|||||||
MaxScale: 20,
|
MaxScale: 20,
|
||||||
NoMinMax: false,
|
NoMinMax: false,
|
||||||
},
|
},
|
||||||
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindUpDownCounter),
|
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableCounter),
|
metric.InstrumentKindUpDownCounter,
|
||||||
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableUpDownCounter),
|
),
|
||||||
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(metric.InstrumentKindObservableGauge),
|
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableGauge,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,10 @@ func (c *GRPCCollector) Headers() map[string][]string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Export handles the export req.
|
// Export handles the export req.
|
||||||
func (c *GRPCCollector) Export(ctx context.Context, req *collpb.ExportMetricsServiceRequest) (*collpb.ExportMetricsServiceResponse, error) {
|
func (c *GRPCCollector) Export(
|
||||||
|
ctx context.Context,
|
||||||
|
req *collpb.ExportMetricsServiceRequest,
|
||||||
|
) (*collpb.ExportMetricsServiceResponse, error) {
|
||||||
c.storage.Add(req)
|
c.storage.Add(req)
|
||||||
|
|
||||||
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
||||||
@ -208,7 +211,11 @@ type HTTPCollector struct {
|
|||||||
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
||||||
// sent on that channel. This means that if errCh is not nil Export calls will
|
// sent on that channel. This means that if errCh is not nil Export calls will
|
||||||
// block until an error is received.
|
// block until an error is received.
|
||||||
func NewHTTPCollector(endpoint string, resultCh <-chan ExportResult, opts ...func(*HTTPCollector)) (*HTTPCollector, error) {
|
func NewHTTPCollector(
|
||||||
|
endpoint string,
|
||||||
|
resultCh <-chan ExportResult,
|
||||||
|
opts ...func(*HTTPCollector),
|
||||||
|
) (*HTTPCollector, error) {
|
||||||
u, err := url.Parse(endpoint)
|
u, err := url.Parse(endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -28,6 +28,10 @@ func requireErrorString(t *testing.T, expect string, err error) {
|
|||||||
func TestPartialSuccessFormat(t *testing.T) {
|
func TestPartialSuccessFormat(t *testing.T) {
|
||||||
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
||||||
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
||||||
requireErrorString(t, "what happened (10 metric data points rejected)", MetricPartialSuccessError(10, "what happened"))
|
requireErrorString(
|
||||||
|
t,
|
||||||
|
"what happened (10 metric data points rejected)",
|
||||||
|
MetricPartialSuccessError(10, "what happened"),
|
||||||
|
)
|
||||||
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
||||||
}
|
}
|
||||||
|
@ -203,7 +203,9 @@ func HistogramDataPoints[N int64 | float64](dPts []metricdata.HistogramDataPoint
|
|||||||
|
|
||||||
// ExponentialHistogram returns an OTLP Metric_ExponentialHistogram generated from h. An error is
|
// ExponentialHistogram returns an OTLP Metric_ExponentialHistogram generated from h. An error is
|
||||||
// returned if the temporality of h is unknown.
|
// returned if the temporality of h is unknown.
|
||||||
func ExponentialHistogram[N int64 | float64](h metricdata.ExponentialHistogram[N]) (*mpb.Metric_ExponentialHistogram, error) {
|
func ExponentialHistogram[N int64 | float64](
|
||||||
|
h metricdata.ExponentialHistogram[N],
|
||||||
|
) (*mpb.Metric_ExponentialHistogram, error) {
|
||||||
t, err := Temporality(h.Temporality)
|
t, err := Temporality(h.Temporality)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -218,7 +220,9 @@ func ExponentialHistogram[N int64 | float64](h metricdata.ExponentialHistogram[N
|
|||||||
|
|
||||||
// ExponentialHistogramDataPoints returns a slice of OTLP ExponentialHistogramDataPoint generated
|
// ExponentialHistogramDataPoints returns a slice of OTLP ExponentialHistogramDataPoint generated
|
||||||
// from dPts.
|
// from dPts.
|
||||||
func ExponentialHistogramDataPoints[N int64 | float64](dPts []metricdata.ExponentialHistogramDataPoint[N]) []*mpb.ExponentialHistogramDataPoint {
|
func ExponentialHistogramDataPoints[N int64 | float64](
|
||||||
|
dPts []metricdata.ExponentialHistogramDataPoint[N],
|
||||||
|
) []*mpb.ExponentialHistogramDataPoint {
|
||||||
out := make([]*mpb.ExponentialHistogramDataPoint, 0, len(dPts))
|
out := make([]*mpb.ExponentialHistogramDataPoint, 0, len(dPts))
|
||||||
for _, dPt := range dPts {
|
for _, dPt := range dPts {
|
||||||
sum := float64(dPt.Sum)
|
sum := float64(dPt.Sum)
|
||||||
@ -250,7 +254,9 @@ func ExponentialHistogramDataPoints[N int64 | float64](dPts []metricdata.Exponen
|
|||||||
|
|
||||||
// ExponentialHistogramDataPointBuckets returns an OTLP ExponentialHistogramDataPoint_Buckets generated
|
// ExponentialHistogramDataPointBuckets returns an OTLP ExponentialHistogramDataPoint_Buckets generated
|
||||||
// from bucket.
|
// from bucket.
|
||||||
func ExponentialHistogramDataPointBuckets(bucket metricdata.ExponentialBucket) *mpb.ExponentialHistogramDataPoint_Buckets {
|
func ExponentialHistogramDataPointBuckets(
|
||||||
|
bucket metricdata.ExponentialBucket,
|
||||||
|
) *mpb.ExponentialHistogramDataPoint_Buckets {
|
||||||
return &mpb.ExponentialHistogramDataPoint_Buckets{
|
return &mpb.ExponentialHistogramDataPoint_Buckets{
|
||||||
Offset: bucket.Offset,
|
Offset: bucket.Offset,
|
||||||
BucketCounts: bucket.Counts,
|
BucketCounts: bucket.Counts,
|
||||||
|
@ -94,8 +94,21 @@ func TestSpanEvent(t *testing.T) {
|
|||||||
eventTimestamp := uint64(1589932800 * 1e9)
|
eventTimestamp := uint64(1589932800 * 1e9)
|
||||||
assert.Equal(t, &tracepb.Span_Event{Name: "test 1", Attributes: nil, TimeUnixNano: eventTimestamp}, got[0])
|
assert.Equal(t, &tracepb.Span_Event{Name: "test 1", Attributes: nil, TimeUnixNano: eventTimestamp}, got[0])
|
||||||
// Do not test Attributes directly, just that the return value goes to the correct field.
|
// Do not test Attributes directly, just that the return value goes to the correct field.
|
||||||
assert.Equal(t, &tracepb.Span_Event{Name: "test 2", Attributes: KeyValues(attrs), TimeUnixNano: eventTimestamp, DroppedAttributesCount: 2}, got[1])
|
assert.Equal(
|
||||||
assert.Equal(t, &tracepb.Span_Event{Name: "test 3", Attributes: KeyValues(attrs), TimeUnixNano: 0, DroppedAttributesCount: 2}, got[2])
|
t,
|
||||||
|
&tracepb.Span_Event{
|
||||||
|
Name: "test 2",
|
||||||
|
Attributes: KeyValues(attrs),
|
||||||
|
TimeUnixNano: eventTimestamp,
|
||||||
|
DroppedAttributesCount: 2,
|
||||||
|
},
|
||||||
|
got[1],
|
||||||
|
)
|
||||||
|
assert.Equal(
|
||||||
|
t,
|
||||||
|
&tracepb.Span_Event{Name: "test 3", Attributes: KeyValues(attrs), TimeUnixNano: 0, DroppedAttributesCount: 2},
|
||||||
|
got[2],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNilLinks(t *testing.T) {
|
func TestNilLinks(t *testing.T) {
|
||||||
@ -220,12 +233,18 @@ func TestSpanData(t *testing.T) {
|
|||||||
traceState, _ := trace.ParseTraceState("key1=val1,key2=val2")
|
traceState, _ := trace.ParseTraceState("key1=val1,key2=val2")
|
||||||
spanData := tracetest.SpanStub{
|
spanData := tracetest.SpanStub{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
TraceState: traceState,
|
TraceState: traceState,
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8},
|
SpanID: trace.SpanID{0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8},
|
||||||
TraceState: traceState,
|
TraceState: traceState,
|
||||||
Remote: true,
|
Remote: true,
|
||||||
@ -251,7 +270,10 @@ func TestSpanData(t *testing.T) {
|
|||||||
Links: []tracesdk.Link{
|
Links: []tracesdk.Link{
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF},
|
TraceID: trace.TraceID{
|
||||||
|
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
|
||||||
|
0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7},
|
SpanID: trace.SpanID{0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7},
|
||||||
TraceFlags: 0,
|
TraceFlags: 0,
|
||||||
}),
|
}),
|
||||||
@ -262,7 +284,10 @@ func TestSpanData(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF},
|
TraceID: trace.TraceID{
|
||||||
|
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
|
||||||
|
0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7},
|
SpanID: trace.SpanID{0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7},
|
||||||
TraceFlags: 0,
|
TraceFlags: 0,
|
||||||
}),
|
}),
|
||||||
@ -299,7 +324,10 @@ func TestSpanData(t *testing.T) {
|
|||||||
// ordering impossible to guarantee on the output. The Resource
|
// ordering impossible to guarantee on the output. The Resource
|
||||||
// transform function has unit tests that should suffice.
|
// transform function has unit tests that should suffice.
|
||||||
expectedSpan := &tracepb.Span{
|
expectedSpan := &tracepb.Span{
|
||||||
TraceId: []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceId: []byte{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanId: []byte{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanId: []byte{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
ParentSpanId: []byte{0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8},
|
ParentSpanId: []byte{0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8},
|
||||||
TraceState: "key1=val1,key2=val2",
|
TraceState: "key1=val1,key2=val2",
|
||||||
|
@ -39,7 +39,11 @@ func TestMain(m *testing.M) {
|
|||||||
|
|
||||||
var roSpans = tracetest.SpanStubs{{Name: "Span 0"}}.Snapshots()
|
var roSpans = tracetest.SpanStubs{{Name: "Span 0"}}.Snapshots()
|
||||||
|
|
||||||
func contextWithTimeout(parent context.Context, t *testing.T, timeout time.Duration) (context.Context, context.CancelFunc) {
|
func contextWithTimeout(
|
||||||
|
parent context.Context,
|
||||||
|
t *testing.T,
|
||||||
|
timeout time.Duration,
|
||||||
|
) (context.Context, context.CancelFunc) {
|
||||||
d, ok := t.Deadline()
|
d, ok := t.Deadline()
|
||||||
if !ok {
|
if !ok {
|
||||||
d = time.Now().Add(timeout)
|
d = time.Now().Add(timeout)
|
||||||
@ -110,7 +114,12 @@ func TestWithEndpointURL(t *testing.T) {
|
|||||||
otlptracetest.RunEndToEndTest(ctx, t, exp, mc)
|
otlptracetest.RunEndToEndTest(ctx, t, exp, mc)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newGRPCExporter(t *testing.T, ctx context.Context, endpoint string, additionalOpts ...otlptracegrpc.Option) *otlptrace.Exporter {
|
func newGRPCExporter(
|
||||||
|
t *testing.T,
|
||||||
|
ctx context.Context,
|
||||||
|
endpoint string,
|
||||||
|
additionalOpts ...otlptracegrpc.Option,
|
||||||
|
) *otlptrace.Exporter {
|
||||||
opts := []otlptracegrpc.Option{
|
opts := []otlptracegrpc.Option{
|
||||||
otlptracegrpc.WithInsecure(),
|
otlptracegrpc.WithInsecure(),
|
||||||
otlptracegrpc.WithEndpoint(endpoint),
|
otlptracegrpc.WithEndpoint(endpoint),
|
||||||
|
@ -77,8 +77,16 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
}),
|
}),
|
||||||
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithClientCert("CLIENT_CERTIFICATE", "CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
envconfig.WithClientCert(
|
||||||
envconfig.WithClientCert("TRACES_CLIENT_CERTIFICATE", "TRACES_CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
"CLIENT_CERTIFICATE",
|
||||||
|
"CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
|
envconfig.WithClientCert(
|
||||||
|
"TRACES_CLIENT_CERTIFICATE",
|
||||||
|
"TRACES_CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
|
@ -28,6 +28,10 @@ func requireErrorString(t *testing.T, expect string, err error) {
|
|||||||
func TestPartialSuccessFormat(t *testing.T) {
|
func TestPartialSuccessFormat(t *testing.T) {
|
||||||
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
||||||
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
||||||
requireErrorString(t, "what happened (10 metric data points rejected)", MetricPartialSuccessError(10, "what happened"))
|
requireErrorString(
|
||||||
|
t,
|
||||||
|
"what happened (10 metric data points rejected)",
|
||||||
|
MetricPartialSuccessError(10, "what happened"),
|
||||||
|
)
|
||||||
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,10 @@ func (mts *mockTraceService) getResourceSpans() []*tracepb.ResourceSpans {
|
|||||||
return mts.storage.GetResourceSpans()
|
return mts.storage.GetResourceSpans()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mts *mockTraceService) Export(ctx context.Context, exp *collectortracepb.ExportTraceServiceRequest) (*collectortracepb.ExportTraceServiceResponse, error) {
|
func (mts *mockTraceService) Export(
|
||||||
|
ctx context.Context,
|
||||||
|
exp *collectortracepb.ExportTraceServiceRequest,
|
||||||
|
) (*collectortracepb.ExportTraceServiceResponse, error) {
|
||||||
mts.mu.Lock()
|
mts.mu.Lock()
|
||||||
defer func() {
|
defer func() {
|
||||||
mts.requests++
|
mts.requests++
|
||||||
|
@ -271,7 +271,11 @@ func TestNoRetry(t *testing.T) {
|
|||||||
assert.True(t, strings.HasPrefix(err.Error(), "traces export: "))
|
assert.True(t, strings.HasPrefix(err.Error(), "traces export: "))
|
||||||
|
|
||||||
unwrapped := errors.Unwrap(err)
|
unwrapped := errors.Unwrap(err)
|
||||||
assert.Contains(t, unwrapped.Error(), fmt.Sprintf("failed to send to http://%s/v1/traces: 400 Bad Request", mc.endpoint))
|
assert.Contains(
|
||||||
|
t,
|
||||||
|
unwrapped.Error(),
|
||||||
|
fmt.Sprintf("failed to send to http://%s/v1/traces: 400 Bad Request", mc.endpoint),
|
||||||
|
)
|
||||||
|
|
||||||
unwrapped2 := errors.Unwrap(unwrapped)
|
unwrapped2 := errors.Unwrap(unwrapped)
|
||||||
assert.Contains(t, unwrapped2.Error(), "missing required attribute aaa")
|
assert.Contains(t, unwrapped2.Error(), "missing required attribute aaa")
|
||||||
|
@ -77,8 +77,16 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
}),
|
}),
|
||||||
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithClientCert("CLIENT_CERTIFICATE", "CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
envconfig.WithClientCert(
|
||||||
envconfig.WithClientCert("TRACES_CLIENT_CERTIFICATE", "TRACES_CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
"CLIENT_CERTIFICATE",
|
||||||
|
"CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
|
envconfig.WithClientCert(
|
||||||
|
"TRACES_CLIENT_CERTIFICATE",
|
||||||
|
"TRACES_CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
|
@ -28,6 +28,10 @@ func requireErrorString(t *testing.T, expect string, err error) {
|
|||||||
func TestPartialSuccessFormat(t *testing.T) {
|
func TestPartialSuccessFormat(t *testing.T) {
|
||||||
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
||||||
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
||||||
requireErrorString(t, "what happened (10 metric data points rejected)", MetricPartialSuccessError(10, "what happened"))
|
requireErrorString(
|
||||||
|
t,
|
||||||
|
"what happened (10 metric data points rejected)",
|
||||||
|
MetricPartialSuccessError(10, "what happened"),
|
||||||
|
)
|
||||||
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,9 @@ type config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var logDeprecatedLegacyScheme = sync.OnceFunc(func() {
|
var logDeprecatedLegacyScheme = sync.OnceFunc(func() {
|
||||||
global.Warn("prometheus exporter legacy scheme deprecated: support for the legacy NameValidationScheme will be removed in the next release")
|
global.Warn(
|
||||||
|
"prometheus exporter legacy scheme deprecated: support for the legacy NameValidationScheme will be removed in the next release",
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
// newConfig creates a validated config configured with options.
|
// newConfig creates a validated config configured with options.
|
||||||
|
@ -254,7 +254,13 @@ func (c *collector) Collect(ch chan<- prometheus.Metric) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addHistogramMetric[N int64 | float64](ch chan<- prometheus.Metric, histogram metricdata.Histogram[N], m metricdata.Metrics, name string, kv keyVals) {
|
func addHistogramMetric[N int64 | float64](
|
||||||
|
ch chan<- prometheus.Metric,
|
||||||
|
histogram metricdata.Histogram[N],
|
||||||
|
m metricdata.Metrics,
|
||||||
|
name string,
|
||||||
|
kv keyVals,
|
||||||
|
) {
|
||||||
for _, dp := range histogram.DataPoints {
|
for _, dp := range histogram.DataPoints {
|
||||||
keys, values := getAttrs(dp.Attributes)
|
keys, values := getAttrs(dp.Attributes)
|
||||||
keys = append(keys, kv.keys...)
|
keys = append(keys, kv.keys...)
|
||||||
@ -278,7 +284,13 @@ func addHistogramMetric[N int64 | float64](ch chan<- prometheus.Metric, histogra
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addSumMetric[N int64 | float64](ch chan<- prometheus.Metric, sum metricdata.Sum[N], m metricdata.Metrics, name string, kv keyVals) {
|
func addSumMetric[N int64 | float64](
|
||||||
|
ch chan<- prometheus.Metric,
|
||||||
|
sum metricdata.Sum[N],
|
||||||
|
m metricdata.Metrics,
|
||||||
|
name string,
|
||||||
|
kv keyVals,
|
||||||
|
) {
|
||||||
valueType := prometheus.CounterValue
|
valueType := prometheus.CounterValue
|
||||||
if !sum.IsMonotonic {
|
if !sum.IsMonotonic {
|
||||||
valueType = prometheus.GaugeValue
|
valueType = prometheus.GaugeValue
|
||||||
@ -304,7 +316,13 @@ func addSumMetric[N int64 | float64](ch chan<- prometheus.Metric, sum metricdata
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addGaugeMetric[N int64 | float64](ch chan<- prometheus.Metric, gauge metricdata.Gauge[N], m metricdata.Metrics, name string, kv keyVals) {
|
func addGaugeMetric[N int64 | float64](
|
||||||
|
ch chan<- prometheus.Metric,
|
||||||
|
gauge metricdata.Gauge[N],
|
||||||
|
m metricdata.Metrics,
|
||||||
|
name string,
|
||||||
|
kv keyVals,
|
||||||
|
) {
|
||||||
for _, dp := range gauge.DataPoints {
|
for _, dp := range gauge.DataPoints {
|
||||||
keys, values := getAttrs(dp.Attributes)
|
keys, values := getAttrs(dp.Attributes)
|
||||||
keys = append(keys, kv.keys...)
|
keys = append(keys, kv.keys...)
|
||||||
|
@ -234,15 +234,24 @@ func TestPrometheusExporter(t *testing.T) {
|
|||||||
gauge.Add(ctx, -25, opt)
|
gauge.Add(ctx, -25, opt)
|
||||||
|
|
||||||
// Invalid, will be renamed.
|
// Invalid, will be renamed.
|
||||||
gauge, err = meter.Float64UpDownCounter("invalid.gauge.name", otelmetric.WithDescription("a gauge with an invalid name"))
|
gauge, err = meter.Float64UpDownCounter(
|
||||||
|
"invalid.gauge.name",
|
||||||
|
otelmetric.WithDescription("a gauge with an invalid name"),
|
||||||
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gauge.Add(ctx, 100, opt)
|
gauge.Add(ctx, 100, opt)
|
||||||
|
|
||||||
counter, err := meter.Float64Counter("0invalid.counter.name", otelmetric.WithDescription("a counter with an invalid name"))
|
counter, err := meter.Float64Counter(
|
||||||
|
"0invalid.counter.name",
|
||||||
|
otelmetric.WithDescription("a counter with an invalid name"),
|
||||||
|
)
|
||||||
require.ErrorIs(t, err, metric.ErrInstrumentName)
|
require.ErrorIs(t, err, metric.ErrInstrumentName)
|
||||||
counter.Add(ctx, 100, opt)
|
counter.Add(ctx, 100, opt)
|
||||||
|
|
||||||
histogram, err := meter.Float64Histogram("invalid.hist.name", otelmetric.WithDescription("a histogram with an invalid name"))
|
histogram, err := meter.Float64Histogram(
|
||||||
|
"invalid.hist.name",
|
||||||
|
otelmetric.WithDescription("a histogram with an invalid name"),
|
||||||
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
histogram.Record(ctx, 23, opt)
|
histogram.Record(ctx, 23, opt)
|
||||||
},
|
},
|
||||||
|
@ -194,7 +194,11 @@ func getPrettyJSON(now *time.Time) string {
|
|||||||
var timestamps string
|
var timestamps string
|
||||||
if now != nil {
|
if now != nil {
|
||||||
serializedNow, _ := json.Marshal(now)
|
serializedNow, _ := json.Marshal(now)
|
||||||
timestamps = "\n\t\"Timestamp\": " + string(serializedNow) + ",\n\t\"ObservedTimestamp\": " + string(serializedNow) + ","
|
timestamps = "\n\t\"Timestamp\": " + string(
|
||||||
|
serializedNow,
|
||||||
|
) + ",\n\t\"ObservedTimestamp\": " + string(
|
||||||
|
serializedNow,
|
||||||
|
) + ","
|
||||||
}
|
}
|
||||||
|
|
||||||
return `{` + timestamps + `
|
return `{` + timestamps + `
|
||||||
@ -318,7 +322,11 @@ func getRecord(now time.Time) sdklog.Record {
|
|||||||
"https://example.com/custom-resource-schema",
|
"https://example.com/custom-resource-schema",
|
||||||
attribute.String("foo", "bar"),
|
attribute.String("foo", "bar"),
|
||||||
),
|
),
|
||||||
InstrumentationScope: &instrumentation.Scope{Name: "name", Version: "version", SchemaURL: "https://example.com/custom-schema"},
|
InstrumentationScope: &instrumentation.Scope{
|
||||||
|
Name: "name",
|
||||||
|
Version: "version",
|
||||||
|
SchemaURL: "https://example.com/custom-schema",
|
||||||
|
},
|
||||||
DroppedAttributes: 10,
|
DroppedAttributes: 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +131,9 @@ func redactAggregationTimestamps(orig metricdata.Aggregation) metricdata.Aggrega
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func redactHistogramTimestamps[T int64 | float64](hdp []metricdata.HistogramDataPoint[T]) []metricdata.HistogramDataPoint[T] {
|
func redactHistogramTimestamps[T int64 | float64](
|
||||||
|
hdp []metricdata.HistogramDataPoint[T],
|
||||||
|
) []metricdata.HistogramDataPoint[T] {
|
||||||
out := make([]metricdata.HistogramDataPoint[T], len(hdp))
|
out := make([]metricdata.HistogramDataPoint[T], len(hdp))
|
||||||
for i, dp := range hdp {
|
for i, dp := range hdp {
|
||||||
out[i] = metricdata.HistogramDataPoint[T]{
|
out[i] = metricdata.HistogramDataPoint[T]{
|
||||||
|
@ -38,11 +38,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// typical span data with UNSET status
|
// typical span data with UNSET status
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
@ -80,11 +86,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// typical span data with OK status
|
// typical span data with OK status
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
@ -119,11 +131,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// typical span data with ERROR status
|
// typical span data with ERROR status
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
@ -159,7 +177,10 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// invalid parent)
|
// invalid parent)
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
@ -193,11 +214,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// span data of unspecified kind
|
// span data of unspecified kind
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindUnspecified,
|
SpanKind: trace.SpanKindUnspecified,
|
||||||
@ -231,11 +258,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// span data of internal kind
|
// span data of internal kind
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindInternal,
|
SpanKind: trace.SpanKindInternal,
|
||||||
@ -269,11 +302,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// span data of client kind
|
// span data of client kind
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindClient,
|
SpanKind: trace.SpanKindClient,
|
||||||
@ -310,11 +349,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// span data of producer kind
|
// span data of producer kind
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindProducer,
|
SpanKind: trace.SpanKindProducer,
|
||||||
@ -348,11 +393,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// span data of consumer kind
|
// span data of consumer kind
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindConsumer,
|
SpanKind: trace.SpanKindConsumer,
|
||||||
@ -386,11 +437,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// span data with no events
|
// span data with no events
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
@ -411,11 +468,17 @@ func TestModelConversion(t *testing.T) {
|
|||||||
// span data with an "error" attribute set to "false"
|
// span data with an "error" attribute set to "false"
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
SpanID: trace.SpanID{0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
|
@ -201,7 +201,10 @@ func TestExportSpans(t *testing.T) {
|
|||||||
// parent
|
// parent
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
@ -219,11 +222,17 @@ func TestExportSpans(t *testing.T) {
|
|||||||
// child
|
// child
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8},
|
SpanID: trace.SpanID{0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8},
|
||||||
}),
|
}),
|
||||||
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
Parent: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
SpanKind: trace.SpanKindServer,
|
SpanKind: trace.SpanKindServer,
|
||||||
@ -394,7 +403,10 @@ func TestWithHeaders(t *testing.T) {
|
|||||||
spans := tracetest.SpanStubs{
|
spans := tracetest.SpanStubs{
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
@ -110,7 +110,10 @@ func (am *altMeter) Int64Counter(name string, _ ...metric.Int64CounterOption) (m
|
|||||||
return noop.NewMeterProvider().Meter("noop").Int64Counter(name)
|
return noop.NewMeterProvider().Meter("noop").Int64Counter(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Int64UpDownCounter(name string, _ ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
func (am *altMeter) Int64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
_ ...metric.Int64UpDownCounterOption,
|
||||||
|
) (metric.Int64UpDownCounter, error) {
|
||||||
return noop.NewMeterProvider().Meter("noop").Int64UpDownCounter(name)
|
return noop.NewMeterProvider().Meter("noop").Int64UpDownCounter(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,19 +125,28 @@ func (am *altMeter) Int64Gauge(name string, _ ...metric.Int64GaugeOption) (metri
|
|||||||
return noop.NewMeterProvider().Meter("noop").Int64Gauge(name)
|
return noop.NewMeterProvider().Meter("noop").Int64Gauge(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
func (am *altMeter) Int64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableCounterOption,
|
||||||
|
) (metric.Int64ObservableCounter, error) {
|
||||||
return &testAiCounter{
|
return &testAiCounter{
|
||||||
meter: am,
|
meter: am,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
func (am *altMeter) Int64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
return &testAiUpDownCounter{
|
return &testAiUpDownCounter{
|
||||||
meter: am,
|
meter: am,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
func (am *altMeter) Int64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableGaugeOption,
|
||||||
|
) (metric.Int64ObservableGauge, error) {
|
||||||
return &testAiGauge{
|
return &testAiGauge{
|
||||||
meter: am,
|
meter: am,
|
||||||
}, nil
|
}, nil
|
||||||
@ -144,11 +156,17 @@ func (am *altMeter) Float64Counter(name string, _ ...metric.Float64CounterOption
|
|||||||
return noop.NewMeterProvider().Meter("noop").Float64Counter(name)
|
return noop.NewMeterProvider().Meter("noop").Float64Counter(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Float64UpDownCounter(name string, _ ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
func (am *altMeter) Float64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
_ ...metric.Float64UpDownCounterOption,
|
||||||
|
) (metric.Float64UpDownCounter, error) {
|
||||||
return noop.NewMeterProvider().Meter("noop").Float64UpDownCounter(name)
|
return noop.NewMeterProvider().Meter("noop").Float64UpDownCounter(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
func (am *altMeter) Float64Histogram(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64HistogramOption,
|
||||||
|
) (metric.Float64Histogram, error) {
|
||||||
return noop.NewMeterProvider().Meter("noop").Float64Histogram(name)
|
return noop.NewMeterProvider().Meter("noop").Float64Histogram(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,19 +174,28 @@ func (am *altMeter) Float64Gauge(name string, options ...metric.Float64GaugeOpti
|
|||||||
return noop.NewMeterProvider().Meter("noop").Float64Gauge(name)
|
return noop.NewMeterProvider().Meter("noop").Float64Gauge(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
func (am *altMeter) Float64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableCounterOption,
|
||||||
|
) (metric.Float64ObservableCounter, error) {
|
||||||
return &testAfCounter{
|
return &testAfCounter{
|
||||||
meter: am,
|
meter: am,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
func (am *altMeter) Float64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
return &testAfUpDownCounter{
|
return &testAfUpDownCounter{
|
||||||
meter: am,
|
meter: am,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *altMeter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
func (am *altMeter) Float64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableGaugeOption,
|
||||||
|
) (metric.Float64ObservableGauge, error) {
|
||||||
return &testAfGauge{
|
return &testAfGauge{
|
||||||
meter: am,
|
meter: am,
|
||||||
}, nil
|
}, nil
|
||||||
|
@ -169,7 +169,10 @@ func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption)
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
func (m *meter) Int64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64UpDownCounterOption,
|
||||||
|
) (metric.Int64UpDownCounter, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -238,7 +241,10 @@ func (m *meter) Int64Gauge(name string, options ...metric.Int64GaugeOption) (met
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
func (m *meter) Int64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableCounterOption,
|
||||||
|
) (metric.Int64ObservableCounter, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -261,7 +267,10 @@ func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64Obser
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
func (m *meter) Int64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -284,7 +293,10 @@ func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int6
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
func (m *meter) Int64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableGaugeOption,
|
||||||
|
) (metric.Int64ObservableGauge, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -330,7 +342,10 @@ func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOpti
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
func (m *meter) Float64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64UpDownCounterOption,
|
||||||
|
) (metric.Float64UpDownCounter, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -353,7 +368,10 @@ func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDow
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
func (m *meter) Float64Histogram(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64HistogramOption,
|
||||||
|
) (metric.Float64Histogram, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -399,7 +417,10 @@ func (m *meter) Float64Gauge(name string, options ...metric.Float64GaugeOption)
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
func (m *meter) Float64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableCounterOption,
|
||||||
|
) (metric.Float64ObservableCounter, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -422,7 +443,10 @@ func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64O
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
func (m *meter) Float64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
@ -445,7 +469,10 @@ func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Fl
|
|||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
func (m *meter) Float64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableGaugeOption,
|
||||||
|
) (metric.Float64ObservableGauge, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
@ -125,7 +125,10 @@ func TestUnregisterConcurrentSafe(t *testing.T) {
|
|||||||
<-done
|
<-done
|
||||||
}
|
}
|
||||||
|
|
||||||
func testSetupAllInstrumentTypes(t *testing.T, m metric.Meter) (metric.Float64Counter, metric.Float64ObservableCounter) {
|
func testSetupAllInstrumentTypes(
|
||||||
|
t *testing.T,
|
||||||
|
m metric.Meter,
|
||||||
|
) (metric.Float64Counter, metric.Float64ObservableCounter) {
|
||||||
afcounter, err := m.Float64ObservableCounter("test_Async_Counter")
|
afcounter, err := m.Float64ObservableCounter("test_Async_Counter")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = m.Float64ObservableUpDownCounter("test_Async_UpDownCounter")
|
_, err = m.Float64ObservableUpDownCounter("test_Async_UpDownCounter")
|
||||||
@ -439,7 +442,10 @@ type failingRegisterCallbackMeter struct {
|
|||||||
noop.Meter
|
noop.Meter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *failingRegisterCallbackMeter) RegisterCallback(metric.Callback, ...metric.Observable) (metric.Registration, error) {
|
func (m *failingRegisterCallbackMeter) RegisterCallback(
|
||||||
|
metric.Callback,
|
||||||
|
...metric.Observable,
|
||||||
|
) (metric.Registration, error) {
|
||||||
return nil, errors.New("an error occurred")
|
return nil, errors.New("an error occurred")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,10 @@ func (m *testMeter) Int64Counter(name string, options ...metric.Int64CounterOpti
|
|||||||
return &testCountingIntInstrument{}, nil
|
return &testCountingIntInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
func (m *testMeter) Int64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64UpDownCounterOption,
|
||||||
|
) (metric.Int64UpDownCounter, error) {
|
||||||
m.siUDCount++
|
m.siUDCount++
|
||||||
return &testCountingIntInstrument{}, nil
|
return &testCountingIntInstrument{}, nil
|
||||||
}
|
}
|
||||||
@ -66,17 +69,26 @@ func (m *testMeter) Int64Gauge(name string, options ...metric.Int64GaugeOption)
|
|||||||
return &testCountingIntInstrument{}, nil
|
return &testCountingIntInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
func (m *testMeter) Int64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableCounterOption,
|
||||||
|
) (metric.Int64ObservableCounter, error) {
|
||||||
m.aiCount++
|
m.aiCount++
|
||||||
return &testCountingIntInstrument{}, nil
|
return &testCountingIntInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
func (m *testMeter) Int64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
m.aiUDCount++
|
m.aiUDCount++
|
||||||
return &testCountingIntInstrument{}, nil
|
return &testCountingIntInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
func (m *testMeter) Int64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableGaugeOption,
|
||||||
|
) (metric.Int64ObservableGauge, error) {
|
||||||
m.aiGauge++
|
m.aiGauge++
|
||||||
return &testCountingIntInstrument{}, nil
|
return &testCountingIntInstrument{}, nil
|
||||||
}
|
}
|
||||||
@ -86,12 +98,18 @@ func (m *testMeter) Float64Counter(name string, options ...metric.Float64Counter
|
|||||||
return &testCountingFloatInstrument{}, nil
|
return &testCountingFloatInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
func (m *testMeter) Float64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64UpDownCounterOption,
|
||||||
|
) (metric.Float64UpDownCounter, error) {
|
||||||
m.sfUDCount++
|
m.sfUDCount++
|
||||||
return &testCountingFloatInstrument{}, nil
|
return &testCountingFloatInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
func (m *testMeter) Float64Histogram(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64HistogramOption,
|
||||||
|
) (metric.Float64Histogram, error) {
|
||||||
m.sfHist++
|
m.sfHist++
|
||||||
return &testCountingFloatInstrument{}, nil
|
return &testCountingFloatInstrument{}, nil
|
||||||
}
|
}
|
||||||
@ -101,17 +119,26 @@ func (m *testMeter) Float64Gauge(name string, options ...metric.Float64GaugeOpti
|
|||||||
return &testCountingFloatInstrument{}, nil
|
return &testCountingFloatInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
func (m *testMeter) Float64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableCounterOption,
|
||||||
|
) (metric.Float64ObservableCounter, error) {
|
||||||
m.afCount++
|
m.afCount++
|
||||||
return &testCountingFloatInstrument{}, nil
|
return &testCountingFloatInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
func (m *testMeter) Float64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
m.afUDCount++
|
m.afUDCount++
|
||||||
return &testCountingFloatInstrument{}, nil
|
return &testCountingFloatInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *testMeter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
func (m *testMeter) Float64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableGaugeOption,
|
||||||
|
) (metric.Float64ObservableGauge, error) {
|
||||||
m.afGauge++
|
m.afGauge++
|
||||||
return &testCountingFloatInstrument{}, nil
|
return &testCountingFloatInstrument{}, nil
|
||||||
}
|
}
|
||||||
|
@ -164,7 +164,12 @@ var autoInstEnabled = new(bool)
|
|||||||
// "noinline" pragma prevents the method from ever being inlined.
|
// "noinline" pragma prevents the method from ever being inlined.
|
||||||
//
|
//
|
||||||
//go:noinline
|
//go:noinline
|
||||||
func (t *tracer) newSpan(ctx context.Context, autoSpan *bool, name string, opts []trace.SpanStartOption) (context.Context, trace.Span) {
|
func (t *tracer) newSpan(
|
||||||
|
ctx context.Context,
|
||||||
|
autoSpan *bool,
|
||||||
|
name string,
|
||||||
|
opts []trace.SpanStartOption,
|
||||||
|
) (context.Context, trace.Span) {
|
||||||
// autoInstEnabled is passed to newSpan via the autoSpan parameter. This is
|
// autoInstEnabled is passed to newSpan via the autoSpan parameter. This is
|
||||||
// so the auto-instrumentation can define a uprobe for (*t).newSpan and be
|
// so the auto-instrumentation can define a uprobe for (*t).newSpan and be
|
||||||
// provided with the address of the bool autoInstEnabled points to. It
|
// provided with the address of the bool autoInstEnabled points to. It
|
||||||
|
@ -34,7 +34,11 @@ type fnTracer struct {
|
|||||||
start func(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span)
|
start func(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fn fnTracer) Start(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
|
func (fn fnTracer) Start(
|
||||||
|
ctx context.Context,
|
||||||
|
spanName string,
|
||||||
|
opts ...trace.SpanStartOption,
|
||||||
|
) (context.Context, trace.Span) {
|
||||||
return fn.start(ctx, spanName, opts...)
|
return fn.start(ctx, spanName, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,8 +80,16 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
}),
|
}),
|
||||||
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithCertPool("METRICS_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("METRICS_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithClientCert("CLIENT_CERTIFICATE", "CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
envconfig.WithClientCert(
|
||||||
envconfig.WithClientCert("METRICS_CLIENT_CERTIFICATE", "METRICS_CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
"CLIENT_CERTIFICATE",
|
||||||
|
"CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
|
envconfig.WithClientCert(
|
||||||
|
"METRICS_CLIENT_CERTIFICATE",
|
||||||
|
"METRICS_CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
envconfig.WithBool("METRICS_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("METRICS_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
@ -91,8 +99,14 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
WithEnvCompression("METRICS_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
WithEnvCompression("METRICS_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
||||||
envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
envconfig.WithDuration("METRICS_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
envconfig.WithDuration("METRICS_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
withEnvTemporalityPreference("METRICS_TEMPORALITY_PREFERENCE", func(t metric.TemporalitySelector) { opts = append(opts, WithTemporalitySelector(t)) }),
|
withEnvTemporalityPreference(
|
||||||
withEnvAggPreference("METRICS_DEFAULT_HISTOGRAM_AGGREGATION", func(a metric.AggregationSelector) { opts = append(opts, WithAggregationSelector(a)) }),
|
"METRICS_TEMPORALITY_PREFERENCE",
|
||||||
|
func(t metric.TemporalitySelector) { opts = append(opts, WithTemporalitySelector(t)) },
|
||||||
|
),
|
||||||
|
withEnvAggPreference(
|
||||||
|
"METRICS_DEFAULT_HISTOGRAM_AGGREGATION",
|
||||||
|
func(a metric.AggregationSelector) { opts = append(opts, WithAggregationSelector(a)) },
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return opts
|
return opts
|
||||||
@ -157,7 +171,11 @@ func withEnvTemporalityPreference(n string, fn func(metric.TemporalitySelector))
|
|||||||
case "lowmemory":
|
case "lowmemory":
|
||||||
fn(lowMemory)
|
fn(lowMemory)
|
||||||
default:
|
default:
|
||||||
global.Warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to an invalid value, ignoring.", "value", s)
|
global.Warn(
|
||||||
|
"OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to an invalid value, ignoring.",
|
||||||
|
"value",
|
||||||
|
s,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,7 +221,11 @@ func withEnvAggPreference(n string, fn func(metric.AggregationSelector)) func(e
|
|||||||
return metric.DefaultAggregationSelector(kind)
|
return metric.DefaultAggregationSelector(kind)
|
||||||
})
|
})
|
||||||
default:
|
default:
|
||||||
global.Warn("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION is set to an invalid value, ignoring.", "value", s)
|
global.Warn(
|
||||||
|
"OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION is set to an invalid value, ignoring.",
|
||||||
|
"value",
|
||||||
|
s,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,12 +113,24 @@ func TestWithEnvAggPreference(t *testing.T) {
|
|||||||
name: "explicit_bucket_histogram",
|
name: "explicit_bucket_histogram",
|
||||||
envValue: "explicit_bucket_histogram",
|
envValue: "explicit_bucket_histogram",
|
||||||
want: map[metric.InstrumentKind]metric.Aggregation{
|
want: map[metric.InstrumentKind]metric.Aggregation{
|
||||||
metric.InstrumentKindCounter: metric.DefaultAggregationSelector(metric.InstrumentKindCounter),
|
metric.InstrumentKindCounter: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindHistogram: metric.DefaultAggregationSelector(metric.InstrumentKindHistogram),
|
metric.InstrumentKindCounter,
|
||||||
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindUpDownCounter),
|
),
|
||||||
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableCounter),
|
metric.InstrumentKindHistogram: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableUpDownCounter),
|
metric.InstrumentKindHistogram,
|
||||||
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(metric.InstrumentKindObservableGauge),
|
),
|
||||||
|
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableGauge,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -131,10 +143,18 @@ func TestWithEnvAggPreference(t *testing.T) {
|
|||||||
MaxScale: 20,
|
MaxScale: 20,
|
||||||
NoMinMax: false,
|
NoMinMax: false,
|
||||||
},
|
},
|
||||||
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindUpDownCounter),
|
metric.InstrumentKindUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableCounter),
|
metric.InstrumentKindUpDownCounter,
|
||||||
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(metric.InstrumentKindObservableUpDownCounter),
|
),
|
||||||
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(metric.InstrumentKindObservableGauge),
|
metric.InstrumentKindObservableCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableUpDownCounter: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableUpDownCounter,
|
||||||
|
),
|
||||||
|
metric.InstrumentKindObservableGauge: metric.DefaultAggregationSelector(
|
||||||
|
metric.InstrumentKindObservableGauge,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,10 @@ func (c *GRPCCollector) Headers() map[string][]string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Export handles the export req.
|
// Export handles the export req.
|
||||||
func (c *GRPCCollector) Export(ctx context.Context, req *collpb.ExportMetricsServiceRequest) (*collpb.ExportMetricsServiceResponse, error) {
|
func (c *GRPCCollector) Export(
|
||||||
|
ctx context.Context,
|
||||||
|
req *collpb.ExportMetricsServiceRequest,
|
||||||
|
) (*collpb.ExportMetricsServiceResponse, error) {
|
||||||
c.storage.Add(req)
|
c.storage.Add(req)
|
||||||
|
|
||||||
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
if h, ok := metadata.FromIncomingContext(ctx); ok {
|
||||||
@ -208,7 +211,11 @@ type HTTPCollector struct {
|
|||||||
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
// If errCh is not nil, the collector will respond to HTTP requests with errors
|
||||||
// sent on that channel. This means that if errCh is not nil Export calls will
|
// sent on that channel. This means that if errCh is not nil Export calls will
|
||||||
// block until an error is received.
|
// block until an error is received.
|
||||||
func NewHTTPCollector(endpoint string, resultCh <-chan ExportResult, opts ...func(*HTTPCollector)) (*HTTPCollector, error) {
|
func NewHTTPCollector(
|
||||||
|
endpoint string,
|
||||||
|
resultCh <-chan ExportResult,
|
||||||
|
opts ...func(*HTTPCollector),
|
||||||
|
) (*HTTPCollector, error) {
|
||||||
u, err := url.Parse(endpoint)
|
u, err := url.Parse(endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -203,7 +203,9 @@ func HistogramDataPoints[N int64 | float64](dPts []metricdata.HistogramDataPoint
|
|||||||
|
|
||||||
// ExponentialHistogram returns an OTLP Metric_ExponentialHistogram generated from h. An error is
|
// ExponentialHistogram returns an OTLP Metric_ExponentialHistogram generated from h. An error is
|
||||||
// returned if the temporality of h is unknown.
|
// returned if the temporality of h is unknown.
|
||||||
func ExponentialHistogram[N int64 | float64](h metricdata.ExponentialHistogram[N]) (*mpb.Metric_ExponentialHistogram, error) {
|
func ExponentialHistogram[N int64 | float64](
|
||||||
|
h metricdata.ExponentialHistogram[N],
|
||||||
|
) (*mpb.Metric_ExponentialHistogram, error) {
|
||||||
t, err := Temporality(h.Temporality)
|
t, err := Temporality(h.Temporality)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -218,7 +220,9 @@ func ExponentialHistogram[N int64 | float64](h metricdata.ExponentialHistogram[N
|
|||||||
|
|
||||||
// ExponentialHistogramDataPoints returns a slice of OTLP ExponentialHistogramDataPoint generated
|
// ExponentialHistogramDataPoints returns a slice of OTLP ExponentialHistogramDataPoint generated
|
||||||
// from dPts.
|
// from dPts.
|
||||||
func ExponentialHistogramDataPoints[N int64 | float64](dPts []metricdata.ExponentialHistogramDataPoint[N]) []*mpb.ExponentialHistogramDataPoint {
|
func ExponentialHistogramDataPoints[N int64 | float64](
|
||||||
|
dPts []metricdata.ExponentialHistogramDataPoint[N],
|
||||||
|
) []*mpb.ExponentialHistogramDataPoint {
|
||||||
out := make([]*mpb.ExponentialHistogramDataPoint, 0, len(dPts))
|
out := make([]*mpb.ExponentialHistogramDataPoint, 0, len(dPts))
|
||||||
for _, dPt := range dPts {
|
for _, dPt := range dPts {
|
||||||
sum := float64(dPt.Sum)
|
sum := float64(dPt.Sum)
|
||||||
@ -250,7 +254,9 @@ func ExponentialHistogramDataPoints[N int64 | float64](dPts []metricdata.Exponen
|
|||||||
|
|
||||||
// ExponentialHistogramDataPointBuckets returns an OTLP ExponentialHistogramDataPoint_Buckets generated
|
// ExponentialHistogramDataPointBuckets returns an OTLP ExponentialHistogramDataPoint_Buckets generated
|
||||||
// from bucket.
|
// from bucket.
|
||||||
func ExponentialHistogramDataPointBuckets(bucket metricdata.ExponentialBucket) *mpb.ExponentialHistogramDataPoint_Buckets {
|
func ExponentialHistogramDataPointBuckets(
|
||||||
|
bucket metricdata.ExponentialBucket,
|
||||||
|
) *mpb.ExponentialHistogramDataPoint_Buckets {
|
||||||
return &mpb.ExponentialHistogramDataPoint_Buckets{
|
return &mpb.ExponentialHistogramDataPoint_Buckets{
|
||||||
Offset: bucket.Offset,
|
Offset: bucket.Offset,
|
||||||
BucketCounts: bucket.Counts,
|
BucketCounts: bucket.Counts,
|
||||||
|
@ -77,8 +77,16 @@ func getOptionsFromEnv() []GenericOption {
|
|||||||
}),
|
}),
|
||||||
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }),
|
||||||
envconfig.WithClientCert("CLIENT_CERTIFICATE", "CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
envconfig.WithClientCert(
|
||||||
envconfig.WithClientCert("TRACES_CLIENT_CERTIFICATE", "TRACES_CLIENT_KEY", func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }),
|
"CLIENT_CERTIFICATE",
|
||||||
|
"CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
|
envconfig.WithClientCert(
|
||||||
|
"TRACES_CLIENT_CERTIFICATE",
|
||||||
|
"TRACES_CLIENT_KEY",
|
||||||
|
func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} },
|
||||||
|
),
|
||||||
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }),
|
||||||
|
@ -28,6 +28,10 @@ func requireErrorString(t *testing.T, expect string, err error) {
|
|||||||
func TestPartialSuccessFormat(t *testing.T) {
|
func TestPartialSuccessFormat(t *testing.T) {
|
||||||
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
requireErrorString(t, "empty message (0 metric data points rejected)", MetricPartialSuccessError(0, ""))
|
||||||
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
requireErrorString(t, "help help (0 metric data points rejected)", MetricPartialSuccessError(0, "help help"))
|
||||||
requireErrorString(t, "what happened (10 metric data points rejected)", MetricPartialSuccessError(10, "what happened"))
|
requireErrorString(
|
||||||
|
t,
|
||||||
|
"what happened (10 metric data points rejected)",
|
||||||
|
MetricPartialSuccessError(10, "what happened"),
|
||||||
|
)
|
||||||
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
requireErrorString(t, "what happened (15 spans rejected)", TracePartialSuccessError(15, "what happened"))
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,11 @@ func AssertRecordEqual(t testing.TB, want, got log.Record) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if !want.ObservedTimestamp().Equal(got.ObservedTimestamp()) {
|
if !want.ObservedTimestamp().Equal(got.ObservedTimestamp()) {
|
||||||
t.Errorf("ObservedTimestamp value is not equal:\nwant: %v\ngot: %v", want.ObservedTimestamp(), got.ObservedTimestamp())
|
t.Errorf(
|
||||||
|
"ObservedTimestamp value is not equal:\nwant: %v\ngot: %v",
|
||||||
|
want.ObservedTimestamp(),
|
||||||
|
got.ObservedTimestamp(),
|
||||||
|
)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if want.Severity() != got.Severity() {
|
if want.Severity() != got.Severity() {
|
||||||
|
@ -106,7 +106,9 @@ type Float64ObservableUpDownCounterConfig struct {
|
|||||||
|
|
||||||
// NewFloat64ObservableUpDownCounterConfig returns a new
|
// NewFloat64ObservableUpDownCounterConfig returns a new
|
||||||
// [Float64ObservableUpDownCounterConfig] with all opts applied.
|
// [Float64ObservableUpDownCounterConfig] with all opts applied.
|
||||||
func NewFloat64ObservableUpDownCounterConfig(opts ...Float64ObservableUpDownCounterOption) Float64ObservableUpDownCounterConfig {
|
func NewFloat64ObservableUpDownCounterConfig(
|
||||||
|
opts ...Float64ObservableUpDownCounterOption,
|
||||||
|
) Float64ObservableUpDownCounterConfig {
|
||||||
var config Float64ObservableUpDownCounterConfig
|
var config Float64ObservableUpDownCounterConfig
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
config = o.applyFloat64ObservableUpDownCounter(config)
|
config = o.applyFloat64ObservableUpDownCounter(config)
|
||||||
@ -239,12 +241,16 @@ type float64CallbackOpt struct {
|
|||||||
cback Float64Callback
|
cback Float64Callback
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o float64CallbackOpt) applyFloat64ObservableCounter(cfg Float64ObservableCounterConfig) Float64ObservableCounterConfig {
|
func (o float64CallbackOpt) applyFloat64ObservableCounter(
|
||||||
|
cfg Float64ObservableCounterConfig,
|
||||||
|
) Float64ObservableCounterConfig {
|
||||||
cfg.callbacks = append(cfg.callbacks, o.cback)
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o float64CallbackOpt) applyFloat64ObservableUpDownCounter(cfg Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
func (o float64CallbackOpt) applyFloat64ObservableUpDownCounter(
|
||||||
|
cfg Float64ObservableUpDownCounterConfig,
|
||||||
|
) Float64ObservableUpDownCounterConfig {
|
||||||
cfg.callbacks = append(cfg.callbacks, o.cback)
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,9 @@ type Int64ObservableUpDownCounterConfig struct {
|
|||||||
|
|
||||||
// NewInt64ObservableUpDownCounterConfig returns a new
|
// NewInt64ObservableUpDownCounterConfig returns a new
|
||||||
// [Int64ObservableUpDownCounterConfig] with all opts applied.
|
// [Int64ObservableUpDownCounterConfig] with all opts applied.
|
||||||
func NewInt64ObservableUpDownCounterConfig(opts ...Int64ObservableUpDownCounterOption) Int64ObservableUpDownCounterConfig {
|
func NewInt64ObservableUpDownCounterConfig(
|
||||||
|
opts ...Int64ObservableUpDownCounterOption,
|
||||||
|
) Int64ObservableUpDownCounterConfig {
|
||||||
var config Int64ObservableUpDownCounterConfig
|
var config Int64ObservableUpDownCounterConfig
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
config = o.applyInt64ObservableUpDownCounter(config)
|
config = o.applyInt64ObservableUpDownCounter(config)
|
||||||
@ -242,7 +244,9 @@ func (o int64CallbackOpt) applyInt64ObservableCounter(cfg Int64ObservableCounter
|
|||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o int64CallbackOpt) applyInt64ObservableUpDownCounter(cfg Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
func (o int64CallbackOpt) applyInt64ObservableUpDownCounter(
|
||||||
|
cfg Int64ObservableUpDownCounterConfig,
|
||||||
|
) Int64ObservableUpDownCounterConfig {
|
||||||
cfg.callbacks = append(cfg.callbacks, o.cback)
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,9 @@ func (o descOpt) applyFloat64ObservableCounter(c Float64ObservableCounterConfig)
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o descOpt) applyFloat64ObservableUpDownCounter(c Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
func (o descOpt) applyFloat64ObservableUpDownCounter(
|
||||||
|
c Float64ObservableUpDownCounterConfig,
|
||||||
|
) Float64ObservableUpDownCounterConfig {
|
||||||
c.description = string(o)
|
c.description = string(o)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
@ -98,7 +100,9 @@ func (o descOpt) applyInt64ObservableCounter(c Int64ObservableCounterConfig) Int
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o descOpt) applyInt64ObservableUpDownCounter(c Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
func (o descOpt) applyInt64ObservableUpDownCounter(
|
||||||
|
c Int64ObservableUpDownCounterConfig,
|
||||||
|
) Int64ObservableUpDownCounterConfig {
|
||||||
c.description = string(o)
|
c.description = string(o)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
@ -138,7 +142,9 @@ func (o unitOpt) applyFloat64ObservableCounter(c Float64ObservableCounterConfig)
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o unitOpt) applyFloat64ObservableUpDownCounter(c Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
func (o unitOpt) applyFloat64ObservableUpDownCounter(
|
||||||
|
c Float64ObservableUpDownCounterConfig,
|
||||||
|
) Float64ObservableUpDownCounterConfig {
|
||||||
c.unit = string(o)
|
c.unit = string(o)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
@ -173,7 +179,9 @@ func (o unitOpt) applyInt64ObservableCounter(c Int64ObservableCounterConfig) Int
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o unitOpt) applyInt64ObservableUpDownCounter(c Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
func (o unitOpt) applyInt64ObservableUpDownCounter(
|
||||||
|
c Int64ObservableUpDownCounterConfig,
|
||||||
|
) Int64ObservableUpDownCounterConfig {
|
||||||
c.unit = string(o)
|
c.unit = string(o)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,10 @@ type Meter interface {
|
|||||||
// The name needs to conform to the OpenTelemetry instrument name syntax.
|
// The name needs to conform to the OpenTelemetry instrument name syntax.
|
||||||
// See the Instrument Name section of the package documentation for more
|
// See the Instrument Name section of the package documentation for more
|
||||||
// information.
|
// information.
|
||||||
Int64ObservableUpDownCounter(name string, options ...Int64ObservableUpDownCounterOption) (Int64ObservableUpDownCounter, error)
|
Int64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...Int64ObservableUpDownCounterOption,
|
||||||
|
) (Int64ObservableUpDownCounter, error)
|
||||||
|
|
||||||
// Int64ObservableGauge returns a new Int64ObservableGauge instrument
|
// Int64ObservableGauge returns a new Int64ObservableGauge instrument
|
||||||
// identified by name and configured with options. The instrument is used
|
// identified by name and configured with options. The instrument is used
|
||||||
@ -194,7 +197,10 @@ type Meter interface {
|
|||||||
// The name needs to conform to the OpenTelemetry instrument name syntax.
|
// The name needs to conform to the OpenTelemetry instrument name syntax.
|
||||||
// See the Instrument Name section of the package documentation for more
|
// See the Instrument Name section of the package documentation for more
|
||||||
// information.
|
// information.
|
||||||
Float64ObservableUpDownCounter(name string, options ...Float64ObservableUpDownCounterOption) (Float64ObservableUpDownCounter, error)
|
Float64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...Float64ObservableUpDownCounterOption,
|
||||||
|
) (Float64ObservableUpDownCounter, error)
|
||||||
|
|
||||||
// Float64ObservableGauge returns a new Float64ObservableGauge instrument
|
// Float64ObservableGauge returns a new Float64ObservableGauge instrument
|
||||||
// identified by name and configured with options. The instrument is used
|
// identified by name and configured with options. The instrument is used
|
||||||
|
@ -86,13 +86,19 @@ func (Meter) Int64Gauge(string, ...metric.Int64GaugeOption) (metric.Int64Gauge,
|
|||||||
|
|
||||||
// Int64ObservableCounter returns an ObservableCounter used to record int64
|
// Int64ObservableCounter returns an ObservableCounter used to record int64
|
||||||
// measurements that produces no telemetry.
|
// measurements that produces no telemetry.
|
||||||
func (Meter) Int64ObservableCounter(string, ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
func (Meter) Int64ObservableCounter(
|
||||||
|
string,
|
||||||
|
...metric.Int64ObservableCounterOption,
|
||||||
|
) (metric.Int64ObservableCounter, error) {
|
||||||
return Int64ObservableCounter{}, nil
|
return Int64ObservableCounter{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64ObservableUpDownCounter returns an ObservableUpDownCounter used to
|
// Int64ObservableUpDownCounter returns an ObservableUpDownCounter used to
|
||||||
// record int64 measurements that produces no telemetry.
|
// record int64 measurements that produces no telemetry.
|
||||||
func (Meter) Int64ObservableUpDownCounter(string, ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
func (Meter) Int64ObservableUpDownCounter(
|
||||||
|
string,
|
||||||
|
...metric.Int64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
return Int64ObservableUpDownCounter{}, nil
|
return Int64ObservableUpDownCounter{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,19 +134,28 @@ func (Meter) Float64Gauge(string, ...metric.Float64GaugeOption) (metric.Float64G
|
|||||||
|
|
||||||
// Float64ObservableCounter returns an ObservableCounter used to record int64
|
// Float64ObservableCounter returns an ObservableCounter used to record int64
|
||||||
// measurements that produces no telemetry.
|
// measurements that produces no telemetry.
|
||||||
func (Meter) Float64ObservableCounter(string, ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
func (Meter) Float64ObservableCounter(
|
||||||
|
string,
|
||||||
|
...metric.Float64ObservableCounterOption,
|
||||||
|
) (metric.Float64ObservableCounter, error) {
|
||||||
return Float64ObservableCounter{}, nil
|
return Float64ObservableCounter{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float64ObservableUpDownCounter returns an ObservableUpDownCounter used to
|
// Float64ObservableUpDownCounter returns an ObservableUpDownCounter used to
|
||||||
// record int64 measurements that produces no telemetry.
|
// record int64 measurements that produces no telemetry.
|
||||||
func (Meter) Float64ObservableUpDownCounter(string, ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
func (Meter) Float64ObservableUpDownCounter(
|
||||||
|
string,
|
||||||
|
...metric.Float64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
return Float64ObservableUpDownCounter{}, nil
|
return Float64ObservableUpDownCounter{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float64ObservableGauge returns an ObservableGauge used to record int64
|
// Float64ObservableGauge returns an ObservableGauge used to record int64
|
||||||
// measurements that produces no telemetry.
|
// measurements that produces no telemetry.
|
||||||
func (Meter) Float64ObservableGauge(string, ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
func (Meter) Float64ObservableGauge(
|
||||||
|
string,
|
||||||
|
...metric.Float64ObservableGaugeOption,
|
||||||
|
) (metric.Float64ObservableGauge, error) {
|
||||||
return Float64ObservableGauge{}, nil
|
return Float64ObservableGauge{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,9 @@ func CheckFileFormatField(fileFormat string, supportedFormatMajor, supportedForm
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check that the major version number in the file is the same as what we expect.
|
// Check that the major version number in the file is the same as what we expect.
|
||||||
if fileFormatParsed.Major() != uint64(supportedFormatMajor) { // nolint:gosec // Version can't be negative (overflow checked).
|
if fileFormatParsed.Major() != uint64(
|
||||||
|
supportedFormatMajor,
|
||||||
|
) { // nolint:gosec // Version can't be negative (overflow checked).
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"this library cannot parse file formats with major version other than %v",
|
"this library cannot parse file formats with major version other than %v",
|
||||||
supportedFormatMajor,
|
supportedFormatMajor,
|
||||||
@ -43,7 +45,9 @@ func CheckFileFormatField(fileFormat string, supportedFormatMajor, supportedForm
|
|||||||
|
|
||||||
// Check that the file minor version number is not greater than
|
// Check that the file minor version number is not greater than
|
||||||
// what is requested supports.
|
// what is requested supports.
|
||||||
if fileFormatParsed.Minor() > uint64(supportedFormatMinor) { // nolint:gosec // Version can't be negative (overflow checked).
|
if fileFormatParsed.Minor() > uint64(
|
||||||
|
supportedFormatMinor,
|
||||||
|
) { // nolint:gosec // Version can't be negative (overflow checked).
|
||||||
supportedFormatMajorMinor := strconv.Itoa(supportedFormatMajor) + "." +
|
supportedFormatMajorMinor := strconv.Itoa(supportedFormatMajor) + "." +
|
||||||
strconv.Itoa(supportedFormatMinor) // 1.0
|
strconv.Itoa(supportedFormatMinor) // 1.0
|
||||||
|
|
||||||
|
@ -47,11 +47,14 @@ func TestLoggerEmit(t *testing.T) {
|
|||||||
rWithNoObservedTimestamp := r
|
rWithNoObservedTimestamp := r
|
||||||
rWithNoObservedTimestamp.SetObservedTimestamp(time.Time{})
|
rWithNoObservedTimestamp.SetObservedTimestamp(time.Time{})
|
||||||
|
|
||||||
contextWithSpanContext := trace.ContextWithSpanContext(context.Background(), trace.NewSpanContext(trace.SpanContextConfig{
|
contextWithSpanContext := trace.ContextWithSpanContext(
|
||||||
|
context.Background(),
|
||||||
|
trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0o1},
|
TraceID: trace.TraceID{0o1},
|
||||||
SpanID: trace.SpanID{0o2},
|
SpanID: trace.SpanID{0o2},
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
}))
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -73,6 +73,8 @@ func (f RecordFactory) NewRecord() sdklog.Record {
|
|||||||
func set(r *sdklog.Record, name string, value any) {
|
func set(r *sdklog.Record, name string, value any) {
|
||||||
rVal := reflect.ValueOf(r).Elem()
|
rVal := reflect.ValueOf(r).Elem()
|
||||||
rf := rVal.FieldByName(name)
|
rf := rVal.FieldByName(name)
|
||||||
rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem() // nolint: gosec // conversion of uintptr -> unsafe.Pointer.
|
rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).
|
||||||
|
Elem()
|
||||||
|
// nolint: gosec // conversion of uintptr -> unsafe.Pointer.
|
||||||
rf.Set(reflect.ValueOf(value))
|
rf.Set(reflect.ValueOf(value))
|
||||||
}
|
}
|
||||||
|
@ -203,8 +203,14 @@ func TestWithResource(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "explicit resource",
|
name: "explicit resource",
|
||||||
options: []LoggerProviderOption{WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5)))},
|
options: []LoggerProviderOption{
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5))),
|
||||||
|
},
|
||||||
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "last resource wins",
|
name: "last resource wins",
|
||||||
@ -212,12 +218,22 @@ func TestWithResource(t *testing.T) {
|
|||||||
WithResource(resource.NewSchemaless(attribute.String("rk1", "vk1"), attribute.Int64("rk2", 5))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "vk1"), attribute.Int64("rk2", 5))),
|
||||||
WithResource(resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
WithResource(resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
||||||
},
|
},
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "overlapping attributes with environment resource",
|
name: "overlapping attributes with environment resource",
|
||||||
options: []LoggerProviderOption{WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10)))},
|
options: []LoggerProviderOption{
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10))),
|
||||||
|
},
|
||||||
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tc := range cases {
|
for _, tc := range cases {
|
||||||
@ -296,12 +312,26 @@ func TestLoggerProviderLogger(t *testing.T) {
|
|||||||
t.Run("SameLoggers", func(t *testing.T) {
|
t.Run("SameLoggers", func(t *testing.T) {
|
||||||
p := NewLoggerProvider()
|
p := NewLoggerProvider()
|
||||||
|
|
||||||
l0, l1, l2 := p.Logger("l0"), p.Logger("l1"), p.Logger("l0", log.WithInstrumentationAttributes(attribute.String("foo", "bar")))
|
l0, l1, l2 := p.Logger(
|
||||||
|
"l0",
|
||||||
|
), p.Logger(
|
||||||
|
"l1",
|
||||||
|
), p.Logger(
|
||||||
|
"l0",
|
||||||
|
log.WithInstrumentationAttributes(attribute.String("foo", "bar")),
|
||||||
|
)
|
||||||
assert.NotSame(t, l0, l1)
|
assert.NotSame(t, l0, l1)
|
||||||
assert.NotSame(t, l0, l2)
|
assert.NotSame(t, l0, l2)
|
||||||
assert.NotSame(t, l1, l2)
|
assert.NotSame(t, l1, l2)
|
||||||
|
|
||||||
l3, l4, l5 := p.Logger("l0"), p.Logger("l1"), p.Logger("l0", log.WithInstrumentationAttributes(attribute.String("foo", "bar")))
|
l3, l4, l5 := p.Logger(
|
||||||
|
"l0",
|
||||||
|
), p.Logger(
|
||||||
|
"l1",
|
||||||
|
), p.Logger(
|
||||||
|
"l0",
|
||||||
|
log.WithInstrumentationAttributes(attribute.String("foo", "bar")),
|
||||||
|
)
|
||||||
assert.Same(t, l0, l3)
|
assert.Same(t, l0, l3)
|
||||||
assert.Same(t, l1, l4)
|
assert.Same(t, l1, l4)
|
||||||
assert.Same(t, l2, l5)
|
assert.Same(t, l2, l5)
|
||||||
|
@ -33,7 +33,9 @@ const envVarResourceAttributes = "OTEL_RESOURCE_ATTRIBUTES"
|
|||||||
|
|
||||||
var _ Reader = (*reader)(nil)
|
var _ Reader = (*reader)(nil)
|
||||||
|
|
||||||
func (r *reader) aggregation(kind InstrumentKind) Aggregation { // nolint:revive // import-shadow for method scoped by type.
|
func (r *reader) aggregation(
|
||||||
|
kind InstrumentKind,
|
||||||
|
) Aggregation { // nolint:revive // import-shadow for method scoped by type.
|
||||||
return r.aggregationFunc(kind)
|
return r.aggregationFunc(kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,8 +151,14 @@ func TestWithResource(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "explicit resource",
|
name: "explicit resource",
|
||||||
options: []Option{WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5)))},
|
options: []Option{
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5))),
|
||||||
|
},
|
||||||
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "last resource wins",
|
name: "last resource wins",
|
||||||
@ -158,12 +166,22 @@ func TestWithResource(t *testing.T) {
|
|||||||
WithResource(resource.NewSchemaless(attribute.String("rk1", "vk1"), attribute.Int64("rk2", 5))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "vk1"), attribute.Int64("rk2", 5))),
|
||||||
WithResource(resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
WithResource(resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
||||||
},
|
},
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "overlapping attributes with environment resource",
|
name: "overlapping attributes with environment resource",
|
||||||
options: []Option{WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10)))},
|
options: []Option{
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10))),
|
||||||
|
},
|
||||||
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tc := range cases {
|
for _, tc := range cases {
|
||||||
|
@ -18,7 +18,10 @@ type ExemplarReservoirProviderSelector func(Aggregation) exemplar.ReservoirProvi
|
|||||||
|
|
||||||
// reservoirFunc returns the appropriately configured exemplar reservoir
|
// reservoirFunc returns the appropriately configured exemplar reservoir
|
||||||
// creation func based on the passed InstrumentKind and filter configuration.
|
// creation func based on the passed InstrumentKind and filter configuration.
|
||||||
func reservoirFunc[N int64 | float64](provider exemplar.ReservoirProvider, filter exemplar.Filter) func(attribute.Set) aggregate.FilteredExemplarReservoir[N] {
|
func reservoirFunc[N int64 | float64](
|
||||||
|
provider exemplar.ReservoirProvider,
|
||||||
|
filter exemplar.Filter,
|
||||||
|
) func(attribute.Set) aggregate.FilteredExemplarReservoir[N] {
|
||||||
return func(attrs attribute.Set) aggregate.FilteredExemplarReservoir[N] {
|
return func(attrs attribute.Set) aggregate.FilteredExemplarReservoir[N] {
|
||||||
return aggregate.NewFilteredExemplarReservoir[N](filter, provider(attrs))
|
return aggregate.NewFilteredExemplarReservoir[N](filter, provider(attrs))
|
||||||
}
|
}
|
||||||
|
@ -208,7 +208,11 @@ func (i *int64Inst) Enabled(_ context.Context) bool {
|
|||||||
return len(i.measures) != 0
|
return len(i.measures) != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *int64Inst) aggregate(ctx context.Context, val int64, s attribute.Set) { // nolint:revive // okay to shadow pkg with method.
|
func (i *int64Inst) aggregate(
|
||||||
|
ctx context.Context,
|
||||||
|
val int64,
|
||||||
|
s attribute.Set,
|
||||||
|
) { // nolint:revive // okay to shadow pkg with method.
|
||||||
for _, in := range i.measures {
|
for _, in := range i.measures {
|
||||||
in(ctx, val, s)
|
in(ctx, val, s)
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,10 @@ func (b Builder[N]) Sum(monotonic bool) (Measure[N], ComputeAggregation) {
|
|||||||
|
|
||||||
// ExplicitBucketHistogram returns a histogram aggregate function input and
|
// ExplicitBucketHistogram returns a histogram aggregate function input and
|
||||||
// output.
|
// output.
|
||||||
func (b Builder[N]) ExplicitBucketHistogram(boundaries []float64, noMinMax, noSum bool) (Measure[N], ComputeAggregation) {
|
func (b Builder[N]) ExplicitBucketHistogram(
|
||||||
|
boundaries []float64,
|
||||||
|
noMinMax, noSum bool,
|
||||||
|
) (Measure[N], ComputeAggregation) {
|
||||||
h := newHistogram[N](boundaries, noMinMax, noSum, b.AggregationLimit, b.resFunc())
|
h := newHistogram[N](boundaries, noMinMax, noSum, b.AggregationLimit, b.resFunc())
|
||||||
switch b.Temporality {
|
switch b.Temporality {
|
||||||
case metricdata.DeltaTemporality:
|
case metricdata.DeltaTemporality:
|
||||||
@ -133,7 +136,10 @@ func (b Builder[N]) ExplicitBucketHistogram(boundaries []float64, noMinMax, noSu
|
|||||||
|
|
||||||
// ExponentialBucketHistogram returns a histogram aggregate function input and
|
// ExponentialBucketHistogram returns a histogram aggregate function input and
|
||||||
// output.
|
// output.
|
||||||
func (b Builder[N]) ExponentialBucketHistogram(maxSize, maxScale int32, noMinMax, noSum bool) (Measure[N], ComputeAggregation) {
|
func (b Builder[N]) ExponentialBucketHistogram(
|
||||||
|
maxSize, maxScale int32,
|
||||||
|
noMinMax, noSum bool,
|
||||||
|
) (Measure[N], ComputeAggregation) {
|
||||||
h := newExponentialHistogram[N](maxSize, maxScale, noMinMax, noSum, b.AggregationLimit, b.resFunc())
|
h := newExponentialHistogram[N](maxSize, maxScale, noMinMax, noSum, b.AggregationLimit, b.resFunc())
|
||||||
switch b.Temporality {
|
switch b.Temporality {
|
||||||
case metricdata.DeltaTemporality:
|
case metricdata.DeltaTemporality:
|
||||||
|
@ -48,7 +48,12 @@ type expoHistogramDataPoint[N int64 | float64] struct {
|
|||||||
zeroCount uint64
|
zeroCount uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
func newExpoHistogramDataPoint[N int64 | float64](attrs attribute.Set, maxSize int, maxScale int32, noMinMax, noSum bool) *expoHistogramDataPoint[N] { // nolint:revive // we need this control flag
|
func newExpoHistogramDataPoint[N int64 | float64](
|
||||||
|
attrs attribute.Set,
|
||||||
|
maxSize int,
|
||||||
|
maxScale int32,
|
||||||
|
noMinMax, noSum bool,
|
||||||
|
) *expoHistogramDataPoint[N] { // nolint:revive // we need this control flag
|
||||||
f := math.MaxFloat64
|
f := math.MaxFloat64
|
||||||
ma := N(f) // if N is int64, max will overflow to -9223372036854775808
|
ma := N(f) // if N is int64, max will overflow to -9223372036854775808
|
||||||
mi := N(-f)
|
mi := N(-f)
|
||||||
@ -283,7 +288,12 @@ func (b *expoBuckets) downscale(delta int32) {
|
|||||||
// newExponentialHistogram returns an Aggregator that summarizes a set of
|
// newExponentialHistogram returns an Aggregator that summarizes a set of
|
||||||
// measurements as an exponential histogram. Each histogram is scoped by attributes
|
// measurements as an exponential histogram. Each histogram is scoped by attributes
|
||||||
// and the aggregation cycle the measurements were made in.
|
// and the aggregation cycle the measurements were made in.
|
||||||
func newExponentialHistogram[N int64 | float64](maxSize, maxScale int32, noMinMax, noSum bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *expoHistogram[N] {
|
func newExponentialHistogram[N int64 | float64](
|
||||||
|
maxSize, maxScale int32,
|
||||||
|
noMinMax, noSum bool,
|
||||||
|
limit int,
|
||||||
|
r func(attribute.Set) FilteredExemplarReservoir[N],
|
||||||
|
) *expoHistogram[N] {
|
||||||
return &expoHistogram[N]{
|
return &expoHistogram[N]{
|
||||||
noSum: noSum,
|
noSum: noSum,
|
||||||
noMinMax: noMinMax,
|
noMinMax: noMinMax,
|
||||||
@ -314,7 +324,12 @@ type expoHistogram[N int64 | float64] struct {
|
|||||||
start time.Time
|
start time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *expoHistogram[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) {
|
func (e *expoHistogram[N]) measure(
|
||||||
|
ctx context.Context,
|
||||||
|
value N,
|
||||||
|
fltrAttr attribute.Set,
|
||||||
|
droppedAttr []attribute.KeyValue,
|
||||||
|
) {
|
||||||
// Ignore NaN and infinity.
|
// Ignore NaN and infinity.
|
||||||
if math.IsInf(float64(value), 0) || math.IsNaN(float64(value)) {
|
if math.IsInf(float64(value), 0) || math.IsNaN(float64(value)) {
|
||||||
return
|
return
|
||||||
@ -360,11 +375,19 @@ func (e *expoHistogram[N]) delta(dest *metricdata.Aggregation) int {
|
|||||||
hDPts[i].ZeroThreshold = 0.0
|
hDPts[i].ZeroThreshold = 0.0
|
||||||
|
|
||||||
hDPts[i].PositiveBucket.Offset = val.posBuckets.startBin
|
hDPts[i].PositiveBucket.Offset = val.posBuckets.startBin
|
||||||
hDPts[i].PositiveBucket.Counts = reset(hDPts[i].PositiveBucket.Counts, len(val.posBuckets.counts), len(val.posBuckets.counts))
|
hDPts[i].PositiveBucket.Counts = reset(
|
||||||
|
hDPts[i].PositiveBucket.Counts,
|
||||||
|
len(val.posBuckets.counts),
|
||||||
|
len(val.posBuckets.counts),
|
||||||
|
)
|
||||||
copy(hDPts[i].PositiveBucket.Counts, val.posBuckets.counts)
|
copy(hDPts[i].PositiveBucket.Counts, val.posBuckets.counts)
|
||||||
|
|
||||||
hDPts[i].NegativeBucket.Offset = val.negBuckets.startBin
|
hDPts[i].NegativeBucket.Offset = val.negBuckets.startBin
|
||||||
hDPts[i].NegativeBucket.Counts = reset(hDPts[i].NegativeBucket.Counts, len(val.negBuckets.counts), len(val.negBuckets.counts))
|
hDPts[i].NegativeBucket.Counts = reset(
|
||||||
|
hDPts[i].NegativeBucket.Counts,
|
||||||
|
len(val.negBuckets.counts),
|
||||||
|
len(val.negBuckets.counts),
|
||||||
|
)
|
||||||
copy(hDPts[i].NegativeBucket.Counts, val.negBuckets.counts)
|
copy(hDPts[i].NegativeBucket.Counts, val.negBuckets.counts)
|
||||||
|
|
||||||
if !e.noSum {
|
if !e.noSum {
|
||||||
@ -413,11 +436,19 @@ func (e *expoHistogram[N]) cumulative(dest *metricdata.Aggregation) int {
|
|||||||
hDPts[i].ZeroThreshold = 0.0
|
hDPts[i].ZeroThreshold = 0.0
|
||||||
|
|
||||||
hDPts[i].PositiveBucket.Offset = val.posBuckets.startBin
|
hDPts[i].PositiveBucket.Offset = val.posBuckets.startBin
|
||||||
hDPts[i].PositiveBucket.Counts = reset(hDPts[i].PositiveBucket.Counts, len(val.posBuckets.counts), len(val.posBuckets.counts))
|
hDPts[i].PositiveBucket.Counts = reset(
|
||||||
|
hDPts[i].PositiveBucket.Counts,
|
||||||
|
len(val.posBuckets.counts),
|
||||||
|
len(val.posBuckets.counts),
|
||||||
|
)
|
||||||
copy(hDPts[i].PositiveBucket.Counts, val.posBuckets.counts)
|
copy(hDPts[i].PositiveBucket.Counts, val.posBuckets.counts)
|
||||||
|
|
||||||
hDPts[i].NegativeBucket.Offset = val.negBuckets.startBin
|
hDPts[i].NegativeBucket.Offset = val.negBuckets.startBin
|
||||||
hDPts[i].NegativeBucket.Counts = reset(hDPts[i].NegativeBucket.Counts, len(val.negBuckets.counts), len(val.negBuckets.counts))
|
hDPts[i].NegativeBucket.Counts = reset(
|
||||||
|
hDPts[i].NegativeBucket.Counts,
|
||||||
|
len(val.negBuckets.counts),
|
||||||
|
len(val.negBuckets.counts),
|
||||||
|
)
|
||||||
copy(hDPts[i].NegativeBucket.Counts, val.negBuckets.counts)
|
copy(hDPts[i].NegativeBucket.Counts, val.negBuckets.counts)
|
||||||
|
|
||||||
if !e.noSum {
|
if !e.noSum {
|
||||||
|
@ -1073,10 +1073,22 @@ func FuzzGetBin(f *testing.F) {
|
|||||||
p.scale = (scale%31+31)%31 - 10
|
p.scale = (scale%31+31)%31 - 10
|
||||||
got := p.getBin(v)
|
got := p.getBin(v)
|
||||||
if v <= lowerBound(got, p.scale) {
|
if v <= lowerBound(got, p.scale) {
|
||||||
t.Errorf("v=%x scale =%d had bin %d, but was below lower bound %x", v, p.scale, got, lowerBound(got, p.scale))
|
t.Errorf(
|
||||||
|
"v=%x scale =%d had bin %d, but was below lower bound %x",
|
||||||
|
v,
|
||||||
|
p.scale,
|
||||||
|
got,
|
||||||
|
lowerBound(got, p.scale),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if v > lowerBound(got+1, p.scale) {
|
if v > lowerBound(got+1, p.scale) {
|
||||||
t.Errorf("v=%x scale =%d had bin %d, but was above upper bound %x", v, p.scale, got, lowerBound(got+1, p.scale))
|
t.Errorf(
|
||||||
|
"v=%x scale =%d had bin %d, but was above upper bound %x",
|
||||||
|
v,
|
||||||
|
p.scale,
|
||||||
|
got,
|
||||||
|
lowerBound(got+1, p.scale),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,10 @@ type filteredExemplarReservoir[N int64 | float64] struct {
|
|||||||
|
|
||||||
// NewFilteredExemplarReservoir creates a [FilteredExemplarReservoir] which only offers values
|
// NewFilteredExemplarReservoir creates a [FilteredExemplarReservoir] which only offers values
|
||||||
// that are allowed by the filter.
|
// that are allowed by the filter.
|
||||||
func NewFilteredExemplarReservoir[N int64 | float64](f exemplar.Filter, r exemplar.Reservoir) FilteredExemplarReservoir[N] {
|
func NewFilteredExemplarReservoir[N int64 | float64](
|
||||||
|
f exemplar.Filter,
|
||||||
|
r exemplar.Reservoir,
|
||||||
|
) FilteredExemplarReservoir[N] {
|
||||||
return &filteredExemplarReservoir[N]{
|
return &filteredExemplarReservoir[N]{
|
||||||
filter: f,
|
filter: f,
|
||||||
reservoir: r,
|
reservoir: r,
|
||||||
|
@ -53,7 +53,12 @@ type histValues[N int64 | float64] struct {
|
|||||||
valuesMu sync.Mutex
|
valuesMu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func newHistValues[N int64 | float64](bounds []float64, noSum bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *histValues[N] {
|
func newHistValues[N int64 | float64](
|
||||||
|
bounds []float64,
|
||||||
|
noSum bool,
|
||||||
|
limit int,
|
||||||
|
r func(attribute.Set) FilteredExemplarReservoir[N],
|
||||||
|
) *histValues[N] {
|
||||||
// The responsibility of keeping all buckets correctly associated with the
|
// The responsibility of keeping all buckets correctly associated with the
|
||||||
// passed boundaries is ultimately this type's responsibility. Make a copy
|
// passed boundaries is ultimately this type's responsibility. Make a copy
|
||||||
// here so we can always guarantee this. Or, in the case of failure, have
|
// here so we can always guarantee this. Or, in the case of failure, have
|
||||||
@ -71,7 +76,12 @@ func newHistValues[N int64 | float64](bounds []float64, noSum bool, limit int, r
|
|||||||
|
|
||||||
// Aggregate records the measurement value, scoped by attr, and aggregates it
|
// Aggregate records the measurement value, scoped by attr, and aggregates it
|
||||||
// into a histogram.
|
// into a histogram.
|
||||||
func (s *histValues[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) {
|
func (s *histValues[N]) measure(
|
||||||
|
ctx context.Context,
|
||||||
|
value N,
|
||||||
|
fltrAttr attribute.Set,
|
||||||
|
droppedAttr []attribute.KeyValue,
|
||||||
|
) {
|
||||||
// This search will return an index in the range [0, len(s.bounds)], where
|
// This search will return an index in the range [0, len(s.bounds)], where
|
||||||
// it will return len(s.bounds) if value is greater than the last element
|
// it will return len(s.bounds) if value is greater than the last element
|
||||||
// of s.bounds. This aligns with the buckets in that the length of buckets
|
// of s.bounds. This aligns with the buckets in that the length of buckets
|
||||||
@ -108,7 +118,12 @@ func (s *histValues[N]) measure(ctx context.Context, value N, fltrAttr attribute
|
|||||||
|
|
||||||
// newHistogram returns an Aggregator that summarizes a set of measurements as
|
// newHistogram returns an Aggregator that summarizes a set of measurements as
|
||||||
// an histogram.
|
// an histogram.
|
||||||
func newHistogram[N int64 | float64](boundaries []float64, noMinMax, noSum bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *histogram[N] {
|
func newHistogram[N int64 | float64](
|
||||||
|
boundaries []float64,
|
||||||
|
noMinMax, noSum bool,
|
||||||
|
limit int,
|
||||||
|
r func(attribute.Set) FilteredExemplarReservoir[N],
|
||||||
|
) *histogram[N] {
|
||||||
return &histogram[N]{
|
return &histogram[N]{
|
||||||
histValues: newHistValues[N](boundaries, noSum, limit, r),
|
histValues: newHistValues[N](boundaries, noSum, limit, r),
|
||||||
noMinMax: noMinMax,
|
noMinMax: noMinMax,
|
||||||
|
@ -225,7 +225,12 @@ func testCumulativeHist[N int64 | float64](c conf[N]) func(t *testing.T) {
|
|||||||
|
|
||||||
// hPointSummed returns an HistogramDataPoint that started and ended now with
|
// hPointSummed returns an HistogramDataPoint that started and ended now with
|
||||||
// multi number of measurements values v. It includes a min and max (set to v).
|
// multi number of measurements values v. It includes a min and max (set to v).
|
||||||
func hPointSummed[N int64 | float64](a attribute.Set, v N, multi uint64, start, t time.Time) metricdata.HistogramDataPoint[N] {
|
func hPointSummed[N int64 | float64](
|
||||||
|
a attribute.Set,
|
||||||
|
v N,
|
||||||
|
multi uint64,
|
||||||
|
start, t time.Time,
|
||||||
|
) metricdata.HistogramDataPoint[N] {
|
||||||
idx := sort.SearchFloat64s(bounds, float64(v))
|
idx := sort.SearchFloat64s(bounds, float64(v))
|
||||||
counts := make([]uint64, len(bounds)+1)
|
counts := make([]uint64, len(bounds)+1)
|
||||||
counts[idx] += multi
|
counts[idx] += multi
|
||||||
@ -244,7 +249,12 @@ func hPointSummed[N int64 | float64](a attribute.Set, v N, multi uint64, start,
|
|||||||
|
|
||||||
// hPoint returns an HistogramDataPoint that started and ended now with multi
|
// hPoint returns an HistogramDataPoint that started and ended now with multi
|
||||||
// number of measurements values v. It includes a min and max (set to v).
|
// number of measurements values v. It includes a min and max (set to v).
|
||||||
func hPoint[N int64 | float64](a attribute.Set, v N, multi uint64, start, t time.Time) metricdata.HistogramDataPoint[N] {
|
func hPoint[N int64 | float64](
|
||||||
|
a attribute.Set,
|
||||||
|
v N,
|
||||||
|
multi uint64,
|
||||||
|
start, t time.Time,
|
||||||
|
) metricdata.HistogramDataPoint[N] {
|
||||||
idx := sort.SearchFloat64s(bounds, float64(v))
|
idx := sort.SearchFloat64s(bounds, float64(v))
|
||||||
counts := make([]uint64, len(bounds)+1)
|
counts := make([]uint64, len(bounds)+1)
|
||||||
counts[idx] += multi
|
counts[idx] += multi
|
||||||
@ -339,7 +349,12 @@ func TestCumulativeHistogramImmutableCounts(t *testing.T) {
|
|||||||
cpCounts := make([]uint64, len(hdp.BucketCounts))
|
cpCounts := make([]uint64, len(hdp.BucketCounts))
|
||||||
copy(cpCounts, hdp.BucketCounts)
|
copy(cpCounts, hdp.BucketCounts)
|
||||||
hdp.BucketCounts[0] = 10
|
hdp.BucketCounts[0] = 10
|
||||||
assert.Equal(t, cpCounts, h.values[alice.Equivalent()].counts, "modifying the Aggregator bucket counts should not change the Aggregator")
|
assert.Equal(
|
||||||
|
t,
|
||||||
|
cpCounts,
|
||||||
|
h.values[alice.Equivalent()].counts,
|
||||||
|
"modifying the Aggregator bucket counts should not change the Aggregator",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeltaHistogramReset(t *testing.T) {
|
func TestDeltaHistogramReset(t *testing.T) {
|
||||||
|
@ -114,7 +114,10 @@ func (s *lastValue[N]) copyDpts(dest *[]metricdata.DataPoint[N], t time.Time) in
|
|||||||
|
|
||||||
// newPrecomputedLastValue returns an aggregator that summarizes a set of
|
// newPrecomputedLastValue returns an aggregator that summarizes a set of
|
||||||
// observations as the last one made.
|
// observations as the last one made.
|
||||||
func newPrecomputedLastValue[N int64 | float64](limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *precomputedLastValue[N] {
|
func newPrecomputedLastValue[N int64 | float64](
|
||||||
|
limit int,
|
||||||
|
r func(attribute.Set) FilteredExemplarReservoir[N],
|
||||||
|
) *precomputedLastValue[N] {
|
||||||
return &precomputedLastValue[N]{lastValue: newLastValue[N](limit, r)}
|
return &precomputedLastValue[N]{lastValue: newLastValue[N](limit, r)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +143,11 @@ func (s *sum[N]) cumulative(dest *metricdata.Aggregation) int {
|
|||||||
// newPrecomputedSum returns an aggregator that summarizes a set of
|
// newPrecomputedSum returns an aggregator that summarizes a set of
|
||||||
// observations as their arithmetic sum. Each sum is scoped by attributes and
|
// observations as their arithmetic sum. Each sum is scoped by attributes and
|
||||||
// the aggregation cycle the measurements were made in.
|
// the aggregation cycle the measurements were made in.
|
||||||
func newPrecomputedSum[N int64 | float64](monotonic bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *precomputedSum[N] {
|
func newPrecomputedSum[N int64 | float64](
|
||||||
|
monotonic bool,
|
||||||
|
limit int,
|
||||||
|
r func(attribute.Set) FilteredExemplarReservoir[N],
|
||||||
|
) *precomputedSum[N] {
|
||||||
return &precomputedSum[N]{
|
return &precomputedSum[N]{
|
||||||
valueMap: newValueMap[N](limit, r),
|
valueMap: newValueMap[N](limit, r),
|
||||||
monotonic: monotonic,
|
monotonic: monotonic,
|
||||||
|
@ -58,7 +58,9 @@ func (mr *ManualReader) temporality(kind InstrumentKind) metricdata.Temporality
|
|||||||
}
|
}
|
||||||
|
|
||||||
// aggregation returns what Aggregation to use for kind.
|
// aggregation returns what Aggregation to use for kind.
|
||||||
func (mr *ManualReader) aggregation(kind InstrumentKind) Aggregation { // nolint:revive // import-shadow for method scoped by type.
|
func (mr *ManualReader) aggregation(
|
||||||
|
kind InstrumentKind,
|
||||||
|
) Aggregation { // nolint:revive // import-shadow for method scoped by type.
|
||||||
return mr.aggregationSelector(kind)
|
return mr.aggregationSelector(kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,10 @@ func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption)
|
|||||||
// Int64UpDownCounter returns a new instrument identified by name and
|
// Int64UpDownCounter returns a new instrument identified by name and
|
||||||
// configured with options. The instrument is used to synchronously record
|
// configured with options. The instrument is used to synchronously record
|
||||||
// int64 measurements during a computational operation.
|
// int64 measurements during a computational operation.
|
||||||
func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
func (m *meter) Int64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64UpDownCounterOption,
|
||||||
|
) (metric.Int64UpDownCounter, error) {
|
||||||
cfg := metric.NewInt64UpDownCounterConfig(options...)
|
cfg := metric.NewInt64UpDownCounterConfig(options...)
|
||||||
const kind = InstrumentKindUpDownCounter
|
const kind = InstrumentKindUpDownCounter
|
||||||
p := int64InstProvider{m}
|
p := int64InstProvider{m}
|
||||||
@ -174,7 +177,10 @@ func (m *meter) int64ObservableInstrument(id Instrument, callbacks []metric.Int6
|
|||||||
// Description, and Unit, only the first set of callbacks provided are used.
|
// Description, and Unit, only the first set of callbacks provided are used.
|
||||||
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
||||||
// if instrumentation can be created multiple times with different callbacks.
|
// if instrumentation can be created multiple times with different callbacks.
|
||||||
func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
func (m *meter) Int64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableCounterOption,
|
||||||
|
) (metric.Int64ObservableCounter, error) {
|
||||||
cfg := metric.NewInt64ObservableCounterConfig(options...)
|
cfg := metric.NewInt64ObservableCounterConfig(options...)
|
||||||
id := Instrument{
|
id := Instrument{
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -195,7 +201,10 @@ func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64Obser
|
|||||||
// Description, and Unit, only the first set of callbacks provided are used.
|
// Description, and Unit, only the first set of callbacks provided are used.
|
||||||
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
||||||
// if instrumentation can be created multiple times with different callbacks.
|
// if instrumentation can be created multiple times with different callbacks.
|
||||||
func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
func (m *meter) Int64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
cfg := metric.NewInt64ObservableUpDownCounterConfig(options...)
|
cfg := metric.NewInt64ObservableUpDownCounterConfig(options...)
|
||||||
id := Instrument{
|
id := Instrument{
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -216,7 +225,10 @@ func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int6
|
|||||||
// Description, and Unit, only the first set of callbacks provided are used.
|
// Description, and Unit, only the first set of callbacks provided are used.
|
||||||
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
||||||
// if instrumentation can be created multiple times with different callbacks.
|
// if instrumentation can be created multiple times with different callbacks.
|
||||||
func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
func (m *meter) Int64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Int64ObservableGaugeOption,
|
||||||
|
) (metric.Int64ObservableGauge, error) {
|
||||||
cfg := metric.NewInt64ObservableGaugeConfig(options...)
|
cfg := metric.NewInt64ObservableGaugeConfig(options...)
|
||||||
id := Instrument{
|
id := Instrument{
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -246,7 +258,10 @@ func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOpti
|
|||||||
// Float64UpDownCounter returns a new instrument identified by name and
|
// Float64UpDownCounter returns a new instrument identified by name and
|
||||||
// configured with options. The instrument is used to synchronously record
|
// configured with options. The instrument is used to synchronously record
|
||||||
// float64 measurements during a computational operation.
|
// float64 measurements during a computational operation.
|
||||||
func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
func (m *meter) Float64UpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64UpDownCounterOption,
|
||||||
|
) (metric.Float64UpDownCounter, error) {
|
||||||
cfg := metric.NewFloat64UpDownCounterConfig(options...)
|
cfg := metric.NewFloat64UpDownCounterConfig(options...)
|
||||||
const kind = InstrumentKindUpDownCounter
|
const kind = InstrumentKindUpDownCounter
|
||||||
p := float64InstProvider{m}
|
p := float64InstProvider{m}
|
||||||
@ -261,7 +276,10 @@ func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDow
|
|||||||
// Float64Histogram returns a new instrument identified by name and configured
|
// Float64Histogram returns a new instrument identified by name and configured
|
||||||
// with options. The instrument is used to synchronously record the
|
// with options. The instrument is used to synchronously record the
|
||||||
// distribution of float64 measurements during a computational operation.
|
// distribution of float64 measurements during a computational operation.
|
||||||
func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
func (m *meter) Float64Histogram(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64HistogramOption,
|
||||||
|
) (metric.Float64Histogram, error) {
|
||||||
cfg := metric.NewFloat64HistogramConfig(options...)
|
cfg := metric.NewFloat64HistogramConfig(options...)
|
||||||
p := float64InstProvider{m}
|
p := float64InstProvider{m}
|
||||||
i, err := p.lookupHistogram(name, cfg)
|
i, err := p.lookupHistogram(name, cfg)
|
||||||
@ -289,7 +307,10 @@ func (m *meter) Float64Gauge(name string, options ...metric.Float64GaugeOption)
|
|||||||
|
|
||||||
// float64ObservableInstrument returns a new observable identified by the Instrument.
|
// float64ObservableInstrument returns a new observable identified by the Instrument.
|
||||||
// It registers callbacks for each reader's pipeline.
|
// It registers callbacks for each reader's pipeline.
|
||||||
func (m *meter) float64ObservableInstrument(id Instrument, callbacks []metric.Float64Callback) (float64Observable, error) {
|
func (m *meter) float64ObservableInstrument(
|
||||||
|
id Instrument,
|
||||||
|
callbacks []metric.Float64Callback,
|
||||||
|
) (float64Observable, error) {
|
||||||
key := instID{
|
key := instID{
|
||||||
Name: id.Name,
|
Name: id.Name,
|
||||||
Description: id.Description,
|
Description: id.Description,
|
||||||
@ -338,7 +359,10 @@ func (m *meter) float64ObservableInstrument(id Instrument, callbacks []metric.Fl
|
|||||||
// Description, and Unit, only the first set of callbacks provided are used.
|
// Description, and Unit, only the first set of callbacks provided are used.
|
||||||
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
||||||
// if instrumentation can be created multiple times with different callbacks.
|
// if instrumentation can be created multiple times with different callbacks.
|
||||||
func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
func (m *meter) Float64ObservableCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableCounterOption,
|
||||||
|
) (metric.Float64ObservableCounter, error) {
|
||||||
cfg := metric.NewFloat64ObservableCounterConfig(options...)
|
cfg := metric.NewFloat64ObservableCounterConfig(options...)
|
||||||
id := Instrument{
|
id := Instrument{
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -359,7 +383,10 @@ func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64O
|
|||||||
// Description, and Unit, only the first set of callbacks provided are used.
|
// Description, and Unit, only the first set of callbacks provided are used.
|
||||||
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
||||||
// if instrumentation can be created multiple times with different callbacks.
|
// if instrumentation can be created multiple times with different callbacks.
|
||||||
func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
func (m *meter) Float64ObservableUpDownCounter(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableUpDownCounterOption,
|
||||||
|
) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
cfg := metric.NewFloat64ObservableUpDownCounterConfig(options...)
|
cfg := metric.NewFloat64ObservableUpDownCounterConfig(options...)
|
||||||
id := Instrument{
|
id := Instrument{
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -380,7 +407,10 @@ func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Fl
|
|||||||
// Description, and Unit, only the first set of callbacks provided are used.
|
// Description, and Unit, only the first set of callbacks provided are used.
|
||||||
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
|
||||||
// if instrumentation can be created multiple times with different callbacks.
|
// if instrumentation can be created multiple times with different callbacks.
|
||||||
func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
func (m *meter) Float64ObservableGauge(
|
||||||
|
name string,
|
||||||
|
options ...metric.Float64ObservableGaugeOption,
|
||||||
|
) (metric.Float64ObservableGauge, error) {
|
||||||
cfg := metric.NewFloat64ObservableGaugeConfig(options...)
|
cfg := metric.NewFloat64ObservableGaugeConfig(options...)
|
||||||
id := Instrument{
|
id := Instrument{
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -426,8 +456,10 @@ func warnRepeatedObservableCallbacks(id Instrument) {
|
|||||||
"Instrument{Name: %q, Description: %q, Kind: %q, Unit: %q}",
|
"Instrument{Name: %q, Description: %q, Kind: %q, Unit: %q}",
|
||||||
id.Name, id.Description, "InstrumentKind"+id.Kind.String(), id.Unit,
|
id.Name, id.Description, "InstrumentKind"+id.Kind.String(), id.Unit,
|
||||||
)
|
)
|
||||||
global.Warn("Repeated observable instrument creation with callbacks. Ignoring new callbacks. Use meter.RegisterCallback and Registration.Unregister to manage callbacks.",
|
global.Warn(
|
||||||
"instrument", inst,
|
"Repeated observable instrument creation with callbacks. Ignoring new callbacks. Use meter.RegisterCallback and Registration.Unregister to manage callbacks.",
|
||||||
|
"instrument",
|
||||||
|
inst,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -613,7 +645,10 @@ func (p int64InstProvider) aggs(kind InstrumentKind, name, desc, u string) ([]ag
|
|||||||
return p.int64Resolver.Aggregators(inst)
|
return p.int64Resolver.Aggregators(inst)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p int64InstProvider) histogramAggs(name string, cfg metric.Int64HistogramConfig) ([]aggregate.Measure[int64], error) {
|
func (p int64InstProvider) histogramAggs(
|
||||||
|
name string,
|
||||||
|
cfg metric.Int64HistogramConfig,
|
||||||
|
) ([]aggregate.Measure[int64], error) {
|
||||||
boundaries := cfg.ExplicitBucketBoundaries()
|
boundaries := cfg.ExplicitBucketBoundaries()
|
||||||
aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
|
aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
|
||||||
if aggError != nil {
|
if aggError != nil {
|
||||||
@ -671,7 +706,10 @@ func (p float64InstProvider) aggs(kind InstrumentKind, name, desc, u string) ([]
|
|||||||
return p.float64Resolver.Aggregators(inst)
|
return p.float64Resolver.Aggregators(inst)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p float64InstProvider) histogramAggs(name string, cfg metric.Float64HistogramConfig) ([]aggregate.Measure[float64], error) {
|
func (p float64InstProvider) histogramAggs(
|
||||||
|
name string,
|
||||||
|
cfg metric.Float64HistogramConfig,
|
||||||
|
) ([]aggregate.Measure[float64], error) {
|
||||||
boundaries := cfg.ExplicitBucketBoundaries()
|
boundaries := cfg.ExplicitBucketBoundaries()
|
||||||
aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
|
aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
|
||||||
if aggError != nil {
|
if aggError != nil {
|
||||||
|
@ -443,7 +443,10 @@ func TestMeterCreatesInstruments(t *testing.T) {
|
|||||||
{
|
{
|
||||||
Attributes: attribute.Set{},
|
Attributes: attribute.Set{},
|
||||||
Count: 1,
|
Count: 1,
|
||||||
Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000},
|
Bounds: []float64{
|
||||||
|
0, 5, 10, 25, 50, 75, 100, 250, 500,
|
||||||
|
750, 1000, 2500, 5000, 7500, 10000,
|
||||||
|
},
|
||||||
BucketCounts: []uint64{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
BucketCounts: []uint64{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
Min: metricdata.NewExtrema[int64](7),
|
Min: metricdata.NewExtrema[int64](7),
|
||||||
Max: metricdata.NewExtrema[int64](7),
|
Max: metricdata.NewExtrema[int64](7),
|
||||||
@ -513,7 +516,10 @@ func TestMeterCreatesInstruments(t *testing.T) {
|
|||||||
{
|
{
|
||||||
Attributes: attribute.Set{},
|
Attributes: attribute.Set{},
|
||||||
Count: 1,
|
Count: 1,
|
||||||
Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000},
|
Bounds: []float64{
|
||||||
|
0, 5, 10, 25, 50, 75, 100, 250, 500,
|
||||||
|
750, 1000, 2500, 5000, 7500, 10000,
|
||||||
|
},
|
||||||
BucketCounts: []uint64{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
BucketCounts: []uint64{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
Min: metricdata.NewExtrema[float64](7.),
|
Min: metricdata.NewExtrema[float64](7.),
|
||||||
Max: metricdata.NewExtrema[float64](7.),
|
Max: metricdata.NewExtrema[float64](7.),
|
||||||
@ -1577,7 +1583,10 @@ func testAttributeFilter(temporality metricdata.Temporality) func(*testing.T) {
|
|||||||
DataPoints: []metricdata.HistogramDataPoint[float64]{
|
DataPoints: []metricdata.HistogramDataPoint[float64]{
|
||||||
{
|
{
|
||||||
Attributes: fooBar,
|
Attributes: fooBar,
|
||||||
Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000},
|
Bounds: []float64{
|
||||||
|
0, 5, 10, 25, 50, 75, 100, 250, 500,
|
||||||
|
750, 1000, 2500, 5000, 7500, 10000,
|
||||||
|
},
|
||||||
BucketCounts: []uint64{0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
BucketCounts: []uint64{0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
Count: 2,
|
Count: 2,
|
||||||
Min: metricdata.NewExtrema(1.),
|
Min: metricdata.NewExtrema(1.),
|
||||||
@ -1653,7 +1662,10 @@ func testAttributeFilter(temporality metricdata.Temporality) func(*testing.T) {
|
|||||||
DataPoints: []metricdata.HistogramDataPoint[int64]{
|
DataPoints: []metricdata.HistogramDataPoint[int64]{
|
||||||
{
|
{
|
||||||
Attributes: fooBar,
|
Attributes: fooBar,
|
||||||
Bounds: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000},
|
Bounds: []float64{
|
||||||
|
0, 5, 10, 25, 50, 75, 100, 250, 500,
|
||||||
|
750, 1000, 2500, 5000, 7500, 10000,
|
||||||
|
},
|
||||||
BucketCounts: []uint64{0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
BucketCounts: []uint64{0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
Count: 2,
|
Count: 2,
|
||||||
Min: metricdata.NewExtrema[int64](1),
|
Min: metricdata.NewExtrema[int64](1),
|
||||||
@ -1689,7 +1701,12 @@ func testAttributeFilter(temporality metricdata.Temporality) func(*testing.T) {
|
|||||||
require.Len(t, m.ScopeMetrics, 1)
|
require.Len(t, m.ScopeMetrics, 1)
|
||||||
require.Len(t, m.ScopeMetrics[0].Metrics, 1)
|
require.Len(t, m.ScopeMetrics[0].Metrics, 1)
|
||||||
|
|
||||||
metricdatatest.AssertEqual(t, tt.wantMetric, m.ScopeMetrics[0].Metrics[0], metricdatatest.IgnoreTimestamp())
|
metricdatatest.AssertEqual(
|
||||||
|
t,
|
||||||
|
tt.wantMetric,
|
||||||
|
m.ScopeMetrics[0].Metrics[0],
|
||||||
|
metricdatatest.IgnoreTimestamp(),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2119,7 +2136,15 @@ func TestMalformedSelectors(t *testing.T) {
|
|||||||
obs.ObserveFloat64(afGauge, 1)
|
obs.ObserveFloat64(afGauge, 1)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
_, err = meter.RegisterCallback(callback, aiCounter, aiUpDownCounter, aiGauge, afCounter, afUpDownCounter, afGauge)
|
_, err = meter.RegisterCallback(
|
||||||
|
callback,
|
||||||
|
aiCounter,
|
||||||
|
aiUpDownCounter,
|
||||||
|
aiGauge,
|
||||||
|
afCounter,
|
||||||
|
afUpDownCounter,
|
||||||
|
afGauge,
|
||||||
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
siCounter.Add(context.Background(), 1)
|
siCounter.Add(context.Background(), 1)
|
||||||
@ -2182,7 +2207,10 @@ func TestHistogramBucketPrecedenceOrdering(t *testing.T) {
|
|||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(tt.desc, func(t *testing.T) {
|
t.Run(tt.desc, func(t *testing.T) {
|
||||||
meter := NewMeterProvider(WithView(tt.views...), WithReader(tt.reader)).Meter("TestHistogramBucketPrecedenceOrdering")
|
meter := NewMeterProvider(
|
||||||
|
WithView(tt.views...),
|
||||||
|
WithReader(tt.reader),
|
||||||
|
).Meter("TestHistogramBucketPrecedenceOrdering")
|
||||||
sfHistogram, err := meter.Float64Histogram("sync.float64.histogram", tt.histogramOpts...)
|
sfHistogram, err := meter.Float64Histogram("sync.float64.histogram", tt.histogramOpts...)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
sfHistogram.Record(context.Background(), 1)
|
sfHistogram.Record(context.Background(), 1)
|
||||||
@ -2508,7 +2536,15 @@ func TestDuplicateInstrumentCreation(t *testing.T) {
|
|||||||
internalMeter, ok := m.(*meter)
|
internalMeter, ok := m.(*meter)
|
||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
// check that multiple calls to create the same instrument only create 1 instrument
|
// check that multiple calls to create the same instrument only create 1 instrument
|
||||||
numInstruments := len(internalMeter.int64Insts.data) + len(internalMeter.float64Insts.data) + len(internalMeter.int64ObservableInsts.data) + len(internalMeter.float64ObservableInsts.data)
|
numInstruments := len(
|
||||||
|
internalMeter.int64Insts.data,
|
||||||
|
) + len(
|
||||||
|
internalMeter.float64Insts.data,
|
||||||
|
) + len(
|
||||||
|
internalMeter.int64ObservableInsts.data,
|
||||||
|
) + len(
|
||||||
|
internalMeter.float64ObservableInsts.data,
|
||||||
|
)
|
||||||
require.Equal(t, 1, numInstruments)
|
require.Equal(t, 1, numInstruments)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -680,18 +680,44 @@ func TestAssertEqual(t *testing.T) {
|
|||||||
t.Run("SumFloat64", testDatatype(sumFloat64A, sumFloat64B, equalSums[float64]))
|
t.Run("SumFloat64", testDatatype(sumFloat64A, sumFloat64B, equalSums[float64]))
|
||||||
t.Run("GaugeInt64", testDatatype(gaugeInt64A, gaugeInt64B, equalGauges[int64]))
|
t.Run("GaugeInt64", testDatatype(gaugeInt64A, gaugeInt64B, equalGauges[int64]))
|
||||||
t.Run("GaugeFloat64", testDatatype(gaugeFloat64A, gaugeFloat64B, equalGauges[float64]))
|
t.Run("GaugeFloat64", testDatatype(gaugeFloat64A, gaugeFloat64B, equalGauges[float64]))
|
||||||
t.Run("HistogramDataPointInt64", testDatatype(histogramDataPointInt64A, histogramDataPointInt64B, equalHistogramDataPoints[int64]))
|
t.Run(
|
||||||
t.Run("HistogramDataPointFloat64", testDatatype(histogramDataPointFloat64A, histogramDataPointFloat64B, equalHistogramDataPoints[float64]))
|
"HistogramDataPointInt64",
|
||||||
|
testDatatype(histogramDataPointInt64A, histogramDataPointInt64B, equalHistogramDataPoints[int64]),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"HistogramDataPointFloat64",
|
||||||
|
testDatatype(histogramDataPointFloat64A, histogramDataPointFloat64B, equalHistogramDataPoints[float64]),
|
||||||
|
)
|
||||||
t.Run("DataPointInt64", testDatatype(dataPointInt64A, dataPointInt64B, equalDataPoints[int64]))
|
t.Run("DataPointInt64", testDatatype(dataPointInt64A, dataPointInt64B, equalDataPoints[int64]))
|
||||||
t.Run("DataPointFloat64", testDatatype(dataPointFloat64A, dataPointFloat64B, equalDataPoints[float64]))
|
t.Run("DataPointFloat64", testDatatype(dataPointFloat64A, dataPointFloat64B, equalDataPoints[float64]))
|
||||||
t.Run("ExtremaInt64", testDatatype(minInt64A, minInt64B, equalExtrema[int64]))
|
t.Run("ExtremaInt64", testDatatype(minInt64A, minInt64B, equalExtrema[int64]))
|
||||||
t.Run("ExtremaFloat64", testDatatype(minFloat64A, minFloat64B, equalExtrema[float64]))
|
t.Run("ExtremaFloat64", testDatatype(minFloat64A, minFloat64B, equalExtrema[float64]))
|
||||||
t.Run("ExemplarInt64", testDatatype(exemplarInt64A, exemplarInt64B, equalExemplars[int64]))
|
t.Run("ExemplarInt64", testDatatype(exemplarInt64A, exemplarInt64B, equalExemplars[int64]))
|
||||||
t.Run("ExemplarFloat64", testDatatype(exemplarFloat64A, exemplarFloat64B, equalExemplars[float64]))
|
t.Run("ExemplarFloat64", testDatatype(exemplarFloat64A, exemplarFloat64B, equalExemplars[float64]))
|
||||||
t.Run("ExponentialHistogramInt64", testDatatype(exponentialHistogramInt64A, exponentialHistogramInt64B, equalExponentialHistograms[int64]))
|
t.Run(
|
||||||
t.Run("ExponentialHistogramFloat64", testDatatype(exponentialHistogramFloat64A, exponentialHistogramFloat64B, equalExponentialHistograms[float64]))
|
"ExponentialHistogramInt64",
|
||||||
t.Run("ExponentialHistogramDataPointInt64", testDatatype(exponentialHistogramDataPointInt64A, exponentialHistogramDataPointInt64B, equalExponentialHistogramDataPoints[int64]))
|
testDatatype(exponentialHistogramInt64A, exponentialHistogramInt64B, equalExponentialHistograms[int64]),
|
||||||
t.Run("ExponentialHistogramDataPointFloat64", testDatatype(exponentialHistogramDataPointFloat64A, exponentialHistogramDataPointFloat64B, equalExponentialHistogramDataPoints[float64]))
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramFloat64",
|
||||||
|
testDatatype(exponentialHistogramFloat64A, exponentialHistogramFloat64B, equalExponentialHistograms[float64]),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointInt64",
|
||||||
|
testDatatype(
|
||||||
|
exponentialHistogramDataPointInt64A,
|
||||||
|
exponentialHistogramDataPointInt64B,
|
||||||
|
equalExponentialHistogramDataPoints[int64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointFloat64",
|
||||||
|
testDatatype(
|
||||||
|
exponentialHistogramDataPointFloat64A,
|
||||||
|
exponentialHistogramDataPointFloat64B,
|
||||||
|
equalExponentialHistogramDataPoints[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
t.Run("ExponentialBuckets", testDatatype(exponentialBucket2, exponentialBucket3, equalExponentialBuckets))
|
t.Run("ExponentialBuckets", testDatatype(exponentialBucket2, exponentialBucket3, equalExponentialBuckets))
|
||||||
t.Run("Summary", testDatatype(summaryA, summaryB, equalSummary))
|
t.Run("Summary", testDatatype(summaryA, summaryB, equalSummary))
|
||||||
t.Run("SummaryDataPoint", testDatatype(summaryDataPointA, summaryDataPointB, equalSummaryDataPoint))
|
t.Run("SummaryDataPoint", testDatatype(summaryDataPointA, summaryDataPointB, equalSummaryDataPoint))
|
||||||
@ -708,18 +734,56 @@ func TestAssertEqualIgnoreTime(t *testing.T) {
|
|||||||
t.Run("SumFloat64", testDatatypeIgnoreTime(sumFloat64A, sumFloat64C, equalSums[float64]))
|
t.Run("SumFloat64", testDatatypeIgnoreTime(sumFloat64A, sumFloat64C, equalSums[float64]))
|
||||||
t.Run("GaugeInt64", testDatatypeIgnoreTime(gaugeInt64A, gaugeInt64C, equalGauges[int64]))
|
t.Run("GaugeInt64", testDatatypeIgnoreTime(gaugeInt64A, gaugeInt64C, equalGauges[int64]))
|
||||||
t.Run("GaugeFloat64", testDatatypeIgnoreTime(gaugeFloat64A, gaugeFloat64C, equalGauges[float64]))
|
t.Run("GaugeFloat64", testDatatypeIgnoreTime(gaugeFloat64A, gaugeFloat64C, equalGauges[float64]))
|
||||||
t.Run("HistogramDataPointInt64", testDatatypeIgnoreTime(histogramDataPointInt64A, histogramDataPointInt64C, equalHistogramDataPoints[int64]))
|
t.Run(
|
||||||
t.Run("HistogramDataPointFloat64", testDatatypeIgnoreTime(histogramDataPointFloat64A, histogramDataPointFloat64C, equalHistogramDataPoints[float64]))
|
"HistogramDataPointInt64",
|
||||||
|
testDatatypeIgnoreTime(histogramDataPointInt64A, histogramDataPointInt64C, equalHistogramDataPoints[int64]),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"HistogramDataPointFloat64",
|
||||||
|
testDatatypeIgnoreTime(
|
||||||
|
histogramDataPointFloat64A,
|
||||||
|
histogramDataPointFloat64C,
|
||||||
|
equalHistogramDataPoints[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
t.Run("DataPointInt64", testDatatypeIgnoreTime(dataPointInt64A, dataPointInt64C, equalDataPoints[int64]))
|
t.Run("DataPointInt64", testDatatypeIgnoreTime(dataPointInt64A, dataPointInt64C, equalDataPoints[int64]))
|
||||||
t.Run("DataPointFloat64", testDatatypeIgnoreTime(dataPointFloat64A, dataPointFloat64C, equalDataPoints[float64]))
|
t.Run("DataPointFloat64", testDatatypeIgnoreTime(dataPointFloat64A, dataPointFloat64C, equalDataPoints[float64]))
|
||||||
t.Run("ExtremaInt64", testDatatypeIgnoreTime(minInt64A, minInt64C, equalExtrema[int64]))
|
t.Run("ExtremaInt64", testDatatypeIgnoreTime(minInt64A, minInt64C, equalExtrema[int64]))
|
||||||
t.Run("ExtremaFloat64", testDatatypeIgnoreTime(minFloat64A, minFloat64C, equalExtrema[float64]))
|
t.Run("ExtremaFloat64", testDatatypeIgnoreTime(minFloat64A, minFloat64C, equalExtrema[float64]))
|
||||||
t.Run("ExemplarInt64", testDatatypeIgnoreTime(exemplarInt64A, exemplarInt64C, equalExemplars[int64]))
|
t.Run("ExemplarInt64", testDatatypeIgnoreTime(exemplarInt64A, exemplarInt64C, equalExemplars[int64]))
|
||||||
t.Run("ExemplarFloat64", testDatatypeIgnoreTime(exemplarFloat64A, exemplarFloat64C, equalExemplars[float64]))
|
t.Run("ExemplarFloat64", testDatatypeIgnoreTime(exemplarFloat64A, exemplarFloat64C, equalExemplars[float64]))
|
||||||
t.Run("ExponentialHistogramInt64", testDatatypeIgnoreTime(exponentialHistogramInt64A, exponentialHistogramInt64C, equalExponentialHistograms[int64]))
|
t.Run(
|
||||||
t.Run("ExponentialHistogramFloat64", testDatatypeIgnoreTime(exponentialHistogramFloat64A, exponentialHistogramFloat64C, equalExponentialHistograms[float64]))
|
"ExponentialHistogramInt64",
|
||||||
t.Run("ExponentialHistogramDataPointInt64", testDatatypeIgnoreTime(exponentialHistogramDataPointInt64A, exponentialHistogramDataPointInt64C, equalExponentialHistogramDataPoints[int64]))
|
testDatatypeIgnoreTime(
|
||||||
t.Run("ExponentialHistogramDataPointFloat64", testDatatypeIgnoreTime(exponentialHistogramDataPointFloat64A, exponentialHistogramDataPointFloat64C, equalExponentialHistogramDataPoints[float64]))
|
exponentialHistogramInt64A,
|
||||||
|
exponentialHistogramInt64C,
|
||||||
|
equalExponentialHistograms[int64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramFloat64",
|
||||||
|
testDatatypeIgnoreTime(
|
||||||
|
exponentialHistogramFloat64A,
|
||||||
|
exponentialHistogramFloat64C,
|
||||||
|
equalExponentialHistograms[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointInt64",
|
||||||
|
testDatatypeIgnoreTime(
|
||||||
|
exponentialHistogramDataPointInt64A,
|
||||||
|
exponentialHistogramDataPointInt64C,
|
||||||
|
equalExponentialHistogramDataPoints[int64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointFloat64",
|
||||||
|
testDatatypeIgnoreTime(
|
||||||
|
exponentialHistogramDataPointFloat64A,
|
||||||
|
exponentialHistogramDataPointFloat64C,
|
||||||
|
equalExponentialHistogramDataPoints[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
t.Run("Summary", testDatatypeIgnoreTime(summaryA, summaryC, equalSummary))
|
t.Run("Summary", testDatatypeIgnoreTime(summaryA, summaryC, equalSummary))
|
||||||
t.Run("SummaryDataPoint", testDatatypeIgnoreTime(summaryDataPointA, summaryDataPointC, equalSummaryDataPoint))
|
t.Run("SummaryDataPoint", testDatatypeIgnoreTime(summaryDataPointA, summaryDataPointC, equalSummaryDataPoint))
|
||||||
}
|
}
|
||||||
@ -727,11 +791,17 @@ func TestAssertEqualIgnoreTime(t *testing.T) {
|
|||||||
func TestAssertEqualIgnoreExemplars(t *testing.T) {
|
func TestAssertEqualIgnoreExemplars(t *testing.T) {
|
||||||
hdpInt64 := histogramDataPointInt64A
|
hdpInt64 := histogramDataPointInt64A
|
||||||
hdpInt64.Exemplars = []metricdata.Exemplar[int64]{exemplarInt64B}
|
hdpInt64.Exemplars = []metricdata.Exemplar[int64]{exemplarInt64B}
|
||||||
t.Run("HistogramDataPointInt64", testDatatypeIgnoreExemplars(histogramDataPointInt64A, hdpInt64, equalHistogramDataPoints[int64]))
|
t.Run(
|
||||||
|
"HistogramDataPointInt64",
|
||||||
|
testDatatypeIgnoreExemplars(histogramDataPointInt64A, hdpInt64, equalHistogramDataPoints[int64]),
|
||||||
|
)
|
||||||
|
|
||||||
hdpFloat64 := histogramDataPointFloat64A
|
hdpFloat64 := histogramDataPointFloat64A
|
||||||
hdpFloat64.Exemplars = []metricdata.Exemplar[float64]{exemplarFloat64B}
|
hdpFloat64.Exemplars = []metricdata.Exemplar[float64]{exemplarFloat64B}
|
||||||
t.Run("HistogramDataPointFloat64", testDatatypeIgnoreExemplars(histogramDataPointFloat64A, hdpFloat64, equalHistogramDataPoints[float64]))
|
t.Run(
|
||||||
|
"HistogramDataPointFloat64",
|
||||||
|
testDatatypeIgnoreExemplars(histogramDataPointFloat64A, hdpFloat64, equalHistogramDataPoints[float64]),
|
||||||
|
)
|
||||||
|
|
||||||
dpInt64 := dataPointInt64A
|
dpInt64 := dataPointInt64A
|
||||||
dpInt64.Exemplars = []metricdata.Exemplar[int64]{exemplarInt64B}
|
dpInt64.Exemplars = []metricdata.Exemplar[int64]{exemplarInt64B}
|
||||||
@ -743,11 +813,25 @@ func TestAssertEqualIgnoreExemplars(t *testing.T) {
|
|||||||
|
|
||||||
ehdpInt64 := exponentialHistogramDataPointInt64A
|
ehdpInt64 := exponentialHistogramDataPointInt64A
|
||||||
ehdpInt64.Exemplars = []metricdata.Exemplar[int64]{exemplarInt64B}
|
ehdpInt64.Exemplars = []metricdata.Exemplar[int64]{exemplarInt64B}
|
||||||
t.Run("ExponentialHistogramDataPointInt64", testDatatypeIgnoreExemplars(exponentialHistogramDataPointInt64A, ehdpInt64, equalExponentialHistogramDataPoints[int64]))
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointInt64",
|
||||||
|
testDatatypeIgnoreExemplars(
|
||||||
|
exponentialHistogramDataPointInt64A,
|
||||||
|
ehdpInt64,
|
||||||
|
equalExponentialHistogramDataPoints[int64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
ehdpFloat64 := exponentialHistogramDataPointFloat64A
|
ehdpFloat64 := exponentialHistogramDataPointFloat64A
|
||||||
ehdpFloat64.Exemplars = []metricdata.Exemplar[float64]{exemplarFloat64B}
|
ehdpFloat64.Exemplars = []metricdata.Exemplar[float64]{exemplarFloat64B}
|
||||||
t.Run("ExponentialHistogramDataPointFloat64", testDatatypeIgnoreExemplars(exponentialHistogramDataPointFloat64A, ehdpFloat64, equalExponentialHistogramDataPoints[float64]))
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointFloat64",
|
||||||
|
testDatatypeIgnoreExemplars(
|
||||||
|
exponentialHistogramDataPointFloat64A,
|
||||||
|
ehdpFloat64,
|
||||||
|
equalExponentialHistogramDataPoints[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAssertEqualIgnoreValue(t *testing.T) {
|
func TestAssertEqualIgnoreValue(t *testing.T) {
|
||||||
@ -760,16 +844,54 @@ func TestAssertEqualIgnoreValue(t *testing.T) {
|
|||||||
t.Run("SumFloat64", testDatatypeIgnoreValue(sumFloat64A, sumFloat64D, equalSums[float64]))
|
t.Run("SumFloat64", testDatatypeIgnoreValue(sumFloat64A, sumFloat64D, equalSums[float64]))
|
||||||
t.Run("GaugeInt64", testDatatypeIgnoreValue(gaugeInt64A, gaugeInt64D, equalGauges[int64]))
|
t.Run("GaugeInt64", testDatatypeIgnoreValue(gaugeInt64A, gaugeInt64D, equalGauges[int64]))
|
||||||
t.Run("GaugeFloat64", testDatatypeIgnoreValue(gaugeFloat64A, gaugeFloat64D, equalGauges[float64]))
|
t.Run("GaugeFloat64", testDatatypeIgnoreValue(gaugeFloat64A, gaugeFloat64D, equalGauges[float64]))
|
||||||
t.Run("HistogramDataPointInt64", testDatatypeIgnoreValue(histogramDataPointInt64A, histogramDataPointInt64D, equalHistogramDataPoints[int64]))
|
t.Run(
|
||||||
t.Run("HistogramDataPointFloat64", testDatatypeIgnoreValue(histogramDataPointFloat64A, histogramDataPointFloat64D, equalHistogramDataPoints[float64]))
|
"HistogramDataPointInt64",
|
||||||
|
testDatatypeIgnoreValue(histogramDataPointInt64A, histogramDataPointInt64D, equalHistogramDataPoints[int64]),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"HistogramDataPointFloat64",
|
||||||
|
testDatatypeIgnoreValue(
|
||||||
|
histogramDataPointFloat64A,
|
||||||
|
histogramDataPointFloat64D,
|
||||||
|
equalHistogramDataPoints[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
t.Run("DataPointInt64", testDatatypeIgnoreValue(dataPointInt64A, dataPointInt64D, equalDataPoints[int64]))
|
t.Run("DataPointInt64", testDatatypeIgnoreValue(dataPointInt64A, dataPointInt64D, equalDataPoints[int64]))
|
||||||
t.Run("DataPointFloat64", testDatatypeIgnoreValue(dataPointFloat64A, dataPointFloat64D, equalDataPoints[float64]))
|
t.Run("DataPointFloat64", testDatatypeIgnoreValue(dataPointFloat64A, dataPointFloat64D, equalDataPoints[float64]))
|
||||||
t.Run("ExemplarInt64", testDatatypeIgnoreValue(exemplarInt64A, exemplarInt64D, equalExemplars[int64]))
|
t.Run("ExemplarInt64", testDatatypeIgnoreValue(exemplarInt64A, exemplarInt64D, equalExemplars[int64]))
|
||||||
t.Run("ExemplarFloat64", testDatatypeIgnoreValue(exemplarFloat64A, exemplarFloat64D, equalExemplars[float64]))
|
t.Run("ExemplarFloat64", testDatatypeIgnoreValue(exemplarFloat64A, exemplarFloat64D, equalExemplars[float64]))
|
||||||
t.Run("ExponentialHistogramInt64", testDatatypeIgnoreValue(exponentialHistogramInt64A, exponentialHistogramInt64D, equalExponentialHistograms[int64]))
|
t.Run(
|
||||||
t.Run("ExponentialHistogramFloat64", testDatatypeIgnoreValue(exponentialHistogramFloat64A, exponentialHistogramFloat64D, equalExponentialHistograms[float64]))
|
"ExponentialHistogramInt64",
|
||||||
t.Run("ExponentialHistogramDataPointInt64", testDatatypeIgnoreValue(exponentialHistogramDataPointInt64A, exponentialHistogramDataPointInt64D, equalExponentialHistogramDataPoints[int64]))
|
testDatatypeIgnoreValue(
|
||||||
t.Run("ExponentialHistogramDataPointFloat64", testDatatypeIgnoreValue(exponentialHistogramDataPointFloat64A, exponentialHistogramDataPointFloat64D, equalExponentialHistogramDataPoints[float64]))
|
exponentialHistogramInt64A,
|
||||||
|
exponentialHistogramInt64D,
|
||||||
|
equalExponentialHistograms[int64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramFloat64",
|
||||||
|
testDatatypeIgnoreValue(
|
||||||
|
exponentialHistogramFloat64A,
|
||||||
|
exponentialHistogramFloat64D,
|
||||||
|
equalExponentialHistograms[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointInt64",
|
||||||
|
testDatatypeIgnoreValue(
|
||||||
|
exponentialHistogramDataPointInt64A,
|
||||||
|
exponentialHistogramDataPointInt64D,
|
||||||
|
equalExponentialHistogramDataPoints[int64],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.Run(
|
||||||
|
"ExponentialHistogramDataPointFloat64",
|
||||||
|
testDatatypeIgnoreValue(
|
||||||
|
exponentialHistogramDataPointFloat64A,
|
||||||
|
exponentialHistogramDataPointFloat64D,
|
||||||
|
equalExponentialHistogramDataPoints[float64],
|
||||||
|
),
|
||||||
|
)
|
||||||
t.Run("Summary", testDatatypeIgnoreValue(summaryA, summaryD, equalSummary))
|
t.Run("Summary", testDatatypeIgnoreValue(summaryA, summaryD, equalSummary))
|
||||||
t.Run("SummaryDataPoint", testDatatypeIgnoreValue(summaryDataPointA, summaryDataPointD, equalSummaryDataPoint))
|
t.Run("SummaryDataPoint", testDatatypeIgnoreValue(summaryDataPointA, summaryDataPointD, equalSummaryDataPoint))
|
||||||
}
|
}
|
||||||
@ -854,7 +976,13 @@ func TestAssertAggregationsEqual(t *testing.T) {
|
|||||||
assert.Empty(t, r, "value should be ignored: %v == %v", histogramFloat64A, histogramFloat64D)
|
assert.Empty(t, r, "value should be ignored: %v == %v", histogramFloat64A, histogramFloat64D)
|
||||||
|
|
||||||
r = equalAggregations(exponentialHistogramInt64A, exponentialHistogramInt64B, config{})
|
r = equalAggregations(exponentialHistogramInt64A, exponentialHistogramInt64B, config{})
|
||||||
assert.NotEmptyf(t, r, "exponential histograms should not be equal: %v == %v", exponentialHistogramInt64A, exponentialHistogramInt64B)
|
assert.NotEmptyf(
|
||||||
|
t,
|
||||||
|
r,
|
||||||
|
"exponential histograms should not be equal: %v == %v",
|
||||||
|
exponentialHistogramInt64A,
|
||||||
|
exponentialHistogramInt64B,
|
||||||
|
)
|
||||||
|
|
||||||
r = equalAggregations(exponentialHistogramInt64A, exponentialHistogramInt64C, config{ignoreTimestamp: true})
|
r = equalAggregations(exponentialHistogramInt64A, exponentialHistogramInt64C, config{ignoreTimestamp: true})
|
||||||
assert.Empty(t, r, "exponential histograms should be equal: %v", r)
|
assert.Empty(t, r, "exponential histograms should be equal: %v", r)
|
||||||
@ -863,7 +991,13 @@ func TestAssertAggregationsEqual(t *testing.T) {
|
|||||||
assert.Empty(t, r, "value should be ignored: %v == %v", exponentialHistogramInt64A, exponentialHistogramInt64D)
|
assert.Empty(t, r, "value should be ignored: %v == %v", exponentialHistogramInt64A, exponentialHistogramInt64D)
|
||||||
|
|
||||||
r = equalAggregations(exponentialHistogramFloat64A, exponentialHistogramFloat64B, config{})
|
r = equalAggregations(exponentialHistogramFloat64A, exponentialHistogramFloat64B, config{})
|
||||||
assert.NotEmptyf(t, r, "exponential histograms should not be equal: %v == %v", exponentialHistogramFloat64A, exponentialHistogramFloat64B)
|
assert.NotEmptyf(
|
||||||
|
t,
|
||||||
|
r,
|
||||||
|
"exponential histograms should not be equal: %v == %v",
|
||||||
|
exponentialHistogramFloat64A,
|
||||||
|
exponentialHistogramFloat64B,
|
||||||
|
)
|
||||||
|
|
||||||
r = equalAggregations(exponentialHistogramFloat64A, exponentialHistogramFloat64C, config{ignoreTimestamp: true})
|
r = equalAggregations(exponentialHistogramFloat64A, exponentialHistogramFloat64C, config{ignoreTimestamp: true})
|
||||||
assert.Empty(t, r, "exponential histograms should be equal: %v", r)
|
assert.Empty(t, r, "exponential histograms should be equal: %v", r)
|
||||||
|
@ -230,7 +230,10 @@ func equalHistograms[N int64 | float64](a, b metricdata.Histogram[N], cfg config
|
|||||||
|
|
||||||
// equalDataPoints returns reasons DataPoints are not equal. If they are
|
// equalDataPoints returns reasons DataPoints are not equal. If they are
|
||||||
// equal, the returned reasons will be empty.
|
// equal, the returned reasons will be empty.
|
||||||
func equalDataPoints[N int64 | float64](a, b metricdata.DataPoint[N], cfg config) (reasons []string) { // nolint: revive // Intentional internal control flag
|
func equalDataPoints[N int64 | float64](
|
||||||
|
a, b metricdata.DataPoint[N],
|
||||||
|
cfg config,
|
||||||
|
) (reasons []string) { // nolint: revive // Intentional internal control flag
|
||||||
if !a.Attributes.Equals(&b.Attributes) {
|
if !a.Attributes.Equals(&b.Attributes) {
|
||||||
reasons = append(reasons, notEqualStr(
|
reasons = append(reasons, notEqualStr(
|
||||||
"Attributes",
|
"Attributes",
|
||||||
@ -272,7 +275,10 @@ func equalDataPoints[N int64 | float64](a, b metricdata.DataPoint[N], cfg config
|
|||||||
|
|
||||||
// equalHistogramDataPoints returns reasons HistogramDataPoints are not equal.
|
// equalHistogramDataPoints returns reasons HistogramDataPoints are not equal.
|
||||||
// If they are equal, the returned reasons will be empty.
|
// If they are equal, the returned reasons will be empty.
|
||||||
func equalHistogramDataPoints[N int64 | float64](a, b metricdata.HistogramDataPoint[N], cfg config) (reasons []string) { // nolint: revive // Intentional internal control flag
|
func equalHistogramDataPoints[N int64 | float64](
|
||||||
|
a, b metricdata.HistogramDataPoint[N],
|
||||||
|
cfg config,
|
||||||
|
) (reasons []string) { // nolint: revive // Intentional internal control flag
|
||||||
if !a.Attributes.Equals(&b.Attributes) {
|
if !a.Attributes.Equals(&b.Attributes) {
|
||||||
reasons = append(reasons, notEqualStr(
|
reasons = append(reasons, notEqualStr(
|
||||||
"Attributes",
|
"Attributes",
|
||||||
@ -329,7 +335,10 @@ func equalHistogramDataPoints[N int64 | float64](a, b metricdata.HistogramDataPo
|
|||||||
//
|
//
|
||||||
// The DataPoints each Histogram contains are compared based on containing the
|
// The DataPoints each Histogram contains are compared based on containing the
|
||||||
// same HistogramDataPoint, not the order they are stored in.
|
// same HistogramDataPoint, not the order they are stored in.
|
||||||
func equalExponentialHistograms[N int64 | float64](a, b metricdata.ExponentialHistogram[N], cfg config) (reasons []string) {
|
func equalExponentialHistograms[N int64 | float64](
|
||||||
|
a, b metricdata.ExponentialHistogram[N],
|
||||||
|
cfg config,
|
||||||
|
) (reasons []string) {
|
||||||
if a.Temporality != b.Temporality {
|
if a.Temporality != b.Temporality {
|
||||||
reasons = append(reasons, notEqualStr("Temporality", a.Temporality, b.Temporality))
|
reasons = append(reasons, notEqualStr("Temporality", a.Temporality, b.Temporality))
|
||||||
}
|
}
|
||||||
@ -350,7 +359,10 @@ func equalExponentialHistograms[N int64 | float64](a, b metricdata.ExponentialHi
|
|||||||
|
|
||||||
// equalExponentialHistogramDataPoints returns reasons HistogramDataPoints are not equal.
|
// equalExponentialHistogramDataPoints returns reasons HistogramDataPoints are not equal.
|
||||||
// If they are equal, the returned reasons will be empty.
|
// If they are equal, the returned reasons will be empty.
|
||||||
func equalExponentialHistogramDataPoints[N int64 | float64](a, b metricdata.ExponentialHistogramDataPoint[N], cfg config) (reasons []string) { // nolint: revive // Intentional internal control flag
|
func equalExponentialHistogramDataPoints[N int64 | float64](
|
||||||
|
a, b metricdata.ExponentialHistogramDataPoint[N],
|
||||||
|
cfg config,
|
||||||
|
) (reasons []string) { // nolint: revive // Intentional internal control flag
|
||||||
if !a.Attributes.Equals(&b.Attributes) {
|
if !a.Attributes.Equals(&b.Attributes) {
|
||||||
reasons = append(reasons, notEqualStr(
|
reasons = append(reasons, notEqualStr(
|
||||||
"Attributes",
|
"Attributes",
|
||||||
@ -637,7 +649,10 @@ func missingAttrStr(name string) string {
|
|||||||
return "missing attribute " + name
|
return "missing attribute " + name
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasAttributesExemplars[T int64 | float64](exemplar metricdata.Exemplar[T], attrs ...attribute.KeyValue) (reasons []string) {
|
func hasAttributesExemplars[T int64 | float64](
|
||||||
|
exemplar metricdata.Exemplar[T],
|
||||||
|
attrs ...attribute.KeyValue,
|
||||||
|
) (reasons []string) {
|
||||||
s := attribute.NewSet(exemplar.FilteredAttributes...)
|
s := attribute.NewSet(exemplar.FilteredAttributes...)
|
||||||
for _, attr := range attrs {
|
for _, attr := range attrs {
|
||||||
val, ok := s.Value(attr.Key)
|
val, ok := s.Value(attr.Key)
|
||||||
@ -652,7 +667,10 @@ func hasAttributesExemplars[T int64 | float64](exemplar metricdata.Exemplar[T],
|
|||||||
return reasons
|
return reasons
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasAttributesDataPoints[T int64 | float64](dp metricdata.DataPoint[T], attrs ...attribute.KeyValue) (reasons []string) {
|
func hasAttributesDataPoints[T int64 | float64](
|
||||||
|
dp metricdata.DataPoint[T],
|
||||||
|
attrs ...attribute.KeyValue,
|
||||||
|
) (reasons []string) {
|
||||||
for _, attr := range attrs {
|
for _, attr := range attrs {
|
||||||
val, ok := dp.Attributes.Value(attr.Key)
|
val, ok := dp.Attributes.Value(attr.Key)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -688,7 +706,10 @@ func hasAttributesSum[T int64 | float64](sum metricdata.Sum[T], attrs ...attribu
|
|||||||
return reasons
|
return reasons
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasAttributesHistogramDataPoints[T int64 | float64](dp metricdata.HistogramDataPoint[T], attrs ...attribute.KeyValue) (reasons []string) {
|
func hasAttributesHistogramDataPoints[T int64 | float64](
|
||||||
|
dp metricdata.HistogramDataPoint[T],
|
||||||
|
attrs ...attribute.KeyValue,
|
||||||
|
) (reasons []string) {
|
||||||
for _, attr := range attrs {
|
for _, attr := range attrs {
|
||||||
val, ok := dp.Attributes.Value(attr.Key)
|
val, ok := dp.Attributes.Value(attr.Key)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -702,7 +723,10 @@ func hasAttributesHistogramDataPoints[T int64 | float64](dp metricdata.Histogram
|
|||||||
return reasons
|
return reasons
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasAttributesHistogram[T int64 | float64](histogram metricdata.Histogram[T], attrs ...attribute.KeyValue) (reasons []string) {
|
func hasAttributesHistogram[T int64 | float64](
|
||||||
|
histogram metricdata.Histogram[T],
|
||||||
|
attrs ...attribute.KeyValue,
|
||||||
|
) (reasons []string) {
|
||||||
for n, dp := range histogram.DataPoints {
|
for n, dp := range histogram.DataPoints {
|
||||||
reas := hasAttributesHistogramDataPoints(dp, attrs...)
|
reas := hasAttributesHistogramDataPoints(dp, attrs...)
|
||||||
if len(reas) > 0 {
|
if len(reas) > 0 {
|
||||||
@ -713,7 +737,10 @@ func hasAttributesHistogram[T int64 | float64](histogram metricdata.Histogram[T]
|
|||||||
return reasons
|
return reasons
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasAttributesExponentialHistogramDataPoints[T int64 | float64](dp metricdata.ExponentialHistogramDataPoint[T], attrs ...attribute.KeyValue) (reasons []string) {
|
func hasAttributesExponentialHistogramDataPoints[T int64 | float64](
|
||||||
|
dp metricdata.ExponentialHistogramDataPoint[T],
|
||||||
|
attrs ...attribute.KeyValue,
|
||||||
|
) (reasons []string) {
|
||||||
for _, attr := range attrs {
|
for _, attr := range attrs {
|
||||||
val, ok := dp.Attributes.Value(attr.Key)
|
val, ok := dp.Attributes.Value(attr.Key)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -727,7 +754,10 @@ func hasAttributesExponentialHistogramDataPoints[T int64 | float64](dp metricdat
|
|||||||
return reasons
|
return reasons
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasAttributesExponentialHistogram[T int64 | float64](histogram metricdata.ExponentialHistogram[T], attrs ...attribute.KeyValue) (reasons []string) {
|
func hasAttributesExponentialHistogram[T int64 | float64](
|
||||||
|
histogram metricdata.ExponentialHistogram[T],
|
||||||
|
attrs ...attribute.KeyValue,
|
||||||
|
) (reasons []string) {
|
||||||
for n, dp := range histogram.DataPoints {
|
for n, dp := range histogram.DataPoints {
|
||||||
reas := hasAttributesExponentialHistogramDataPoints(dp, attrs...)
|
reas := hasAttributesExponentialHistogramDataPoints(dp, attrs...)
|
||||||
if len(reas) > 0 {
|
if len(reas) > 0 {
|
||||||
|
@ -193,7 +193,9 @@ func (r *PeriodicReader) temporality(kind InstrumentKind) metricdata.Temporality
|
|||||||
}
|
}
|
||||||
|
|
||||||
// aggregation returns what Aggregation to use for kind.
|
// aggregation returns what Aggregation to use for kind.
|
||||||
func (r *PeriodicReader) aggregation(kind InstrumentKind) Aggregation { // nolint:revive // import-shadow for method scoped by type.
|
func (r *PeriodicReader) aggregation(
|
||||||
|
kind InstrumentKind,
|
||||||
|
) Aggregation { // nolint:revive // import-shadow for method scoped by type.
|
||||||
return r.exporter.Aggregation(kind)
|
return r.exporter.Aggregation(kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +347,12 @@ func (i *inserter[N]) readerDefaultAggregation(kind InstrumentKind) Aggregation
|
|||||||
//
|
//
|
||||||
// If the instrument defines an unknown or incompatible aggregation, an error
|
// If the instrument defines an unknown or incompatible aggregation, an error
|
||||||
// is returned.
|
// is returned.
|
||||||
func (i *inserter[N]) cachedAggregator(scope instrumentation.Scope, kind InstrumentKind, stream Stream, readerAggregation Aggregation) (meas aggregate.Measure[N], aggID uint64, err error) {
|
func (i *inserter[N]) cachedAggregator(
|
||||||
|
scope instrumentation.Scope,
|
||||||
|
kind InstrumentKind,
|
||||||
|
stream Stream,
|
||||||
|
readerAggregation Aggregation,
|
||||||
|
) (meas aggregate.Measure[N], aggID uint64, err error) {
|
||||||
switch stream.Aggregation.(type) {
|
switch stream.Aggregation.(type) {
|
||||||
case nil:
|
case nil:
|
||||||
// The aggregation was not overridden with a view. Use the aggregation
|
// The aggregation was not overridden with a view. Use the aggregation
|
||||||
@ -380,7 +385,10 @@ func (i *inserter[N]) cachedAggregator(scope instrumentation.Scope, kind Instrum
|
|||||||
cv := i.aggregators.Lookup(normID, func() aggVal[N] {
|
cv := i.aggregators.Lookup(normID, func() aggVal[N] {
|
||||||
b := aggregate.Builder[N]{
|
b := aggregate.Builder[N]{
|
||||||
Temporality: i.pipeline.reader.temporality(kind),
|
Temporality: i.pipeline.reader.temporality(kind),
|
||||||
ReservoirFunc: reservoirFunc[N](stream.ExemplarReservoirProviderSelector(stream.Aggregation), i.pipeline.exemplarFilter),
|
ReservoirFunc: reservoirFunc[N](
|
||||||
|
stream.ExemplarReservoirProviderSelector(stream.Aggregation),
|
||||||
|
i.pipeline.exemplarFilter,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
b.Filter = stream.AttributeFilter
|
b.Filter = stream.AttributeFilter
|
||||||
// A value less than or equal to zero will disable the aggregation
|
// A value less than or equal to zero will disable the aggregation
|
||||||
@ -471,7 +479,11 @@ func (i *inserter[N]) instID(kind InstrumentKind, stream Stream) instID {
|
|||||||
// aggregateFunc returns new aggregate functions matching agg, kind, and
|
// aggregateFunc returns new aggregate functions matching agg, kind, and
|
||||||
// monotonic. If the agg is unknown or temporality is invalid, an error is
|
// monotonic. If the agg is unknown or temporality is invalid, an error is
|
||||||
// returned.
|
// returned.
|
||||||
func (i *inserter[N]) aggregateFunc(b aggregate.Builder[N], agg Aggregation, kind InstrumentKind) (meas aggregate.Measure[N], comp aggregate.ComputeAggregation, err error) {
|
func (i *inserter[N]) aggregateFunc(
|
||||||
|
b aggregate.Builder[N],
|
||||||
|
agg Aggregation,
|
||||||
|
kind InstrumentKind,
|
||||||
|
) (meas aggregate.Measure[N], comp aggregate.ComputeAggregation, err error) {
|
||||||
switch a := agg.(type) {
|
switch a := agg.(type) {
|
||||||
case AggregationDefault:
|
case AggregationDefault:
|
||||||
return i.aggregateFunc(b, DefaultAggregationSelector(kind), kind)
|
return i.aggregateFunc(b, DefaultAggregationSelector(kind), kind)
|
||||||
|
@ -34,14 +34,25 @@ func (invalidAggregation) err() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func requireN[N int64 | float64](t *testing.T, n int, m []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
func requireN[N int64 | float64](
|
||||||
|
t *testing.T,
|
||||||
|
n int,
|
||||||
|
m []aggregate.Measure[N],
|
||||||
|
comps []aggregate.ComputeAggregation,
|
||||||
|
err error,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
require.Len(t, m, n)
|
require.Len(t, m, n)
|
||||||
require.Len(t, comps, n)
|
require.Len(t, comps, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertSum[N int64 | float64](n int, temp metricdata.Temporality, mono bool, v [2]N) func(*testing.T, []aggregate.Measure[N], []aggregate.ComputeAggregation, error) {
|
func assertSum[N int64 | float64](
|
||||||
|
n int,
|
||||||
|
temp metricdata.Temporality,
|
||||||
|
mono bool,
|
||||||
|
v [2]N,
|
||||||
|
) func(*testing.T, []aggregate.Measure[N], []aggregate.ComputeAggregation, error) {
|
||||||
return func(t *testing.T, meas []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
return func(t *testing.T, meas []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
requireN[N](t, n, meas, comps, err)
|
requireN[N](t, n, meas, comps, err)
|
||||||
@ -71,7 +82,9 @@ func assertSum[N int64 | float64](n int, temp metricdata.Temporality, mono bool,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertHist[N int64 | float64](temp metricdata.Temporality) func(*testing.T, []aggregate.Measure[N], []aggregate.ComputeAggregation, error) {
|
func assertHist[N int64 | float64](
|
||||||
|
temp metricdata.Temporality,
|
||||||
|
) func(*testing.T, []aggregate.Measure[N], []aggregate.ComputeAggregation, error) {
|
||||||
return func(t *testing.T, meas []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
return func(t *testing.T, meas []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
requireN[N](t, 1, meas, comps, err)
|
requireN[N](t, 1, meas, comps, err)
|
||||||
@ -116,7 +129,12 @@ func assertHist[N int64 | float64](temp metricdata.Temporality) func(*testing.T,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertLastValue[N int64 | float64](t *testing.T, meas []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
func assertLastValue[N int64 | float64](
|
||||||
|
t *testing.T,
|
||||||
|
meas []aggregate.Measure[N],
|
||||||
|
comps []aggregate.ComputeAggregation,
|
||||||
|
err error,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
requireN[N](t, 1, meas, comps, err)
|
requireN[N](t, 1, meas, comps, err)
|
||||||
|
|
||||||
@ -165,7 +183,9 @@ func testCreateAggregators[N int64 | float64](t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Default/Drop",
|
name: "Default/Drop",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDrop{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDrop{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindCounter],
|
inst: instruments[InstrumentKindCounter],
|
||||||
validate: func(t *testing.T, meas []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
validate: func(t *testing.T, meas []aggregate.Measure[N], comps []aggregate.ComputeAggregation, err error) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
@ -305,43 +325,57 @@ func testCreateAggregators[N int64 | float64](t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Reader/Default/Cumulative/Sum/Monotonic",
|
name: "Reader/Default/Cumulative/Sum/Monotonic",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindCounter],
|
inst: instruments[InstrumentKindCounter],
|
||||||
validate: assertSum[N](1, metricdata.CumulativeTemporality, true, [2]N{1, 4}),
|
validate: assertSum[N](1, metricdata.CumulativeTemporality, true, [2]N{1, 4}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Reader/Default/Cumulative/Sum/NonMonotonic",
|
name: "Reader/Default/Cumulative/Sum/NonMonotonic",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindUpDownCounter],
|
inst: instruments[InstrumentKindUpDownCounter],
|
||||||
validate: assertSum[N](1, metricdata.CumulativeTemporality, false, [2]N{1, 4}),
|
validate: assertSum[N](1, metricdata.CumulativeTemporality, false, [2]N{1, 4}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Reader/Default/Cumulative/ExplicitBucketHistogram",
|
name: "Reader/Default/Cumulative/ExplicitBucketHistogram",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindHistogram],
|
inst: instruments[InstrumentKindHistogram],
|
||||||
validate: assertHist[N](metricdata.CumulativeTemporality),
|
validate: assertHist[N](metricdata.CumulativeTemporality),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Reader/Default/Cumulative/Gauge",
|
name: "Reader/Default/Cumulative/Gauge",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindGauge],
|
inst: instruments[InstrumentKindGauge],
|
||||||
validate: assertLastValue[N],
|
validate: assertLastValue[N],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Reader/Default/Cumulative/PrecomputedSum/Monotonic",
|
name: "Reader/Default/Cumulative/PrecomputedSum/Monotonic",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindObservableCounter],
|
inst: instruments[InstrumentKindObservableCounter],
|
||||||
validate: assertSum[N](1, metricdata.CumulativeTemporality, true, [2]N{1, 3}),
|
validate: assertSum[N](1, metricdata.CumulativeTemporality, true, [2]N{1, 3}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Reader/Default/Cumulative/PrecomputedSum/NonMonotonic",
|
name: "Reader/Default/Cumulative/PrecomputedSum/NonMonotonic",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindObservableUpDownCounter],
|
inst: instruments[InstrumentKindObservableUpDownCounter],
|
||||||
validate: assertSum[N](1, metricdata.CumulativeTemporality, false, [2]N{1, 3}),
|
validate: assertSum[N](1, metricdata.CumulativeTemporality, false, [2]N{1, 3}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Reader/Default/Gauge",
|
name: "Reader/Default/Gauge",
|
||||||
reader: NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} })),
|
reader: NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationDefault{} }),
|
||||||
|
),
|
||||||
inst: instruments[InstrumentKindObservableGauge],
|
inst: instruments[InstrumentKindObservableGauge],
|
||||||
validate: assertLastValue[N],
|
validate: assertLastValue[N],
|
||||||
},
|
},
|
||||||
@ -418,7 +452,9 @@ func TestPipelinesAggregatorForEachReader(t *testing.T) {
|
|||||||
func TestPipelineRegistryCreateAggregators(t *testing.T) {
|
func TestPipelineRegistryCreateAggregators(t *testing.T) {
|
||||||
renameView := NewView(Instrument{Name: "foo"}, Stream{Name: "bar"})
|
renameView := NewView(Instrument{Name: "foo"}, Stream{Name: "bar"})
|
||||||
testRdr := NewManualReader()
|
testRdr := NewManualReader()
|
||||||
testRdrHistogram := NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationExplicitBucketHistogram{} }))
|
testRdrHistogram := NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationExplicitBucketHistogram{} }),
|
||||||
|
)
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
@ -529,7 +565,9 @@ func TestPipelineRegistryResource(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestPipelineRegistryCreateAggregatorsIncompatibleInstrument(t *testing.T) {
|
func TestPipelineRegistryCreateAggregatorsIncompatibleInstrument(t *testing.T) {
|
||||||
testRdrHistogram := NewManualReader(WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationSum{} }))
|
testRdrHistogram := NewManualReader(
|
||||||
|
WithAggregationSelector(func(ik InstrumentKind) Aggregation { return AggregationSum{} }),
|
||||||
|
)
|
||||||
|
|
||||||
readers := []Reader{testRdrHistogram}
|
readers := []Reader{testRdrHistogram}
|
||||||
views := []View{defaultView}
|
views := []View{defaultView}
|
||||||
|
@ -146,7 +146,10 @@ type AggregationSelector func(InstrumentKind) Aggregation
|
|||||||
// Histogram ⇨ ExplicitBucketHistogram.
|
// Histogram ⇨ ExplicitBucketHistogram.
|
||||||
func DefaultAggregationSelector(ik InstrumentKind) Aggregation {
|
func DefaultAggregationSelector(ik InstrumentKind) Aggregation {
|
||||||
switch ik {
|
switch ik {
|
||||||
case InstrumentKindCounter, InstrumentKindUpDownCounter, InstrumentKindObservableCounter, InstrumentKindObservableUpDownCounter:
|
case InstrumentKindCounter,
|
||||||
|
InstrumentKindUpDownCounter,
|
||||||
|
InstrumentKindObservableCounter,
|
||||||
|
InstrumentKindObservableUpDownCounter:
|
||||||
return AggregationSum{}
|
return AggregationSum{}
|
||||||
case InstrumentKindObservableGauge, InstrumentKindGauge:
|
case InstrumentKindObservableGauge, InstrumentKindGauge:
|
||||||
return AggregationLastValue{}
|
return AggregationLastValue{}
|
||||||
|
@ -287,7 +287,14 @@ func benchReaderCollectFunc(r Reader) func(*testing.B) {
|
|||||||
|
|
||||||
for n := 0; n < b.N; n++ {
|
for n := 0; n < b.N; n++ {
|
||||||
err = r.Collect(ctx, &collectedMetrics)
|
err = r.Collect(ctx, &collectedMetrics)
|
||||||
assert.Equalf(b, testResourceMetricsA, collectedMetrics, "unexpected Collect response: (%#v, %v)", collectedMetrics, err)
|
assert.Equalf(
|
||||||
|
b,
|
||||||
|
testResourceMetricsA,
|
||||||
|
collectedMetrics,
|
||||||
|
"unexpected Collect response: (%#v, %v)",
|
||||||
|
collectedMetrics,
|
||||||
|
err,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,11 +69,26 @@ func TestGetFirstAvailableFile(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{"Gets first, skip second candidate", []string{filename1, filename2}, filename1, ""},
|
{"Gets first, skip second candidate", []string{filename1, filename2}, filename1, ""},
|
||||||
{"Skips first, gets second candidate", []string{"does_not_exists", filename2}, filename2, ""},
|
{"Skips first, gets second candidate", []string{"does_not_exists", filename2}, filename2, ""},
|
||||||
{"Skips first, gets second, ignores third candidate", []string{"does_not_exists", filename2, filename1}, filename2, ""},
|
{
|
||||||
|
"Skips first, gets second, ignores third candidate",
|
||||||
|
[]string{"does_not_exists", filename2, filename1},
|
||||||
|
filename2,
|
||||||
|
"",
|
||||||
|
},
|
||||||
{"No candidates (empty slice)", []string{}, "", "no candidate file available: []"},
|
{"No candidates (empty slice)", []string{}, "", "no candidate file available: []"},
|
||||||
{"No candidates (nil slice)", nil, "", "no candidate file available: []"},
|
{"No candidates (nil slice)", nil, "", "no candidate file available: []"},
|
||||||
{"Single nonexisting candidate", []string{"does_not_exists"}, "", "no candidate file available: [does_not_exists]"},
|
{
|
||||||
{"Multiple nonexisting candidates", []string{"does_not_exists", "this_either"}, "", "no candidate file available: [does_not_exists this_either]"},
|
"Single nonexisting candidate",
|
||||||
|
[]string{"does_not_exists"},
|
||||||
|
"",
|
||||||
|
"no candidate file available: [does_not_exists]",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Multiple nonexisting candidates",
|
||||||
|
[]string{"does_not_exists", "this_either"},
|
||||||
|
"",
|
||||||
|
"no candidate file available: [does_not_exists this_either]",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tt {
|
for _, tc := range tt {
|
||||||
|
@ -29,7 +29,10 @@ func TestDefaultExperimental(t *testing.T) {
|
|||||||
|
|
||||||
serviceInstanceID, ok := res.Set().Value(semconv.ServiceInstanceIDKey)
|
serviceInstanceID, ok := res.Set().Value(semconv.ServiceInstanceIDKey)
|
||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
matched, err := regexp.MatchString("^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$", serviceInstanceID.AsString())
|
matched, err := regexp.MatchString(
|
||||||
|
"^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$",
|
||||||
|
serviceInstanceID.AsString(),
|
||||||
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.True(t, matched)
|
require.True(t, matched)
|
||||||
}
|
}
|
||||||
|
@ -409,7 +409,11 @@ func TestNew(t *testing.T) {
|
|||||||
options: []resource.Option{
|
options: []resource.Option{
|
||||||
resource.WithDetectors(
|
resource.WithDetectors(
|
||||||
resource.StringDetector("https://opentelemetry.io/schemas/1.0.0", semconv.HostNameKey, os.Hostname),
|
resource.StringDetector("https://opentelemetry.io/schemas/1.0.0", semconv.HostNameKey, os.Hostname),
|
||||||
resource.StringDetector("https://opentelemetry.io/schemas/1.1.0", semconv.HostNameKey, func() (string, error) { return "", errors.New("fail") }),
|
resource.StringDetector(
|
||||||
|
"https://opentelemetry.io/schemas/1.1.0",
|
||||||
|
semconv.HostNameKey,
|
||||||
|
func() (string, error) { return "", errors.New("fail") },
|
||||||
|
),
|
||||||
),
|
),
|
||||||
resource.WithSchemaURL("https://opentelemetry.io/schemas/1.2.0"),
|
resource.WithSchemaURL("https://opentelemetry.io/schemas/1.2.0"),
|
||||||
},
|
},
|
||||||
|
@ -169,7 +169,17 @@ func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.T
|
|||||||
// slowing down all tracing consumers.
|
// slowing down all tracing consumers.
|
||||||
// - Logging code may be instrumented with tracing and deadlock because it could try
|
// - Logging code may be instrumented with tracing and deadlock because it could try
|
||||||
// acquiring the same non-reentrant mutex.
|
// acquiring the same non-reentrant mutex.
|
||||||
global.Info("Tracer created", "name", name, "version", is.Version, "schemaURL", is.SchemaURL, "attributes", is.Attributes)
|
global.Info(
|
||||||
|
"Tracer created",
|
||||||
|
"name",
|
||||||
|
name,
|
||||||
|
"version",
|
||||||
|
is.Version,
|
||||||
|
"schemaURL",
|
||||||
|
is.SchemaURL,
|
||||||
|
"attributes",
|
||||||
|
is.Attributes,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
@ -374,12 +374,26 @@ func testStoredError(t *testing.T, target interface{}) {
|
|||||||
func TestTracerProviderReturnsSameTracer(t *testing.T) {
|
func TestTracerProviderReturnsSameTracer(t *testing.T) {
|
||||||
p := NewTracerProvider()
|
p := NewTracerProvider()
|
||||||
|
|
||||||
t0, t1, t2 := p.Tracer("t0"), p.Tracer("t1"), p.Tracer("t0", trace.WithInstrumentationAttributes(attribute.String("foo", "bar")))
|
t0, t1, t2 := p.Tracer(
|
||||||
|
"t0",
|
||||||
|
), p.Tracer(
|
||||||
|
"t1",
|
||||||
|
), p.Tracer(
|
||||||
|
"t0",
|
||||||
|
trace.WithInstrumentationAttributes(attribute.String("foo", "bar")),
|
||||||
|
)
|
||||||
assert.NotSame(t, t0, t1)
|
assert.NotSame(t, t0, t1)
|
||||||
assert.NotSame(t, t0, t2)
|
assert.NotSame(t, t0, t2)
|
||||||
assert.NotSame(t, t1, t2)
|
assert.NotSame(t, t1, t2)
|
||||||
|
|
||||||
t3, t4, t5 := p.Tracer("t0"), p.Tracer("t1"), p.Tracer("t0", trace.WithInstrumentationAttributes(attribute.String("foo", "bar")))
|
t3, t4, t5 := p.Tracer(
|
||||||
|
"t0",
|
||||||
|
), p.Tracer(
|
||||||
|
"t1",
|
||||||
|
), p.Tracer(
|
||||||
|
"t0",
|
||||||
|
trace.WithInstrumentationAttributes(attribute.String("foo", "bar")),
|
||||||
|
)
|
||||||
assert.Same(t, t0, t3)
|
assert.Same(t, t0, t3)
|
||||||
assert.Same(t, t1, t4)
|
assert.Same(t, t1, t4)
|
||||||
assert.Same(t, t2, t5)
|
assert.Same(t, t2, t5)
|
||||||
|
@ -151,7 +151,10 @@ func (ts *testSampler) ShouldSample(p SamplingParameters) SamplingResult {
|
|||||||
if strings.HasPrefix(p.Name, ts.prefix) {
|
if strings.HasPrefix(p.Name, ts.prefix) {
|
||||||
decision = RecordAndSample
|
decision = RecordAndSample
|
||||||
}
|
}
|
||||||
return SamplingResult{Decision: decision, Attributes: []attribute.KeyValue{attribute.Int("callCount", ts.callCount)}}
|
return SamplingResult{
|
||||||
|
Decision: decision,
|
||||||
|
Attributes: []attribute.KeyValue{attribute.Int("callCount", ts.callCount)},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ts testSampler) Description() string {
|
func (ts testSampler) Description() string {
|
||||||
@ -374,13 +377,21 @@ func TestStartSpanNewRootNotSampled(t *testing.T) {
|
|||||||
|
|
||||||
_, s2 := neverSampledTr.Start(ctx, "span2-no-newroot")
|
_, s2 := neverSampledTr.Start(ctx, "span2-no-newroot")
|
||||||
if !s2.SpanContext().IsSampled() {
|
if !s2.SpanContext().IsSampled() {
|
||||||
t.Error(fmt.Errorf("got child span is not sampled, want child span with sampler: ParentBased(NeverSample()) to be sampled"))
|
t.Error(
|
||||||
|
fmt.Errorf(
|
||||||
|
"got child span is not sampled, want child span with sampler: ParentBased(NeverSample()) to be sampled",
|
||||||
|
),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adding WithNewRoot causes child spans to not sample based on parent context
|
// Adding WithNewRoot causes child spans to not sample based on parent context
|
||||||
_, s3 := neverSampledTr.Start(ctx, "span3-newroot", trace.WithNewRoot())
|
_, s3 := neverSampledTr.Start(ctx, "span3-newroot", trace.WithNewRoot())
|
||||||
if s3.SpanContext().IsSampled() {
|
if s3.SpanContext().IsSampled() {
|
||||||
t.Error(fmt.Errorf("got child span is sampled, want child span WithNewRoot() and with sampler: ParentBased(NeverSample()) to not be sampled"))
|
t.Error(
|
||||||
|
fmt.Errorf(
|
||||||
|
"got child span is sampled, want child span WithNewRoot() and with sampler: ParentBased(NeverSample()) to not be sampled",
|
||||||
|
),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -731,8 +742,12 @@ func TestLinks(t *testing.T) {
|
|||||||
k2v2 := attribute.String("key2", "value2")
|
k2v2 := attribute.String("key2", "value2")
|
||||||
k3v3 := attribute.String("key3", "value3")
|
k3v3 := attribute.String("key3", "value3")
|
||||||
|
|
||||||
sc1 := trace.NewSpanContext(trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}})
|
sc1 := trace.NewSpanContext(
|
||||||
sc2 := trace.NewSpanContext(trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}})
|
trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}},
|
||||||
|
)
|
||||||
|
sc2 := trace.NewSpanContext(
|
||||||
|
trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}},
|
||||||
|
)
|
||||||
|
|
||||||
l1 := trace.Link{SpanContext: sc1, Attributes: []attribute.KeyValue{k1v1}}
|
l1 := trace.Link{SpanContext: sc1, Attributes: []attribute.KeyValue{k1v1}}
|
||||||
l2 := trace.Link{SpanContext: sc2, Attributes: []attribute.KeyValue{k2v2, k3v3}}
|
l2 := trace.Link{SpanContext: sc2, Attributes: []attribute.KeyValue{k2v2, k3v3}}
|
||||||
@ -773,9 +788,15 @@ func TestLinks(t *testing.T) {
|
|||||||
func TestLinksOverLimit(t *testing.T) {
|
func TestLinksOverLimit(t *testing.T) {
|
||||||
te := NewTestExporter()
|
te := NewTestExporter()
|
||||||
|
|
||||||
sc1 := trace.NewSpanContext(trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}})
|
sc1 := trace.NewSpanContext(
|
||||||
sc2 := trace.NewSpanContext(trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}})
|
trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}},
|
||||||
sc3 := trace.NewSpanContext(trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}})
|
)
|
||||||
|
sc2 := trace.NewSpanContext(
|
||||||
|
trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}},
|
||||||
|
)
|
||||||
|
sc3 := trace.NewSpanContext(
|
||||||
|
trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{1, 1}), SpanID: trace.SpanID{3}},
|
||||||
|
)
|
||||||
|
|
||||||
sl := NewSpanLimits()
|
sl := NewSpanLimits()
|
||||||
sl.LinkCountLimit = 2
|
sl.LinkCountLimit = 2
|
||||||
@ -951,7 +972,12 @@ func startNamedSpan(tp *TracerProvider, trName, name string, args ...trace.SpanS
|
|||||||
// passed name and with the passed context. The context is returned
|
// passed name and with the passed context. The context is returned
|
||||||
// along with the span so this parent can be used to create child
|
// along with the span so this parent can be used to create child
|
||||||
// spans.
|
// spans.
|
||||||
func startLocalSpan(ctx context.Context, tp *TracerProvider, trName, name string, args ...trace.SpanStartOption) (context.Context, trace.Span) {
|
func startLocalSpan(
|
||||||
|
ctx context.Context,
|
||||||
|
tp *TracerProvider,
|
||||||
|
trName, name string,
|
||||||
|
args ...trace.SpanStartOption,
|
||||||
|
) (context.Context, trace.Span) {
|
||||||
ctx, span := tp.Tracer(trName).Start(
|
ctx, span := tp.Tracer(trName).Start(
|
||||||
ctx,
|
ctx,
|
||||||
name,
|
name,
|
||||||
@ -1299,8 +1325,21 @@ func TestRecordErrorWithStackTrace(t *testing.T) {
|
|||||||
assert.Equal(t, got.events[0].Attributes[1].Value.AsString(), want.events[0].Attributes[1].Value.AsString())
|
assert.Equal(t, got.events[0].Attributes[1].Value.AsString(), want.events[0].Attributes[1].Value.AsString())
|
||||||
gotStackTraceFunctionName := strings.Split(got.events[0].Attributes[2].Value.AsString(), "\n")
|
gotStackTraceFunctionName := strings.Split(got.events[0].Attributes[2].Value.AsString(), "\n")
|
||||||
|
|
||||||
assert.Truef(t, strings.HasPrefix(gotStackTraceFunctionName[1], "go.opentelemetry.io/otel/sdk/trace.recordStackTrace"), "%q not prefixed with go.opentelemetry.io/otel/sdk/trace.recordStackTrace", gotStackTraceFunctionName[1])
|
assert.Truef(
|
||||||
assert.Truef(t, strings.HasPrefix(gotStackTraceFunctionName[3], "go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).RecordError"), "%q not prefixed with go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).RecordError", gotStackTraceFunctionName[3])
|
t,
|
||||||
|
strings.HasPrefix(gotStackTraceFunctionName[1], "go.opentelemetry.io/otel/sdk/trace.recordStackTrace"),
|
||||||
|
"%q not prefixed with go.opentelemetry.io/otel/sdk/trace.recordStackTrace",
|
||||||
|
gotStackTraceFunctionName[1],
|
||||||
|
)
|
||||||
|
assert.Truef(
|
||||||
|
t,
|
||||||
|
strings.HasPrefix(
|
||||||
|
gotStackTraceFunctionName[3],
|
||||||
|
"go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).RecordError",
|
||||||
|
),
|
||||||
|
"%q not prefixed with go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).RecordError",
|
||||||
|
gotStackTraceFunctionName[3],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRecordErrorNil(t *testing.T) {
|
func TestRecordErrorNil(t *testing.T) {
|
||||||
@ -1346,7 +1385,11 @@ func TestWithSpanKind(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if spanData.SpanKind() != trace.SpanKindInternal {
|
if spanData.SpanKind() != trace.SpanKindInternal {
|
||||||
t.Errorf("Default value of Spankind should be Internal: got %+v, want %+v\n", spanData.SpanKind(), trace.SpanKindInternal)
|
t.Errorf(
|
||||||
|
"Default value of Spankind should be Internal: got %+v, want %+v\n",
|
||||||
|
spanData.SpanKind(),
|
||||||
|
trace.SpanKindInternal,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
sks := []trace.SpanKind{
|
sks := []trace.SpanKind{
|
||||||
@ -1398,8 +1441,14 @@ func TestWithResource(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "explicit resource",
|
name: "explicit resource",
|
||||||
options: []TracerProviderOption{WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5)))},
|
options: []TracerProviderOption{
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5))),
|
||||||
|
},
|
||||||
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk2", 5)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "last resource wins",
|
name: "last resource wins",
|
||||||
@ -1407,12 +1456,22 @@ func TestWithResource(t *testing.T) {
|
|||||||
WithResource(resource.NewSchemaless(attribute.String("rk1", "vk1"), attribute.Int64("rk2", 5))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "vk1"), attribute.Int64("rk2", 5))),
|
||||||
WithResource(resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
WithResource(resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
||||||
},
|
},
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10))),
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk3", "rv3"), attribute.Int64("rk4", 10)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "overlapping attributes with environment resource",
|
name: "overlapping attributes with environment resource",
|
||||||
options: []TracerProviderOption{WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10)))},
|
options: []TracerProviderOption{
|
||||||
want: mergeResource(t, resource.Environment(), resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10))),
|
WithResource(resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10))),
|
||||||
|
},
|
||||||
|
want: mergeResource(
|
||||||
|
t,
|
||||||
|
resource.Environment(),
|
||||||
|
resource.NewSchemaless(attribute.String("rk1", "rv1"), attribute.Int64("rk5", 10)),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tc := range cases {
|
for _, tc := range cases {
|
||||||
@ -1527,8 +1586,18 @@ func TestSpanCapturesPanicWithStackTrace(t *testing.T) {
|
|||||||
assert.Equal(t, "error message", spans[0].Events()[0].Attributes[1].Value.AsString())
|
assert.Equal(t, "error message", spans[0].Events()[0].Attributes[1].Value.AsString())
|
||||||
|
|
||||||
gotStackTraceFunctionName := strings.Split(spans[0].Events()[0].Attributes[2].Value.AsString(), "\n")
|
gotStackTraceFunctionName := strings.Split(spans[0].Events()[0].Attributes[2].Value.AsString(), "\n")
|
||||||
assert.Truef(t, strings.HasPrefix(gotStackTraceFunctionName[1], "go.opentelemetry.io/otel/sdk/trace.recordStackTrace"), "%q not prefixed with go.opentelemetry.io/otel/sdk/trace.recordStackTrace", gotStackTraceFunctionName[1])
|
assert.Truef(
|
||||||
assert.Truef(t, strings.HasPrefix(gotStackTraceFunctionName[3], "go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).End"), "%q not prefixed with go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).End", gotStackTraceFunctionName[3])
|
t,
|
||||||
|
strings.HasPrefix(gotStackTraceFunctionName[1], "go.opentelemetry.io/otel/sdk/trace.recordStackTrace"),
|
||||||
|
"%q not prefixed with go.opentelemetry.io/otel/sdk/trace.recordStackTrace",
|
||||||
|
gotStackTraceFunctionName[1],
|
||||||
|
)
|
||||||
|
assert.Truef(
|
||||||
|
t,
|
||||||
|
strings.HasPrefix(gotStackTraceFunctionName[3], "go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).End"),
|
||||||
|
"%q not prefixed with go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).End",
|
||||||
|
gotStackTraceFunctionName[3],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReadOnlySpan(t *testing.T) {
|
func TestReadOnlySpan(t *testing.T) {
|
||||||
@ -1930,7 +1999,9 @@ func TestSpanAddLink(t *testing.T) {
|
|||||||
name: "AddLinkWithInvalidSpanContext",
|
name: "AddLinkWithInvalidSpanContext",
|
||||||
attrLinkCountLimit: 128,
|
attrLinkCountLimit: 128,
|
||||||
link: trace.Link{
|
link: trace.Link{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{}), SpanID: [8]byte{}}),
|
SpanContext: trace.NewSpanContext(
|
||||||
|
trace.SpanContextConfig{TraceID: trace.TraceID([16]byte{}), SpanID: [8]byte{}},
|
||||||
|
),
|
||||||
},
|
},
|
||||||
want: &snapshot{
|
want: &snapshot{
|
||||||
name: "span0",
|
name: "span0",
|
||||||
|
@ -26,7 +26,11 @@ var _ trace.Tracer = &tracer{}
|
|||||||
// The Span is created with the provided name and as a child of any existing
|
// The Span is created with the provided name and as a child of any existing
|
||||||
// span context found in the passed context. The created Span will be
|
// span context found in the passed context. The created Span will be
|
||||||
// configured appropriately by any SpanOption passed.
|
// configured appropriately by any SpanOption passed.
|
||||||
func (tr *tracer) Start(ctx context.Context, name string, options ...trace.SpanStartOption) (context.Context, trace.Span) {
|
func (tr *tracer) Start(
|
||||||
|
ctx context.Context,
|
||||||
|
name string,
|
||||||
|
options ...trace.SpanStartOption,
|
||||||
|
) (context.Context, trace.Span) {
|
||||||
config := trace.NewSpanStartConfig(options...)
|
config := trace.NewSpanStartConfig(options...)
|
||||||
|
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
@ -112,7 +116,12 @@ func (tr *tracer) newSpan(ctx context.Context, name string, config *trace.SpanCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newRecordingSpan returns a new configured recordingSpan.
|
// newRecordingSpan returns a new configured recordingSpan.
|
||||||
func (tr *tracer) newRecordingSpan(psc, sc trace.SpanContext, name string, sr SamplingResult, config *trace.SpanConfig) *recordingSpan {
|
func (tr *tracer) newRecordingSpan(
|
||||||
|
psc, sc trace.SpanContext,
|
||||||
|
name string,
|
||||||
|
sr SamplingResult,
|
||||||
|
config *trace.SpanConfig,
|
||||||
|
) *recordingSpan {
|
||||||
startTime := config.Timestamp()
|
startTime := config.Timestamp()
|
||||||
if startTime.IsZero() {
|
if startTime.IsZero() {
|
||||||
startTime = time.Now()
|
startTime = time.Now()
|
||||||
|
@ -50,7 +50,10 @@ type SemanticConventions struct {
|
|||||||
// namespace as specified by the OpenTelemetry specification for a
|
// namespace as specified by the OpenTelemetry specification for a
|
||||||
// span. The network parameter is a string that net.Dial function
|
// span. The network parameter is a string that net.Dial function
|
||||||
// from standard library can understand.
|
// from standard library can understand.
|
||||||
func (sc *SemanticConventions) NetAttributesFromHTTPRequest(network string, request *http.Request) []attribute.KeyValue {
|
func (sc *SemanticConventions) NetAttributesFromHTTPRequest(
|
||||||
|
network string,
|
||||||
|
request *http.Request,
|
||||||
|
) []attribute.KeyValue {
|
||||||
attrs := []attribute.KeyValue{}
|
attrs := []attribute.KeyValue{}
|
||||||
|
|
||||||
switch network {
|
switch network {
|
||||||
@ -200,7 +203,10 @@ func (sc *SemanticConventions) httpBasicAttributesFromHTTPRequest(request *http.
|
|||||||
|
|
||||||
// HTTPServerMetricAttributesFromHTTPRequest generates low-cardinality attributes
|
// HTTPServerMetricAttributesFromHTTPRequest generates low-cardinality attributes
|
||||||
// to be used with server-side HTTP metrics.
|
// to be used with server-side HTTP metrics.
|
||||||
func (sc *SemanticConventions) HTTPServerMetricAttributesFromHTTPRequest(serverName string, request *http.Request) []attribute.KeyValue {
|
func (sc *SemanticConventions) HTTPServerMetricAttributesFromHTTPRequest(
|
||||||
|
serverName string,
|
||||||
|
request *http.Request,
|
||||||
|
) []attribute.KeyValue {
|
||||||
attrs := []attribute.KeyValue{}
|
attrs := []attribute.KeyValue{}
|
||||||
if serverName != "" {
|
if serverName != "" {
|
||||||
attrs = append(attrs, sc.HTTPServerNameKey.String(serverName))
|
attrs = append(attrs, sc.HTTPServerNameKey.String(serverName))
|
||||||
@ -212,7 +218,10 @@ func (sc *SemanticConventions) HTTPServerMetricAttributesFromHTTPRequest(serverN
|
|||||||
// http namespace as specified by the OpenTelemetry specification for
|
// http namespace as specified by the OpenTelemetry specification for
|
||||||
// a span on the server side. Currently, only basic authentication is
|
// a span on the server side. Currently, only basic authentication is
|
||||||
// supported.
|
// supported.
|
||||||
func (sc *SemanticConventions) HTTPServerAttributesFromHTTPRequest(serverName, route string, request *http.Request) []attribute.KeyValue {
|
func (sc *SemanticConventions) HTTPServerAttributesFromHTTPRequest(
|
||||||
|
serverName, route string,
|
||||||
|
request *http.Request,
|
||||||
|
) []attribute.KeyValue {
|
||||||
attrs := []attribute.KeyValue{
|
attrs := []attribute.KeyValue{
|
||||||
sc.HTTPTargetKey.String(request.RequestURI),
|
sc.HTTPTargetKey.String(request.RequestURI),
|
||||||
}
|
}
|
||||||
|
@ -961,7 +961,12 @@ func assertElementsMatch(t *testing.T, expected, got []attribute.KeyValue, forma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testRequest(method, requestURI, proto, remoteAddr, host string, u *url.URL, header http.Header, tlsopt tlsOption) *http.Request {
|
func testRequest(
|
||||||
|
method, requestURI, proto, remoteAddr, host string,
|
||||||
|
u *url.URL,
|
||||||
|
header http.Header,
|
||||||
|
tlsopt tlsOption,
|
||||||
|
) *http.Request {
|
||||||
major, minor := protoToInts(proto)
|
major, minor := protoToInts(proto)
|
||||||
var tlsConn *tls.ConnectionState
|
var tlsConn *tls.ConnectionState
|
||||||
switch tlsopt {
|
switch tlsopt {
|
||||||
|
@ -816,12 +816,24 @@ func TestSpanAttributeValueLimits(t *testing.T) {
|
|||||||
assert.Truef(t, eq(want, s.span.Attrs), "set span attributes: got %#v, want %#v", s.span.Attrs, want)
|
assert.Truef(t, eq(want, s.span.Attrs), "set span attributes: got %#v, want %#v", s.span.Attrs, want)
|
||||||
|
|
||||||
s.AddEvent("test", WithAttributes(aStr, aStrSlice))
|
s.AddEvent("test", WithAttributes(aStr, aStrSlice))
|
||||||
assert.Truef(t, eq(want, s.span.Events[0].Attrs), "span event attributes: got %#v, want %#v", s.span.Events[0].Attrs, want)
|
assert.Truef(
|
||||||
|
t,
|
||||||
|
eq(want, s.span.Events[0].Attrs),
|
||||||
|
"span event attributes: got %#v, want %#v",
|
||||||
|
s.span.Events[0].Attrs,
|
||||||
|
want,
|
||||||
|
)
|
||||||
|
|
||||||
s.AddLink(Link{
|
s.AddLink(Link{
|
||||||
Attributes: []attribute.KeyValue{aStr, aStrSlice},
|
Attributes: []attribute.KeyValue{aStr, aStrSlice},
|
||||||
})
|
})
|
||||||
assert.Truef(t, eq(want, s.span.Links[0].Attrs), "span link attributes: got %#v, want %#v", s.span.Links[0].Attrs, want)
|
assert.Truef(
|
||||||
|
t,
|
||||||
|
eq(want, s.span.Links[0].Attrs),
|
||||||
|
"span link attributes: got %#v, want %#v",
|
||||||
|
s.span.Links[0].Attrs,
|
||||||
|
want,
|
||||||
|
)
|
||||||
|
|
||||||
builder.Options = []SpanStartOption{
|
builder.Options = []SpanStartOption{
|
||||||
WithAttributes(aStr, aStrSlice),
|
WithAttributes(aStr, aStrSlice),
|
||||||
@ -831,7 +843,13 @@ func TestSpanAttributeValueLimits(t *testing.T) {
|
|||||||
}
|
}
|
||||||
s = builder.Build()
|
s = builder.Build()
|
||||||
assert.Truef(t, eq(want, s.span.Attrs), "new span attributes: got %#v, want %#v", s.span.Attrs, want)
|
assert.Truef(t, eq(want, s.span.Attrs), "new span attributes: got %#v, want %#v", s.span.Attrs, want)
|
||||||
assert.Truef(t, eq(want, s.span.Links[0].Attrs), "new span link attributes: got %#v, want %#v", s.span.Attrs, want)
|
assert.Truef(
|
||||||
|
t,
|
||||||
|
eq(want, s.span.Links[0].Attrs),
|
||||||
|
"new span link attributes: got %#v, want %#v",
|
||||||
|
s.span.Attrs,
|
||||||
|
want,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user