Skip to content

Commit

Permalink
Hide testbed DataProvider implementation structs (open-telemetry#3389)
Browse files Browse the repository at this point in the history
Remove also the Nil vs Empty tests since in pdata they are equivalent.

Signed-off-by: Bogdan Drutu <[email protected]>

Updates open-telemetry#3104
  • Loading branch information
bogdandrutu committed Jun 9, 2021
1 parent ba9ccde commit 0a24036
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 189 deletions.
38 changes: 18 additions & 20 deletions testbed/testbed/data_providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,28 +48,27 @@ type DataProvider interface {
GenerateLogs() (pdata.Logs, bool)
}

// PerfTestDataProvider in an implementation of the DataProvider for use in performance tests.
// perfTestDataProvider in an implementation of the DataProvider for use in performance tests.
// Tracing IDs are based on the incremented batch and data items counters.
type PerfTestDataProvider struct {
type perfTestDataProvider struct {
options LoadOptions
traceIDSequence atomic.Uint64
dataItemsGenerated *atomic.Uint64
}

// NewPerfTestDataProvider creates an instance of PerfTestDataProvider which generates test data based on the sizes
// NewPerfTestDataProvider creates an instance of perfTestDataProvider which generates test data based on the sizes
// specified in the supplied LoadOptions.
func NewPerfTestDataProvider(options LoadOptions) *PerfTestDataProvider {
return &PerfTestDataProvider{
func NewPerfTestDataProvider(options LoadOptions) DataProvider {
return &perfTestDataProvider{
options: options,
}
}

func (dp *PerfTestDataProvider) SetLoadGeneratorCounters(dataItemsGenerated *atomic.Uint64) {
func (dp *perfTestDataProvider) SetLoadGeneratorCounters(dataItemsGenerated *atomic.Uint64) {
dp.dataItemsGenerated = dataItemsGenerated
}

func (dp *PerfTestDataProvider) GenerateTraces() (pdata.Traces, bool) {

func (dp *perfTestDataProvider) GenerateTraces() (pdata.Traces, bool) {
traceData := pdata.NewTraces()
spans := traceData.ResourceSpans().AppendEmpty().InstrumentationLibrarySpans().AppendEmpty().Spans()
spans.Resize(dp.options.ItemsPerBatch)
Expand Down Expand Up @@ -102,8 +101,7 @@ func (dp *PerfTestDataProvider) GenerateTraces() (pdata.Traces, bool) {
return traceData, false
}

func (dp *PerfTestDataProvider) GenerateMetrics() (pdata.Metrics, bool) {

func (dp *perfTestDataProvider) GenerateMetrics() (pdata.Metrics, bool) {
// Generate 7 data points per metric.
const dataPointsPerMetric = 7

Expand Down Expand Up @@ -145,7 +143,7 @@ func (dp *PerfTestDataProvider) GenerateMetrics() (pdata.Metrics, bool) {
return md, false
}

func (dp *PerfTestDataProvider) GenerateLogs() (pdata.Logs, bool) {
func (dp *perfTestDataProvider) GenerateLogs() (pdata.Logs, bool) {
logs := pdata.NewLogs()
rl := logs.ResourceLogs().AppendEmpty()
if dp.options.Attributes != nil {
Expand Down Expand Up @@ -183,9 +181,9 @@ func (dp *PerfTestDataProvider) GenerateLogs() (pdata.Logs, bool) {
return logs, false
}

// GoldenDataProvider is an implementation of DataProvider for use in correctness tests.
// goldenDataProvider is an implementation of DataProvider for use in correctness tests.
// Provided data from the "Golden" dataset generated using pairwise combinatorial testing techniques.
type GoldenDataProvider struct {
type goldenDataProvider struct {
tracePairsFile string
spanPairsFile string
dataItemsGenerated *atomic.Uint64
Expand All @@ -198,21 +196,21 @@ type GoldenDataProvider struct {
metricsIndex int
}

// NewGoldenDataProvider creates a new instance of GoldenDataProvider which generates test data based
// NewGoldenDataProvider creates a new instance of goldenDataProvider which generates test data based
// on the pairwise combinations specified in the tracePairsFile and spanPairsFile input variables.
func NewGoldenDataProvider(tracePairsFile string, spanPairsFile string, metricPairsFile string) *GoldenDataProvider {
return &GoldenDataProvider{
func NewGoldenDataProvider(tracePairsFile string, spanPairsFile string, metricPairsFile string) DataProvider {
return &goldenDataProvider{
tracePairsFile: tracePairsFile,
spanPairsFile: spanPairsFile,
metricPairsFile: metricPairsFile,
}
}

func (dp *GoldenDataProvider) SetLoadGeneratorCounters(dataItemsGenerated *atomic.Uint64) {
func (dp *goldenDataProvider) SetLoadGeneratorCounters(dataItemsGenerated *atomic.Uint64) {
dp.dataItemsGenerated = dataItemsGenerated
}

func (dp *GoldenDataProvider) GenerateTraces() (pdata.Traces, bool) {
func (dp *goldenDataProvider) GenerateTraces() (pdata.Traces, bool) {
if dp.tracesGenerated == nil {
var err error
dp.tracesGenerated, err = goldendataset.GenerateTraces(dp.tracePairsFile, dp.spanPairsFile)
Expand All @@ -230,7 +228,7 @@ func (dp *GoldenDataProvider) GenerateTraces() (pdata.Traces, bool) {
return td, false
}

func (dp *GoldenDataProvider) GenerateMetrics() (pdata.Metrics, bool) {
func (dp *goldenDataProvider) GenerateMetrics() (pdata.Metrics, bool) {
if dp.metricsGenerated == nil {
var err error
dp.metricsGenerated, err = goldendataset.GenerateMetrics(dp.metricPairsFile)
Expand All @@ -248,7 +246,7 @@ func (dp *GoldenDataProvider) GenerateMetrics() (pdata.Metrics, bool) {
return pdm, false
}

func (dp *GoldenDataProvider) GenerateLogs() (pdata.Logs, bool) {
func (dp *goldenDataProvider) GenerateLogs() (pdata.Logs, bool) {
return pdata.NewLogs(), true
}

Expand Down
2 changes: 1 addition & 1 deletion testbed/testbed/data_providers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,5 @@ func TestGoldenDataProvider(t *testing.T) {
}
ms = append(ms, m)
}
require.Equal(t, len(dp.metricsGenerated), len(ms))
require.Equal(t, len(dp.(*goldenDataProvider).metricsGenerated), len(ms))
}
2 changes: 1 addition & 1 deletion testbed/testbed/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ func (v *CorrectnessTestValidator) RecordResults(tc *TestCase) {
func (v *CorrectnessTestValidator) assertSentRecdTracingDataEqual(tracesList []pdata.Traces) {
spansMap := make(map[string]pdata.Span)
// TODO: Remove this hack, and add a way to retrieve all sent data.
if val, ok := v.dataProvider.(*GoldenDataProvider); ok {
if val, ok := v.dataProvider.(*goldenDataProvider); ok {
populateSpansMap(spansMap, val.tracesGenerated)
}

Expand Down
216 changes: 49 additions & 167 deletions testbed/tests/resource_processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,113 +23,42 @@ import (
"github.com/stretchr/testify/require"

"go.opentelemetry.io/collector/consumer/pdata"
"go.opentelemetry.io/collector/internal"
otlpcollectormetrics "go.opentelemetry.io/collector/internal/data/protogen/collector/metrics/v1"
otlpcommon "go.opentelemetry.io/collector/internal/data/protogen/common/v1"
otlpmetrics "go.opentelemetry.io/collector/internal/data/protogen/metrics/v1"
otlpresource "go.opentelemetry.io/collector/internal/data/protogen/resource/v1"
"go.opentelemetry.io/collector/testbed/testbed"
)

var (
mockedConsumedResourceWithType = &otlpmetrics.ResourceMetrics{
Resource: otlpresource.Resource{
Attributes: []otlpcommon.KeyValue{
{
Key: "opencensus.resourcetype",
Value: otlpcommon.AnyValue{
Value: &otlpcommon.AnyValue_StringValue{
StringValue: "host",
},
},
},
{
Key: "label-key",
Value: otlpcommon.AnyValue{
Value: &otlpcommon.AnyValue_StringValue{
StringValue: "label-value",
},
},
},
},
},
InstrumentationLibraryMetrics: []*otlpmetrics.InstrumentationLibraryMetrics{
{
Metrics: []*otlpmetrics.Metric{
{
Name: "metric-name",
Description: "metric-description",
Unit: "metric-unit",
Data: &otlpmetrics.Metric_IntGauge{
IntGauge: &otlpmetrics.IntGauge{
DataPoints: []*otlpmetrics.IntDataPoint{
{
Value: 0,
},
},
},
},
},
},
},
},
}

mockedConsumedResourceNil = &otlpmetrics.ResourceMetrics{
InstrumentationLibraryMetrics: []*otlpmetrics.InstrumentationLibraryMetrics{
{
Metrics: []*otlpmetrics.Metric{
{
Name: "metric-name",
Description: "metric-description",
Unit: "metric-unit",
Data: &otlpmetrics.Metric_IntGauge{
IntGauge: &otlpmetrics.IntGauge{
DataPoints: []*otlpmetrics.IntDataPoint{
{
Value: 0,
},
},
},
},
},
},
},
},
}

mockedConsumedResourceWithoutAttributes = &otlpmetrics.ResourceMetrics{
Resource: otlpresource.Resource{
Attributes: []otlpcommon.KeyValue{},
},
InstrumentationLibraryMetrics: []*otlpmetrics.InstrumentationLibraryMetrics{
{
Metrics: []*otlpmetrics.Metric{
{
Name: "metric-name",
Description: "metric-description",
Unit: "metric-unit",
Data: &otlpmetrics.Metric_IntGauge{
IntGauge: &otlpmetrics.IntGauge{
DataPoints: []*otlpmetrics.IntDataPoint{
{
Value: 0,
},
},
},
},
},
},
},
},
}
mockedConsumedResourceWithType = func() pdata.Metrics {
md := pdata.NewMetrics()
rm := md.ResourceMetrics().AppendEmpty()
rm.Resource().Attributes().UpsertString("opencensus.resourcetype", "host")
rm.Resource().Attributes().UpsertString("label-key", "label-value")
m := rm.InstrumentationLibraryMetrics().AppendEmpty().Metrics().AppendEmpty()
m.SetName("metric-name")
m.SetDescription("metric-description")
m.SetUnit("metric-unit")
m.SetDataType(pdata.MetricDataTypeIntGauge)
m.IntGauge().DataPoints().AppendEmpty().SetValue(0)
return md
}()

mockedConsumedResourceEmpty = func() pdata.Metrics {
md := pdata.NewMetrics()
rm := md.ResourceMetrics().AppendEmpty()
m := rm.InstrumentationLibraryMetrics().AppendEmpty().Metrics().AppendEmpty()
m.SetName("metric-name")
m.SetDescription("metric-description")
m.SetUnit("metric-unit")
m.SetDataType(pdata.MetricDataTypeIntGauge)
m.IntGauge().DataPoints().AppendEmpty().SetValue(0)
return md
}()
)

type resourceProcessorTestCase struct {
name string
resourceProcessorConfig string
mockedConsumedMetricData pdata.Metrics
expectedMetricData pdata.Metrics
name string
resourceProcessorConfig string
mockedConsumedMetrics pdata.Metrics
expectedMetrics pdata.Metrics
}

func getResourceProcessorTestCases() []resourceProcessorTestCase {
Expand All @@ -149,43 +78,14 @@ func getResourceProcessorTestCases() []resourceProcessorTestCase {
- key: opencensus.resourcetype
action: delete
`,
mockedConsumedMetricData: metricsFromResourceMetrics(mockedConsumedResourceWithType),
expectedMetricData: metricsFromResourceMetrics(&otlpmetrics.ResourceMetrics{
Resource: otlpresource.Resource{
Attributes: []otlpcommon.KeyValue{
{
Key: "resource-type",
Value: otlpcommon.AnyValue{Value: &otlpcommon.AnyValue_StringValue{StringValue: "host"}},
},
{
Key: "label-key",
Value: otlpcommon.AnyValue{Value: &otlpcommon.AnyValue_StringValue{StringValue: "new-label-value"}},
},
},
},
}),
},
{
name: "set_attribute_on_nil_resource",
resourceProcessorConfig: `
resource:
attributes:
- key: additional-label-key
value: additional-label-value
action: insert
`,
mockedConsumedMetricData: metricsFromResourceMetrics(mockedConsumedResourceNil),
expectedMetricData: metricsFromResourceMetrics(&otlpmetrics.ResourceMetrics{
Resource: otlpresource.Resource{
Attributes: []otlpcommon.KeyValue{
{
Key: "additional-label-key",
Value: otlpcommon.AnyValue{Value: &otlpcommon.AnyValue_StringValue{StringValue: "additional-label-value"}},
},
},
},
}),
mockedConsumedMetrics: mockedConsumedResourceWithType,
expectedMetrics: func() pdata.Metrics {
md := pdata.NewMetrics()
rm := md.ResourceMetrics().AppendEmpty()
rm.Resource().Attributes().UpsertString("resource-type", "host")
rm.Resource().Attributes().UpsertString("label-key", "new-label-value")
return md
}(),
},
{
name: "set_attribute_on_empty_resource",
Expand All @@ -195,30 +95,21 @@ func getResourceProcessorTestCases() []resourceProcessorTestCase {
- key: additional-label-key
value: additional-label-value
action: insert
`,
mockedConsumedMetricData: metricsFromResourceMetrics(mockedConsumedResourceWithoutAttributes),
expectedMetricData: metricsFromResourceMetrics(&otlpmetrics.ResourceMetrics{
Resource: otlpresource.Resource{
Attributes: []otlpcommon.KeyValue{
{
Key: "additional-label-key",
Value: otlpcommon.AnyValue{Value: &otlpcommon.AnyValue_StringValue{StringValue: "additional-label-value"}},
},
},
},
}),
mockedConsumedMetrics: mockedConsumedResourceEmpty,
expectedMetrics: func() pdata.Metrics {
md := pdata.NewMetrics()
rm := md.ResourceMetrics().AppendEmpty()
rm.Resource().Attributes().UpsertString("additional-label-key", "additional-label-value")
return md
}(),
},
}

return tests
}

func metricsFromResourceMetrics(rm *otlpmetrics.ResourceMetrics) pdata.Metrics {
return pdata.MetricsFromInternalRep(internal.MetricsFromOtlp(&otlpcollectormetrics.ExportMetricsServiceRequest{
ResourceMetrics: []*otlpmetrics.ResourceMetrics{rm},
}))
}

func TestMetricResourceProcessor(t *testing.T) {
sender := testbed.NewOTLPMetricDataSender(testbed.DefaultHost, testbed.GetAvailablePort(t))
receiver := testbed.NewOTLPDataReceiver(testbed.GetAvailablePort(t))
Expand Down Expand Up @@ -267,7 +158,7 @@ func TestMetricResourceProcessor(t *testing.T) {
sender, ok := tc.Sender.(testbed.MetricDataSender)
require.True(t, ok, "unsupported metric sender")

require.NoError(t, sender.ConsumeMetrics(context.Background(), test.mockedConsumedMetricData))
require.NoError(t, sender.ConsumeMetrics(context.Background(), test.mockedConsumedMetrics))

// We bypass the load generator in this test, but make sure to increment the
// counter since it is used in final reports.
Expand All @@ -281,20 +172,11 @@ func TestMetricResourceProcessor(t *testing.T) {
rm := m.ResourceMetrics()
require.Equal(t, 1, rm.Len())

expectidMD := test.expectedMetricData
expectidMD := test.expectedMetrics
require.Equal(t,
attributesToMap(expectidMD.ResourceMetrics().At(0).Resource().Attributes()),
attributesToMap(rm.At(0).Resource().Attributes()),
expectidMD.ResourceMetrics().At(0).Resource().Attributes().Sort(),
rm.At(0).Resource().Attributes().Sort(),
)
})
}
}

func attributesToMap(attributes pdata.AttributeMap) map[string]pdata.AttributeValue {
out := map[string]pdata.AttributeValue{}
attributes.Range(func(k string, v pdata.AttributeValue) bool {
out[k] = v
return true
})
return out
}

0 comments on commit 0a24036

Please sign in to comment.