)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"dbece8406d81c6a183d000896eb11bbe4f33af01","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9cf4e4e7_767179c0","updated":"2026-02-16 14:32:19.000000000","message":"Can you create the release notes for this one?","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"6803e67d40f3d10c74f2baceaf3ca8df71d97fbe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ddb10107_49c85ad1","updated":"2026-02-16 15:02:21.000000000","message":"Hi Juan, thanks for your patch !","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"3d43134079014540979b5adc2de77d69c9963e3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"518eb530_65ea7d98","updated":"2026-02-09 11:32:14.000000000","message":"The grenade job error does not seem to be related with the changes in this PR:\n\n2026-02-09 09:59:27.417916 | controller | ModuleNotFoundError: No module named \u0027pkg_resources\u0027\n2026-02-09 09:59:27.417921 | controller | [end of output]\n2026-02-09 09:59:27.417926 | controller |\n2026-02-09 09:59:27.417931 | controller | note: This error originates from a subprocess, and is likely not a problem with pip.\n2026-02-09 09:59:27.418711 | controller | error: legacy-install-failure\n2026-02-09 09:59:27.418761 | controller |\n2026-02-09 09:59:27.418767 | controller | × Encountered error while trying to install package.\n2026-02-09 09:59:27.418776 | controller | ╰─\u003e openstack_requirements\n2026-02-09 09:59:27.418782 | controller |\n2026-02-09 09:59:27.418787 | controller | note: This is an issue with the package mentioned above, not pip.\n2026-02-09 09:59:27.418792 | controller | hint: See above for output from the failure.\n2026-02-09 09:59:27.557364 | controller | + inc/python:pip_install:1 : exit_trap\n2026-02-09 09:59:27.559142 | controller | + ./stack.sh:exit_trap:549 : local r\u003d1\n2026-02-09 09:59:27.561564 | controller | ++ ./stack.sh:exit_trap:550 : jobs -p\n2026-02-09 09:59:27.564687 | controller | + ./stack.sh:exit_trap:550 : jobs\u003d\n2026-02-09 09:59:27.567130 | controller | + ./stack.sh:exit_trap:553 : [[ -n \u0027\u0027 ]]\n2026-02-09 09:59:27.569532 | controller | + ./stack.sh:exit_trap:559 : \u0027[\u0027 -f \u0027\u0027 \u0027]\u0027\n2026-02-09 09:59:27.571627 | controller | + ./stack.sh:exit_trap:564 : kill_spinner\n2026-02-09 09:59:27.573523 | controller | + ./stack.sh:kill_spinner:459 : \u0027[\u0027 \u0027!\u0027 -z \u0027\u0027 \u0027]\u0027\n2026-02-09 09:59:27.576314 | controller | + ./stack.sh:exit_trap:566 : [[ 1 -ne 0 ]]\n2026-02-09 09:59:27.578808 | controller | + ./stack.sh:exit_trap:567 : echo \u0027Error on exit\u0027\n2026-02-09 09:59:27.578850 | controller | Error on exit\n2026-02-09 09:59:27.581530 | controller | + ./stack.sh:exit_trap:569 : type -p generate-subunit\n2026-02-09 09:59:27.583641 | controller | + ./stack.sh:exit_trap:570 : generate-subunit 1770631069 98 fail\n2026-02-09 09:59:27.691835 | controller | + ./stack.sh:exit_trap:572 : [[ -z /opt/stack/old/logs ]]\n2026-02-09 09:59:27.693964 | controller | + ./stack.sh:exit_trap:575 : /opt/stack/data/venv/bin/python3 /opt/stack/old/devstack/tools/worlddump.py -d /opt/stack/old/logs\n2026-02-09 09:59:28.299020 | controller | + ./stack.sh:exit_trap:584 : exit 1\n2026-02-09 09:59:28.299411 | controller | *** FINISHED ***\n2026-02-09 09:59:28.579450 | controller | ERROR\n2026-02-09 09:59:28.579999 | controller | {\n2026-02-09 09:59:28.580117 | controller | \"delta\": \"0:01:38.458219\",\n2026-02-09 09:59:28.580192 | controller | \"end\": \"2026-02-09 09:59:28.314149\",\n2026-02-09 09:59:28.580247 | controller | \"msg\": \"non-zero return code\",\n2026-02-09 09:59:28.580301 | controller | \"rc\": 1,\n2026-02-09 09:59:28.580352 | controller | \"start\": \"2026-02-09 09:57:49.855930\"\n2026-02-09 09:59:28.580407 | controller | }","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":4264,"name":"Matthias Runge","email":"mrunge@redhat.com","username":"mrunge"},"change_message_id":"c4e28f17041992fae581bd6fd5143c5de6cad9cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"1cb060bb_24609270","updated":"2026-02-09 12:50:35.000000000","message":"https://setuptools.pypa.io/en/latest/history.html#deprecations-and-removals ?","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"1bbd245aa7c85a36dcbec3e317ec698883a4fe5a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a9358666_c57a6cdb","updated":"2026-02-16 12:14:41.000000000","message":"recheck","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"624690e5141c8e97bb9adaef76d4cccb79ef4427","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"bed422a5_83439445","updated":"2026-02-09 11:32:20.000000000","message":"recheck","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"71b5f8ddf8de8f757bfe1aee100ff3a65a11dd7c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ed305c4b_4df3927a","in_reply_to":"1a8c014b_b3bcb22b","updated":"2026-02-09 14:15:40.000000000","message":"Well, actually this needs to be fixed in the CI...","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"cd86fa139a3a2c02d03876754460310a45312cb6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"1a8c014b_b3bcb22b","in_reply_to":"1cb060bb_24609270","updated":"2026-02-09 14:13:47.000000000","message":"yeah, it seems to be this, thanks for the pointet. Ill fix setuptools.","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"b8b6b2a41a84d2463d3d1ec4ea37e3eaa0aacc32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"378a31c8_18d7ca52","in_reply_to":"9cf4e4e7_767179c0","updated":"2026-02-23 09:02:50.000000000","message":"Done","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"aa69f60f43e5632d0d0b2dead26e97e41f9dccc5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"383d4923_2830445d","in_reply_to":"ed305c4b_4df3927a","updated":"2026-02-09 14:22:23.000000000","message":"https://review.opendev.org/c/openstack/devstack/+/976107 should fix this","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ac4a25ed47ddfa7bc4dd8ea6b86869239e49a4eb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0ed0f5b9_e4a820bb","updated":"2026-04-14 09:49:26.000000000","message":"I see the `structured_metadata` or `indexed_fields` sometimes use `\u0027type\u0027, \u0027user\u0027, \u0027unit\u0027, \u0027flavor_name\u0027` and sometimes just `\u0027user\u0027, \u0027flavor_name\u0027`. That\u0027s on purpose?","commit_id":"c212006d65178c1cb5097615513a54c0125ee7c2"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"42c862f9b807db9cb1decc6f8003bc86ed333533","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3baec77f_f1a841cc","in_reply_to":"0ed0f5b9_e4a820bb","updated":"2026-04-16 09:09:40.000000000","message":"Very good suggestion, even if it worked it was very confusing having the fields scattered all around, so I created a new INDEXED_FIELD structure that holds the fields we want to index over and use it all around.","commit_id":"c212006d65178c1cb5097615513a54c0125ee7c2"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"898a608b608cca8e13c5f9c0259e5a18a3083e4e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"91ee311c_1dc0747a","updated":"2026-04-21 06:47:53.000000000","message":"recheck","commit_id":"a45fbeeab049d20f525f7a0eba4eac46a8450776"}],"cloudkitty/storage/v2/loki/client.py":[{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"6803e67d40f3d10c74f2baceaf3ca8df71d97fbe","unresolved":true,"context_lines":[{"line_number":368,"context_line":"        log_line \u003d json.dumps(data)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        # Build structured metadata for indexed querying"},{"line_number":371,"context_line":"        structured_metadata \u003d {"},{"line_number":372,"context_line":"            \u0027type\u0027: type,"},{"line_number":373,"context_line":"            \u0027user\u0027: point.groupby.get(\u0027user\u0027, \u0027\u0027),"},{"line_number":374,"context_line":"            \u0027unit\u0027: point.unit,"}],"source_content_type":"text/x-python","patch_set":1,"id":"d104b1d8_08209407","line":371,"updated":"2026-02-16 15:02:21.000000000","message":"Can we externalize the structured metadata to a config in the storage_loki? It would allow to customize the groupby which we want to index. You could leave those attributes (type, user, unit and flavor_name) as default.","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"943a377244e0a8296f75a555d5a1907a2c46594c","unresolved":true,"context_lines":[{"line_number":368,"context_line":"        log_line \u003d json.dumps(data)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        # Build structured metadata for indexed querying"},{"line_number":371,"context_line":"        structured_metadata \u003d {"},{"line_number":372,"context_line":"            \u0027type\u0027: type,"},{"line_number":373,"context_line":"            \u0027user\u0027: point.groupby.get(\u0027user\u0027, \u0027\u0027),"},{"line_number":374,"context_line":"            \u0027unit\u0027: point.unit,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ecc4c5df_52e51732","line":371,"in_reply_to":"d104b1d8_08209407","updated":"2026-02-23 08:45:23.000000000","message":"The truth is that all of this is brand new and I am not sure about giving too much configuration options yet, until I am able to see how the users work with it and if they think it is useful at all.\n\nThe structured metadata only shines when the volume of data starts to get high, so I would like to do here a \"rolling\" delivery, when first we use this fields as metadata, we track usage, we gather feedback and we can think about if and how open it as a configuration option.\n\nDoes this makes sense?","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"ce6095d83476ec531b5a75c9bfdfc43fc003bcba","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        log_line \u003d json.dumps(data)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        # Build structured metadata for indexed querying"},{"line_number":371,"context_line":"        structured_metadata \u003d {"},{"line_number":372,"context_line":"            \u0027type\u0027: type,"},{"line_number":373,"context_line":"            \u0027user\u0027: point.groupby.get(\u0027user\u0027, \u0027\u0027),"},{"line_number":374,"context_line":"            \u0027unit\u0027: point.unit,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ca89ae31_1877518c","line":371,"in_reply_to":"ecc4c5df_52e51732","updated":"2026-03-31 13:05:08.000000000","message":"I see no problem making things static and start adding more flexibility on demand.","commit_id":"9dbd41e7fe6e07993dc999bf01fdfa7d76020f12"},{"author":{"_account_id":34975,"name":"Jaromír Wysoglad","email":"jwysogla@redhat.com","username":"jwysogla"},"change_message_id":"ac4a25ed47ddfa7bc4dd8ea6b86869239e49a4eb","unresolved":true,"context_lines":[{"line_number":187,"context_line":"                response.status_code, response.text"},{"line_number":188,"context_line":"            )"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def delete(self, begin, end, filters):"},{"line_number":191,"context_line":"        # Fields that are indexed as structured metadata"},{"line_number":192,"context_line":"        indexed_fields \u003d {\u0027user\u0027, \u0027flavor_name\u0027}"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"728773ca_c1481fd0","line":190,"updated":"2026-04-14 09:49:26.000000000","message":"I see a lot of duplication between the delete and _retrieve methods. Could we put the duplicated code into a separate function?\n\ne.g. create a \"_build_query\", that would basically include L244 - L310.\n\nThe only difference I spotted is the metric_types. We could have it as an optional parameter of the _build_query with the default value being None. With that you probably don\u0027t even need to do many modifications to the duplicated code.","commit_id":"c212006d65178c1cb5097615513a54c0125ee7c2"},{"author":{"_account_id":32968,"name":"Juan Larriba","email":"jlarriba@redhat.com","username":"jlarriba"},"change_message_id":"42c862f9b807db9cb1decc6f8003bc86ed333533","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                response.status_code, response.text"},{"line_number":188,"context_line":"            )"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def delete(self, begin, end, filters):"},{"line_number":191,"context_line":"        # Fields that are indexed as structured metadata"},{"line_number":192,"context_line":"        indexed_fields \u003d {\u0027user\u0027, \u0027flavor_name\u0027}"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3c787d67_0c2c20e9","line":190,"in_reply_to":"728773ca_c1481fd0","updated":"2026-04-16 09:09:40.000000000","message":"You are absolutely right, fixed.","commit_id":"c212006d65178c1cb5097615513a54c0125ee7c2"}]}
