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

Return proxy instruments from ProxyMeter #2169

Merged
merged 10 commits into from
Oct 14, 2021

Conversation

aabmass
Copy link
Member

@aabmass aabmass commented Oct 2, 2021

Fixes #2144

This PR implements proxy instruments to be returned from the metrics API before an SDK is set up. This is slightly different than how this is implemented for tracing because of the complication of asynchronous instruments. In tracing, we resolve the proxied Tracer whenever spans are created by a user:

def start_span(self, *args, **kwargs) -> Span: # type: ignore
return self._tracer.start_span(*args, **kwargs) # type: ignore
def start_as_current_span(self, *args, **kwargs) -> Span: # type: ignore
return self._tracer.start_as_current_span(*args, **kwargs) # type: ignore

This would work for synchronous instruments. However, the user never interacts with asynchronous instruments, so we need to keep them reachable by reference so when an SDK is swapped in, we can create SDK instances of each async instrument.

@aabmass aabmass added this to In progress in Metrics RC via automation Oct 2, 2021
@aabmass aabmass added the metrics label Oct 2, 2021
@aabmass aabmass added the Approve Public API check This label shows that the public symbols added or changed in a PR are strictly necessary label Oct 2, 2021
@aabmass aabmass changed the title Metrics: return proxy instruments from ProxyMeter Return proxy instruments from ProxyMeter Oct 2, 2021
@aabmass aabmass force-pushed the metrics-proxy-2144 branch 2 times, most recently from 66b6a15 to 0d49d0f Compare October 4, 2021 15:57
@aabmass aabmass marked this pull request as ready for review October 4, 2021 16:15
@aabmass aabmass requested a review from a team as a code owner October 4, 2021 16:15
@aabmass aabmass requested review from ocelotl and lzchen October 4, 2021 16:15
)
return ProxyMeter(name, version=version, schema_url=schema_url)
with self._lock:
if self._real_meter_provider:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if self._real_meter_provider:
if self._real_meter_provider is not None:

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should be equivalent here right? I'm happy to change it if this is a general thing we enforce throughout our code base.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most of the time it is not a big deal, but it can be. It is part of PEP8 because of this reason:

Also, beware of writing if x when you really mean if x is not None -- e.g. when testing whether a variable or argument that defaults to None was set to some other value. The other value might have a type (such as a container) that could be false in a boolean context!

I don't think we have been consistent on enforcing this, though.

opentelemetry-api/src/opentelemetry/metrics/__init__.py Outdated Show resolved Hide resolved
opentelemetry-api/src/opentelemetry/metrics/__init__.py Outdated Show resolved Hide resolved
opentelemetry-api/tests/metrics/test_meter_provider.py Outdated Show resolved Hide resolved
opentelemetry-api/tests/metrics/test_meter_provider.py Outdated Show resolved Hide resolved
opentelemetry-api/src/opentelemetry/metrics/__init__.py Outdated Show resolved Hide resolved
Metrics RC automation moved this from In progress to Review in progress Oct 7, 2021
@lzchen
Copy link
Contributor

lzchen commented Oct 7, 2021

Should wait on #2182 to be merged before this.

Metrics RC automation moved this from Review in progress to Reviewer approved Oct 13, 2021
@aabmass
Copy link
Member Author

aabmass commented Oct 14, 2021

Should be good to go now 👍

@ocelotl
Copy link
Contributor

ocelotl commented Oct 14, 2021

Should be good to go now +1

Hm, looks like tests are still failing...

@aabmass
Copy link
Member Author

aabmass commented Oct 14, 2021

@ocelotl failures are in contrib builds related to the release

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
opentelemetry-sdk 1.5.0 requires opentelemetry-api==1.5.0, but you have opentelemetry-api 1.6.0 which is incompatible.
opentelemetry-sdk 1.5.0 requires opentelemetry-semantic-conventions==0.24b0, but you have opentelemetry-semantic-conventions 0.25b0 which is incompatible.
Successfully installed opentelemetry-semantic-conventions-0.25b0

I think #2199 should fix it?

