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

Adds comparable constraint to reader #3080

Conversation

MadVikingGod
Copy link
Contributor

This is a solution to the discussion of #3044 (comment).

This adds a constraint to the WithReader Option, so that all Readers within the SDK will be comparable.

ComparableReader isn't used within the MeterProvider/Meter ecosystem because it is A) a type constraint so you can't have a map[ComparableReader]struct{} and B) would color the structs so you could only have one kind of reader per MeterProvider/Meter.

MrAlias and others added 30 commits April 20, 2022 07:50
* Remove prometheus example code

* Remove prometheus exporter code

* Remove stdoutmetric code

* Remove sdk/metric/* packages

* Remove opencensus example code

* Remove otlpmetric exporter code

* Remove OpenCensus bridge code

* go mod tidy

* Remove empty modules
* Remove prometheus example code

* Remove prometheus exporter code

* Remove stdoutmetric code

* Remove sdk/metric/* packages

* Remove opencensus example code

* Remove otlpmetric exporter code

* Remove OpenCensus bridge code

* go mod tidy

* Remove empty modules

* Add MeterProvider/meter structure to new SDK

* Add vanity imports

* go mod tidy

* Add MeterProvider Flush/Shutdown required by spec

* Cast nil ptr instead of alloc for comp time check

* Apply suggestions from code review

Co-authored-by: Aaron Clawson <[email protected]>

* Apply suggested Shutdown comment

* Apply fixes from feedback

Co-authored-by: Aaron Clawson <[email protected]>
* Add sdk/metric/view package structure

* Vanity import
…ry#2885)

* Add the manual reader to the sdk.

* Incoperate feedback from PR.

* additional PR comments

* Fix lint

* Fixes for PR.

* Unexport ManualReader
fix a few comments
* Refactor reader testing into a harness

* Run lint
* Add the metric.Exporter interface

* Move the reader errors to reader.go

* Update Reader.Collect docs

Remove TODO being addressed in this PR and restate purpose of method.

* Initial draft of the periodic reader

* Refer to correct config in periodic reader opts

* Refactor reader testing into a harness

* Move wait group handling out of run

* Refactor ticker creation to allow testing

* Honor export timeout in run

* Fix wait group wait bug

* Add periodic reader tests

* Fix lint

* Update periodic reader comments

* Add concurrency test for readers

* Simplify the ticker stop deferral

* Only register once

* Restrict build of metric sdk to Go>1.16

* Clean up ShutdownBeforeRegister test
The specification requires the SDK prevent duplicate registrations for
readers. This adds a test for that and fixes this for the manualReader.
* Add WithReader and WithResource Options

* Run lint

* Update WithReader fn signature based on feedback

* crosslink

* Remove zero-len check in unify

* Restrict build to Go > 1.16
* Unify reader implementations

Use an atomic.Value to manage concurrency without a lock.

* Lint
* Use already enabled revive linter and add depguard (open-telemetry#2883)

* Refactor golangci-lint conf

Order settings alphabetically.

* Add revive settings to golangci conf

* Check blank imports

* Check bool-literal-in-expr

* Check constant-logical-expr

* Check context-as-argument

* Check context-key-type

* Check deep-exit

* Check defer

* Check dot-imports

* Check duplicated-imports

* Check early-return

* Check empty-block

* Check empty-lines

* Check error-naming

* Check error-return

* Check error-strings

* Check errorf

* Stop ignoring context first arg in tests

* Check exported comments

* Check flag-parameter

* Check identical branches

* Check if-return

* Check increment-decrement

* Check indent-error-flow

* Check deny list of go imports

* Check import shadowing

* Check package comments

* Check range

* Check range val in closure

* Check range val address

* Check redefines builtin id

* Check string-format

* Check struct tag

* Check superfluous else

* Check time equal

* Check var naming

* Check var declaration

* Check unconditional recursion

* Check unexported return

* Check unhandled errors

* Check unnecessary stmt

* Check unnecessary break

* Check waitgroup by value

* Exclude deep-exit check in example*_test.go files

* Move the minimum version to go 1.17 (open-telemetry#2917)

* Move the minimum version to go 1.17

* Update readme and changelog

Co-authored-by: Chester Cheung <[email protected]>

* Make lint

Co-authored-by: Aaron Clawson <[email protected]>
Co-authored-by: Chester Cheung <[email protected]>
* WIP views public

* Add attribute filters and comments.

* Fixes for lint

* Address comments

* Fix lint

* Changed view matching to expand end

Removed the dscriptor, it was moved in previous patch

* change wildcards into regex

* Update comments

* address comments.

* Address more PR comments

* renamed WithDescription to WithSetDescription.

Co-authored-by: Chester Cheung <[email protected]>
* Implement stubbed meter create method

* Rename return value to avoid comment

* Encapsulate meterRegistry tests with identifying name

* Run lint fix

* Comment meterRegistry being concurrent safe

* Remove ordered meter tracking in the meterRegistry

* Test range completeness instead of order

* Remove provider field from meter
…ind (open-telemetry#2949)

* Introduce Temporality and InstrumentKind

Because Temporality is the responsibility of the Reader additional methods
are added to the Reader interface.  And New options are created to
configure the temporality selector.

* Addresses comments, and adds tests.

* Fix addition PR comment
* Add aggregation pkg and options

* Update documentation for the aggregation pkg

* Test Aggregation.Err

* Fix aggregation pkg comment

* Add WithAggregation comment

* Add default aggregation

* Rename WithAggregation and add AggregationSelector

* Fix DefaultAggregationSelector use and decl

* Replace Aggregation struct with iface

* Add Copy method to hist and fix Err method

* Additional test for monotonic bounds

* Add aggregation method to Reader

* Use AggregationSelector instead of inline func type

* Switch RecordMinMax to NoMinMax

* Deep copy and validate in options

* Test the DefaultAggregationSelector

* nolint for import-shadow of method

* Fix Default aggregation comment

* Test the explicit bucket histogram deep copy
Match the WithAggregationSelector option pattern: define a
TemporalitySelector type, export the DefaultTemporalitySelector
function, and name the option with a Selector suffix.
* Add the aggtor package

* Restrict to Go 1.18

* Add missing build block to view_test.go

* Comment Aggregator iface

* Use Go 1.18 as the default ci version

* Update Aggregator iface from feedback

* Accept hist conf

* Flatten aggtor into just internal

* Add Cycler interface

Separate the duties of aggregation and maintaining state across
aggregation periods.

* Remove build flags for doc.go

* Clarify Cycler documentation

* Remove aggregation fold logic

* Rename Number to Atomic

* Add tests for Atomic impls

* Remove unneeded Atomic implementation

Add back when filling in structures.

* Fix article in Float64 docs

* Remove Atomic

This is an implementation detail.

* Add aggregator_example_test

* Fix hist example

* Add issue numbers to all TODO and FIXME

* Remove zero parameter comment

* Combine the cycler into the aggregators

* Remove the drop aggregator

* Fix lint

* Use attribute.Set instead of ptr to it

Co-authored-by: Anthony Mirabella <[email protected]>
* Use already enabled revive linter and add depguard (open-telemetry#2883)

* Refactor golangci-lint conf

Order settings alphabetically.

* Add revive settings to golangci conf

* Check blank imports

* Check bool-literal-in-expr

* Check constant-logical-expr

* Check context-as-argument

* Check context-key-type

* Check deep-exit

* Check defer

* Check dot-imports

* Check duplicated-imports

* Check early-return

* Check empty-block

* Check empty-lines

* Check error-naming

* Check error-return

* Check error-strings

* Check errorf

* Stop ignoring context first arg in tests

* Check exported comments

* Check flag-parameter

* Check identical branches

* Check if-return

* Check increment-decrement

* Check indent-error-flow

* Check deny list of go imports

* Check import shadowing

* Check package comments

* Check range

* Check range val in closure

* Check range val address

* Check redefines builtin id

* Check string-format

* Check struct tag

* Check superfluous else

* Check time equal

* Check var naming

* Check var declaration

* Check unconditional recursion

* Check unexported return

* Check unhandled errors

* Check unnecessary stmt

* Check unnecessary break

* Check waitgroup by value

* Exclude deep-exit check in example*_test.go files

* Move the minimum version to go 1.17 (open-telemetry#2917)

* Move the minimum version to go 1.17

* Update readme and changelog

Co-authored-by: Chester Cheung <[email protected]>

* Use ByteSliceToString from golang.org/x/sys/unix (open-telemetry#2924)

Use unix.ByteSliceToString to convert Utsname []byte fields to strings.

This also allows to drop the charsToString helper which serves the same
purpose and matches ByteSliceToString's implementation.

Signed-off-by: Tobias Klauser <[email protected]>

Co-authored-by: Tyler Yahn <[email protected]>

* docs: fix typo (open-telemetry#2935)

* add timeout to grpc connection in otel-collector example (open-telemetry#2939)

* Closes: open-telemetry#2951 (open-telemetry#2952)

This PR updates the example listed in the getting started doc
so that it will compile without error.  It also makes this
example consistent with the code found in
https://github.com/open-telemetry/opentelemetry-go/blob/main/example/fib/main.go

Signed-off-by: Brad Topol <[email protected]>

* fix data-model link (open-telemetry#2955)

* Bump go.opentelemetry.io/proto/otlp from v0.16.0 to v0.18.0 (open-telemetry#2960)

* Move to using Instrumentation Scope (open-telemetry#2976)

* Move to using Instrumentation Scope

* Use type alias, not definition

* Add a changelog entry

* docs(website_docs): fix exporting_data.md and getting-started.md toc (open-telemetry#2930)

* docs(website_docs): fix toc

* docs(website_docs): fix toc

* update exporting_data.md for rerun check-links

* update exporting_data.md for rerun check-links

Co-authored-by: Chester Cheung <[email protected]>
Co-authored-by: Tyler Yahn <[email protected]>

* Update getting-started.md (open-telemetry#2984)

grammar edit for line 175 of readme

* fix typo (open-telemetry#2986)

* fix typo

* spell fix

* typo fix (open-telemetry#2991)

* added traces.txt to gitignore for fib (open-telemetry#2993)

* Deprecate Library and move all uses to Scope (open-telemetry#2977)

* Deprecate Library and move all uses to Scope

* Add PR number to changelog

* Don't change signatures in stable modules

* Revert some changes

* Rename internal struct names

* A bit more renaming

* Update sdk/trace/span.go

Co-authored-by: Tyler Yahn <[email protected]>

* Update based on feedback

* Revert change

Co-authored-by: Tyler Yahn <[email protected]>
Co-authored-by: Anthony Mirabella <[email protected]>

* Feat/bridge support text map (open-telemetry#2911)

* feat: support TextMap

* doc: add comment

* test: support for ot.TextMap

* Retrieve lost code due to merge

* fix: retrieve lost code due to merge. test: support for ot.HTTPHeaders

* go mod tidy

* Optimized code style, add changelog

* doc: Restore comments

* wip: add test cases

* test: fix args error

* delete empty line

* Fix syntax and changelog errors

* Fix formatting errors

Co-authored-by: Chester Cheung <[email protected]>
Co-authored-by: Anthony Mirabella <[email protected]>

* Add a release template (open-telemetry#2863)

* Add a release template

* Update the about field

Co-authored-by: Damien Mathieu <[email protected]>

* Fix linting Issues

* Add ignore for template link

Co-authored-by: Damien Mathieu <[email protected]>
Co-authored-by: Chester Cheung <[email protected]>
Co-authored-by: Anthony Mirabella <[email protected]>

* Fix merge of CHANGELOG.md

Co-authored-by: Aaron Clawson <[email protected]>
Co-authored-by: Chester Cheung <[email protected]>
Co-authored-by: Tobias Klauser <[email protected]>
Co-authored-by: petrie <[email protected]>
Co-authored-by: Damien Mathieu <[email protected]>
Co-authored-by: Brad Topol <[email protected]>
Co-authored-by: Craig Pastro <[email protected]>
Co-authored-by: Kshitija Murudi <[email protected]>
Co-authored-by: Petrie Liu <[email protected]>
Co-authored-by: Guangya Liu <[email protected]>
Co-authored-by: Craig Pastro <[email protected]>
Co-authored-by: Anthony Mirabella <[email protected]>
Co-authored-by: ttoad <[email protected]>
MadVikingGod and others added 11 commits July 25, 2022 08:56
* Move InstrumentKind to view, Add view filter

* remove TODO

* Add the Option function, fix lint

* use local var over 0

* Fix missing undefinedInstrumnet

Co-authored-by: Tyler Yahn <[email protected]>
* Change View Attribute Filter to detect if not set.

* Fix PR comments.

* Rework test for no filter logic.
* Add last-value aggregator

* Add test of last-value reset of unseen attrs

* Add benchmark

* Use generic DataPoint value

* Fix assertion_fail_test.go

* Fix tests

* Remove unused test increment values
* Add delta/cumulative histogram implementation

* Add histogram unit tests

* Fix histValues Aggregate

Store the new buckets value back to the values map.

Ensure min/max are measured values, not zero values.

* Fix lint

* Add benchmarks

* Test histograms internal functionality

* Fix lint

* Add TODO to look at memory use for cumu hist

* Update sdk/metric/internal/histogram.go

Co-authored-by: Chester Cheung <[email protected]>

Co-authored-by: Chester Cheung <[email protected]>
Signed-off-by: Petrie <[email protected]>

Co-authored-by: Aaron Clawson <[email protected]>
* Implement the sum aggregators

* Add unit tests for delta/cumulative sums

* Add benchmarks

* Merge sum tests into one

* Remove unused start time from cumulative sum

* Refactor benchmark tests

Split benchmarks for the Aggregations and Aggregate methods so
computational resource use can be determined.

* goimports

* Move timestamp out of lock

* Refactor testing

* Fix spelling mistake

* Name param of expectFunc

* Reset delta sum to zero instead of delete

* Revert to deleting unused attr sets

* Refactor testing to allow use across other aggs

* Add TODO to bound cumulative sum mem usage

* Fix misspelling

* Unify aggregator benchmark code in aggregator_test

* Use generic DataPoint value

* Fix assertion_fail_test.go

* Use generic metricdata types

* Fix tests

* Fix benchmarks

* Fix lint

* Update sum documentation

* Remove leftover encapsulating test run

* Use t.Cleanup to mock time

* Consolidate expecter logic into funcs

* Move errNegVal closer to use

* Run the agg test

* Add tests for monotonic sum Aggregate err

* Run make lint

* Make monotonic an arg of creation funcs

* Remove Aggregate monotonic validation

* Rename sum to valueMap

The term sum is a good variable name that we do not want to take and
valueMap better describes the type as the storage of the aggregator.
* Adds a filter Aggregator.

* Add lock and tests

* Add Concurrency tests

* fix lint errors

* Add memory constrained todo.

* Update filter comment.

Co-authored-by: Tyler Yahn <[email protected]>

Co-authored-by: Chester Cheung <[email protected]>
Co-authored-by: Tyler Yahn <[email protected]>
* PoC stdoutmetric exporter

* Use stringer to generate String for Temporality

* Add vanity imports

* Update Temporality string expected output

* Do not return error from newConfig

* Add shutdown unit tests

* Fix spelling error

* Unify testing of ctx errors and test ForceFlush

* Add unit test for Export handle of ctx errs

* Clarify documentation about alt OTLP exporter

* Remove unused ErrUnrecognized

A third party encoder can produce their own errors. This code does
nothing unique with this error, therefore, it is removed.

* Lint exporter_test.go

* Refactor example_test.go removing FIXME

* Add test for Export shutdown err

* Add a discard encoder for testing

* Acknowledged error is returned from Shutdown

* Remove unexpected SchemaURL from stdouttrace test

* Remove unneeded *testing.T arg from testEncoderOption

* Fix the location of now

* Revise and edit docs

Co-authored-by: Aaron Clawson <[email protected]>
This is required so that they can be used as ComparableReaders.
@MadVikingGod
Copy link
Contributor Author

This change isn't as straightforward as I thought. For it to work, we will have to expose both ManualReader and PeriodicReader, because you can't convert a Reader, what the New Functions return currently, to a ComparableReader.

@codecov
Copy link

codecov bot commented Aug 10, 2022

Codecov Report

Merging #3080 (00d063b) into new_sdk/main (8ac0588) will increase coverage by 2.6%.
The diff coverage is 88.8%.

Impacted file tree graph

@@              Coverage Diff               @@
##           new_sdk/main   #3080     +/-   ##
==============================================
+ Coverage          74.0%   76.6%   +2.6%     
==============================================
  Files               114     131     +17     
  Lines              7930    9104   +1174     
==============================================
+ Hits               5874    6982   +1108     
- Misses             1921    1969     +48     
- Partials            135     153     +18     
Impacted Files Coverage Δ
attribute/value.go 88.9% <ø> (ø)
bridge/opentracing/util.go 100.0% <ø> (ø)
bridge/opentracing/wrapper.go 100.0% <ø> (ø)
exporters/jaeger/uploader.go 48.2% <0.0%> (-0.4%) ⬇️
exporters/stdout/stdouttrace/config.go 100.0% <ø> (ø)
handler.go 100.0% <ø> (ø)
internal/matchers/expectation.go 0.0% <0.0%> (ø)
metric/instrument/config.go 0.0% <0.0%> (ø)
metric/internal/global/instruments.go 54.3% <ø> (-3.0%) ⬇️
metric/noop.go 100.0% <ø> (ø)
... and 60 more

@MadVikingGod MadVikingGod marked this pull request as draft August 10, 2022 18:19
@MadVikingGod
Copy link
Contributor Author

So this creates more problems than it solves. We will need to add checks for empty readers, &ManualReader{} and &PeriodicReader{}. I think it might be a good path to go, but a bit more work needs to be put into it.

@MrAlias MrAlias changed the base branch from new_sdk/main to main September 16, 2022 14:36
@MadVikingGod
Copy link
Contributor Author

I'm going to close this as a different, and better approach can be taken.

@MadVikingGod MadVikingGod deleted the mvg/new_sdk/comparable-reader branch October 11, 2022 15:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants