From acc6f13b9a3d1a4a11e4ef690aaf23bb8c50b982 Mon Sep 17 00:00:00 2001 From: sh0rez Date: Tue, 1 Oct 2024 18:03:43 +0200 Subject: [PATCH] processor/deltatocumulative: golden tests Rewrites most tests to use a pkg/golden like approach --- processor/deltatocumulativeprocessor/go.mod | 8 +- processor/deltatocumulativeprocessor/go.sum | 10 +- .../internal/testar/decode.go | 112 ++++++ .../internal/testar/read_test.go | 58 +++ .../internal/testdata/random/random.go | 24 +- .../deltatocumulativeprocessor/linear.go | 2 +- .../processor_test.go | 336 ++++------------ .../testdata/limit/1.test | 47 +++ .../testdata/limit/2.test | 49 +++ .../testdata/limit/config.yaml | 1 + .../testdata/notemporality-ignored/1.test | 57 +++ .../testdata/notemporality-ignored/in.yaml | 27 -- .../testdata/notemporality-ignored/out.yaml | 27 -- .../testdata/timestamps/1.test | 36 ++ .../testdata/tracking/1.test | 376 ++++++++++++++++++ 15 files changed, 841 insertions(+), 329 deletions(-) create mode 100644 processor/deltatocumulativeprocessor/internal/testar/decode.go create mode 100644 processor/deltatocumulativeprocessor/internal/testar/read_test.go create mode 100644 processor/deltatocumulativeprocessor/testdata/limit/1.test create mode 100644 processor/deltatocumulativeprocessor/testdata/limit/2.test create mode 100644 processor/deltatocumulativeprocessor/testdata/limit/config.yaml create mode 100644 processor/deltatocumulativeprocessor/testdata/notemporality-ignored/1.test delete mode 100644 processor/deltatocumulativeprocessor/testdata/notemporality-ignored/in.yaml delete mode 100644 processor/deltatocumulativeprocessor/testdata/notemporality-ignored/out.yaml create mode 100644 processor/deltatocumulativeprocessor/testdata/timestamps/1.test create mode 100644 processor/deltatocumulativeprocessor/testdata/tracking/1.test diff --git a/processor/deltatocumulativeprocessor/go.mod b/processor/deltatocumulativeprocessor/go.mod index 1c4e225bd097..f6e8f201aa3e 100644 --- a/processor/deltatocumulativeprocessor/go.mod +++ b/processor/deltatocumulativeprocessor/go.mod @@ -5,7 +5,6 @@ go 1.22.0 require ( github.com/google/go-cmp v0.6.0 github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.111.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.111.0 github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.111.0 github.com/stretchr/testify v1.9.0 go.opentelemetry.io/collector/component v0.111.1-0.20241008154146-ea48c09c31ae @@ -21,6 +20,8 @@ require ( go.opentelemetry.io/otel/trace v1.31.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 + golang.org/x/tools v0.25.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -50,13 +51,12 @@ require ( go.opentelemetry.io/collector/processor/processorprofiles v0.111.1-0.20241008154146-ea48c09c31ae // indirect go.opentelemetry.io/otel/sdk v1.31.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.28.0 // indirect + golang.org/x/net v0.29.0 // indirect golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/text v0.18.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect google.golang.org/grpc v1.67.1 // indirect google.golang.org/protobuf v1.35.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil diff --git a/processor/deltatocumulativeprocessor/go.sum b/processor/deltatocumulativeprocessor/go.sum index 0b4ad58ccdf4..a60aff0b0442 100644 --- a/processor/deltatocumulativeprocessor/go.sum +++ b/processor/deltatocumulativeprocessor/go.sum @@ -103,8 +103,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -115,12 +115,14 @@ golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= +golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/processor/deltatocumulativeprocessor/internal/testar/decode.go b/processor/deltatocumulativeprocessor/internal/testar/decode.go new file mode 100644 index 000000000000..5141df958fbd --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testar/decode.go @@ -0,0 +1,112 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// testar is a textual archive (based on [golang.org/x/tools/txtar]) to define +// test fixtures. +// +// Archive data is read into struct fields, optionally calling parsers for field +// types other than string or []byte: +// +// type T struct { +// Literal string `testar:"file1"` +// Parsed int `testar:"file2,myparser"` +// } +// +// var into T +// err := Read(data, &into) +// +// See [Read] and [Parser] for examples. +package testar // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testar" + +import ( + "fmt" + "io/fs" + "reflect" + "strings" + + "golang.org/x/tools/txtar" +) + +// Read archive data into the fields of struct *T +func Read[T any](data []byte, into *T, parsers ...Format) error { + ar := txtar.Parse(data) + return Decode(ar, into, parsers...) +} + +func ReadFile[T any](file string, into *T, parsers ...Format) error { + ar, err := txtar.ParseFile(file) + if err != nil { + return err + } + return Decode(ar, into, parsers...) +} + +func Decode[T any](ar *txtar.Archive, into *T, parsers ...Format) error { + arfs, err := txtar.FS(ar) + if err != nil { + return err + } + + pv := reflect.ValueOf(into) + if pv.Kind() != reflect.Pointer { + return fmt.Errorf("into must be pointer") + } + sv := pv.Elem() + + for i := range sv.NumField() { + f := sv.Type().Field(i) + tag := f.Tag.Get("testar") + if tag == "" { + continue + } + + name, format, _ := strings.Cut(tag, ",") + data, err := fs.ReadFile(arfs, name) + if err != nil { + return fmt.Errorf("%s: %w", name, err) + } + + err = formats(parsers).Parse(format, data, sv.Field(i).Addr().Interface()) + if err != nil { + return fmt.Errorf("%s: %w", name, err) + } + } + return nil +} + +type formats []Format + +func (fmts formats) Parse(name string, data []byte, into any) error { + if name == "" { + return LiteralParser(data, into) + } + + for _, f := range fmts { + if f.name == name { + return f.parse(data, into) + } + } + return fmt.Errorf("no such format: %q", name) +} + +type Format struct { + name string + parse func(file []byte, into any) error +} + +func Parser(name string, fn func(data []byte, into any) error) Format { + return Format{name: name, parse: fn} +} + +// LiteralParser sets data unaltered into a []byte or string +func LiteralParser(data []byte, into any) error { + switch ptr := into.(type) { + case *[]byte: + *ptr = append([]byte(nil), data...) + case *string: + *ptr = string(data) + default: + return fmt.Errorf("pass *[]byte, *string or use a parser. got %T", into) + } + return nil +} diff --git a/processor/deltatocumulativeprocessor/internal/testar/read_test.go b/processor/deltatocumulativeprocessor/internal/testar/read_test.go new file mode 100644 index 000000000000..6279ac35527e --- /dev/null +++ b/processor/deltatocumulativeprocessor/internal/testar/read_test.go @@ -0,0 +1,58 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package testar + +import ( + "fmt" + "strconv" + "strings" +) + +func ExampleRead() { + data := []byte(` +-- foo -- +hello + +-- bar -- +world +`) + + var into struct { + Foo string `testar:"foo"` + Bar []byte `testar:"bar"` + } + + _ = Read(data, &into) + fmt.Printf("foo: %T(%q)\n", into.Foo, into.Foo) + fmt.Printf("bar: %T(%q)\n", into.Bar, into.Bar) + + // Output: + // foo: string("hello\n\n") + // bar: []uint8("world\n") +} + +func ExampleParser() { + data := []byte(` +-- foobar -- +377927 +`) + + var into struct { + Foobar int `testar:"foobar,atoi"` + } + + _ = Read(data, &into, Parser("atoi", func(file []byte, into any) error { + n, err := strconv.Atoi(strings.TrimSpace(string(file))) + if err != nil { + return err + } + *(into.(*int)) = n + return nil + })) + + fmt.Printf("foobar: %T(%d)\n", into.Foobar, into.Foobar) + + // Output: + // foobar: int(377927) +} diff --git a/processor/deltatocumulativeprocessor/internal/testdata/random/random.go b/processor/deltatocumulativeprocessor/internal/testdata/random/random.go index e205fa358882..ca0642cf8795 100644 --- a/processor/deltatocumulativeprocessor/internal/testdata/random/random.go +++ b/processor/deltatocumulativeprocessor/internal/testdata/random/random.go @@ -68,23 +68,35 @@ func (m Metric[P]) Stream() (streams.Ident, P) { } func Resource() pcommon.Resource { + return ResourceN(10) +} + +func ResourceN(n int) pcommon.Resource { res := pcommon.NewResource() - for i := 0; i < 10; i++ { - res.Attributes().PutStr(randStr(), randStr()) - } + Attributes(n).MoveTo(res.Attributes()) return res } func Scope() pcommon.InstrumentationScope { + return ScopeN(3) +} + +func ScopeN(n int) pcommon.InstrumentationScope { scope := pcommon.NewInstrumentationScope() scope.SetName(randStr()) scope.SetVersion(randStr()) - for i := 0; i < 3; i++ { - scope.Attributes().PutStr(randStr(), randStr()) - } + Attributes(n).MoveTo(scope.Attributes()) return scope } +func Attributes(n int) pcommon.Map { + m := pcommon.NewMap() + for i := 0; i < n; i++ { + m.PutStr(randStr(), randStr()) + } + return m +} + func randStr() string { return strconv.FormatInt(randInt(), 16) } diff --git a/processor/deltatocumulativeprocessor/linear.go b/processor/deltatocumulativeprocessor/linear.go index b333ab851627..34edcd377eb2 100644 --- a/processor/deltatocumulativeprocessor/linear.go +++ b/processor/deltatocumulativeprocessor/linear.go @@ -110,7 +110,7 @@ func (p *Linear) ConsumeMetrics(ctx context.Context, md pmetric.Metrics) error { acc, err := func() (data.Number, error) { if !ok { // new stream: there is no existing aggregation, so start new with current dp - return dp, nil + return dp.Clone(), nil } // tracked stream: add incoming delta dp to existing cumulative aggregation return acc, delta.AccumulateInto(acc, dp) diff --git a/processor/deltatocumulativeprocessor/processor_test.go b/processor/deltatocumulativeprocessor/processor_test.go index a2cbf5957ac6..12d4452e621f 100644 --- a/processor/deltatocumulativeprocessor/processor_test.go +++ b/processor/deltatocumulativeprocessor/processor_test.go @@ -5,308 +5,124 @@ package deltatocumulativeprocessor import ( "context" + "encoding/json" + "errors" + "io/fs" "math" - "math/rand" + "os" "path/filepath" - "strconv" "testing" - "time" - "github.com/google/go-cmp/cmp/cmpopts" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/consumer/consumertest" - "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/processor" "go.opentelemetry.io/collector/processor/processortest" "go.opentelemetry.io/otel/sdk/metric/metricdata" + "gopkg.in/yaml.v3" - "github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics/identity" - "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/data/datatest/compare" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/metrics" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/streams" - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testdata/random" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor/internal/testar" ) -func setup(t *testing.T, cfg *Config) (processor.Metrics, *consumertest.MetricsSink) { - t.Helper() - - next := &consumertest.MetricsSink{} - if cfg == nil { - cfg = &Config{MaxStale: 0, MaxStreams: math.MaxInt} - } - - proc, err := NewFactory().CreateMetrics( - context.Background(), - processortest.NewNopSettings(), - cfg, - next, - ) +func TestProcessor(t *testing.T) { + fis, err := os.ReadDir("testdata") require.NoError(t, err) - return proc, next -} - -// TestAccumulation verifies stream identification works correctly by writing -// 100 random dps spread across 10 different streams. -// Processor output is compared against a manual aggregation on a per-stream basis. -// -// Uses Sum datatype for testing, as we are not testing actual aggregation (see -// internal/data for tests), but proper stream separation -func TestAccumulation(t *testing.T) { - proc, sink := setup(t, nil) - - sum := random.Sum() + for _, fi := range fis { + if !fi.IsDir() { + continue + } - // create 10 distinct streams - const N = 10 - sbs := make([]SumBuilder, N) - for i := range sbs { - _, base := sum.Stream() - sbs[i] = SumBuilder{Metric: sum, base: base} - } + type Stage struct { + In pmetric.Metrics `testar:"in,pmetric"` + Out pmetric.Metrics `testar:"out,pmetric"` + } - // init manual aggregation state - want := make(map[identity.Stream]data.Number) - for _, s := range sbs { - id := s.id(pmetric.AggregationTemporalityCumulative) - want[id] = s.point(0, 0, 0) - } + read := func(file string, into *Stage) error { + return testar.ReadFile(file, into, + testar.Parser("pmetric", unmarshalMetrics), + ) + } - for i := 0; i < 100; i++ { - s := sbs[rand.Intn(N)] + dir := fi.Name() + t.Run(dir, func(t *testing.T) { + file := func(f string) string { + return filepath.Join("testdata", dir, f) + } - v := int64(rand.Intn(255)) - ts := pcommon.Timestamp(i) + ctx := context.Background() + cfg := config(t, file("config.yaml")) + proc, sink := setup(t, cfg) - // write to processor - in := s.delta(s.point(0, ts, v)) - rms := s.resourceMetrics(in) - err := proc.ConsumeMetrics(context.Background(), rms) - require.NoError(t, err) + stages, _ := filepath.Glob(file("*.test")) + for _, file := range stages { + var stage Stage + err := read(file, &stage) + require.NoError(t, err) - // aggregate manually - wantv := want[s.id(pmetric.AggregationTemporalityCumulative)] - wantv.SetIntValue(wantv.IntValue() + v) - wantv.SetTimestamp(ts) - } + sink.Reset() + err = proc.ConsumeMetrics(ctx, stage.In) + require.NoError(t, err) - // get the final processor output for each stream - got := make(map[identity.Stream]data.Number) - for _, md := range sink.AllMetrics() { - metrics.All(md)(func(m metrics.Metric) bool { - sum := metrics.Sum(m) - streams.Datapoints(sum)(func(id identity.Stream, dp data.Number) bool { - got[id] = dp - return true - }) - return true + out := []pmetric.Metrics{stage.Out} + if diff := compare.Diff(out, sink.AllMetrics()); diff != "" { + t.Fatal(diff) + } + } }) - } - sort := cmpopts.SortMaps(func(a, b identity.Stream) bool { - return a.Hash().Sum64() < b.Hash().Sum64() - }) - if diff := compare.Diff(want, got, sort); diff != "" { - t.Fatal(diff) } } -// TestTimestamp verifies timestamp handling, most notably: -// - Timestamp() keeps getting advanced -// - StartTimestamp() stays the same -func TestTimestamps(t *testing.T) { - proc, sink := setup(t, nil) - - sb := stream() - point := func(start, last pcommon.Timestamp) data.Number { - return sb.point(start, last, 0) +func config(t *testing.T, file string) *Config { + cfg := NewFactory().CreateDefaultConfig().(*Config) + cm, err := confmaptest.LoadConf(file) + if errors.Is(err, fs.ErrNotExist) { + return cfg } + require.NoError(t, err) - cases := []struct { - in data.Number - out data.Number - drop bool - }{{ - // first: take as-is - in: point(1000, 1100), - out: point(1000, 1100), - }, { - // subsequent: take, but keep start-ts - in: point(1100, 1200), - out: point(1000, 1200), - }, { - // gap: take - in: point(1300, 1400), - out: point(1000, 1400), - }, { - // out of order - in: point(1200, 1300), - drop: true, - }, { - // older start - in: point(500, 550), - drop: true, - }} - - for i, cs := range cases { - t.Run(strconv.Itoa(i), func(t *testing.T) { - sink.Reset() - - in := sb.resourceMetrics(sb.delta(cs.in)) - want := make([]pmetric.Metrics, 0) - if !cs.drop { - want = []pmetric.Metrics{sb.resourceMetrics(sb.cumul(cs.out))} - } - - err := proc.ConsumeMetrics(context.Background(), in) - require.NoError(t, err) - - out := sink.AllMetrics() - if diff := compare.Diff(want, out); diff != "" { - t.Fatal(diff) - } - }) - } + err = cm.Unmarshal(cfg) + require.NoError(t, err) + return cfg } -func TestStreamLimit(t *testing.T) { - proc, sink := setup(t, &Config{MaxStale: 5 * time.Minute, MaxStreams: 10}) - - good := make([]SumBuilder, 10) - for i := range good { - good[i] = stream() - } - bad := stream() - _ = bad - - diff := func(want, got []pmetric.Metrics) { - t.Helper() - if diff := compare.Diff(want, got); diff != "" { - t.Fatal(diff) - } - } - - writeGood := func(ts pcommon.Timestamp) { - for i, sb := range good { - in := sb.resourceMetrics(sb.delta(sb.point(0, ts+pcommon.Timestamp(i), 0))) - want := sb.resourceMetrics(sb.cumul(sb.point(0, ts+pcommon.Timestamp(i), 0))) - - err := proc.ConsumeMetrics(context.Background(), in) - require.NoError(t, err) +func setup(t *testing.T, cfg *Config) (processor.Metrics, *consumertest.MetricsSink) { + t.Helper() - diff([]pmetric.Metrics{want}, sink.AllMetrics()) - sink.Reset() - } + next := &consumertest.MetricsSink{} + if cfg == nil { + cfg = &Config{MaxStale: 0, MaxStreams: math.MaxInt} } - // write up to limit must work - writeGood(0) - - // extra stream must be dropped, nothing written - in := bad.resourceMetrics(bad.delta(bad.point(0, 0, 0))) - err := proc.ConsumeMetrics(context.Background(), in) + proc, err := NewFactory().CreateMetrics( + context.Background(), + processortest.NewNopSettings(), + cfg, + next, + ) require.NoError(t, err) - diff([]pmetric.Metrics{}, sink.AllMetrics()) - sink.Reset() - - // writing existing streams must still work - writeGood(100) -} - -type copyable interface { - CopyTo(pmetric.Metric) -} - -func (s SumBuilder) resourceMetrics(metrics ...copyable) pmetric.Metrics { - md := pmetric.NewMetrics() - - rm := md.ResourceMetrics().AppendEmpty() - s.Resource().CopyTo(rm.Resource()) - - sm := rm.ScopeMetrics().AppendEmpty() - s.Scope().CopyTo(sm.Scope()) - - for _, m := range metrics { - m.CopyTo(sm.Metrics().AppendEmpty()) - } - return md -} -type SumBuilder struct { - random.Metric[data.Number] - base data.Number + return proc, next } -func (s SumBuilder) with(dps ...data.Number) pmetric.Metric { - m := pmetric.NewMetric() - s.Metric.CopyTo(m) - - for _, dp := range dps { - dp.NumberDataPoint.CopyTo(m.Sum().DataPoints().AppendEmpty()) +func unmarshalMetrics(data []byte, into any) error { + var tmp any + if err := yaml.Unmarshal(data, &tmp); err != nil { + return err } - - return m -} - -func (s SumBuilder) delta(dps ...data.Number) pmetric.Metric { - m := s.with(dps...) - m.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityDelta) - return m -} - -func (s SumBuilder) cumul(dps ...data.Number) pmetric.Metric { - m := s.with(dps...) - m.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) - return m -} - -func (s SumBuilder) id(temp pmetric.AggregationTemporality) identity.Stream { - m := s.with(s.base) - m.Sum().SetAggregationTemporality(temp) - - mid := identity.OfMetric(s.Ident().Scope(), m) - return identity.OfStream(mid, s.base) -} - -func (s SumBuilder) point(start, ts pcommon.Timestamp, value int64) data.Number { - dp := s.base.Clone() - dp.SetStartTimestamp(start) - dp.SetTimestamp(ts) - dp.SetIntValue(value) - return dp -} - -func stream() SumBuilder { - sum := random.Sum() - _, base := sum.Stream() - return SumBuilder{Metric: sum, base: base} -} - -func TestIgnore(t *testing.T) { - proc, sink := setup(t, nil) - - dir := "./testdata/notemporality-ignored" - open := func(file string) pmetric.Metrics { - t.Helper() - md, err := golden.ReadMetrics(filepath.Join(dir, file)) - require.NoError(t, err) - return md + data, err := json.Marshal(tmp) + if err != nil { + return err } - - in := open("in.yaml") - out := open("out.yaml") - - ctx := context.Background() - - err := proc.ConsumeMetrics(ctx, in) - require.NoError(t, err) - - if diff := compare.Diff([]pmetric.Metrics{out}, sink.AllMetrics()); diff != "" { - t.Fatal(diff) + md, err := (&pmetric.JSONUnmarshaler{}).UnmarshalMetrics(data) + if err != nil { + return err } + *(into.(*pmetric.Metrics)) = md + return nil } func TestTelemetry(t *testing.T) { diff --git a/processor/deltatocumulativeprocessor/testdata/limit/1.test b/processor/deltatocumulativeprocessor/testdata/limit/1.test new file mode 100644 index 000000000000..0acad04bf3c6 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/limit/1.test @@ -0,0 +1,47 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 1 # delta + dataPoints: + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "9"}}]} + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 2 # cumulative + dataPoints: + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 1, asDouble: 1, attributes: [{key: series, value: {stringValue: "9"}}]} diff --git a/processor/deltatocumulativeprocessor/testdata/limit/2.test b/processor/deltatocumulativeprocessor/testdata/limit/2.test new file mode 100644 index 000000000000..20cd03a7db41 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/limit/2.test @@ -0,0 +1,49 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 1 # delta + dataPoints: + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "9"}}]} + - {timeUnixNano: 2, asDouble: 1, attributes: [{key: series, value: {stringValue: "x"}}]} # will exceed limit + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 2 # cumulative + dataPoints: + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "0"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "1"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "2"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "3"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "4"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "5"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "6"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "7"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "8"}}]} + - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "9"}}]} + # - {timeUnixNano: 2, asDouble: 2, attributes: [{key: series, value: {stringValue: "x"}}]} # dropped diff --git a/processor/deltatocumulativeprocessor/testdata/limit/config.yaml b/processor/deltatocumulativeprocessor/testdata/limit/config.yaml new file mode 100644 index 000000000000..b8642c6cd928 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/limit/config.yaml @@ -0,0 +1 @@ +max_streams: 10 diff --git a/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/1.test b/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/1.test new file mode 100644 index 000000000000..c7c743bcde30 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/1.test @@ -0,0 +1,57 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + resource: + attributes: + - key: resattr + value: { stringValue: stringoo } + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + attributes: + - key: scopeattr + value: { stringValue: string } + metrics: + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: 1 + asDouble: 1 + - name: test.summary + summary: + dataPoints: + - timeUnixNano: 1 + quantileValues: + - quantile: 0.25 + value: 25 + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + resource: + attributes: + - key: resattr + value: { stringValue: stringoo } + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + attributes: + - key: scopeattr + value: { stringValue: string } + metrics: + - name: test.gauge + gauge: + dataPoints: + - timeUnixNano: 1 + asDouble: 1 + - name: test.summary + summary: + dataPoints: + - timeUnixNano: 1 + quantileValues: + - quantile: 0.25 + value: 25 diff --git a/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/in.yaml b/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/in.yaml deleted file mode 100644 index 095de3947de0..000000000000 --- a/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/in.yaml +++ /dev/null @@ -1,27 +0,0 @@ -resourceMetrics: - - schemaUrl: https://test.com/resource - resource: - attributes: - - key: resattr - value: { stringValue: stringoo } - scopeMetrics: - - schemaUrl: https://test.com/scope - scope: - name: Test - version: 1.2.3 - attributes: - - key: scopeattr - value: { stringValue: string } - metrics: - - name: test.gauge - gauge: - dataPoints: - - timeUnixNano: 1 - asDouble: 1 - - name: test.summary - summary: - dataPoints: - - timeUnixNano: 1 - quantileValues: - - quantile: 0.25 - value: 25 diff --git a/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/out.yaml b/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/out.yaml deleted file mode 100644 index 095de3947de0..000000000000 --- a/processor/deltatocumulativeprocessor/testdata/notemporality-ignored/out.yaml +++ /dev/null @@ -1,27 +0,0 @@ -resourceMetrics: - - schemaUrl: https://test.com/resource - resource: - attributes: - - key: resattr - value: { stringValue: stringoo } - scopeMetrics: - - schemaUrl: https://test.com/scope - scope: - name: Test - version: 1.2.3 - attributes: - - key: scopeattr - value: { stringValue: string } - metrics: - - name: test.gauge - gauge: - dataPoints: - - timeUnixNano: 1 - asDouble: 1 - - name: test.summary - summary: - dataPoints: - - timeUnixNano: 1 - quantileValues: - - quantile: 0.25 - value: 25 diff --git a/processor/deltatocumulativeprocessor/testdata/timestamps/1.test b/processor/deltatocumulativeprocessor/testdata/timestamps/1.test new file mode 100644 index 000000000000..4f6d48c54e36 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/timestamps/1.test @@ -0,0 +1,36 @@ +-- in -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 1 # delta + dataPoints: + - {startTimeUnixNano: 1000, timeUnixNano: 1100, asDouble: 0} + - {startTimeUnixNano: 1100, timeUnixNano: 1200, asDouble: 0} + # - {startTimeUnixNano: 1200, timeUnixNano: 1300, asDouble: 0} + - {startTimeUnixNano: 1300, timeUnixNano: 1400, asDouble: 0} # gap (previous sample missing): accept + - {startTimeUnixNano: 1200, timeUnixNano: 1300, asDouble: 0} # out of order: drop + - {startTimeUnixNano: 500, timeUnixNano: 550, asDouble: 0} # belongs to older series: drop + +-- out -- +resourceMetrics: + - schemaUrl: https://test.com/resource + scopeMetrics: + - schemaUrl: https://test.com/scope + scope: + name: Test + version: 1.2.3 + metrics: + - name: sum + sum: + aggregationTemporality: 2 # cumulative + dataPoints: + - {startTimeUnixNano: 1000, timeUnixNano: 1100, asDouble: 0} + - {startTimeUnixNano: 1000, timeUnixNano: 1200, asDouble: 0} + - {startTimeUnixNano: 1000, timeUnixNano: 1400, asDouble: 0} diff --git a/processor/deltatocumulativeprocessor/testdata/tracking/1.test b/processor/deltatocumulativeprocessor/testdata/tracking/1.test new file mode 100644 index 000000000000..76ab437989c2 --- /dev/null +++ b/processor/deltatocumulativeprocessor/testdata/tracking/1.test @@ -0,0 +1,376 @@ +-- in -- +resourceMetrics: + - resource: + attributes: + - {key: "21f4", value: {stringValue: "42c8"}} + - {key: "7e7", value: {stringValue: "4b13"}} + scopeMetrics: + - metrics: + - description: 754d + name: 29c9 + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "1100", asInt: "124"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "1700", asInt: "22"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "2400", asInt: "27"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "3100", asInt: "115"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "4600", asInt: "47"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "5200", asInt: "34"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "6400", asInt: "98"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "6800", asInt: "36"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "7100", asInt: "48"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8200", asInt: "118"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8300", asInt: "62"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8700", asInt: "118"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9000", asInt: "51"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9400", asInt: "49"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "10200", asInt: "97"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "10400", asInt: "21"} + unit: "7337" + - description: 611d + name: "5e04" + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1400", asInt: "84"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1800", asInt: "53"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3400", asInt: "122"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3600", asInt: "104"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "4100", asInt: "91"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5300", asInt: "123"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5600", asInt: "112"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7600", asInt: "83"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7700", asInt: "8"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "8500", asInt: "12"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "9100", asInt: "57"} + unit: 6db0 + scope: + attributes: + - {key: "553", value: {stringValue: "144a"}} + - {key: "5ab6", value: {stringValue: "9a8"}} + name: "7715" + version: 7bfb + - metrics: + - description: 52f4 + name: 476d + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "2100", asInt: "66"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "2900", asInt: "112"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "3000", asInt: "63"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "3900", asInt: "86"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4000", asInt: "11"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4200", asInt: "116"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4300", asInt: "69"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "5400", asInt: "31"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "6500", asInt: "31"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7300", asInt: "78"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7900", asInt: "3"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8000", asInt: "73"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8900", asInt: "30"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9500", asInt: "85"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9600", asInt: "52"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "9900", asInt: "66"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "10000", asInt: "43"} + unit: 331a + - description: "3985" + name: "2128" + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "1500", asInt: "63"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "1600", asInt: "26"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "2500", asInt: "105"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "3200", asInt: "68"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5500", asInt: "8"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5800", asInt: "16"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "6100", asInt: "5"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "6700", asInt: "78"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7000", asInt: "1"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7500", asInt: "10"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "9800", asInt: "119"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10300", asInt: "80"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10500", asInt: "49"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "10600", asInt: "62"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10700", asInt: "87"} + unit: 164b + scope: + attributes: + - {key: "6c70", value: {stringValue: "2773"}} + - {key: "766b", value: {stringValue: "370c"}} + name: 6c45 + version: 74f9 + - resource: + attributes: + - {key: "2aa", value: {stringValue: "7f34"}} + - {key: "261e", value: {stringValue: "3076"}} + scopeMetrics: + - metrics: + - description: 2d50 + name: "5863" + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2200", asInt: "52"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2700", asInt: "46"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "4400", asInt: "84"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "4700", asInt: "23"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5100", asInt: "21"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5900", asInt: "54"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "6300", asInt: "120"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "7800", asInt: "112"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "9300", asInt: "57"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10800", asInt: "55"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10900", asInt: "29"} + unit: 541a + - description: 6b2c + name: 430c + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "1ac7", value: {stringValue: "5b1f"}}], startTimeUnixNano: "1000", timeUnixNano: "1200", asInt: "51"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "1900", asInt: "50"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "2800", asInt: "86"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3300", asInt: "79"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3500", asInt: "97"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6200", asInt: "58"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6900", asInt: "96"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7200", asInt: "34"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7400", asInt: "5"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "8800", asInt: "117"} + unit: 785e + scope: + attributes: + - {key: "509", value: {stringValue: "2bcd"}} + - {key: "2aec", value: {stringValue: "390b"}} + name: "6812" + version: 17ce + - metrics: + - description: c6a + name: 3ccc + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "1300", asInt: "77"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "2300", asInt: "8"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "3800", asInt: "41"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "5700", asInt: "31"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "6600", asInt: "38"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8400", asInt: "13"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8600", asInt: "106"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "9200", asInt: "49"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "9700", asInt: "0"} + unit: 1adc + - description: 20fb + name: 61b6 + sum: + aggregationTemporality: 1 + dataPoints: + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "1000", asInt: "45"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "2000", asInt: "53"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "2600", asInt: "47"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "3700", asInt: "61"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4500", asInt: "27"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4800", asInt: "37"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4900", asInt: "100"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "5000", asInt: "73"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "6000", asInt: "71"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "8100", asInt: "55"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "10100", asInt: "71"} + unit: "5679" + scope: + attributes: + - {key: "14cf", value: {stringValue: "64ea"}} + - {key: "67ef", value: {stringValue: "4299"}} + name: 58a7 + version: 1cd0 +-- out -- +resourceMetrics: + - resource: + attributes: + - {key: "21f4", value: {stringValue: "42c8"}} + - {key: "7e7", value: {stringValue: "4b13"}} + scopeMetrics: + - metrics: + - description: 754d + name: 29c9 + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "1100", asInt: "124"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "1700", asInt: "22"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "2400", asInt: "49"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "3100", asInt: "239"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "4600", asInt: "286"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "5200", asInt: "320"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "6400", asInt: "418"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "6800", asInt: "85"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "7100", asInt: "133"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8200", asInt: "251"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8300", asInt: "313"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "8700", asInt: "431"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9000", asInt: "469"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "9400", asInt: "518"} + - {attributes: [{key: "10d", value: {stringValue: "68c6"}}], startTimeUnixNano: "1000", timeUnixNano: "10200", asInt: "615"} + - {attributes: [{key: "7861", value: {stringValue: "3d13"}}], startTimeUnixNano: "1000", timeUnixNano: "10400", asInt: "452"} + unit: "7337" + - description: 611d + name: "5e04" + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1400", asInt: "84"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "1800", asInt: "137"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3400", asInt: "122"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "3600", asInt: "226"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "4100", asInt: "317"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5300", asInt: "440"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "5600", asInt: "552"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7600", asInt: "220"} + - {attributes: [{key: "1f1d", value: {stringValue: "762b"}}], startTimeUnixNano: "1000", timeUnixNano: "7700", asInt: "228"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "8500", asInt: "564"} + - {attributes: [{key: "6eeb", value: {stringValue: "e44"}}], startTimeUnixNano: "1000", timeUnixNano: "9100", asInt: "621"} + unit: 6db0 + scope: + attributes: + - {key: "553", value: {stringValue: "144a"}} + - {key: "5ab6", value: {stringValue: "9a8"}} + name: "7715" + version: 7bfb + - metrics: + - description: 52f4 + name: 476d + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "2100", asInt: "66"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "2900", asInt: "112"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "3000", asInt: "129"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "3900", asInt: "198"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4000", asInt: "209"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4200", asInt: "325"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "4300", asInt: "394"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "5400", asInt: "425"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "6500", asInt: "456"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7300", asInt: "207"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "7900", asInt: "210"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8000", asInt: "529"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "8900", asInt: "559"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9500", asInt: "644"} + - {attributes: [{key: "18d7", value: {stringValue: "6b33"}}], startTimeUnixNano: "1000", timeUnixNano: "9600", asInt: "696"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "9900", asInt: "276"} + - {attributes: [{key: "19b0", value: {stringValue: "114f"}}], startTimeUnixNano: "1000", timeUnixNano: "10000", asInt: "319"} + unit: 331a + - description: "3985" + name: "2128" + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "1500", asInt: "63"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "1600", asInt: "26"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "2500", asInt: "131"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "3200", asInt: "199"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5500", asInt: "207"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "5800", asInt: "223"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "6100", asInt: "68"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "6700", asInt: "301"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7000", asInt: "302"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "7500", asInt: "312"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "9800", asInt: "431"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10300", asInt: "148"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10500", asInt: "197"} + - {attributes: [{key: "6c73", value: {stringValue: "2fc5"}}], startTimeUnixNano: "1000", timeUnixNano: "10600", asInt: "493"} + - {attributes: [{key: "b0", value: {stringValue: "3b97"}}], startTimeUnixNano: "1000", timeUnixNano: "10700", asInt: "284"} + unit: 164b + scope: + attributes: + - {key: "6c70", value: {stringValue: "2773"}} + - {key: "766b", value: {stringValue: "370c"}} + name: 6c45 + version: 74f9 + - resource: + attributes: + - {key: "2aa", value: {stringValue: "7f34"}} + - {key: "261e", value: {stringValue: "3076"}} + scopeMetrics: + - metrics: + - description: 2d50 + name: "5863" + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2200", asInt: "52"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "2700", asInt: "98"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "4400", asInt: "84"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "4700", asInt: "121"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5100", asInt: "105"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "5900", asInt: "159"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "6300", asInt: "279"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "7800", asInt: "233"} + - {attributes: [{key: "27bd", value: {stringValue: "21a"}}], startTimeUnixNano: "1000", timeUnixNano: "9300", asInt: "290"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10800", asInt: "334"} + - {attributes: [{key: "33cf", value: {stringValue: "23b0"}}], startTimeUnixNano: "1000", timeUnixNano: "10900", asInt: "363"} + unit: 541a + - description: 6b2c + name: 430c + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "1ac7", value: {stringValue: "5b1f"}}], startTimeUnixNano: "1000", timeUnixNano: "1200", asInt: "51"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "1900", asInt: "50"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "2800", asInt: "136"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3300", asInt: "215"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "3500", asInt: "312"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6200", asInt: "370"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "6900", asInt: "466"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7200", asInt: "500"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "7400", asInt: "505"} + - {attributes: [{key: "50bf", value: {stringValue: "4e9a"}}], startTimeUnixNano: "1000", timeUnixNano: "8800", asInt: "622"} + unit: 785e + scope: + attributes: + - {key: "509", value: {stringValue: "2bcd"}} + - {key: "2aec", value: {stringValue: "390b"}} + name: "6812" + version: 17ce + - metrics: + - description: c6a + name: 3ccc + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "1300", asInt: "77"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "2300", asInt: "85"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "3800", asInt: "41"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "5700", asInt: "72"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "6600", asInt: "123"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8400", asInt: "136"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "8600", asInt: "242"} + - {attributes: [{key: "306c", value: {stringValue: "3c61"}}], startTimeUnixNano: "1000", timeUnixNano: "9200", asInt: "121"} + - {attributes: [{key: "75d9", value: {stringValue: "4b59"}}], startTimeUnixNano: "1000", timeUnixNano: "9700", asInt: "242"} + unit: 1adc + - description: 20fb + name: 61b6 + sum: + aggregationTemporality: 2 + dataPoints: + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "1000", asInt: "45"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "2000", asInt: "53"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "2600", asInt: "92"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "3700", asInt: "153"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4500", asInt: "180"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4800", asInt: "217"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "4900", asInt: "317"} + - {attributes: [{key: "2fad", value: {stringValue: "3ea1"}}], startTimeUnixNano: "1000", timeUnixNano: "5000", asInt: "390"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "6000", asInt: "124"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "8100", asInt: "179"} + - {attributes: [{key: "2afe", value: {stringValue: "22f1"}}], startTimeUnixNano: "1000", timeUnixNano: "10100", asInt: "250"} + unit: "5679" + scope: + attributes: + - {key: "14cf", value: {stringValue: "64ea"}} + - {key: "67ef", value: {stringValue: "4299"}} + name: 58a7 + version: 1cd0