mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-02-11 13:38:37 +02:00
* in memory exporter * Add comments * Split tests and address PR comments * address PR comments. * Changelog * fix Changelog. * Apply suggestions from code review Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com> Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com> * Add numberkind * Made the tests require.NoError * fix the Label changing * Update CHANGELOG.md Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com> Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
425 lines
12 KiB
Go
425 lines
12 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package metrictest_test // import "go.opentelemetry.io/otel/sdk/metric/metrictest"
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"go.opentelemetry.io/otel/attribute"
|
|
"go.opentelemetry.io/otel/metric/instrument"
|
|
"go.opentelemetry.io/otel/sdk/metric/export/aggregation"
|
|
"go.opentelemetry.io/otel/sdk/metric/metrictest"
|
|
)
|
|
|
|
func TestSyncInstruments(t *testing.T) {
|
|
ctx := context.Background()
|
|
mp, exp := metrictest.NewTestMeterProvider()
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestSyncInstruments")
|
|
|
|
t.Run("Float Counter", func(t *testing.T) {
|
|
fcnt, err := meter.SyncFloat64().Counter("fCount")
|
|
require.NoError(t, err)
|
|
|
|
fcnt.Add(ctx, 2)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fCount")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 2.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Float UpDownCounter", func(t *testing.T) {
|
|
fudcnt, err := meter.SyncFloat64().UpDownCounter("fUDCount")
|
|
require.NoError(t, err)
|
|
|
|
fudcnt.Add(ctx, 3)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fUDCount")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 3.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
|
|
})
|
|
|
|
t.Run("Float Histogram", func(t *testing.T) {
|
|
fhis, err := meter.SyncFloat64().Histogram("fHist")
|
|
require.NoError(t, err)
|
|
|
|
fhis.Record(ctx, 4)
|
|
fhis.Record(ctx, 5)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fHist")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 9.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.EqualValues(t, 2, out.Count)
|
|
assert.Equal(t, aggregation.HistogramKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Int Counter", func(t *testing.T) {
|
|
icnt, err := meter.SyncInt64().Counter("iCount")
|
|
require.NoError(t, err)
|
|
|
|
icnt.Add(ctx, 22)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iCount")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 22, out.Sum.AsInt64())
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
|
|
})
|
|
t.Run("Int UpDownCounter", func(t *testing.T) {
|
|
iudcnt, err := meter.SyncInt64().UpDownCounter("iUDCount")
|
|
require.NoError(t, err)
|
|
|
|
iudcnt.Add(ctx, 23)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iUDCount")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 23, out.Sum.AsInt64())
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
|
|
})
|
|
t.Run("Int Histogram", func(t *testing.T) {
|
|
|
|
ihis, err := meter.SyncInt64().Histogram("iHist")
|
|
require.NoError(t, err)
|
|
|
|
ihis.Record(ctx, 24)
|
|
ihis.Record(ctx, 25)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iHist")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 49, out.Sum.AsInt64())
|
|
assert.EqualValues(t, 2, out.Count)
|
|
assert.Equal(t, aggregation.HistogramKind, out.AggregationKind)
|
|
})
|
|
}
|
|
|
|
func TestSyncDeltaInstruments(t *testing.T) {
|
|
ctx := context.Background()
|
|
mp, exp := metrictest.NewTestMeterProvider(metrictest.WithTemporalitySelector(aggregation.DeltaTemporalitySelector()))
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestSyncDeltaInstruments")
|
|
|
|
t.Run("Float Counter", func(t *testing.T) {
|
|
fcnt, err := meter.SyncFloat64().Counter("fCount")
|
|
require.NoError(t, err)
|
|
|
|
fcnt.Add(ctx, 2)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fCount")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 2.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Float UpDownCounter", func(t *testing.T) {
|
|
fudcnt, err := meter.SyncFloat64().UpDownCounter("fUDCount")
|
|
require.NoError(t, err)
|
|
|
|
fudcnt.Add(ctx, 3)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fUDCount")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 3.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
|
|
})
|
|
|
|
t.Run("Float Histogram", func(t *testing.T) {
|
|
fhis, err := meter.SyncFloat64().Histogram("fHist")
|
|
require.NoError(t, err)
|
|
|
|
fhis.Record(ctx, 4)
|
|
fhis.Record(ctx, 5)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fHist")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 9.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.EqualValues(t, 2, out.Count)
|
|
assert.Equal(t, aggregation.HistogramKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Int Counter", func(t *testing.T) {
|
|
icnt, err := meter.SyncInt64().Counter("iCount")
|
|
require.NoError(t, err)
|
|
|
|
icnt.Add(ctx, 22)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iCount")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 22, out.Sum.AsInt64())
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
|
|
})
|
|
t.Run("Int UpDownCounter", func(t *testing.T) {
|
|
iudcnt, err := meter.SyncInt64().UpDownCounter("iUDCount")
|
|
require.NoError(t, err)
|
|
|
|
iudcnt.Add(ctx, 23)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iUDCount")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 23, out.Sum.AsInt64())
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
|
|
})
|
|
t.Run("Int Histogram", func(t *testing.T) {
|
|
|
|
ihis, err := meter.SyncInt64().Histogram("iHist")
|
|
require.NoError(t, err)
|
|
|
|
ihis.Record(ctx, 24)
|
|
ihis.Record(ctx, 25)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iHist")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 49, out.Sum.AsInt64())
|
|
assert.EqualValues(t, 2, out.Count)
|
|
assert.Equal(t, aggregation.HistogramKind, out.AggregationKind)
|
|
})
|
|
}
|
|
|
|
func TestAsyncInstruments(t *testing.T) {
|
|
ctx := context.Background()
|
|
mp, exp := metrictest.NewTestMeterProvider()
|
|
|
|
t.Run("Float Counter", func(t *testing.T) {
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestAsyncCounter_FloatCounter")
|
|
|
|
fcnt, err := meter.AsyncFloat64().Counter("fCount")
|
|
require.NoError(t, err)
|
|
|
|
err = meter.RegisterCallback(
|
|
[]instrument.Asynchronous{
|
|
fcnt,
|
|
}, func(context.Context) {
|
|
fcnt.Observe(ctx, 2)
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fCount")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 2.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Float UpDownCounter", func(t *testing.T) {
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestAsyncCounter_FloatUpDownCounter")
|
|
|
|
fudcnt, err := meter.AsyncFloat64().UpDownCounter("fUDCount")
|
|
require.NoError(t, err)
|
|
|
|
err = meter.RegisterCallback(
|
|
[]instrument.Asynchronous{
|
|
fudcnt,
|
|
}, func(context.Context) {
|
|
fudcnt.Observe(ctx, 3)
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fUDCount")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 3.0, out.Sum.AsFloat64(), 0.0001)
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Float Gauge", func(t *testing.T) {
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestAsyncCounter_FloatGauge")
|
|
|
|
fgauge, err := meter.AsyncFloat64().Gauge("fGauge")
|
|
require.NoError(t, err)
|
|
|
|
err = meter.RegisterCallback(
|
|
[]instrument.Asynchronous{
|
|
fgauge,
|
|
}, func(context.Context) {
|
|
fgauge.Observe(ctx, 4)
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("fGauge")
|
|
require.NoError(t, err)
|
|
assert.InDelta(t, 4.0, out.LastValue.AsFloat64(), 0.0001)
|
|
assert.Equal(t, aggregation.LastValueKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Int Counter", func(t *testing.T) {
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestAsyncCounter_IntCounter")
|
|
|
|
icnt, err := meter.AsyncInt64().Counter("iCount")
|
|
require.NoError(t, err)
|
|
|
|
err = meter.RegisterCallback(
|
|
[]instrument.Asynchronous{
|
|
icnt,
|
|
}, func(context.Context) {
|
|
icnt.Observe(ctx, 22)
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iCount")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 22, out.Sum.AsInt64())
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
})
|
|
|
|
t.Run("Int UpDownCounter", func(t *testing.T) {
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestAsyncCounter_IntUpDownCounter")
|
|
|
|
iudcnt, err := meter.AsyncInt64().UpDownCounter("iUDCount")
|
|
require.NoError(t, err)
|
|
|
|
err = meter.RegisterCallback(
|
|
[]instrument.Asynchronous{
|
|
iudcnt,
|
|
}, func(context.Context) {
|
|
iudcnt.Observe(ctx, 23)
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iUDCount")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 23, out.Sum.AsInt64())
|
|
assert.Equal(t, aggregation.SumKind, out.AggregationKind)
|
|
|
|
})
|
|
t.Run("Int Gauge", func(t *testing.T) {
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_TestAsyncCounter_IntGauge")
|
|
|
|
igauge, err := meter.AsyncInt64().Gauge("iGauge")
|
|
require.NoError(t, err)
|
|
|
|
err = meter.RegisterCallback(
|
|
[]instrument.Asynchronous{
|
|
igauge,
|
|
}, func(context.Context) {
|
|
igauge.Observe(ctx, 25)
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = exp.Collect(context.Background())
|
|
require.NoError(t, err)
|
|
|
|
out, err := exp.GetByName("iGauge")
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 25, out.LastValue.AsInt64())
|
|
assert.Equal(t, aggregation.LastValueKind, out.AggregationKind)
|
|
})
|
|
|
|
}
|
|
|
|
func ExampleExporter_GetByName() {
|
|
mp, exp := metrictest.NewTestMeterProvider()
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_ExampleExporter_GetByName")
|
|
|
|
cnt, err := meter.SyncFloat64().Counter("fCount")
|
|
if err != nil {
|
|
panic("could not acquire counter")
|
|
}
|
|
|
|
cnt.Add(context.Background(), 2.5)
|
|
|
|
err = exp.Collect(context.Background())
|
|
if err != nil {
|
|
panic("collection failed")
|
|
}
|
|
|
|
out, _ := exp.GetByName("fCount")
|
|
|
|
fmt.Println(out.Sum.AsFloat64())
|
|
// Output: 2.5
|
|
}
|
|
|
|
func ExampleExporter_GetByNameAndAttributes() {
|
|
mp, exp := metrictest.NewTestMeterProvider()
|
|
meter := mp.Meter("go.opentelemetry.io/otel/sdk/metric/metrictest/exporter_ExampleExporter_GetByNameAndAttributes")
|
|
|
|
cnt, err := meter.SyncFloat64().Counter("fCount")
|
|
if err != nil {
|
|
panic("could not acquire counter")
|
|
}
|
|
|
|
cnt.Add(context.Background(), 4, attribute.String("foo", "bar"), attribute.Bool("found", false))
|
|
|
|
err = exp.Collect(context.Background())
|
|
if err != nil {
|
|
panic("collection failed")
|
|
}
|
|
|
|
out, err := exp.GetByNameAndAttributes("fCount", []attribute.KeyValue{attribute.String("foo", "bar")})
|
|
if err != nil {
|
|
println(err.Error())
|
|
}
|
|
|
|
fmt.Println(out.Sum.AsFloat64())
|
|
// Output: 4
|
|
}
|