Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add internal package structure for aggregation #2954

Merged
merged 28 commits into from
Jul 6, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8fc1c74
Add the aggtor package
MrAlias Jun 13, 2022
dc1d912
Restrict to Go 1.18
MrAlias Jun 13, 2022
f9e8a49
Add missing build block to view_test.go
MrAlias Jun 14, 2022
59df1f7
Comment Aggregator iface
MrAlias Jun 14, 2022
0a700fe
Use Go 1.18 as the default ci version
MrAlias Jun 14, 2022
a5c5834
Update Aggregator iface from feedback
MrAlias Jun 15, 2022
538ff99
Merge branch 'new_sdk/main' into aggtor
MrAlias Jun 21, 2022
aa8b301
Accept hist conf
MrAlias Jun 21, 2022
f390e41
Flatten aggtor into just internal
MrAlias Jun 21, 2022
778c10a
Add Cycler interface
MrAlias Jun 21, 2022
bd9c963
Remove build flags for doc.go
MrAlias Jun 21, 2022
816f3dc
Clarify Cycler documentation
MrAlias Jun 21, 2022
0d7923c
Remove aggregation fold logic
MrAlias Jun 21, 2022
0287a06
Rename Number to Atomic
MrAlias Jun 21, 2022
36fad53
Add tests for Atomic impls
MrAlias Jun 21, 2022
47082f0
Remove unneeded Atomic implementation
MrAlias Jun 21, 2022
86061cc
Fix article in Float64 docs
MrAlias Jun 21, 2022
fc0f30e
Remove Atomic
MrAlias Jun 21, 2022
658f4a5
Add aggregator_example_test
MrAlias Jun 22, 2022
02488a2
Fix hist example
MrAlias Jun 22, 2022
c266e46
Add issue numbers to all TODO and FIXME
MrAlias Jun 22, 2022
3057ac2
Remove zero parameter comment
MrAlias Jun 22, 2022
dd82716
Merge branch 'new_sdk/main' into aggtor
MrAlias Jun 23, 2022
6b39c54
Combine the cycler into the aggregators
MrAlias Jun 23, 2022
02edebd
Remove the drop aggregator
MrAlias Jun 23, 2022
c7cfda1
Fix lint
MrAlias Jun 23, 2022
3d0d54e
Use attribute.Set instead of ptr to it
MrAlias Jun 24, 2022
42ba11d
Merge branch 'new_sdk/main' into aggtor
Aneurysm9 Jul 6, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ env:
# Path to where test results will be saved.
TEST_RESULTS: /tmp/test-results
# Default minimum version of Go to support.
DEFAULT_GO_VERSION: 1.17
DEFAULT_GO_VERSION: 1.18
jobs:
lint:
runs-on: ubuntu-latest
Expand Down
4 changes: 2 additions & 2 deletions sdk/metric/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build go1.17
// +build go1.17
//go:build go1.18
// +build go1.18

package metric // import "go.opentelemetry.io/otel/sdk/metric"

Expand Down
4 changes: 2 additions & 2 deletions sdk/metric/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build go1.17
// +build go1.17
//go:build go1.18
// +build go1.18

package metric

Expand Down
4 changes: 2 additions & 2 deletions sdk/metric/export/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build go1.17
// +build go1.17
//go:build go1.18
// +build go1.18

// TODO: NOTE this is a temporary space, it may be moved following the
// discussion of #2813, or #2841
Expand Down
4 changes: 2 additions & 2 deletions sdk/metric/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build go1.17
// +build go1.17
//go:build go1.18
// +build go1.18

package metric // import "go.opentelemetry.io/otel/sdk/metric"

Expand Down
2 changes: 1 addition & 1 deletion sdk/metric/go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module go.opentelemetry.io/otel/sdk/metric

go 1.17
go 1.18

