Repository: open-telemetry/opentelemetry-python

Issue:
Add metrics example to show how to reduce cardinality with `attribute_keys`
Part of #2733 


Discussion:

Resolving patch:
diff --git a/docs/examples/views/change_aggregation.py b/docs/examples/views/change_aggregation.py
new file mode 100644
--- /dev/null
+++ b/docs/examples/views/change_aggregation.py
@@ -0,0 +1,53 @@
+# 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.
+
+import random
+import time
+
+from opentelemetry.metrics import get_meter_provider, set_meter_provider
+from opentelemetry.sdk.metrics import MeterProvider
+from opentelemetry.sdk.metrics.export import (
+    ConsoleMetricExporter,
+    PeriodicExportingMetricReader,
+)
+from opentelemetry.sdk.metrics.view import SumAggregation, View
+
+# Create a view matching the histogram instrument name `http.client.request.latency`
+# and configure the `SumAggregation` for the result metrics stream
+hist_to_sum_view = View(
+    instrument_name="http.client.request.latency", aggregation=SumAggregation()
+)
+
+# Use console exporter for the example
+exporter = ConsoleMetricExporter()
+
+# Create a metric reader with stdout exporter
+reader = PeriodicExportingMetricReader(exporter, export_interval_millis=1_000)
+provider = MeterProvider(
+    metric_readers=[
+        reader,
+    ],
+    views=[
+        hist_to_sum_view,
+    ],
+)
+set_meter_provider(provider)
+
+meter = get_meter_provider().get_meter("view-change-aggregation", "0.1.2")
+
+histogram = meter.create_histogram("http.client.request.latency")
+
+while 1:
+    histogram.record(99.9)
+    time.sleep(random.random())
diff --git a/docs/examples/views/change_name.py b/docs/examples/views/change_name.py
new file mode 100644
--- /dev/null
+++ b/docs/examples/views/change_name.py
@@ -0,0 +1,55 @@
+# 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.
+
+import random
+import time
+
+from opentelemetry.metrics import get_meter_provider, set_meter_provider
+from opentelemetry.sdk.metrics import Counter, MeterProvider
+from opentelemetry.sdk.metrics.export import (
+    ConsoleMetricExporter,
+    PeriodicExportingMetricReader,
+)
+from opentelemetry.sdk.metrics.view import View
+
+# Create a view matching the counter instrument `my.counter`
+# and configure the new name `my.counter.total` for the result metrics stream
+change_metric_name_view = View(
+    instrument_type=Counter,
+    instrument_name="my.counter",
+    name="my.counter.total",
+)
+
+# Use console exporter for the example
+exporter = ConsoleMetricExporter()
+
+# Create a metric reader with stdout exporter
+reader = PeriodicExportingMetricReader(exporter, export_interval_millis=1_000)
+provider = MeterProvider(
+    metric_readers=[
+        reader,
+    ],
+    views=[
+        change_metric_name_view,
+    ],
+)
+set_meter_provider(provider)
+
+meter = get_meter_provider().get_meter("view-name-change", "0.1.2")
+
+my_counter = meter.create_counter("my.counter")
+
+while 1:
+    my_counter.add(random.randint(1, 10))
+    time.sleep(random.random())
diff --git a/docs/examples/views/limit_num_of_attrs.py b/docs/examples/views/limit_num_of_attrs.py
new file mode 100644
--- /dev/null
+++ b/docs/examples/views/limit_num_of_attrs.py
@@ -0,0 +1,71 @@
+# 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.
+
+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
+
+# Create a view matching the observable gauge instrument `observable_gauge`
+# and configure the attributes in the result metric stream
+# to contain only the attributes with keys with `k_3` and `k_5`
+view_with_attributes_limit = View(
+    instrument_type=ObservableGauge,
+    instrument_name="observable_gauge",
+    attribute_keys={"k_3", "k_5"},
+)
+
+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]:
+    attrs = {}
+    for i in range(random.randint(1, 100)):
+        attrs[f"k_{i}"] = f"v_{i}"
+    yield Observation(1, attrs)
+
+
+# Async gauge
+observable_gauge = meter.create_observable_gauge(
+    "observable_gauge",
+    [observable_gauge_func],
+)
+
+while 1:
+    time.sleep(1)


Test patch: