Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
2d288fd
WIP custom attributes metrics labeler
tammy-baylis-swi Aug 11, 2025
930685e
Add Flask merging of Labeler custom attrs to Flask metrics
tammy-baylis-swi Aug 11, 2025
a16821a
Fixes
tammy-baylis-swi Aug 13, 2025
67e7e8f
Docstring
tammy-baylis-swi Aug 13, 2025
4b0c6ed
Ruff
tammy-baylis-swi Aug 20, 2025
ce12b1b
Mv example to docstring; lint
tammy-baylis-swi Aug 20, 2025
96c0aad
Header
tammy-baylis-swi Aug 20, 2025
4eeecf6
Add contextvar tests
tammy-baylis-swi Aug 20, 2025
0199858
Fix: custom attrs Flask to request_counter, not span
tammy-baylis-swi Aug 21, 2025
570e994
Rm custom attrs from updown active requests count
tammy-baylis-swi Aug 22, 2025
da7d8f8
Add FlaskInstrumentor custom attrs tests
tammy-baylis-swi Aug 22, 2025
ffcf998
Mv Flask attrs test to existing test_programmatic
tammy-baylis-swi Aug 22, 2025
7d24863
Clarify Flask labeler effects
tammy-baylis-swi Aug 22, 2025
74289b9
Changelog
tammy-baylis-swi Aug 22, 2025
98c375e
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Aug 22, 2025
3c73113
Add WsgiInstrumentor labeler support for custom metrics
tammy-baylis-swi Aug 23, 2025
8cd8c81
Add DjangoInstrumentor labeler custom attrs metrics support
tammy-baylis-swi Aug 23, 2025
ee45e0f
Fix test
tammy-baylis-swi Aug 25, 2025
4ef0c1a
Docstring
tammy-baylis-swi Aug 25, 2025
f7df7db
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Aug 25, 2025
035ae2e
Add FalconInstrumentor labeler custom attrs metrics support
tammy-baylis-swi Aug 25, 2025
e50f1e2
disable too-many-lints
tammy-baylis-swi Aug 25, 2025
03e767c
Add AsgiInstrumentor labeler custom attrs metrics support
tammy-baylis-swi Aug 26, 2025
1b39798
Changelog
tammy-baylis-swi Aug 26, 2025
fc74620
Fix asgi custom attributes
tammy-baylis-swi Aug 26, 2025
cd5e639
Tidy Labeler
tammy-baylis-swi Aug 27, 2025
b338833
Update doc
tammy-baylis-swi Aug 27, 2025
aed659b
Update docstring
tammy-baylis-swi Aug 27, 2025
0f5c00a
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Sep 2, 2025
cdb6c61
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Sep 9, 2025
27348be
Merge branch 'main' into add-metrics-attributes-labeler
emdneto Sep 17, 2025
2c64576
Set Labeler Max at init
tammy-baylis-swi Sep 22, 2025
0bfd192
Update and add test
tammy-baylis-swi Sep 22, 2025
01707e7
lint
tammy-baylis-swi Sep 22, 2025
c86a538
get_attrs MappingProxyType
tammy-baylis-swi Sep 22, 2025
e10dc80
Skip and warn if invalid attr for Labeler
tammy-baylis-swi Sep 22, 2025
068d0c4
Rename enhance to enrich
tammy-baylis-swi Sep 22, 2025
6213116
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Sep 22, 2025
4d7c1c3
Changelog
tammy-baylis-swi Sep 22, 2025
4a5fc33
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Nov 12, 2025
bfcb9f1
lint
tammy-baylis-swi Nov 12, 2025
fb12b68
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Nov 12, 2025
2d1d525
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Jan 15, 2026
98f11b7
lint
tammy-baylis-swi Jan 15, 2026
286e12b
Stop duplicate recording
tammy-baylis-swi Jan 15, 2026
00708ca
Rm test_thread_safety_atomic_increment because it tested counter not …
tammy-baylis-swi Jan 15, 2026
e29774f
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Feb 17, 2026
bac83e2
Add Labeler to pyright; adjust return types
tammy-baylis-swi Feb 24, 2026
5626264
Test fixes for span.started metrics
tammy-baylis-swi Feb 24, 2026
675e94a
lint
tammy-baylis-swi Feb 24, 2026
1e35697
More test fixes for span.started metrics
tammy-baylis-swi Feb 24, 2026
12ef547
Test semcomv no override
tammy-baylis-swi Feb 24, 2026
a9e15d9
Merge branch 'main' into add-metrics-attributes-labeler
tammy-baylis-swi Feb 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#4141](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4141))
- `opentelemetry-instrumentation-pyramid`: pass request attributes at span creation
([#4139](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4139))
- `opentelemetry-instrumentation`, `opentelemetry-instrumentation-flask`, `opentelemetry-instrumentation-wsgi`, `opentelemetry-instrumentation-django`, `opentelemetry-instrumentation-falcon`, `opentelemetry-instrumentation-asgi`: Add Labeler utility. Add FalconInstrumentor, FlaskInstrumentor, DjangoInstrumentor, WsgiInstrumentor, AsgiInstrumentor support of custom attributes merging for HTTP duration metrics.
([#3689](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3689))

### Fixed
- `opentelemetry-instrumentation-mysql`: Refactor MySQL integration test mocks to use concrete DBAPI connection attributes, reducing noisy attribute type warnings.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,46 @@ def client_response_hook(span: Span, scope: Scope, message: dict[str, Any]):
Note:
The environment variable names used to capture HTTP headers are still experimental, and thus are subject to change.

Custom Metrics Attributes using Labeler
***************************************
The ASGI instrumentation reads from a labeler utility that supports adding custom
attributes to HTTP duration metrics at record time. The custom attributes are
stored only within the context of an instrumented request or operation. The
instrumentor does not overwrite base attributes that exist at the same keys as
any custom attributes.


.. code-block:: python

.. code-block:: python

from quart import Quart
from opentelemetry.instrumentation._labeler import get_labeler
from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware

app = Quart(__name__)
app.asgi_app = OpenTelemetryMiddleware(app.asgi_app)

@app.route("/users/<user_id>/")
async def user_profile(user_id):
# Get the labeler for the current request
labeler = get_labeler()

# Add custom attributes to ASGI instrumentation metrics
labeler.add("user_id", user_id)
labeler.add("user_type", "registered")

# Or, add multiple attributes at once
labeler.add_attributes({
"feature_flag": "new_ui",
"experiment_group": "control"
})

return f"User profile for {user_id}"

if __name__ == "__main__":
app.run(debug=True)

API
---
"""
Expand All @@ -220,6 +260,10 @@ def client_response_hook(span: Span, scope: Scope, message: dict[str, Any]):
from asgiref.compatibility import guarantee_single_callable

from opentelemetry import context, trace
from opentelemetry.instrumentation._labeler import (
enrich_metric_attributes,
get_labeler,
)
from opentelemetry.instrumentation._semconv import (
HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
_filter_semconv_active_request_count_attr,
Expand Down Expand Up @@ -744,6 +788,9 @@ async def __call__(
receive: An awaitable callable yielding dictionaries
send: An awaitable callable taking a single dictionary as argument.
"""
# Required to create new instance for custom attributes in async context
_ = get_labeler()

start = default_timer()
if scope["type"] not in ("http", "websocket"):
return await self.app(scope, receive, send)
Expand Down Expand Up @@ -825,11 +872,19 @@ async def __call__(
duration_attrs_old = _parse_duration_attrs(
attributes, _StabilityMode.DEFAULT
)
# Enhance attributes with any custom labeler attributes
duration_attrs_old = enrich_metric_attributes(
duration_attrs_old
)
if target:
duration_attrs_old[HTTP_TARGET] = target
duration_attrs_new = _parse_duration_attrs(
attributes, _StabilityMode.HTTP
)
# Enhance attributes with any custom labeler attributes
duration_attrs_new = enrich_metric_attributes(
duration_attrs_new
)
span_ctx = set_span_in_context(span)
if self.duration_histogram_old:
self.duration_histogram_old.record(
Expand Down
Loading
Loading