Currently the specification states:
The SDK MUST provide the means to register Views with a MeterProvider. Here are the inputs:
...
- The configuration for the resulting metrics stream:
...
- A list of
attribute keys (optional). If provided, the attributes that are not in the list will be ignored. If not provided, all the attribute keys will be used by default (TODO: once the Hint API is available, the default behavior should respect the Hint if it is available).
For asynchronous counter instruments (counter and up-down-counter), how should their sums be reported when this "filter" is defined?
For example, if there is an asynchronous counter that observes 1 for the attribute set version=1 and then, in the same callback, 2 for the attribute set version=2 and a list of attribute keys equaling {"foo"} is used in a view, both attribute sets (version=1 and version=2) should be ignored according to the specification. Therefore, they both become observations of the empty attribute set. How should their sums be combined? Should the SDK report 2, the last recorded value for the empty attribute set? Or, should it report 3 the combination?
I had assumed the latter would be expected, but when looking at the python implementation they use the former. This is based on the limit_num_of_attrs.py example:
import random
import time
from typing import Iterable
from opentelemetry.metrics import (
CallbackOptions,
Observation,
get_meter_provider,
set_meter_provider,
)
from opentelemetry.sdk.metrics import MeterProvider, ObservableGauge
from opentelemetry.sdk.metrics.export import (
ConsoleMetricExporter,
PeriodicExportingMetricReader,
)
from opentelemetry.sdk.metrics.view import View
view_with_attributes_limit = View(
instrument_type=ObservableGauge,
instrument_name="observable_gauge",
attribute_keys={"foo"},
)
exporter = ConsoleMetricExporter()
reader = PeriodicExportingMetricReader(exporter, export_interval_millis=1_000)
provider = MeterProvider(
metric_readers=[
reader,
],
views=[
view_with_attributes_limit,
],
)
set_meter_provider(provider)
meter = get_meter_provider().get_meter("reduce-cardinality-with-view", "0.1.2")
def observable_gauge_func(options: CallbackOptions) -> Iterable[Observation]:
yield Observation(1, {"version": 1})
yield Observation(2, {"version": 2})
# Async gauge
observable_gauge = meter.create_observable_gauge(
"observable_gauge",
[observable_gauge_func],
)
while 1:
time.sleep(1)
(caveat, my python understanding is limited so I could have missed something here)
When running this:
$ python limit_num_of_attrs.py
{"resource_metrics": [{"resource": {"attributes": {"telemetry.sdk.language": "python", "telemetry.sdk.name": "opentelemetry", "telemetry.sdk.version": "1.12.0", "service.name": "unknown_service"}, "schema_url": ""}, "scope_metrics": [{"scope": {"name": "reduce-cardinality-with-view", "version": "0.1.2", "schema_url": ""}, "metrics": [{"name": "observable_gauge", "description": "", "unit": "", "data": {"data_points": [{"attributes": {}, "start_time_unix_nano": 0, "time_unix_nano": 1666898388887952217, "value": 2}]}}], "schema_url": ""}], "schema_url": ""}]}
{"resource_metrics": [{"resource": {"attributes": {"telemetry.sdk.language": "python", "telemetry.sdk.name": "opentelemetry", "telemetry.sdk.version": "1.12.0", "service.name": "unknown_service"}, "schema_url": ""}, "scope_metrics": [{"scope": {"name": "reduce-cardinality-with-view", "version": "0.1.2", "schema_url": ""}, "metrics": [{"name": "observable_gauge", "description": "", "unit": "", "data": {"data_points": [{"attributes": {}, "start_time_unix_nano": 0, "time_unix_nano": 1666898389956287449, "value": 2}]}}], "schema_url": ""}], "schema_url": ""}]}
#...
The value reported is 2.
cc @jmacd @bogdandrutu @reyang @open-telemetry/python-approvers
Currently the specification states:
For asynchronous counter instruments (counter and up-down-counter), how should their sums be reported when this "filter" is defined?
For example, if there is an asynchronous counter that observes
1for the attribute setversion=1and then, in the same callback,2for the attribute setversion=2and a list of attribute keys equaling{"foo"}is used in a view, both attribute sets (version=1andversion=2) should be ignored according to the specification. Therefore, they both become observations of the empty attribute set. How should their sums be combined? Should the SDK report2, the last recorded value for the empty attribute set? Or, should it report3the combination?I had assumed the latter would be expected, but when looking at the python implementation they use the former. This is based on the limit_num_of_attrs.py example:
(caveat, my python understanding is limited so I could have missed something here)
When running this:
The value reported is
2.cc @jmacd @bogdandrutu @reyang @open-telemetry/python-approvers