opentelemetry-collector/scraper/scraperhelper/obs_metrics_test.go

133 lines
4.8 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package scraperhelper
import (
"context"
"errors"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/sdk/metric/metricdata"
"go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/pdata/testdata"
"go.opentelemetry.io/collector/scraper"
"go.opentelemetry.io/collector/scraper/scrapererror"
"go.opentelemetry.io/collector/scraper/scraperhelper/internal/metadatatest"
)
var (
receiverID = component.MustNewID("fakeReceiver")
scraperID = component.MustNewID("fakeScraper")
errFake = errors.New("errFake")
partialErrFake = scrapererror.NewPartialScrapeError(errFake, 2)
)
type testParams struct {
items int
err error
}
func TestScrapeMetricsDataOp(t *testing.T) {
tel := componenttest.NewTelemetry()
t.Cleanup(func() { require.NoError(t, tel.Shutdown(context.Background())) })
set := tel.NewTelemetrySettings()
parentCtx, parentSpan := set.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
defer parentSpan.End()
params := []testParams{
{items: 23, err: partialErrFake},
{items: 29, err: errFake},
{items: 15, err: nil},
}
for i := range params {
sm, err := scraper.NewMetrics(func(context.Context) (pmetric.Metrics, error) {
return testdata.GenerateMetrics(params[i].items), params[i].err
})
require.NoError(t, err)
sf, err := wrapObsMetrics(sm, receiverID, scraperID, set)
require.NoError(t, err)
_, err = sf.ScrapeMetrics(parentCtx)
require.ErrorIs(t, err, params[i].err)
}
spans := tel.SpanRecorder.Ended()
require.Len(t, spans, len(params))
var scrapedMetricPoints, erroredMetricPoints int
for i, span := range spans {
assert.Equal(t, "scraper/"+scraperID.String()+"/ScrapeMetrics", span.Name())
switch {
case params[i].err == nil:
scrapedMetricPoints += params[i].items
require.Contains(t, span.Attributes(), attribute.Int64(scrapedMetricPointsKey, int64(params[i].items)))
require.Contains(t, span.Attributes(), attribute.Int64(erroredMetricPointsKey, 0))
assert.Equal(t, codes.Unset, span.Status().Code)
case errors.Is(params[i].err, errFake):
// Since we get an error, we cannot record any metrics because we don't know if the returned pmetric.Metrics is valid instance.
require.Contains(t, span.Attributes(), attribute.Int64(scrapedMetricPointsKey, 0))
require.Contains(t, span.Attributes(), attribute.Int64(erroredMetricPointsKey, 0))
assert.Equal(t, codes.Error, span.Status().Code)
assert.Equal(t, params[i].err.Error(), span.Status().Description)
case errors.Is(params[i].err, partialErrFake):
scrapedMetricPoints += params[i].items
erroredMetricPoints += 2
require.Contains(t, span.Attributes(), attribute.Int64(scrapedMetricPointsKey, int64(params[i].items)))
require.Contains(t, span.Attributes(), attribute.Int64(erroredMetricPointsKey, 2))
assert.Equal(t, codes.Error, span.Status().Code)
assert.Equal(t, params[i].err.Error(), span.Status().Description)
default:
t.Fatalf("unexpected err param: %v", params[i].err)
}
}
checkScraperMetrics(t, tel, receiverID, scraperID, int64(scrapedMetricPoints), int64(erroredMetricPoints))
}
func TestCheckScraperMetrics(t *testing.T) {
tel := componenttest.NewTelemetry()
t.Cleanup(func() { require.NoError(t, tel.Shutdown(context.Background())) })
sm, err := scraper.NewMetrics(func(context.Context) (pmetric.Metrics, error) {
return testdata.GenerateMetrics(7), nil
})
require.NoError(t, err)
sf, err := wrapObsMetrics(sm, receiverID, scraperID, tel.NewTelemetrySettings())
require.NoError(t, err)
_, err = sf.ScrapeMetrics(context.Background())
require.NoError(t, err)
checkScraperMetrics(t, tel, receiverID, scraperID, 7, 0)
}
func checkScraperMetrics(t *testing.T, tt *componenttest.Telemetry, receiver, scraper component.ID, scrapedMetricPoints, erroredMetricPoints int64) {
metadatatest.AssertEqualScraperScrapedMetricPoints(t, tt,
[]metricdata.DataPoint[int64]{
{
Attributes: attribute.NewSet(
attribute.String(receiverKey, receiver.String()),
attribute.String(scraperKey, scraper.String())),
Value: scrapedMetricPoints,
},
}, metricdatatest.IgnoreTimestamp(), metricdatatest.IgnoreExemplars())
metadatatest.AssertEqualScraperErroredMetricPoints(t, tt,
[]metricdata.DataPoint[int64]{
{
Attributes: attribute.NewSet(
attribute.String(receiverKey, receiver.String()),
attribute.String(scraperKey, scraper.String())),
Value: erroredMetricPoints,
},
}, metricdatatest.IgnoreTimestamp(), metricdatatest.IgnoreExemplars())
}