)]}'
{"doc/source/admin/profiler.rst":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Except where otherwise noted, this document is licensed under Creative"},{"line_number":3,"context_line":"      Commons Attribution 3.0 License.  You can view the license at:"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"8e930377_e5eff579","line":1,"in_reply_to":"6fc9d8ce_aa0aa793","updated":"2026-02-18 14:57:00.000000000","message":"Covered at the end of the doc","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Except where otherwise noted, this document is licensed under Creative"},{"line_number":3,"context_line":"      Commons Attribution 3.0 License.  You can view the license at:"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"041feaf9_d1f57f94","line":1,"in_reply_to":"88394d01_8bd41f92","updated":"2026-02-18 14:57:00.000000000","message":"We don\u0027t plan to move to OpenTelemetry in future unless that osprofiler introduces. If so, that should be covered in osprofile itself.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"}],"watcher/api/app.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0ca061ae395b206d573426444d081319a382d01a","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    app \u003d http_proxy_to_wsgi.HTTPProxyToWSGI(app)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    if profiler_web:"},{"line_number":65,"context_line":"        # OSprofiler middleware for cross-service profiling"},{"line_number":66,"context_line":"        # Must be before CORS but after other middleware to capture full trace"},{"line_number":67,"context_line":"        if CONF.profiler.enabled:"}],"source_content_type":"text/x-python","patch_set":2,"id":"92073fc8_16d36a2c","line":64,"in_reply_to":"555c7278_12b2bfe6","updated":"2026-02-11 19:59:11.000000000","message":"hum\n\nif you have it enabled and thre is an initalsitation error i think we shoudl proably crash the app or exit rather then ignroe the error so i think thsi is fine as is\n\nbut that woudl be valid too if we logged an ERROR to let operators know.\n\nmy vote is to say no","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8282a143e4bd2068349b5a8bf03899aec3e3e2af","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    app \u003d http_proxy_to_wsgi.HTTPProxyToWSGI(app)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    if profiler_web:"},{"line_number":65,"context_line":"        # OSprofiler middleware for cross-service profiling"},{"line_number":66,"context_line":"        # Must be before CORS but after other middleware to capture full trace"},{"line_number":67,"context_line":"        if CONF.profiler.enabled:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fe93e199_eccef96c","line":64,"in_reply_to":"92073fc8_16d36a2c","updated":"2026-02-12 10:47:07.000000000","message":"I agree","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright © 2012 New Dream Network, LLC (DreamHost)"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"# Copyright (c) 2016 Intel Corp"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":4,"id":"8d29f99d_ee162d41","line":1,"in_reply_to":"af0bf7a6_d7d76c52","updated":"2026-02-18 14:57:00.000000000","message":"This isn\u0027t implemented in any openstack project afaik and I\u0027m not sure that\u0027s good from security PoV.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"}],"watcher/cmd/eventlet/applier.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0ca061ae395b206d573426444d081319a382d01a","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"APPLIER_SERVICE \u003d \u0027watcher.applier.service.ApplierService\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def main():"},{"line_number":34,"context_line":"    watcher_service.prepare_service(sys.argv, CONF)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    LOG.info(\u0027Starting Watcher Applier service in PID %s\u0027, os.getpid())"}],"source_content_type":"text/x-python","patch_set":2,"id":"d427b642_c142b6b7","line":33,"in_reply_to":"3b530a6e_5f049040","updated":"2026-02-11 19:59:11.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8282a143e4bd2068349b5a8bf03899aec3e3e2af","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"APPLIER_SERVICE \u003d \u0027watcher.applier.service.ApplierService\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def main():"},{"line_number":34,"context_line":"    watcher_service.prepare_service(sys.argv, CONF)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    LOG.info(\u0027Starting Watcher Applier service in PID %s\u0027, os.getpid())"}],"source_content_type":"text/x-python","patch_set":2,"id":"af80d263_9e74edc6","line":33,"in_reply_to":"d427b642_c142b6b7","updated":"2026-02-12 10:47:07.000000000","message":"Done","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"}],"watcher/cmd/eventlet/decisionengine.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0ca061ae395b206d573426444d081319a382d01a","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"DE_SERVICE \u003d \u0027watcher.decision_engine.service.DecisionEngineService\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def main():"},{"line_number":35,"context_line":"    watcher_service.prepare_service(sys.argv, CONF)"},{"line_number":36,"context_line":"    gmr.register_gmr_plugins()"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"80914711_f897e2c7","line":34,"in_reply_to":"25989d03_28b2de9f","updated":"2026-02-11 19:59:11.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8282a143e4bd2068349b5a8bf03899aec3e3e2af","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"DE_SERVICE \u003d \u0027watcher.decision_engine.service.DecisionEngineService\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def main():"},{"line_number":35,"context_line":"    watcher_service.prepare_service(sys.argv, CONF)"},{"line_number":36,"context_line":"    gmr.register_gmr_plugins()"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"6e294853_fcae3157","line":34,"in_reply_to":"80914711_f897e2c7","updated":"2026-02-12 10:47:07.000000000","message":"Done","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"}],"watcher/common/profiler.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0ca061ae395b206d573426444d081319a382d01a","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2025"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":2,"id":"8bef1a35_b0bc53a4","line":1,"in_reply_to":"4c14f5da_52a3872e","updated":"2026-02-11 19:59:11.000000000","message":"we dont acttuly need a copy reithe staement at aslll we just need the lices header\nor we can use the spdx header instead which i kind of prefer\n\nwhich is replace all of this with just one line\n\n`# SPDX-License-Identifier: Apache-2.0`","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8282a143e4bd2068349b5a8bf03899aec3e3e2af","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2025"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":2,"id":"99a23592_49984660","line":1,"in_reply_to":"8bef1a35_b0bc53a4","updated":"2026-02-12 10:47:07.000000000","message":"Done","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"def send_info_to_file_collector(info, context\u003dNone):"},{"line_number":17,"context_line":"    LOG.info(\"osprofiler trace: %s\", info)"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def setup_profiler(binary, host):"}],"source_content_type":"text/x-python","patch_set":4,"id":"f2727965_1c158c10","line":17,"in_reply_to":"f77caabe_4577b560","updated":"2026-02-18 14:57:00.000000000","message":"Already documented in the admin guide.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":true,"context_lines":[{"line_number":23,"context_line":"    # from the wsgi middleware in the watcher-api or in the rpc triggers"},{"line_number":24,"context_line":"    # in the applier and decision-entine if tracer headers are present."},{"line_number":25,"context_line":"    if osprofiler and CONF.profiler.enabled:"},{"line_number":26,"context_line":"        profiler_initializer.init_from_conf("},{"line_number":27,"context_line":"            conf\u003dCONF,"},{"line_number":28,"context_line":"            context\u003dcontext.make_context().to_dict(),"},{"line_number":29,"context_line":"            project\u003d\"watcher\","}],"source_content_type":"text/x-python","patch_set":4,"id":"25262435_661f2ece","line":26,"in_reply_to":"c243105c_befd80fe","updated":"2026-02-18 14:57:00.000000000","message":"IMO it\u0027s fine if the service fails to start if profiler is enabled but improperly configured.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":true,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def decorator(cls):"},{"line_number":49,"context_line":"        if osprofiler and CONF.profiler.enabled:"},{"line_number":50,"context_line":"            trace_cls_decorator \u003d osprofiler.profiler.trace_cls(name, kwargs)"},{"line_number":51,"context_line":"            return trace_cls_decorator(cls)"},{"line_number":52,"context_line":"        return cls"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"96b8addf_49839b88","line":50,"in_reply_to":"f01ff62e_543b3078","updated":"2026-02-18 14:57:00.000000000","message":"\u003e Decorator signature bug in trace_cls() and trace() functions - kwargs dict passed as positional argument instead of being unpacked\n\u003e \n\u003e **Severity**: CRITICAL | **Confidence**: 0.9\n\u003e \n\u003e **Risk**: Decorator wrappers pass kwargs as positional argument to osprofiler decorators. When decorators are used with keyword arguments (e.g., @profiler.trace(\u0027name\u0027, hide_args\u003dFalse)), this causes TypeError. Tracing breaks completely.\n\u003e \n\u003e **Priority**: Immediate\n\u003e **Why This Matters**: The tracing functionality is completely broken when decorators are used with keyword arguments. Tests may pass because they check for __traced__ attribute without actually calling the decorator with real osprofiler, but production use will fail.\n\u003e \n\u003e **Recommendation**:\n\u003e Change line 50 from: trace_cls_decorator \u003d osprofiler.profiler.trace_cls(name, kwargs) to: trace_cls_decorator \u003d osprofiler.profiler.trace_cls(name, **kwargs). Similarly change line 69 from: trace_decorator \u003d osprofiler.profiler.trace(name, kwargs) to: trace_decorator \u003d osprofiler.profiler.trace(name, **kwargs). Add test coverage that verifies decorators work with keyword arguments.\n\nActually, I have tested this and it\u0027s working properly.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"}],"watcher/common/rpc.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0ca061ae395b206d573426444d081319a382d01a","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        trace_info \u003d profiler.serialize_profile_info()"},{"line_number":118,"context_line":"        if trace_info:"},{"line_number":119,"context_line":"            _context.update({\"trace_info\": trace_info})"},{"line_number":120,"context_line":"        return _context"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def deserialize_context(self, context):"},{"line_number":123,"context_line":"        # initialize the profiler if trace_info is present"}],"source_content_type":"text/x-python","patch_set":2,"id":"ca2a6e30_a1da5f40","line":120,"updated":"2026-02-11 19:59:11.000000000","message":"so everythign we send over rpc shoudl really be an ovo but lookign at nova\n\nhttps://github.com/openstack/nova/blob/master/nova/rpc.py#L146-L192\n\nwe sort of do somethign simialr\n\nand use a difeent seriasler classes depending on if profilign is enabled\n\nhttps://github.com/openstack/nova/blob/master/nova/rpc.py#L199-L210","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8282a143e4bd2068349b5a8bf03899aec3e3e2af","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        trace_info \u003d profiler.serialize_profile_info()"},{"line_number":118,"context_line":"        if trace_info:"},{"line_number":119,"context_line":"            _context.update({\"trace_info\": trace_info})"},{"line_number":120,"context_line":"        return _context"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def deserialize_context(self, context):"},{"line_number":123,"context_line":"        # initialize the profiler if trace_info is present"}],"source_content_type":"text/x-python","patch_set":2,"id":"b8f8583f_8b71b760","line":120,"in_reply_to":"ca2a6e30_a1da5f40","updated":"2026-02-12 10:47:07.000000000","message":"Done","commit_id":"9e6685a24d4797b554b630e7d5e082a8449580c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":true,"context_lines":[{"line_number":142,"context_line":"def get_client(target, version_cap\u003dNone, serializer\u003dNone):"},{"line_number":143,"context_line":"    assert TRANSPORT is not None"},{"line_number":144,"context_line":"    if osprofiler:"},{"line_number":145,"context_line":"        serializer \u003d ProfilerRequestContextSerializer(serializer)"},{"line_number":146,"context_line":"    else:"},{"line_number":147,"context_line":"        serializer \u003d RequestContextSerializer(serializer)"},{"line_number":148,"context_line":"    return messaging.get_rpc_client("}],"source_content_type":"text/x-python","patch_set":4,"id":"b2984b8b_ca9a8c49","line":145,"in_reply_to":"f2e497bc_89053906","updated":"2026-02-18 14:57:00.000000000","message":"This is on purpose. Once the profiler has been initialized, any check for the profiler should be done based on the content of the local profiler not in context (see profiler.serialize_profile_info() i.e.). This follows the pattern in nova, i.e,","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"}],"watcher/db/sqlalchemy/api.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":true,"context_lines":[{"line_number":52,"context_line":"    return Connection()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def _wrap_db_session(session):"},{"line_number":56,"context_line":"    if osprofiler_sqlalchemy:"},{"line_number":57,"context_line":"        if CONF.profiler.enabled and CONF.profiler.trace_sqlalchemy:"},{"line_number":58,"context_line":"            session \u003d osprofiler_sqlalchemy.wrap_session(sqlalchemy, session)"}],"source_content_type":"text/x-python","patch_set":4,"id":"a4a67820_61477bb8","line":55,"in_reply_to":"2ec10da0_1515b55e","updated":"2026-02-18 14:57:00.000000000","message":"The wrap_session() just adds a sqlalchemy event listener and returns the session as-is so it should not interfere with the enginefacade session. This is being used in other projects, I expect to be enough mature. Also note, this only wraps the session when osprofiler is installed, enabled and with sqlalchemy_trace option enabled. Impact on production environments is limited as it\u0027s expected to be used only in limited cases.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":true,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def _wrap_db_session(session):"},{"line_number":56,"context_line":"    if osprofiler_sqlalchemy:"},{"line_number":57,"context_line":"        if CONF.profiler.enabled and CONF.profiler.trace_sqlalchemy:"},{"line_number":58,"context_line":"            session \u003d osprofiler_sqlalchemy.wrap_session(sqlalchemy, session)"},{"line_number":59,"context_line":"    return session"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"4e8f5bae_322d9428","line":57,"in_reply_to":"e02491af_2e02fd8a","updated":"2026-02-18 14:57:00.000000000","message":"It comes from osprofiler opts.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"}],"watcher/tests/unit/common/test_profiler.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3cafc49ea9c5ba9ec3213df0e03a909c9e237700","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# SPDX-License-Identifier: Apache-2.0"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"import importlib"},{"line_number":4,"context_line":"import inspect"}],"source_content_type":"text/x-python","patch_set":4,"id":"1396e604_a8a7de3d","line":1,"in_reply_to":"7b203e96_e37e3471","updated":"2026-02-18 14:57:00.000000000","message":"Good point, I\u0027ll review.","commit_id":"914dccc0f54468b0182d1edecf48879184a956fd"}]}
