)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"822d7f6070b32d0125eab92a0afd0275be8d913f","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Add a TracingMiddleware that creates OpenTelemetry spans for each"},{"line_number":10,"context_line":"HTTP request with W3C TraceContext propagation. The middleware is"},{"line_number":11,"context_line":"disabled by default and becomes a zero-overhead passthrough when"},{"line_number":12,"context_line":"[tracing] enabled \u003d false or when the OpenTelemetry SDK is not"},{"line_number":13,"context_line":"installed."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This allows all OpenStack services to gain distributed tracing"},{"line_number":16,"context_line":"by adding a single paste filter declaration pointing to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"22cb7d95_f26cd29a","line":13,"range":{"start_line":12,"start_character":26,"end_line":13,"end_character":10},"updated":"2026-05-05 16:36:23.000000000","message":"I think this isn\u0027t correct, right ? If [tracing] enabled \u003d true but the library is not installed then the service may fail to start.","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"9082561cd62fb83f1fef606ab1c90bc714c9fe1c","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Add a TracingMiddleware that creates OpenTelemetry spans for each"},{"line_number":10,"context_line":"HTTP request with W3C TraceContext propagation. The middleware is"},{"line_number":11,"context_line":"disabled by default and becomes a zero-overhead passthrough when"},{"line_number":12,"context_line":"[tracing] enabled \u003d false or when the OpenTelemetry SDK is not"},{"line_number":13,"context_line":"installed."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This allows all OpenStack services to gain distributed tracing"},{"line_number":16,"context_line":"by adding a single paste filter declaration pointing to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ac27d1fd_cee8a8b2","line":13,"range":{"start_line":12,"start_character":26,"end_line":13,"end_character":10},"in_reply_to":"22cb7d95_f26cd29a","updated":"2026-05-06 10:52:12.000000000","message":"Yes indeed. I am raising RuntimeError when tracing is enabled but the SDK is not installed, I just need to adjust the commit message to something on the likes of \"When enabled, the OpenTelemetry SDK must be installed or the service will fail to start.\"","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"b8779e9cd87b97f537601586d4ad88caa937da42","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add a TracingMiddleware that creates OpenTelemetry spans for each"},{"line_number":10,"context_line":"HTTP request with W3C TraceContext propagation. The middleware is"},{"line_number":11,"context_line":"disabled by default and becomes a zero-overhead passthrough when"},{"line_number":12,"context_line":"[tracing] enabled \u003d false or when the OpenTelemetry SDK is not"},{"line_number":13,"context_line":"installed."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This allows all OpenStack services to gain distributed tracing"},{"line_number":16,"context_line":"by adding a single paste filter declaration pointing to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"11339de7_a386a569","line":13,"range":{"start_line":12,"start_character":26,"end_line":13,"end_character":10},"in_reply_to":"ac27d1fd_cee8a8b2","updated":"2026-05-06 12:59:34.000000000","message":"Done","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"dcad21ca_0c76332b","updated":"2026-04-14 12:58:53.000000000","message":"Couple of comments here, mainly around managing our imports and our dependencies. I\u0027d also like to see some docs (e.g. a new `doc/source/admin/telemetry.rst` doc?) and a release note so people know this exists.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"d6fffe7966220c587184d7315cce60d449df7bbe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3cb46703_9a742759","in_reply_to":"dcad21ca_0c76332b","updated":"2026-04-14 13:39:33.000000000","message":"Thank you for your review Stephen, I\u0027ll be addressing the comments.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"56f5ea143bf1d9e99dd5bd12160fd29104f025d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"6d0b8e78_fb239bc1","updated":"2026-04-15 12:45:49.000000000","message":"Just saw @kajinamit@oss.nttdata.com\u0027s comments. I agree with all of those too. There\u0027s probably enough here now for a -1","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"4426a9e2b11f0f8e0070bbc0bd477bdd64ada804","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8ad4472e_1c2267c5","updated":"2026-04-15 12:26:43.000000000","message":"Leaving several inline comments. Also please consider adding a release note.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a5f14f66124aa667bb5afcffd2e5b1ddc5b0d2aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"aea7042b_6a00fb76","updated":"2026-04-15 12:43:28.000000000","message":"This is looking much better. I just have two outstanding requests","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"10620c5a_9d8b27f5","in_reply_to":"8ad4472e_1c2267c5","updated":"2026-04-16 13:03:24.000000000","message":"Thank you for your review, very good advice as always. I have added a release note.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"768f311cb7db2aae5c77e97e773c28c5dd5d43e1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5a535cc8_546f7c4e","updated":"2026-04-16 13:02:37.000000000","message":"I should have noticed this earlier, but we have a similar implementation in osprofiler.\n\nWhat\u0027s the core difference between this new middleware and that existing one ? If we are implementing similar functionalities can we just re-use the existing one ?","commit_id":"b308c9bcf21ce4a7c7326bbb933f73f044483140"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"01f501db696a68bba68f95c7cb712aad03c57205","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"fcc0b717_9575b842","in_reply_to":"1431343e_a661a115","updated":"2026-04-16 13:31:14.000000000","message":"Thanks for the explanation. I\u0027ll take a few more moments to go through the link and also check the current status of osprofiler, but what you explained sounds quite reasonable to me. The main intention of my question is first to make sure that it was considered as a potential option so as long as you are aware of it and the current approach comes out from that consideration that is ok.","commit_id":"b308c9bcf21ce4a7c7326bbb933f73f044483140"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"a348a1cf1e427e883058b28c883759b92feb1912","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"1431343e_a661a115","in_reply_to":"5a535cc8_546f7c4e","updated":"2026-04-16 13:11:01.000000000","message":"Well, I thought about that a lot and iterated over osprofiler for a while, the thing is that from my point of view, what I am trying to implement here and what osprofiler is doing are two fundamentally different things.\n\nThe most important thing is that osprofiler \"profiles\" requests. It requires a specific header activation for the request to be profiled, and it retrieves and give a whole swath of information. This takes a big toll on the requests. The profiled requests are far too slow to be used constantly in production.\n\nThis tracing implementation, though, is designed to be ran at all times, gathering API execution times, which user called what and provide just enough information to get an early alert of that something might be wrong with your production system.\n\nI see both things as complementary: you have tracing running at all times and configure alerts in your observability system, and if something starts going wrong you can use osprofiler to debug the issues.\n\nMaybe a spec would have helped. I first proposed this as a community goal (then the idea was to put the tracing code in each service indepentently until Sean Mooney referenced oslo.middleware). Since now this is a self-contained oslo.middleware implementation, I abandoned the comunity goal, but it can still provide information about the rationale of what I am intending to do and why osprofiler is not the correct tool: https://review.opendev.org/c/openstack/governance/+/982624/1/goals/proposed/tracing.rst","commit_id":"b308c9bcf21ce4a7c7326bbb933f73f044483140"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"822d7f6070b32d0125eab92a0afd0275be8d913f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8a0e66df_732a46dd","in_reply_to":"fcc0b717_9575b842","updated":"2026-05-05 16:36:23.000000000","message":"Sorry I\u0027ve not updated this so long but I now agree that adding a separate middleware would be a better choice.","commit_id":"b308c9bcf21ce4a7c7326bbb933f73f044483140"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"822d7f6070b32d0125eab92a0afd0275be8d913f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"6a3a41a9_25dfab0f","updated":"2026-05-05 16:36:23.000000000","message":"After digging into current osprofiler I\u0027m agreeing with the proposed approach. Adding a few comments which may need to be addressed.","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dac12db5633141e6e4925fc5063759748f04ed6f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"170e8610_9277789d","updated":"2026-05-05 14:38:17.000000000","message":"I\u0027m mainly waiting on @kajinamit@oss.nttdata.com to come back to this before I review in depth again mself, but I spotted a few small things.","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"9082561cd62fb83f1fef606ab1c90bc714c9fe1c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"50be2328_73486deb","in_reply_to":"6a3a41a9_25dfab0f","updated":"2026-05-06 10:52:12.000000000","message":"Thank you! I am glad that you think it is the right approach.","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"}],"oslo_middleware/tracing.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Required packages (installed separately by operators)::"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Configuration example::"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f64c71e2_7fdf2679","line":29,"updated":"2026-04-14 12:58:53.000000000","message":"Maybe update this to reference the extra?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Required packages (installed separately by operators)::"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Configuration example::"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5490e233_9fa5ad13","line":29,"in_reply_to":"f64c71e2_7fdf2679","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a742a62459c41b23b27db26a4c6edd35490a36","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    ),"},{"line_number":68,"context_line":"    cfg.StrOpt("},{"line_number":69,"context_line":"        \u0027otlp_endpoint\u0027,"},{"line_number":70,"context_line":"        default\u003d\u0027http://localhost:4318\u0027,"},{"line_number":71,"context_line":"        help\u003d_("},{"line_number":72,"context_line":"            \u0027OTLP exporter endpoint URL. For HTTP/protobuf protocol, \u0027"},{"line_number":73,"context_line":"            \u0027traces are sent to \u003cendpoint\u003e/v1/traces.\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"edcd5c9d_90b40736","line":70,"updated":"2026-04-14 13:07:49.000000000","message":"Does it make sense to register a default here? It seems *highly* deployment specific?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"4426a9e2b11f0f8e0070bbc0bd477bdd64ada804","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    ),"},{"line_number":68,"context_line":"    cfg.StrOpt("},{"line_number":69,"context_line":"        \u0027otlp_endpoint\u0027,"},{"line_number":70,"context_line":"        default\u003d\u0027http://localhost:4318\u0027,"},{"line_number":71,"context_line":"        help\u003d_("},{"line_number":72,"context_line":"            \u0027OTLP exporter endpoint URL. For HTTP/protobuf protocol, \u0027"},{"line_number":73,"context_line":"            \u0027traces are sent to \u003cendpoint\u003e/v1/traces.\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"47b5bde9_bd6a2249","line":70,"in_reply_to":"488e4e92_cfea1d82","updated":"2026-04-15 12:26:43.000000000","message":"I\u0027m unsure how much benefit we may have by getting rid of wsgify, because the middleware is anyway loaded in the pipeline (if it ia added).","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a5f14f66124aa667bb5afcffd2e5b1ddc5b0d2aa","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    ),"},{"line_number":68,"context_line":"    cfg.StrOpt("},{"line_number":69,"context_line":"        \u0027otlp_endpoint\u0027,"},{"line_number":70,"context_line":"        default\u003d\u0027http://localhost:4318\u0027,"},{"line_number":71,"context_line":"        help\u003d_("},{"line_number":72,"context_line":"            \u0027OTLP exporter endpoint URL. For HTTP/protobuf protocol, \u0027"},{"line_number":73,"context_line":"            \u0027traces are sent to \u003cendpoint\u003e/v1/traces.\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"156a9042_7136756c","line":70,"in_reply_to":"488e4e92_cfea1d82","updated":"2026-04-15 12:43:28.000000000","message":"Okay, that makes sense. Thanks for the context.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    ),"},{"line_number":68,"context_line":"    cfg.StrOpt("},{"line_number":69,"context_line":"        \u0027otlp_endpoint\u0027,"},{"line_number":70,"context_line":"        default\u003d\u0027http://localhost:4318\u0027,"},{"line_number":71,"context_line":"        help\u003d_("},{"line_number":72,"context_line":"            \u0027OTLP exporter endpoint URL. For HTTP/protobuf protocol, \u0027"},{"line_number":73,"context_line":"            \u0027traces are sent to \u003cendpoint\u003e/v1/traces.\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"488e4e92_cfea1d82","line":70,"in_reply_to":"edcd5c9d_90b40736","updated":"2026-04-15 11:03:47.000000000","message":"Well, this is the universal OTLP standard default used everywhere (in all tutorials, in every collector, etc...) so it seems kind of useful to do not force the user to redefine what is going to be this most of the time. It might not be like this for prod, but then it would be enough overwriting the default. I think it might be very useful for all non-production cases.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a742a62459c41b23b27db26a4c6edd35490a36","unresolved":true,"context_lines":[{"line_number":84,"context_line":"    ),"},{"line_number":85,"context_line":"    cfg.StrOpt("},{"line_number":86,"context_line":"        \u0027service_name\u0027,"},{"line_number":87,"context_line":"        default\u003d\u0027openstack\u0027,"},{"line_number":88,"context_line":"        help\u003d_("},{"line_number":89,"context_line":"            \u0027OpenTelemetry service name reported in trace data. \u0027"},{"line_number":90,"context_line":"            \u0027Services should override this default via set_defaults() \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"b2d62f1e_31edb281","line":87,"updated":"2026-04-14 13:07:49.000000000","message":"Would it make sense to make this required and avoid setting a default? That would ensure it\u0027s overridden.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    ),"},{"line_number":85,"context_line":"    cfg.StrOpt("},{"line_number":86,"context_line":"        \u0027service_name\u0027,"},{"line_number":87,"context_line":"        default\u003d\u0027openstack\u0027,"},{"line_number":88,"context_line":"        help\u003d_("},{"line_number":89,"context_line":"            \u0027OpenTelemetry service name reported in trace data. \u0027"},{"line_number":90,"context_line":"            \u0027Services should override this default via set_defaults() \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"c3d4b169_780e6a73","line":87,"in_reply_to":"b2d62f1e_31edb281","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5a742a62459c41b23b27db26a4c6edd35490a36","unresolved":true,"context_lines":[{"line_number":103,"context_line":"    ),"},{"line_number":104,"context_line":"    cfg.BoolOpt("},{"line_number":105,"context_line":"        \u0027insecure\u0027,"},{"line_number":106,"context_line":"        default\u003dTrue,"},{"line_number":107,"context_line":"        help\u003d_("},{"line_number":108,"context_line":"            \u0027Disable TLS verification for the OTLP endpoint. \u0027"},{"line_number":109,"context_line":"            \u0027Set to False in production with proper TLS certificates.\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"b8e7fb31_2e4e46e0","line":106,"updated":"2026-04-14 13:07:49.000000000","message":"We should have to opt-in to insecure. It shouldn\u0027t be the default.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    ),"},{"line_number":104,"context_line":"    cfg.BoolOpt("},{"line_number":105,"context_line":"        \u0027insecure\u0027,"},{"line_number":106,"context_line":"        default\u003dTrue,"},{"line_number":107,"context_line":"        help\u003d_("},{"line_number":108,"context_line":"            \u0027Disable TLS verification for the OTLP endpoint. \u0027"},{"line_number":109,"context_line":"            \u0027Set to False in production with proper TLS certificates.\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"4ba989d7_bfb0dd75","line":106,"in_reply_to":"b8e7fb31_2e4e46e0","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":168,"context_line":"        from opentelemetry.sdk.trace import TracerProvider"},{"line_number":169,"context_line":"        from opentelemetry import trace"},{"line_number":170,"context_line":"    except ImportError:"},{"line_number":171,"context_line":"        LOG.warning("},{"line_number":172,"context_line":"            \u0027OpenTelemetry packages are not installed. \u0027"},{"line_number":173,"context_line":"            \u0027Install opentelemetry-sdk and \u0027"},{"line_number":174,"context_line":"            \u0027opentelemetry-exporter-otlp-proto-http to enable tracing.\u0027"},{"line_number":175,"context_line":"        )"},{"line_number":176,"context_line":"        _INITIALIZED \u003d True"},{"line_number":177,"context_line":"        return"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"abf31262_a0f3894c","line":175,"range":{"start_line":171,"start_character":0,"end_line":175,"end_character":9},"updated":"2026-04-14 12:58:53.000000000","message":"Should this not be fatal? The user has configured $thing but doesn\u0027t have dependencies needed to enable $thing.\n\nAlso, we have a lot of imports scattered around here. Perhaps we could import all of these at module level and assign `None` if import fails (you\u0027ll need `type: ignore` on those lines). It\u0027ll save us attempting the import on each call of this. The imports are cached but checking that cache still takes time.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        from opentelemetry.sdk.trace import TracerProvider"},{"line_number":169,"context_line":"        from opentelemetry import trace"},{"line_number":170,"context_line":"    except ImportError:"},{"line_number":171,"context_line":"        LOG.warning("},{"line_number":172,"context_line":"            \u0027OpenTelemetry packages are not installed. \u0027"},{"line_number":173,"context_line":"            \u0027Install opentelemetry-sdk and \u0027"},{"line_number":174,"context_line":"            \u0027opentelemetry-exporter-otlp-proto-http to enable tracing.\u0027"},{"line_number":175,"context_line":"        )"},{"line_number":176,"context_line":"        _INITIALIZED \u003d True"},{"line_number":177,"context_line":"        return"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"0bf40b68_45a6815b","line":175,"range":{"start_line":171,"start_character":0,"end_line":175,"end_character":9},"in_reply_to":"abf31262_a0f3894c","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":213,"context_line":"            )"},{"line_number":214,"context_line":"        )"},{"line_number":215,"context_line":"    except ImportError:"},{"line_number":216,"context_line":"        LOG.warning(\u0027Could not set up W3C propagators\u0027)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    if not _ATEXIT_REGISTERED:"},{"line_number":219,"context_line":"        atexit.register(shutdown_tracing)"}],"source_content_type":"text/x-python","patch_set":3,"id":"a498b3d3_1b37af89","line":216,"updated":"2026-04-14 12:58:53.000000000","message":"Is this likely to happen if the earlier imports failed? If so, could we get a context comment explaining why? If not, can we group these imports with the other imports above?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            )"},{"line_number":214,"context_line":"        )"},{"line_number":215,"context_line":"    except ImportError:"},{"line_number":216,"context_line":"        LOG.warning(\u0027Could not set up W3C propagators\u0027)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    if not _ATEXIT_REGISTERED:"},{"line_number":219,"context_line":"        atexit.register(shutdown_tracing)"}],"source_content_type":"text/x-python","patch_set":3,"id":"74a41cc1_e6ba517a","line":216,"in_reply_to":"a498b3d3_1b37af89","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":215,"context_line":"    except ImportError:"},{"line_number":216,"context_line":"        LOG.warning(\u0027Could not set up W3C propagators\u0027)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    if not _ATEXIT_REGISTERED:"},{"line_number":219,"context_line":"        atexit.register(shutdown_tracing)"},{"line_number":220,"context_line":"        _ATEXIT_REGISTERED \u003d True"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"18ccf41f_495e66b8","line":218,"updated":"2026-04-14 12:58:53.000000000","message":"What\u0027s the rationale for calling this behind a guard? The `shutdown_tracing` call already has a guard (`if _TRACER_PROVIDER is not None`) so this feels redundant?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    except ImportError:"},{"line_number":216,"context_line":"        LOG.warning(\u0027Could not set up W3C propagators\u0027)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    if not _ATEXIT_REGISTERED:"},{"line_number":219,"context_line":"        atexit.register(shutdown_tracing)"},{"line_number":220,"context_line":"        _ATEXIT_REGISTERED \u003d True"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"16c29a12_a4aaff47","line":218,"in_reply_to":"18ccf41f_495e66b8","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"def _register_opts(conf: cfg.ConfigOpts) -\u003e None:"},{"line_number":244,"context_line":"    \"\"\"Register tracing config options. Handles DuplicateOptError.\"\"\""},{"line_number":245,"context_line":"    try:"},{"line_number":246,"context_line":"        conf.register_group("},{"line_number":247,"context_line":"            cfg.OptGroup(\u0027tracing\u0027, title\u003d\u0027OpenTelemetry Tracing\u0027)"},{"line_number":248,"context_line":"        )"},{"line_number":249,"context_line":"    except cfg.DuplicateOptError:"},{"line_number":250,"context_line":"        pass"},{"line_number":251,"context_line":"    try:"},{"line_number":252,"context_line":"        conf.register_opts(TRACING_OPTS, group\u003d\u0027tracing\u0027)"},{"line_number":253,"context_line":"    except cfg.DuplicateOptError:"},{"line_number":254,"context_line":"        pass"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"def _create_exporter(conf: cfg.ConfigOpts) -\u003e ty.Any:"}],"source_content_type":"text/x-python","patch_set":3,"id":"2163a74b_a993cc4b","line":254,"range":{"start_line":245,"start_character":0,"end_line":254,"end_character":12},"updated":"2026-04-14 12:58:53.000000000","message":"All of the other middlewares register options but none of them do this. Is this necessary? Can we just inline the calls and drop the exception handling? Alternatively, if you believe this is necessary can you fix them all with a prior commit?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"def _register_opts(conf: cfg.ConfigOpts) -\u003e None:"},{"line_number":244,"context_line":"    \"\"\"Register tracing config options. Handles DuplicateOptError.\"\"\""},{"line_number":245,"context_line":"    try:"},{"line_number":246,"context_line":"        conf.register_group("},{"line_number":247,"context_line":"            cfg.OptGroup(\u0027tracing\u0027, title\u003d\u0027OpenTelemetry Tracing\u0027)"},{"line_number":248,"context_line":"        )"},{"line_number":249,"context_line":"    except cfg.DuplicateOptError:"},{"line_number":250,"context_line":"        pass"},{"line_number":251,"context_line":"    try:"},{"line_number":252,"context_line":"        conf.register_opts(TRACING_OPTS, group\u003d\u0027tracing\u0027)"},{"line_number":253,"context_line":"    except cfg.DuplicateOptError:"},{"line_number":254,"context_line":"        pass"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"def _create_exporter(conf: cfg.ConfigOpts) -\u003e ty.Any:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bbf3f6cb_5c923e99","line":254,"range":{"start_line":245,"start_character":0,"end_line":254,"end_character":12},"in_reply_to":"2163a74b_a993cc4b","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        pass"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"def _create_exporter(conf: cfg.ConfigOpts) -\u003e ty.Any:"},{"line_number":258,"context_line":"    \"\"\"Create the OTLP span exporter based on configuration.\"\"\""},{"line_number":259,"context_line":"    protocol \u003d conf.tracing.otlp_protocol"},{"line_number":260,"context_line":"    endpoint \u003d conf.tracing.otlp_endpoint"}],"source_content_type":"text/x-python","patch_set":3,"id":"e7f80e2c_a7327169","line":257,"updated":"2026-04-14 12:58:53.000000000","message":"Can type the return type? And maybe pass `protocol` explicitly since you\u0027ll be able to narrow the type accordingly? (Assuming we opt to keep this function, which we may not)","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        pass"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"def _create_exporter(conf: cfg.ConfigOpts) -\u003e ty.Any:"},{"line_number":258,"context_line":"    \"\"\"Create the OTLP span exporter based on configuration.\"\"\""},{"line_number":259,"context_line":"    protocol \u003d conf.tracing.otlp_protocol"},{"line_number":260,"context_line":"    endpoint \u003d conf.tracing.otlp_endpoint"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ed74ec5_2424ab60","line":257,"in_reply_to":"e7f80e2c_a7327169","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":269,"context_line":"            return http_exporter.OTLPSpanExporter("},{"line_number":270,"context_line":"                endpoint\u003dendpoint + \u0027/v1/traces\u0027,"},{"line_number":271,"context_line":"            )"},{"line_number":272,"context_line":"        else:"},{"line_number":273,"context_line":"            from opentelemetry.exporter.otlp.proto.grpc import (  # type: ignore[import-not-found]"},{"line_number":274,"context_line":"                trace_exporter as grpc_exporter,"},{"line_number":275,"context_line":"            )"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"            return grpc_exporter.OTLPSpanExporter("},{"line_number":278,"context_line":"                endpoint\u003dendpoint,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df00027f_874276b5","line":275,"range":{"start_line":272,"start_character":13,"end_line":275,"end_character":13},"updated":"2026-04-14 12:58:53.000000000","message":"This `type: ignore` suggests the module doesn\u0027t exist. Is there a typo here or does this require an additional package? Can we get a comment if it\u0027s the latter?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            return http_exporter.OTLPSpanExporter("},{"line_number":270,"context_line":"                endpoint\u003dendpoint + \u0027/v1/traces\u0027,"},{"line_number":271,"context_line":"            )"},{"line_number":272,"context_line":"        else:"},{"line_number":273,"context_line":"            from opentelemetry.exporter.otlp.proto.grpc import (  # type: ignore[import-not-found]"},{"line_number":274,"context_line":"                trace_exporter as grpc_exporter,"},{"line_number":275,"context_line":"            )"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"            return grpc_exporter.OTLPSpanExporter("},{"line_number":278,"context_line":"                endpoint\u003dendpoint,"}],"source_content_type":"text/x-python","patch_set":3,"id":"c2b266f9_9834007b","line":275,"range":{"start_line":272,"start_character":13,"end_line":275,"end_character":13},"in_reply_to":"df00027f_874276b5","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":277,"context_line":"            return grpc_exporter.OTLPSpanExporter("},{"line_number":278,"context_line":"                endpoint\u003dendpoint,"},{"line_number":279,"context_line":"                insecure\u003dinsecure,"},{"line_number":280,"context_line":"            )"},{"line_number":281,"context_line":"    except ImportError:"},{"line_number":282,"context_line":"        LOG.warning("},{"line_number":283,"context_line":"            \u0027OTLP exporter for protocol %s is not installed. \u0027"},{"line_number":284,"context_line":"            \u0027Tracing will be disabled.\u0027,"},{"line_number":285,"context_line":"            protocol,"},{"line_number":286,"context_line":"        )"},{"line_number":287,"context_line":"        return None"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class TracingMiddleware(base.ConfigurableMiddleware):"}],"source_content_type":"text/x-python","patch_set":3,"id":"e0f2f5d0_9dd96a67","line":287,"range":{"start_line":280,"start_character":13,"end_line":287,"end_character":19},"updated":"2026-04-14 12:58:53.000000000","message":"Again, do we need this? If the user has configured it we should hard fail, IMO.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            return grpc_exporter.OTLPSpanExporter("},{"line_number":278,"context_line":"                endpoint\u003dendpoint,"},{"line_number":279,"context_line":"                insecure\u003dinsecure,"},{"line_number":280,"context_line":"            )"},{"line_number":281,"context_line":"    except ImportError:"},{"line_number":282,"context_line":"        LOG.warning("},{"line_number":283,"context_line":"            \u0027OTLP exporter for protocol %s is not installed. \u0027"},{"line_number":284,"context_line":"            \u0027Tracing will be disabled.\u0027,"},{"line_number":285,"context_line":"            protocol,"},{"line_number":286,"context_line":"        )"},{"line_number":287,"context_line":"        return None"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"class TracingMiddleware(base.ConfigurableMiddleware):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1d799a51_33a607ad","line":287,"range":{"start_line":280,"start_character":13,"end_line":287,"end_character":19},"in_reply_to":"e0f2f5d0_9dd96a67","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f75bbfb_103127a3","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"updated":"2026-04-14 12:58:53.000000000","message":"Any reason we can\u0027t use `webob.dec.wsgify` and the same signature here also? I\u0027m assuming it ends up double wrapping? If so, could we move the body of `ConfigurableMiddleware.__call__`  to a separate function and call that here instead of `__call__`?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a5f14f66124aa667bb5afcffd2e5b1ddc5b0d2aa","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"546cbfdc_2a8f39b5","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"3a567bc4_cb765d1d","updated":"2026-04-15 12:43:28.000000000","message":"Ah, okay, I understand now.\n\nIf that is the case, could I suggest we instead drop the `enabled` flag and just ask users to add/remove the middleware from `api-paste.ini` as they do for (all?) other middlewares?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"cb37fcd1_45e39458","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"546cbfdc_2a8f39b5","updated":"2026-04-16 13:03:24.000000000","message":"I thought very hard about this, because having the enabled flag allowed me to add the paste configuration to all the services by default and allow the user to enable it or disable it, but eventually I agree with your vision. Having two different places to enable a feature would be quite confusing, apart that the other middlewares do not do this, so I removed the enabled flag, and thus this __call__ override is not needed anymore.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a567bc4_cb765d1d","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"5f75bbfb_103127a3","updated":"2026-04-15 11:03:47.000000000","message":"This would mean that we could not bypass wsgfiy entirely when we disable telemetry to create zero overhead, which I was trying to avoid from the beginning.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64cbdfb65dcdbc906b9579e5d257f4f336df15e2","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"cc44f755_ef13ded9","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"b0701fd1_1cd47171","updated":"2026-05-06 11:29:47.000000000","message":"\u003e That would be out of the scope of this patch.\n\nAgreed, this would be a separate effort. However, what I\u0027m asking here is whether this pattern would work for other middlewares or not. I\u0027d like to avoid implementing a pattern here there is specific to this middleware when there could be alternatives that are more broadly applicable.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"cb59f76f8c9e79a7358a10f528c5b2f372915f8f","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"fb2f5260_738bf6d8","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"cb37fcd1_45e39458","updated":"2026-04-27 10:29:47.000000000","message":"I was asked specifically about this in the H-cycle PTG. After a long techical discussion it was deemed that having the enabled flag is very useful for all services for at least two reasons:\n\n- The api-paste based services would like to ship the tracing middleware already there and expose just the conf to the operator, following the osprofiler pattern.\n\n- There are services that are not Paste based, and those cannot dynamically enable/disable a middleware based in configuration. Also, Paste is deprecated and will be replaced with something different in the near future. That \"something\" might not have the capability of define executing middlewares via configuration, like Paste offers.\n\nIn specific examples, Watcher does not have this capability and Nova stated that they would rather ship the middleware activated in api-paste.ini but disabled by default, like they do with osprofiler.\n\nThat lead to the re-introduction of the config option and of this wrapper.\n\nWhat do you think?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"13dac27edcfcb77e7919926f407968a00d52eb1f","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"f845e5cf_dca7c1a7","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"cc44f755_ef13ded9","updated":"2026-05-06 11:51:31.000000000","message":"So, this is maybe not the cleanest of hacks to provide zero overhead. I will change it to do the same as osprofiler does: pass through wsgfiy and only then evaluate whether the middleware is disabled. It just needs to remove this __call__ redefinition. That will make the code cleaner, and maybe the solution more adaptable to other middlewares, with just adding the little overhead wsgfiy adds when executing disabled middlewares.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"9082561cd62fb83f1fef606ab1c90bc714c9fe1c","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"b0701fd1_1cd47171","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"d5e13814_6150eca0","updated":"2026-05-06 10:52:12.000000000","message":"I think that what I am proposing is a optional middleware, disabled by default, that can be enabled or disabled depending on which amount of information the user wants about their environment. osprofiler middleware follows the same pattern, and I think it is a good pattern. I dont think we should be hampered by making a decision that limits the functionality we are able to provide just for the sake of consistency.\n\nApplying the same pattern to the rest of the middlewares is something might considering, but it is a design decision that would require further consideration. That would be out of the scope of this patch. However, I see middlewares (such as auth) that are never really meant to be disabled, which is something that we might want to take into consideration for that design decision.","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"b8779e9cd87b97f537601586d4ad88caa937da42","unresolved":false,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"2be14382_cb17a6f0","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"f845e5cf_dca7c1a7","updated":"2026-05-06 12:59:34.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dac12db5633141e6e4925fc5063759748f04ed6f","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                \u0027OpenTelemetry packages not available. \u0027"},{"line_number":344,"context_line":"                \u0027Tracing middleware will be a no-op.\u0027"},{"line_number":345,"context_line":"            )"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def __call__(  # type: ignore[override]"},{"line_number":348,"context_line":"        self,"},{"line_number":349,"context_line":"        environ: dict[str, ty.Any],"},{"line_number":350,"context_line":"        start_response: ty.Callable[..., ty.Any],"},{"line_number":351,"context_line":"    ) -\u003e ty.Any:"},{"line_number":352,"context_line":"        \"\"\"WSGI entry point with short-circuit when disabled.\"\"\""},{"line_number":353,"context_line":"        if not self._tracing_enabled:"},{"line_number":354,"context_line":"            return self.application(environ, start_response)  # type: ignore"}],"source_content_type":"text/x-python","patch_set":3,"id":"d5e13814_6150eca0","line":351,"range":{"start_line":346,"start_character":1,"end_line":351,"end_character":16},"in_reply_to":"fb2f5260_738bf6d8","updated":"2026-05-05 14:38:17.000000000","message":"Does that same rationale not apply to all middleware? Should we be looking to apply this pattern everywhere, for all middlewares currently provided by this package (and ideally formalize a pattern)?","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":false,"context_lines":[{"line_number":361,"context_line":"    ) -\u003e webob.response.Response | None:"},{"line_number":362,"context_line":"        if not self._tracing_enabled:"},{"line_number":363,"context_line":"            return None"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"        from opentelemetry import context as otel_context"},{"line_number":366,"context_line":"        from opentelemetry import trace"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        # Extract trace context from incoming request headers"},{"line_number":369,"context_line":"        carrier: dict[str, str] \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"be8d31e8_abf65a55","line":366,"range":{"start_line":364,"start_character":1,"end_line":366,"end_character":39},"updated":"2026-04-14 12:58:53.000000000","message":"These aren\u0027t guarded imports which is what I\u0027d expect","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"4426a9e2b11f0f8e0070bbc0bd477bdd64ada804","unresolved":true,"context_lines":[{"line_number":63,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":66,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":67,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"},{"line_number":68,"context_line":"    from opentelemetry.sdk.resources import Resource"},{"line_number":69,"context_line":"    from opentelemetry.sdk.trace.export import BatchSpanProcessor"}],"source_content_type":"text/x-python","patch_set":4,"id":"cb4eccd2_4ec923b1","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":32},"updated":"2026-04-15 12:26:43.000000000","message":"Can we use module-level import rather than class/method level imports ?","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dac12db5633141e6e4925fc5063759748f04ed6f","unresolved":true,"context_lines":[{"line_number":63,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":66,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":67,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"},{"line_number":68,"context_line":"    from opentelemetry.sdk.resources import Resource"},{"line_number":69,"context_line":"    from opentelemetry.sdk.trace.export import BatchSpanProcessor"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f4d1b15_9c3464b6","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":32},"in_reply_to":"1c4976f0_7e93c469","updated":"2026-05-05 14:38:17.000000000","message":"I don\u0027t believe this is done?","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64cbdfb65dcdbc906b9579e5d257f4f336df15e2","unresolved":true,"context_lines":[{"line_number":63,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":66,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":67,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"},{"line_number":68,"context_line":"    from opentelemetry.sdk.resources import Resource"},{"line_number":69,"context_line":"    from opentelemetry.sdk.trace.export import BatchSpanProcessor"}],"source_content_type":"text/x-python","patch_set":4,"id":"b90a02fc_4647d0e3","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":32},"in_reply_to":"32e58fe8_9bb43cc2","updated":"2026-05-06 11:29:47.000000000","message":"Yes, exactly. For example:\n\n\n\n```suggestion\n    from opentelemetry import propagate\n```","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":66,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":67,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"},{"line_number":68,"context_line":"    from opentelemetry.sdk.resources import Resource"},{"line_number":69,"context_line":"    from opentelemetry.sdk.trace.export import BatchSpanProcessor"}],"source_content_type":"text/x-python","patch_set":4,"id":"1c4976f0_7e93c469","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":32},"in_reply_to":"84de9510_6a36211c","updated":"2026-04-16 13:03:24.000000000","message":"Done","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"9082561cd62fb83f1fef606ab1c90bc714c9fe1c","unresolved":true,"context_lines":[{"line_number":63,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":66,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":67,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"},{"line_number":68,"context_line":"    from opentelemetry.sdk.resources import Resource"},{"line_number":69,"context_line":"    from opentelemetry.sdk.trace.export import BatchSpanProcessor"}],"source_content_type":"text/x-python","patch_set":4,"id":"32e58fe8_9bb43cc2","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":32},"in_reply_to":"9f4d1b15_9c3464b6","updated":"2026-05-06 10:52:12.000000000","message":"Oh, it seems I understood it wrong. I thought Takashi was referring to where the imports were done (in a module in our case), but now I see he is referring to not import classes/methods but modules from the external libraries. Change incoming.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"b8779e9cd87b97f537601586d4ad88caa937da42","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":66,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":67,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"},{"line_number":68,"context_line":"    from opentelemetry.sdk.resources import Resource"},{"line_number":69,"context_line":"    from opentelemetry.sdk.trace.export import BatchSpanProcessor"}],"source_content_type":"text/x-python","patch_set":4,"id":"9e1b41d8_f8fa02da","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":32},"in_reply_to":"b90a02fc_4647d0e3","updated":"2026-05-06 12:59:34.000000000","message":"Done","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"56f5ea143bf1d9e99dd5bd12160fd29104f025d3","unresolved":true,"context_lines":[{"line_number":63,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":66,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":67,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"},{"line_number":68,"context_line":"    from opentelemetry.sdk.resources import Resource"},{"line_number":69,"context_line":"    from opentelemetry.sdk.trace.export import BatchSpanProcessor"}],"source_content_type":"text/x-python","patch_set":4,"id":"84de9510_6a36211c","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":32},"in_reply_to":"cb4eccd2_4ec923b1","updated":"2026-04-15 12:45:49.000000000","message":"Good catch","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"4426a9e2b11f0f8e0070bbc0bd477bdd64ada804","unresolved":true,"context_lines":[{"line_number":90,"context_line":"            \u0027to a configured backend. Disabled by default.\u0027"},{"line_number":91,"context_line":"        ),"},{"line_number":92,"context_line":"    ),"},{"line_number":93,"context_line":"    cfg.StrOpt("},{"line_number":94,"context_line":"        \u0027otlp_endpoint\u0027,"},{"line_number":95,"context_line":"        default\u003d\u0027http://localhost:4318\u0027,"},{"line_number":96,"context_line":"        help\u003d_("}],"source_content_type":"text/x-python","patch_set":4,"id":"2dd7c47d_40ea50f7","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":14},"updated":"2026-04-15 12:26:43.000000000","message":"If this supports only HTTP/HTTPS url then use URIOpt with schemas","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"56f5ea143bf1d9e99dd5bd12160fd29104f025d3","unresolved":true,"context_lines":[{"line_number":90,"context_line":"            \u0027to a configured backend. Disabled by default.\u0027"},{"line_number":91,"context_line":"        ),"},{"line_number":92,"context_line":"    ),"},{"line_number":93,"context_line":"    cfg.StrOpt("},{"line_number":94,"context_line":"        \u0027otlp_endpoint\u0027,"},{"line_number":95,"context_line":"        default\u003d\u0027http://localhost:4318\u0027,"},{"line_number":96,"context_line":"        help\u003d_("}],"source_content_type":"text/x-python","patch_set":4,"id":"8ee73914_79216cf5","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":14},"in_reply_to":"2dd7c47d_40ea50f7","updated":"2026-04-15 12:45:49.000000000","message":"Yes, another good catch","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            \u0027to a configured backend. Disabled by default.\u0027"},{"line_number":91,"context_line":"        ),"},{"line_number":92,"context_line":"    ),"},{"line_number":93,"context_line":"    cfg.StrOpt("},{"line_number":94,"context_line":"        \u0027otlp_endpoint\u0027,"},{"line_number":95,"context_line":"        default\u003d\u0027http://localhost:4318\u0027,"},{"line_number":96,"context_line":"        help\u003d_("}],"source_content_type":"text/x-python","patch_set":4,"id":"34b8a057_af84ebdb","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":14},"in_reply_to":"8ee73914_79216cf5","updated":"2026-04-16 13:03:24.000000000","message":"Done","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"4426a9e2b11f0f8e0070bbc0bd477bdd64ada804","unresolved":true,"context_lines":[{"line_number":100,"context_line":"    ),"},{"line_number":101,"context_line":"    cfg.StrOpt("},{"line_number":102,"context_line":"        \u0027otlp_protocol\u0027,"},{"line_number":103,"context_line":"        default\u003d\u0027http/protobuf\u0027,"},{"line_number":104,"context_line":"        choices\u003d[\u0027http/protobuf\u0027, \u0027grpc\u0027],"},{"line_number":105,"context_line":"        help\u003d_("},{"line_number":106,"context_line":"            \u0027OTLP transport protocol. Either http/protobuf (OTLP over \u0027"},{"line_number":107,"context_line":"            \u0027HTTP with Protocol Buffers) or grpc (OTLP over gRPC).\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"0f2258cc_2e1fb2e3","line":104,"range":{"start_line":103,"start_character":32,"end_line":104,"end_character":42},"updated":"2026-04-15 12:26:43.000000000","message":"```suggestion\n        default\u003d\u0027http/protobuf\u0027,\n        choices\u003d[\n            (\u0027http/protobuf\u0027, \u0027OTLP over HTTP with Protocol Buffers\u0027)\n            (\u0027grpc\u0027, \u0027OTLP over gRPC\u0027),\n        ],\n```\n\nthen you can simplify the help text.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    ),"},{"line_number":101,"context_line":"    cfg.StrOpt("},{"line_number":102,"context_line":"        \u0027otlp_protocol\u0027,"},{"line_number":103,"context_line":"        default\u003d\u0027http/protobuf\u0027,"},{"line_number":104,"context_line":"        choices\u003d[\u0027http/protobuf\u0027, \u0027grpc\u0027],"},{"line_number":105,"context_line":"        help\u003d_("},{"line_number":106,"context_line":"            \u0027OTLP transport protocol. Either http/protobuf (OTLP over \u0027"},{"line_number":107,"context_line":"            \u0027HTTP with Protocol Buffers) or grpc (OTLP over gRPC).\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ac8f4e9f_041078f3","line":104,"range":{"start_line":103,"start_character":32,"end_line":104,"end_character":42},"in_reply_to":"0f2258cc_2e1fb2e3","updated":"2026-04-16 13:03:24.000000000","message":"Done","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a5f14f66124aa667bb5afcffd2e5b1ddc5b0d2aa","unresolved":true,"context_lines":[{"line_number":257,"context_line":"        return otlp_http_exporter.OTLPSpanExporter("},{"line_number":258,"context_line":"            endpoint\u003dendpoint + \u0027/v1/traces\u0027,"},{"line_number":259,"context_line":"        )"},{"line_number":260,"context_line":"    else:"},{"line_number":261,"context_line":"        # The gRPC exporter is in a separate package"},{"line_number":262,"context_line":"        # (opentelemetry-exporter-otlp-proto-grpc) which may not"},{"line_number":263,"context_line":"        # be installed alongside the HTTP exporter."},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            from opentelemetry.exporter.otlp.proto.grpc import (  # type: ignore[import-not-found]"},{"line_number":266,"context_line":"                trace_exporter as grpc_exporter,"},{"line_number":267,"context_line":"            )"},{"line_number":268,"context_line":"        except ImportError:"},{"line_number":269,"context_line":"            raise RuntimeError("},{"line_number":270,"context_line":"                \u0027OTLP gRPC exporter is not installed. Install it with: \u0027"},{"line_number":271,"context_line":"                \u0027pip install opentelemetry-exporter-otlp-proto-grpc\u0027"},{"line_number":272,"context_line":"            )"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        return grpc_exporter.OTLPSpanExporter("},{"line_number":275,"context_line":"            endpoint\u003dendpoint,"}],"source_content_type":"text/x-python","patch_set":4,"id":"803469ae_09934233","line":272,"range":{"start_line":260,"start_character":9,"end_line":272,"end_character":13},"updated":"2026-04-15 12:43:28.000000000","message":"Could we move this to the module level and expose a separate global const? Again, it\u0027ll avoid multiple attempts at importing.\n\nAlso, do we want to provide this via a separate extra? We should install it in our test env at a minimum.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return otlp_http_exporter.OTLPSpanExporter("},{"line_number":258,"context_line":"            endpoint\u003dendpoint + \u0027/v1/traces\u0027,"},{"line_number":259,"context_line":"        )"},{"line_number":260,"context_line":"    else:"},{"line_number":261,"context_line":"        # The gRPC exporter is in a separate package"},{"line_number":262,"context_line":"        # (opentelemetry-exporter-otlp-proto-grpc) which may not"},{"line_number":263,"context_line":"        # be installed alongside the HTTP exporter."},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            from opentelemetry.exporter.otlp.proto.grpc import (  # type: ignore[import-not-found]"},{"line_number":266,"context_line":"                trace_exporter as grpc_exporter,"},{"line_number":267,"context_line":"            )"},{"line_number":268,"context_line":"        except ImportError:"},{"line_number":269,"context_line":"            raise RuntimeError("},{"line_number":270,"context_line":"                \u0027OTLP gRPC exporter is not installed. Install it with: \u0027"},{"line_number":271,"context_line":"                \u0027pip install opentelemetry-exporter-otlp-proto-grpc\u0027"},{"line_number":272,"context_line":"            )"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        return grpc_exporter.OTLPSpanExporter("},{"line_number":275,"context_line":"            endpoint\u003dendpoint,"}],"source_content_type":"text/x-python","patch_set":4,"id":"b9910898_13c2e0ee","line":272,"range":{"start_line":260,"start_character":9,"end_line":272,"end_character":13},"in_reply_to":"803469ae_09934233","updated":"2026-04-16 13:03:24.000000000","message":"I have added a separate extra for grpc, but not only that, I did not really like the \"telemetry\" and \"telemetry-grpc\" names (naming is difficult!). I changed the extra names to \"tracing-http\" and \"tracing-grpc\"","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"4426a9e2b11f0f8e0070bbc0bd477bdd64ada804","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        try:"},{"line_number":315,"context_line":"            if not self.oslo_conf.tracing.enabled:"},{"line_number":316,"context_line":"                return"},{"line_number":317,"context_line":"        except cfg.NoSuchGroupError:"},{"line_number":318,"context_line":"            return"},{"line_number":319,"context_line":"        except cfg.NoSuchOptError:"},{"line_number":320,"context_line":"            return"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        init_tracing(self.oslo_conf)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"84e13633_06906f8c","line":320,"range":{"start_line":317,"start_character":0,"end_line":320,"end_character":18},"updated":"2026-04-15 12:26:43.000000000","message":"What\u0027s the actual use case where we expect these may happen ?","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        try:"},{"line_number":315,"context_line":"            if not self.oslo_conf.tracing.enabled:"},{"line_number":316,"context_line":"                return"},{"line_number":317,"context_line":"        except cfg.NoSuchGroupError:"},{"line_number":318,"context_line":"            return"},{"line_number":319,"context_line":"        except cfg.NoSuchOptError:"},{"line_number":320,"context_line":"            return"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        init_tracing(self.oslo_conf)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ce828da2_abad415d","line":320,"range":{"start_line":317,"start_character":0,"end_line":320,"end_character":18},"in_reply_to":"84e13633_06906f8c","updated":"2026-04-16 13:03:24.000000000","message":"You are right, this is too overprotective, and it does not make sense.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"4426a9e2b11f0f8e0070bbc0bd477bdd64ada804","unresolved":true,"context_lines":[{"line_number":386,"context_line":"        if user_agent:"},{"line_number":387,"context_line":"            span.set_attribute(\u0027http.user_agent\u0027, user_agent)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # OpenStack-specific attributes"},{"line_number":390,"context_line":"        request_id \u003d req.headers.get(\u0027X-Openstack-Request-ID\u0027)"},{"line_number":391,"context_line":"        if request_id:"},{"line_number":392,"context_line":"            span.set_attribute(\u0027openstack.request_id\u0027, request_id)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        project_id \u003d req.headers.get(\u0027X-Project-Id\u0027)"},{"line_number":395,"context_line":"        if project_id:"},{"line_number":396,"context_line":"            span.set_attribute(\u0027openstack.project_id\u0027, project_id)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        user_id \u003d req.headers.get(\u0027X-User-Id\u0027)"},{"line_number":399,"context_line":"        if user_id:"},{"line_number":400,"context_line":"            span.set_attribute(\u0027openstack.user_id\u0027, user_id)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        # Attach span to context"},{"line_number":403,"context_line":"        new_ctx \u003d trace.set_span_in_context(span, ctx)"}],"source_content_type":"text/x-python","patch_set":4,"id":"234cc3ac_29c92ef5","line":400,"range":{"start_line":389,"start_character":8,"end_line":400,"end_character":60},"updated":"2026-04-15 12:26:43.000000000","message":"Maybe we can use oslo.context to load these values, instead of implementing a similar (but partial) logic in a few places ?","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        if user_agent:"},{"line_number":387,"context_line":"            span.set_attribute(\u0027http.user_agent\u0027, user_agent)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # OpenStack-specific attributes"},{"line_number":390,"context_line":"        request_id \u003d req.headers.get(\u0027X-Openstack-Request-ID\u0027)"},{"line_number":391,"context_line":"        if request_id:"},{"line_number":392,"context_line":"            span.set_attribute(\u0027openstack.request_id\u0027, request_id)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        project_id \u003d req.headers.get(\u0027X-Project-Id\u0027)"},{"line_number":395,"context_line":"        if project_id:"},{"line_number":396,"context_line":"            span.set_attribute(\u0027openstack.project_id\u0027, project_id)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        user_id \u003d req.headers.get(\u0027X-User-Id\u0027)"},{"line_number":399,"context_line":"        if user_id:"},{"line_number":400,"context_line":"            span.set_attribute(\u0027openstack.user_id\u0027, user_id)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        # Attach span to context"},{"line_number":403,"context_line":"        new_ctx \u003d trace.set_span_in_context(span, ctx)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffc5c3c5_8b639fcb","line":400,"range":{"start_line":389,"start_character":8,"end_line":400,"end_character":60},"in_reply_to":"234cc3ac_29c92ef5","updated":"2026-04-16 13:03:24.000000000","message":"Done","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64cbdfb65dcdbc906b9579e5d257f4f336df15e2","unresolved":true,"context_lines":[{"line_number":63,"context_line":"# The middleware checks these at startup and raises RuntimeError"},{"line_number":64,"context_line":"# if tracing is enabled but packages are missing."},{"line_number":65,"context_line":"try:"},{"line_number":66,"context_line":"    from opentelemetry.baggage.propagation import W3CBaggagePropagator"},{"line_number":67,"context_line":"    from opentelemetry.exporter.otlp.proto.http import ("},{"line_number":68,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":71,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":72,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"}],"source_content_type":"text/x-python","patch_set":12,"id":"7387cb4d_ebbda776","line":69,"range":{"start_line":66,"start_character":70,"end_line":69,"end_character":5},"updated":"2026-05-06 11:29:47.000000000","message":"So based on @kajinamit@oss.nttdata.com\u0027s comments in `pyproject.toml`, I believe this should be inside its own import block and a new e.g. `_OTEL_HTTP_AVAILABLE` global variable set?","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"b8779e9cd87b97f537601586d4ad88caa937da42","unresolved":false,"context_lines":[{"line_number":63,"context_line":"# The middleware checks these at startup and raises RuntimeError"},{"line_number":64,"context_line":"# if tracing is enabled but packages are missing."},{"line_number":65,"context_line":"try:"},{"line_number":66,"context_line":"    from opentelemetry.baggage.propagation import W3CBaggagePropagator"},{"line_number":67,"context_line":"    from opentelemetry.exporter.otlp.proto.http import ("},{"line_number":68,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":71,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":72,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"}],"source_content_type":"text/x-python","patch_set":12,"id":"4325e7a3_66f39e12","line":69,"range":{"start_line":66,"start_character":70,"end_line":69,"end_character":5},"in_reply_to":"5978c767_0a7ac778","updated":"2026-05-06 12:59:34.000000000","message":"Done","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"13dac27edcfcb77e7919926f407968a00d52eb1f","unresolved":true,"context_lines":[{"line_number":63,"context_line":"# The middleware checks these at startup and raises RuntimeError"},{"line_number":64,"context_line":"# if tracing is enabled but packages are missing."},{"line_number":65,"context_line":"try:"},{"line_number":66,"context_line":"    from opentelemetry.baggage.propagation import W3CBaggagePropagator"},{"line_number":67,"context_line":"    from opentelemetry.exporter.otlp.proto.http import ("},{"line_number":68,"context_line":"        trace_exporter as otlp_http_exporter,"},{"line_number":69,"context_line":"    )"},{"line_number":70,"context_line":"    from opentelemetry.propagate import get_global_textmap"},{"line_number":71,"context_line":"    from opentelemetry.propagate import set_global_textmap"},{"line_number":72,"context_line":"    from opentelemetry.propagators.composite import CompositePropagator"}],"source_content_type":"text/x-python","patch_set":12,"id":"5978c767_0a7ac778","line":69,"range":{"start_line":66,"start_character":70,"end_line":69,"end_character":5},"in_reply_to":"7387cb4d_ebbda776","updated":"2026-05-06 11:51:31.000000000","message":"Yes, im working on that change. No global variable, though: the middleware will just raise a RuntimeError during execution with the appropiate instructions on the log for the user.","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"}],"pyproject.toml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":31,"context_line":"[project.urls]"},{"line_number":32,"context_line":"Homepage \u003d \"https://docs.openstack.org/oslo.middleware\""},{"line_number":33,"context_line":"Repository \u003d \"https://opendev.org/openstack/oslo.middleware\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[project.entry-points.\"oslo.config.opts\"]"},{"line_number":36,"context_line":"\"oslo.middleware\" \u003d \"oslo_middleware.opts:list_opts\""},{"line_number":37,"context_line":"\"oslo.middleware.cors\" \u003d \"oslo_middleware.opts:list_opts_cors\""}],"source_content_type":"text/x-toml","patch_set":3,"id":"cafa1e88_c4293f51","line":34,"updated":"2026-04-14 12:58:53.000000000","message":"Could you define an e.g. `telemetry` extra here that will install the required dependencies? See [oslo.db for example](https://github.com/openstack/oslo.db/blob/b16fbbd8a9f9c58d702ab73c2b717c259c1343d3/pyproject.toml#L35-L43).","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"[project.urls]"},{"line_number":32,"context_line":"Homepage \u003d \"https://docs.openstack.org/oslo.middleware\""},{"line_number":33,"context_line":"Repository \u003d \"https://opendev.org/openstack/oslo.middleware\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[project.entry-points.\"oslo.config.opts\"]"},{"line_number":36,"context_line":"\"oslo.middleware\" \u003d \"oslo_middleware.opts:list_opts\""},{"line_number":37,"context_line":"\"oslo.middleware.cors\" \u003d \"oslo_middleware.opts:list_opts_cors\""}],"source_content_type":"text/x-toml","patch_set":3,"id":"6e9d7b4f_882dfe42","line":34,"in_reply_to":"cafa1e88_c4293f51","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a5f14f66124aa667bb5afcffd2e5b1ddc5b0d2aa","unresolved":true,"context_lines":[{"line_number":31,"context_line":"[project.optional-dependencies]"},{"line_number":32,"context_line":"telemetry \u003d ["},{"line_number":33,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":34,"context_line":"    \"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0\","},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"[project.urls]"}],"source_content_type":"text/x-toml","patch_set":4,"id":"d3c3c33f_37acb0c3","line":34,"updated":"2026-04-15 12:43:28.000000000","message":"See comment about adding grpc to either this `telemetry` extra or a new, separate one","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"[project.optional-dependencies]"},{"line_number":32,"context_line":"telemetry \u003d ["},{"line_number":33,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":34,"context_line":"    \"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0\","},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"[project.urls]"}],"source_content_type":"text/x-toml","patch_set":4,"id":"d8bb2add_6807a7ea","line":34,"in_reply_to":"d3c3c33f_37acb0c3","updated":"2026-04-16 13:03:24.000000000","message":"Done","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"822d7f6070b32d0125eab92a0afd0275be8d913f","unresolved":true,"context_lines":[{"line_number":29,"context_line":"dynamic \u003d [\"version\", \"dependencies\"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[project.optional-dependencies]"},{"line_number":32,"context_line":"tracing-http \u003d ["},{"line_number":33,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":34,"context_line":"    \"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0\","},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":"tracing-grpc \u003d ["},{"line_number":37,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":38,"context_line":"    \"opentelemetry-exporter-otlp-proto-grpc\u003e\u003d1.0.0\","},{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"[project.urls]"},{"line_number":42,"context_line":"Homepage \u003d \"https://docs.openstack.org/oslo.middleware\""},{"line_number":43,"context_line":"Repository \u003d \"https://opendev.org/openstack/oslo.middleware\""}],"source_content_type":"text/x-toml","patch_set":12,"id":"2636ac84_d5deae73","line":40,"range":{"start_line":32,"start_character":0,"end_line":40,"end_character":1},"updated":"2026-05-05 16:36:23.000000000","message":"I didn\u0027t catch this earlier but I\u0027m wondering if we expect users to only install tracing-grpc extra in case grpc protocol is used ? Current implementation requires both when grpc is required while it requires only -http when http is used, and I find it a bit confusing now.\n\nIn the release not you mentioned \n\n```\nthe new tracing-http **or** tracing-grpc extras\n```\n\nwhich makes me guess that you intend to require only one of these ?","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"9082561cd62fb83f1fef606ab1c90bc714c9fe1c","unresolved":true,"context_lines":[{"line_number":29,"context_line":"dynamic \u003d [\"version\", \"dependencies\"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[project.optional-dependencies]"},{"line_number":32,"context_line":"tracing-http \u003d ["},{"line_number":33,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":34,"context_line":"    \"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0\","},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":"tracing-grpc \u003d ["},{"line_number":37,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":38,"context_line":"    \"opentelemetry-exporter-otlp-proto-grpc\u003e\u003d1.0.0\","},{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"[project.urls]"},{"line_number":42,"context_line":"Homepage \u003d \"https://docs.openstack.org/oslo.middleware\""},{"line_number":43,"context_line":"Repository \u003d \"https://opendev.org/openstack/oslo.middleware\""}],"source_content_type":"text/x-toml","patch_set":12,"id":"6ec9aac8_b9243041","line":40,"range":{"start_line":32,"start_character":0,"end_line":40,"end_character":1},"in_reply_to":"2636ac84_d5deae73","updated":"2026-05-06 10:52:12.000000000","message":"You are correct, it is indeed confusing. What I am going to do is make this dependencies independent of each other. If the user wants to push the data via http, it will require -http dependency and if he wants to push the data via grpc, it will require -grpc dependency. Having to install http dependency just to enable grpc pushing is an error.","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"b8779e9cd87b97f537601586d4ad88caa937da42","unresolved":false,"context_lines":[{"line_number":29,"context_line":"dynamic \u003d [\"version\", \"dependencies\"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[project.optional-dependencies]"},{"line_number":32,"context_line":"tracing-http \u003d ["},{"line_number":33,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":34,"context_line":"    \"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0\","},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":"tracing-grpc \u003d ["},{"line_number":37,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":38,"context_line":"    \"opentelemetry-exporter-otlp-proto-grpc\u003e\u003d1.0.0\","},{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"[project.urls]"},{"line_number":42,"context_line":"Homepage \u003d \"https://docs.openstack.org/oslo.middleware\""},{"line_number":43,"context_line":"Repository \u003d \"https://opendev.org/openstack/oslo.middleware\""}],"source_content_type":"text/x-toml","patch_set":12,"id":"567498e0_7be8141d","line":40,"range":{"start_line":32,"start_character":0,"end_line":40,"end_character":1},"in_reply_to":"318de63a_2c478c97","updated":"2026-05-06 12:59:34.000000000","message":"Done","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64cbdfb65dcdbc906b9579e5d257f4f336df15e2","unresolved":true,"context_lines":[{"line_number":29,"context_line":"dynamic \u003d [\"version\", \"dependencies\"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[project.optional-dependencies]"},{"line_number":32,"context_line":"tracing-http \u003d ["},{"line_number":33,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":34,"context_line":"    \"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0\","},{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":"tracing-grpc \u003d ["},{"line_number":37,"context_line":"    \"opentelemetry-sdk\u003e\u003d1.0.0\","},{"line_number":38,"context_line":"    \"opentelemetry-exporter-otlp-proto-grpc\u003e\u003d1.0.0\","},{"line_number":39,"context_line":"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"[project.urls]"},{"line_number":42,"context_line":"Homepage \u003d \"https://docs.openstack.org/oslo.middleware\""},{"line_number":43,"context_line":"Repository \u003d \"https://opendev.org/openstack/oslo.middleware\""}],"source_content_type":"text/x-toml","patch_set":12,"id":"318de63a_2c478c97","line":40,"range":{"start_line":32,"start_character":0,"end_line":40,"end_character":1},"in_reply_to":"6ec9aac8_b9243041","updated":"2026-05-06 11:29:47.000000000","message":"\u003e Current implementation requires both when grpc is required while it requires only -http when http is used, and I find it a bit confusing now.\n\nGood catch. I left a comment in `oslo_middleware/tracing.py`","commit_id":"7c36a666b4403ee2d1b1a0b2bdba1254054d1d5d"}],"test-requirements.txt":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bbb25787bbee2718de209aa5f35fd982d0c2e228","unresolved":true,"context_lines":[{"line_number":5,"context_line":"oslo.serialization\u003e\u003d2.18.0 # Apache-2.0"},{"line_number":6,"context_line":"stestr\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":7,"context_line":"opentelemetry-sdk\u003e\u003d1.0.0 # Apache-2.0"},{"line_number":8,"context_line":"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":3,"id":"7ea10c16_946ec0f0","line":8,"updated":"2026-04-14 12:58:53.000000000","message":"You _could_ define these here **or** you could use the `extras` feature in `tox.ini` to install these and avoid the duplication. See [this example in nova](https://github.com/openstack/nova/blob/09af153df2f4be8a330385ef44508f4bd60e8af2/tox.ini#L24-L26).","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"93dfbd4d4ecb1fbcc0a57d396a10f4830d1da73a","unresolved":false,"context_lines":[{"line_number":5,"context_line":"oslo.serialization\u003e\u003d2.18.0 # Apache-2.0"},{"line_number":6,"context_line":"stestr\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":7,"context_line":"opentelemetry-sdk\u003e\u003d1.0.0 # Apache-2.0"},{"line_number":8,"context_line":"opentelemetry-exporter-otlp-proto-http\u003e\u003d1.0.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":3,"id":"8019dfb7_354e1d11","line":8,"in_reply_to":"7ea10c16_946ec0f0","updated":"2026-04-15 11:03:47.000000000","message":"Done","commit_id":"5e31103e352207bfe22213a63c6774f5f37d6ef6"}],"tox.ini":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0009138f133035cc596f4a38018dc8c87262dd4a","unresolved":true,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"[testenv]"},{"line_number":6,"context_line":"extras \u003d"},{"line_number":7,"context_line":"  telemetry"},{"line_number":8,"context_line":"deps \u003d"},{"line_number":9,"context_line":"  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}"},{"line_number":10,"context_line":"  -r{toxinidir}/test-requirements.txt"}],"source_content_type":"text/x-properties","patch_set":4,"id":"fe9a1574_8fbecc38","line":7,"range":{"start_line":7,"start_character":2,"end_line":7,"end_character":11},"updated":"2026-04-15 12:28:33.000000000","message":"I\u0027m afraid that this makes the extra target installed in all targets including release note which is not efficient.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"10d7f291acf98a7faf02010373c262aaeda4986b","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"[testenv]"},{"line_number":6,"context_line":"extras \u003d"},{"line_number":7,"context_line":"  telemetry"},{"line_number":8,"context_line":"deps \u003d"},{"line_number":9,"context_line":"  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}"},{"line_number":10,"context_line":"  -r{toxinidir}/test-requirements.txt"}],"source_content_type":"text/x-properties","patch_set":4,"id":"faaf8287_5e923035","line":7,"range":{"start_line":7,"start_character":2,"end_line":7,"end_character":11},"in_reply_to":"ed739fba_8a212a71","updated":"2026-04-16 13:03:24.000000000","message":"Done","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"56f5ea143bf1d9e99dd5bd12160fd29104f025d3","unresolved":true,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"[testenv]"},{"line_number":6,"context_line":"extras \u003d"},{"line_number":7,"context_line":"  telemetry"},{"line_number":8,"context_line":"deps \u003d"},{"line_number":9,"context_line":"  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}"},{"line_number":10,"context_line":"  -r{toxinidir}/test-requirements.txt"}],"source_content_type":"text/x-properties","patch_set":4,"id":"ed739fba_8a212a71","line":7,"range":{"start_line":7,"start_character":2,"end_line":7,"end_character":11},"in_reply_to":"fe9a1574_8fbecc38","updated":"2026-04-15 12:45:49.000000000","message":"Good point. You can override this by setting `extras \u003d` on the targets where you don\u0027t want this.","commit_id":"8efdfd8814a9b08d230cff72edaa3697e7c5b4d1"}]}