@lzchen lzchen merged commit 0243aa4 into open-telemetry:metrics_new Oct 14, 2021
Metrics RC automation moved this from Reviewer approved to Done Oct 14, 2021
@aabmass aabmass deleted the metrics-proxy-2144 branch October 14, 2021 17:47
aabmass added a commit to aabmass/opentelemetry-python that referenced this pull request Oct 29, 2021
ocelotl pushed a commit to ocelotl/opentelemetry-python that referenced this pull request Nov 2, 2021
ocelotl pushed a commit to ocelotl/opentelemetry-python that referenced this pull request Nov 10, 2021
ocelotl pushed a commit to ocelotl/opentelemetry-python that referenced this pull request Nov 11, 2021
ocelotl pushed a commit to ocelotl/opentelemetry-python that referenced this pull request Nov 15, 2021
ocelotl pushed a commit to ocelotl/opentelemetry-python that referenced this pull request Nov 17, 2021
ocelotl added a commit that referenced this pull request Nov 18, 2021
* Adds metrics API (#1887)

* Adds metric prototype

Fixes #1835

* Fix docs

* Add API metrics doc

* Add missing docs

* Add files

* Adding docs

* Refactor to _initialize

* Refactor initialize

* Add more documentation

* Add exporter test

* Add process

* Fix tests

* Try to add aggregator_class argument

Tests are failing here

* Fix instrument parent classes

* Test default aggregator

* WIP

* Add prototype test

* Tests passing again

* Use right counters

* All tests passing

* Rearrange instrument storage

* Fix tests

* Add HTTP server test

* WIP

* WIP

* Add prototype

* WIP

* Fail the test

* WIP

* WIP

* WIP

* WIP

* Add views

* Discard instruments via views

* Fix tests

* WIP

* WIP

* Fix lint

* WIP

* Fix test

* Fix lint

* Fix method

* Fix lint

* Mypy workaround

* Skip if 3.6

* Fix lint

* Add reason

* Fix 3.6

* Fix run

* Fix lint

* Remove SDK metrics

* Remove SDK docs

* Remove metrics

* Remove assertnotraises mixin

* Revert sdk docs conf

* Remove SDK env var changes

* Fix unit checking

* Define positional-only arguments

* Add Metrics plans

* Add API tests

* WIP

* WIP test

* WIP

* WIP

* WIP

* Set provider test passing

* Use a fixture

* Add test for get_provider

* Rename tests

* WIP

* WIP

* WIP

* WIP

* Remove non specific requirement

* Add meter requirements

* Put all meter provider tests in one file

* Add meter tests

* Make attributes be passed as a dictionary

* Make some interfaces private

* Log an error instead

* Remove ASCII flag

* Add CHANGELOG entry

* Add instrument tests

* All tests passing

* Add test

* Add name tests

* Add unit tests

* Add description tests

* Add counter tests

* Add more tests

* Add Histogram tests

* Add observable gauge tests

* Add updowncounter tests

* Add observableupdowncounter tests

* Fix lint

* Fix docs

* Fix lint

* Ignore mypy

* Remove useless pylint skip

* Remove useless pylint skip

* Remove useless pylint skip

* Remove useless pylint skip

* Remove useless pylint skip

* Add locks to meter and meterprovider

* Add lock to instruments

* Fix fixmes

* Fix lint

* Add documentation placeholder

* Remove blank line as requested.

* Do not override Rlock

* Remove unecessary super calls

* Add missing super calls

* Remove plan files

* Add missing parameters

* Rename observe to callback

* Fix lint

* Rename to secure_instrument_name

* Remove locks

* Fix lint

* Remove args and kwargs

* Remove implementation that gives meters access to meter provider

* Allow creating async instruments with either a callback function or generator

* add additional test with callback form of observable counter

* add a test/example that reads measurements from proc stat

* implement cpu time integration test with generator too

Co-authored-by: Aaron Abbott <aaronabbott@google.com>

* Make measurement a concrete class (#2153)

* Make Measurement a concrete class

* comments

* update changelog

* Return proxy instruments from ProxyMeter (#2169)

* Merge main 4 (#2236)

* Add MeterProvider and Meter to the SDK

Fixes #2200

* Add FIXMEs

* Fix docstring

* Add FIXME

* Fix meter return

* Log an error if a force flush fails

* Add FIXME

* Fix lint

* Remove SDK API module

* Unregister

* Fix API names

* Return _DefaultMeter

* Remove properties

* Pass MeterProvider as a parameter to __init__

* Add FIXMEs

* Add FIXMEs

* Fix lint

* Add Aggregation to the metrics SDK

Fixes #2229

* lint fix wip

* Fix lint

* Add proto to setup.cfg

* Add timestamp for last value

* Rename modules to be private

* Fix paths

* Set value in concrete classes init

* Fix test

* Fix lint

* Remove temporalities

* Use frozenset as key

* Test instruments

* Handle min, max and sum in explicit bucket histogram aggregator

* Add test for negative values

* Remove collect method from aggregations

* Add make_point_and_reset

* Remove add implementation

* Remove _Synchronous

* Update opentelemetry-sdk/src/opentelemetry/sdk/_metrics/aggregation.py

Co-authored-by: Aaron Abbott <aaronabbott@google.com>

* Requested fixes

* Remove NoneAggregation

* Add changelog entry

* Fix tests

* Fix boundaries

* More fixes

* Update CHANGELOG.md

Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>

Co-authored-by: Aaron Abbott <aaronabbott@google.com>
Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Approve Public API check This label shows that the public symbols added or changed in a PR are strictly necessary metrics
Projects
No open projects
Metrics RC
  
Done
Development

Successfully merging this pull request may close these issues.

ProxyMeter must return proxy instruments or users may get stale instruments in the API
4 participants