require (
github.com/go-logr/logr v1.2.3
Expand Down
1 change: 0 additions & 1 deletion sdk/metric/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Expand Down
4 changes: 2 additions & 2 deletions sdk/metric/instrumentkind.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build go1.17
// +build go1.17
//go:build go1.18
// +build go1.18

package metric // import "go.opentelemetry.io/otel/sdk/metric"

Expand Down
61 changes: 61 additions & 0 deletions sdk/metric/internal/aggregation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// 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.

//go:build go1.18
// +build go1.18

package internal // import "go.opentelemetry.io/otel/sdk/metric/internal"

import (
"go.opentelemetry.io/otel/attribute"
)

// Aggregation is a single data point in a timeseries that summarizes
// measurements made during a time span.
type Aggregation struct {
// TODO(#2968): Replace this with the export.Aggregation type once #2961
// is merged.

// Timestamp defines the time the last measurement was made. If zero, no
// measurements were made for this time span. The time is represented as a
// unix timestamp with nanosecond precision.
Timestamp uint64

// Attributes are the unique dimensions Value describes.
Attributes attribute.Set

// Value is the summarization of the measurements made.
Value value
}

type value interface {
private()
}

// SingleValue summarizes a set of measurements as a single value.
type SingleValue[N int64 | float64] struct {
Value N
}

func (SingleValue[N]) private() {}

// HistogramValue summarizes a set of measurements as a histogram.
type HistogramValue struct {
Bounds []float64
Counts []uint64
Sum float64
Min, Max float64
}

func (HistogramValue) private() {}
31 changes: 31 additions & 0 deletions sdk/metric/internal/aggregator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// 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.

//go:build go1.18
// +build go1.18

package internal // import "go.opentelemetry.io/otel/sdk/metric/internal"

import "go.opentelemetry.io/otel/attribute"

// Aggregator forms an aggregation from a collection of recorded measurements.
type Aggregator[N int64 | float64] interface {
// Aggregate records the measurement, scoped by attr, and aggregates it
// into an aggregation.
Aggregate(measurement N, attr attribute.Set)

// Aggregations returns a slice of Aggregation, one per each attribute set
// used to scope measurement aggregation, and ends an aggregation cycle.
Aggregations() []Aggregation
}
122 changes: 122 additions & 0 deletions sdk/metric/internal/aggregator_example_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// 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.

//go:build go1.18
// +build go1.18

package internal

import (
"context"
"fmt"

"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric/instrument"
"go.opentelemetry.io/otel/metric/instrument/syncint64"
"go.opentelemetry.io/otel/sdk/metric/aggregation"
)

type meter struct {
// When a reader initiates a collection, the meter would collect
// aggregations from each of these functions. In this process they will
// progress the aggregation period of each instrument's aggregator.
aggregationFuncs []func() []Aggregation
}

func (m *meter) SyncInt64() syncint64.InstrumentProvider {
// The same would be done for all the other instrument providers.
return (*syncInt64Provider)(m)
}

type syncInt64Provider meter

func (p *syncInt64Provider) Counter(string, ...instrument.Option) (syncint64.Counter, error) {
// This is an example of how a synchronous int64 provider would create an
// aggregator for a new counter. At this point the provider would
// determine the aggregation and temporality to used based on the Reader
// and View configuration. Assume here these are determined to be a
// cumulative sum.

aggregator := NewCumulativeSum[int64]()
count := inst{aggregateFunc: aggregator.Aggregate}

p.aggregationFuncs = append(p.aggregationFuncs, aggregator.Aggregations)

fmt.Printf("using %T aggregator for counter\n", aggregator)

return count, nil
}

func (p *syncInt64Provider) UpDownCounter(string, ...instrument.Option) (syncint64.UpDownCounter, error) {
// This is an example of how a synchronous int64 provider would create an
// aggregator for a new up-down counter. At this point the provider would
// determine the aggregation and temporality to used based on the Reader
// and View configuration. Assume here these are determined to be a
// last-value aggregation (the temporality does not affect the produced
// aggregations).

aggregator := NewLastValue[int64]()
upDownCount := inst{aggregateFunc: aggregator.Aggregate}

p.aggregationFuncs = append(p.aggregationFuncs, aggregator.Aggregations)

fmt.Printf("using %T aggregator for up-down counter\n", aggregator)

return upDownCount, nil
}

func (p *syncInt64Provider) Histogram(string, ...instrument.Option) (syncint64.Histogram, error) {
// This is an example of how a synchronous int64 provider would create an
// aggregator for a new histogram. At this point the provider would
// determine the aggregation and temporality to used based on the Reader
// and View configuration. Assume here these are determined to be a delta
// explicit-bucket histogram.

aggregator := NewDeltaHistogram[int64](aggregation.ExplicitBucketHistogram{
Boundaries: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 1000},
NoMinMax: false,
})
hist := inst{aggregateFunc: aggregator.Aggregate}

p.aggregationFuncs = append(p.aggregationFuncs, aggregator.Aggregations)

fmt.Printf("using %T aggregator for histogram\n", aggregator)

return hist, nil
}

