@@ -95,6 +95,38 @@ def hello():
9595 if __name__ == "__main__":
9696 app.run(debug=True)
9797
98+ Custom Metrics Attributes using Labeler
99+ ***************************************
100+ The Flask instrumentation reads from a Labeler utility that supports adding custom attributes
101+ to the HTTP metrics recorded by the instrumentation.
102+
103+ .. code-block:: python
104+
105+ from flask import Flask
106+ from opentelemetry.instrumentation.flask import FlaskInstrumentor
107+ from opentelemetry.instrumentation._labeler import get_labeler
108+
109+ app = Flask(__name__)
110+ FlaskInstrumentor().instrument_app(app)
111+
112+ @app.route("/user/<user_id>")
113+ def user_profile(user_id):
114+ # Get the labeler for the current request
115+ labeler = get_labeler()
116+
117+ # Add custom attributes to Flask instrumentation metrics
118+ labeler.add("user_id", user_id)
119+ labeler.add("user_type", "registered")
120+
121+ # Or, add multiple attributes at once
122+ labeler.add_attributes({
123+ "feature_flag": "new_ui",
124+ "experiment_group": "control"
125+ })
126+
127+ return f"User profile for {user_id}"
128+
129+
98130Configuration
99131-------------
100132
@@ -268,6 +300,7 @@ def response_hook(span: Span, status: str, response_headers: List):
268300from opentelemetry .instrumentation .flask .package import _instruments
269301from opentelemetry .instrumentation .flask .version import __version__
270302from opentelemetry .instrumentation .instrumentor import BaseInstrumentor
303+ from opentelemetry .instrumentation ._labeler import enhance_metric_attributes
271304from opentelemetry .instrumentation .propagators import (
272305 get_global_response_propagator ,
273306)
@@ -341,6 +374,10 @@ def _wrapped_app(wrapped_app_environ, start_response):
341374 attributes = otel_wsgi .collect_request_attributes (
342375 wrapped_app_environ , sem_conv_opt_in_mode
343376 )
377+ # Enhance attributes with custom labeler attributes
378+ attributes = enhance_metric_attributes (
379+ attributes , wrapped_app_environ , "request"
380+ )
344381 active_requests_count_attrs = (
345382 otel_wsgi ._parse_active_request_count_attrs (
346383 attributes ,
@@ -446,6 +483,10 @@ def _before_request():
446483 flask_request_environ ,
447484 sem_conv_opt_in_mode = sem_conv_opt_in_mode ,
448485 )
486+ # Enhance attributes with custom labeler attributes
487+ attributes = enhance_metric_attributes (
488+ attributes , flask_request_environ , "request"
489+ )
449490 if flask .request .url_rule :
450491 # For 404 that result from no route found, etc, we
451492 # don't have a url_rule.
0 commit comments