2021-09-24 00:05:29 +08:00
|
|
|
package opentelemetry
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"net"
|
|
|
|
|
"testing"
|
2022-10-06 04:03:17 +08:00
|
|
|
"time"
|
2021-09-24 00:05:29 +08:00
|
|
|
|
2023-06-02 19:24:33 +08:00
|
|
|
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
|
|
|
|
|
2021-09-24 00:05:29 +08:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
|
2022-10-06 04:03:17 +08:00
|
|
|
"go.opentelemetry.io/otel/sdk/metric"
|
2021-09-24 00:05:29 +08:00
|
|
|
"google.golang.org/grpc"
|
|
|
|
|
"google.golang.org/grpc/test/bufconn"
|
2021-11-02 22:42:22 +08:00
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf"
|
|
|
|
|
"github.com/influxdata/telegraf/plugins/inputs"
|
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
2021-09-24 00:05:29 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestOpenTelemetry(t *testing.T) {
|
2022-10-06 04:03:17 +08:00
|
|
|
// create mock OpenTelemetry client
|
|
|
|
|
|
2021-09-24 00:05:29 +08:00
|
|
|
mockListener := bufconn.Listen(1024 * 1024)
|
2022-10-06 04:03:17 +08:00
|
|
|
t.Cleanup(func() { _ = mockListener.Close() })
|
2021-09-24 00:05:29 +08:00
|
|
|
plugin := inputs.Inputs["opentelemetry"]().(*OpenTelemetry)
|
|
|
|
|
plugin.listener = mockListener
|
|
|
|
|
accumulator := new(testutil.Accumulator)
|
|
|
|
|
|
2022-10-06 04:03:17 +08:00
|
|
|
require.NoError(t, plugin.Start(accumulator))
|
2021-09-24 00:05:29 +08:00
|
|
|
t.Cleanup(plugin.Stop)
|
|
|
|
|
|
2022-10-06 04:03:17 +08:00
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
|
|
|
|
t.Cleanup(cancel)
|
|
|
|
|
|
|
|
|
|
metricExporter, err := otlpmetricgrpc.New(ctx,
|
2021-09-24 00:05:29 +08:00
|
|
|
otlpmetricgrpc.WithInsecure(),
|
|
|
|
|
otlpmetricgrpc.WithDialOption(
|
2024-06-07 03:35:56 +08:00
|
|
|
grpc.WithBlock(), //nolint:staticcheck // grpc.WithBlock is deprecated, but no alternative is provided
|
2022-10-06 04:03:17 +08:00
|
|
|
grpc.WithContextDialer(func(ctx context.Context, _ string) (net.Conn, error) {
|
|
|
|
|
return mockListener.DialContext(ctx)
|
2021-09-24 00:05:29 +08:00
|
|
|
})),
|
|
|
|
|
)
|
|
|
|
|
require.NoError(t, err)
|
2024-07-10 18:51:25 +08:00
|
|
|
//nolint:errcheck // test cleanup
|
|
|
|
|
t.Cleanup(func() { metricExporter.Shutdown(ctx) })
|
2021-09-24 00:05:29 +08:00
|
|
|
|
2022-10-06 04:03:17 +08:00
|
|
|
reader := metric.NewManualReader()
|
|
|
|
|
mp := metric.NewMeterProvider(metric.WithReader(reader))
|
2021-09-24 00:05:29 +08:00
|
|
|
|
2022-10-06 04:03:17 +08:00
|
|
|
// set a metric value
|
2021-09-24 00:05:29 +08:00
|
|
|
|
2022-10-06 04:03:17 +08:00
|
|
|
meter := mp.Meter("library-name")
|
2023-02-08 00:17:31 +08:00
|
|
|
counter, err := meter.Int64Counter("measurement-counter")
|
2022-10-13 03:08:03 +08:00
|
|
|
require.NoError(t, err)
|
2022-10-06 04:03:17 +08:00
|
|
|
counter.Add(ctx, 7)
|
|
|
|
|
|
|
|
|
|
// write metrics through the telegraf OpenTelemetry input plugin
|
2021-09-24 00:05:29 +08:00
|
|
|
|
2023-03-13 19:22:03 +08:00
|
|
|
var rm metricdata.ResourceMetrics
|
|
|
|
|
err = reader.Collect(ctx, &rm)
|
2021-09-24 00:05:29 +08:00
|
|
|
require.NoError(t, err)
|
2023-06-02 19:24:33 +08:00
|
|
|
require.NoError(t, metricExporter.Export(ctx, &rm))
|
2021-09-24 00:05:29 +08:00
|
|
|
|
|
|
|
|
// Shutdown
|
|
|
|
|
|
2022-10-06 04:03:17 +08:00
|
|
|
require.NoError(t, reader.Shutdown(ctx))
|
|
|
|
|
require.NoError(t, metricExporter.Shutdown(ctx))
|
2021-09-24 00:05:29 +08:00
|
|
|
plugin.Stop()
|
|
|
|
|
|
|
|
|
|
// Check
|
|
|
|
|
|
2021-11-02 22:42:22 +08:00
|
|
|
require.Empty(t, accumulator.Errors)
|
|
|
|
|
require.Len(t, accumulator.Metrics, 1)
|
|
|
|
|
got := accumulator.Metrics[0]
|
|
|
|
|
require.Equal(t, "measurement-counter", got.Measurement)
|
|
|
|
|
require.Equal(t, telegraf.Counter, got.Type)
|
|
|
|
|
require.Equal(t, "library-name", got.Tags["otel.library.name"])
|
2021-09-24 00:05:29 +08:00
|
|
|
}
|