// inst is a generalized int64 synchronous counter, up-down counter, and
// histogram used for demonstration purposes only.
type inst struct {
instrument.Synchronous

aggregateFunc func(int64, attribute.Set)
}

func (inst) Add(context.Context, int64, ...attribute.KeyValue) {}
func (inst) Record(context.Context, int64, ...attribute.KeyValue) {}

func Example() {
m := meter{}
provider := m.SyncInt64()

_, _ = provider.Counter("counter example")
_, _ = provider.UpDownCounter("up-down counter example")
_, _ = provider.Histogram("histogram example")

// Output:
// using *internal.cumulativeSum[int64] aggregator for counter
// using *internal.lastValue[int64] aggregator for up-down counter
// using *internal.deltaHistogram[int64] aggregator for histogram
}
18 changes: 18 additions & 0 deletions sdk/metric/internal/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// 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 internal provides types and functionality used to aggregate and
// cycle the state of metric measurements made by the SDK. These types and
// functionality are meant only for internal SDK use.
package internal // import "go.opentelemetry.io/otel/sdk/metric/internal"
80 changes: 80 additions & 0 deletions sdk/metric/internal/histogram.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// 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.

//go:build go1.18
// +build go1.18

package internal // import "go.opentelemetry.io/otel/sdk/metric/internal"

import (
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/sdk/metric/aggregation"
)

// histogram summarizes a set of measurements as an histogram with
// explicitly defined buckets.
type histogram[N int64 | float64] struct {
// TODO(#2970): implement.
}

func (s *histogram[N]) Aggregate(value N, attr attribute.Set) {
// TODO(#2970): implement.
}

// NewDeltaHistogram returns an Aggregator that summarizes a set of
// measurements as an histogram. Each histogram is scoped by attributes and
// the aggregation cycle the measurements were made in.
//
// Each aggregation cycle is treated independently. When the returned
// Aggregator's Aggregations method is called it will reset all histogram
// counts to zero.
func NewDeltaHistogram[N int64 | float64](cfg aggregation.ExplicitBucketHistogram) Aggregator[N] {
return &deltaHistogram[N]{}
}

// deltaHistogram summarizes a set of measurements made in a single
// aggregation cycle as an histogram with explicitly defined buckets.
type deltaHistogram[N int64 | float64] struct {
histogram[N]

// TODO(#2970): implement.
}

func (s *deltaHistogram[N]) Aggregations() []Aggregation {
// TODO(#2970): implement.
return nil
}

// NewCumulativeHistogram returns an Aggregator that summarizes a set of
// measurements as an histogram. Each histogram is scoped by attributes.
//
// Each aggregation cycle builds from the previous, the histogram counts are
// the bucketed counts of all values aggregated since the returned Aggregator
// was created.
func NewCumulativeHistogram[N int64 | float64](cfg aggregation.ExplicitBucketHistogram) Aggregator[N] {
return &cumulativeHistogram[N]{}
}

// cumulativeHistogram summarizes a set of measurements made over all
// aggregation cycles as an histogram with explicitly defined buckets.
type cumulativeHistogram[N int64 | float64] struct {
histogram[N]

// TODO(#2970): implement.
}

func (s *cumulativeHistogram[N]) Aggregations() []Aggregation {
// TODO(#2970): implement.
return nil
}