Add metric data integration testing (#2959)
This commit is contained in:
parent
ad04d9c71c
commit
3b2c5ba09f
|
|
@ -7,6 +7,7 @@ require (
|
|||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0
|
||||
go.opentelemetry.io/otel v1.11.2
|
||||
go.opentelemetry.io/otel/sdk v1.11.2
|
||||
go.opentelemetry.io/otel/sdk/metric v0.34.0
|
||||
go.opentelemetry.io/otel/trace v1.11.2
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ go.opentelemetry.io/otel/metric v0.34.0 h1:MCPoQxcg/26EuuJwpYN1mZTeCYAUGx8ABxfW0
|
|||
go.opentelemetry.io/otel/metric v0.34.0/go.mod h1:ZFuI4yQGNCupurTXCwkeD/zHBt+C2bR7bw5JqUm/AP8=
|
||||
go.opentelemetry.io/otel/sdk v1.11.2 h1:GF4JoaEx7iihdMFu30sOyRx52HDHOkl9xQ8SMqNXUiU=
|
||||
go.opentelemetry.io/otel/sdk v1.11.2/go.mod h1:wZ1WxImwpq+lVRo4vsmSOxdd+xwoUJ6rqyLc3SyX9aU=
|
||||
go.opentelemetry.io/otel/sdk/metric v0.34.0 h1:7ElxfQpXCFZlRTvVRTkcUvK8Gt5DC8QzmzsLsO2gdzo=
|
||||
go.opentelemetry.io/otel/sdk/metric v0.34.0/go.mod h1:l4r16BIqiqPy5rd14kkxllPy/fOI4tWo1jkpD9Z3ffQ=
|
||||
go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0=
|
||||
go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA=
|
||||
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ package test
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
|
|
@ -30,15 +31,56 @@ import (
|
|||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/codes"
|
||||
"go.opentelemetry.io/otel/propagation"
|
||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||
"go.opentelemetry.io/otel/sdk/metric"
|
||||
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
||||
"go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest"
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
"go.opentelemetry.io/otel/sdk/trace/tracetest"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
)
|
||||
|
||||
// TODO(#2759): Add metric integration tests for the instrumentation. These
|
||||
// tests depend on
|
||||
// https://github.com/open-telemetry/opentelemetry-go/issues/3031 being
|
||||
// resolved.
|
||||
func assertScopeMetrics(t *testing.T, sm metricdata.ScopeMetrics, attrs attribute.Set) {
|
||||
assert.Equal(t, instrumentation.Scope{
|
||||
Name: "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp",
|
||||
Version: otelhttp.SemVersion(),
|
||||
}, sm.Scope)
|
||||
|
||||
require.Len(t, sm.Metrics, 3)
|
||||
|
||||
want := metricdata.Metrics{
|
||||
Name: "http.server.request_content_length",
|
||||
Data: metricdata.Sum[int64]{
|
||||
DataPoints: []metricdata.DataPoint[int64]{{Attributes: attrs, Value: 0}},
|
||||
Temporality: metricdata.CumulativeTemporality,
|
||||
IsMonotonic: true,
|
||||
},
|
||||
}
|
||||
metricdatatest.AssertEqual(t, want, sm.Metrics[0], metricdatatest.IgnoreTimestamp())
|
||||
|
||||
want = metricdata.Metrics{
|
||||
Name: "http.server.response_content_length",
|
||||
Data: metricdata.Sum[int64]{
|
||||
DataPoints: []metricdata.DataPoint[int64]{{Attributes: attrs, Value: 11}},
|
||||
Temporality: metricdata.CumulativeTemporality,
|
||||
IsMonotonic: true,
|
||||
},
|
||||
}
|
||||
metricdatatest.AssertEqual(t, want, sm.Metrics[1], metricdatatest.IgnoreTimestamp())
|
||||
|
||||
// Duration value is not predictable.
|
||||
dur := sm.Metrics[2]
|
||||
assert.Equal(t, "http.server.duration", dur.Name)
|
||||
require.IsType(t, dur.Data, metricdata.Histogram{})
|
||||
hist := dur.Data.(metricdata.Histogram)
|
||||
assert.Equal(t, metricdata.CumulativeTemporality, hist.Temporality)
|
||||
require.Len(t, hist.DataPoints, 1)
|
||||
dPt := hist.DataPoints[0]
|
||||
assert.Equal(t, attrs, dPt.Attributes, "attributes")
|
||||
assert.Equal(t, uint64(1), dPt.Count, "count")
|
||||
assert.Equal(t, []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000}, dPt.Bounds, "bounds")
|
||||
}
|
||||
|
||||
func TestHandlerBasics(t *testing.T) {
|
||||
rr := httptest.NewRecorder()
|
||||
|
|
@ -46,6 +88,9 @@ func TestHandlerBasics(t *testing.T) {
|
|||
spanRecorder := tracetest.NewSpanRecorder()
|
||||
provider := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(spanRecorder))
|
||||
|
||||
reader := metric.NewManualReader()
|
||||
meterProvider := metric.NewMeterProvider(metric.WithReader(reader))
|
||||
|
||||
operation := "test_handler"
|
||||
|
||||
h := otelhttp.NewHandler(
|
||||
|
|
@ -58,6 +103,7 @@ func TestHandlerBasics(t *testing.T) {
|
|||
}
|
||||
}), operation,
|
||||
otelhttp.WithTracerProvider(provider),
|
||||
otelhttp.WithMeterProvider(meterProvider),
|
||||
otelhttp.WithPropagators(propagation.TraceContext{}),
|
||||
)
|
||||
|
||||
|
|
@ -67,6 +113,19 @@ func TestHandlerBasics(t *testing.T) {
|
|||
}
|
||||
h.ServeHTTP(rr, r)
|
||||
|
||||
rm, err := reader.Collect(context.Background())
|
||||
require.NoError(t, err)
|
||||
require.Len(t, rm.ScopeMetrics, 1)
|
||||
attrs := attribute.NewSet(
|
||||
semconv.HTTPServerNameKey.String(operation),
|
||||
semconv.HTTPSchemeHTTP,
|
||||
semconv.HTTPHostKey.String(r.Host),
|
||||
semconv.HTTPFlavorKey.String(fmt.Sprintf("1.%d", r.ProtoMinor)),
|
||||
semconv.HTTPMethodKey.String("GET"),
|
||||
attribute.String("test", "attribute"),
|
||||
)
|
||||
assertScopeMetrics(t, rm.ScopeMetrics[0], attrs)
|
||||
|
||||
if got, expected := rr.Result().StatusCode, http.StatusOK; got != expected {
|
||||
t.Fatalf("got %d, expected %d", got, expected)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue