)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"5845fe1a2effba1f76a77dd0a64edfe1198df07f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cecfe329_944b8e87","updated":"2024-07-08 14:47:41.000000000","message":"Thanks for the patch Arnould!\n\nI left some comments there. I also did not see any code to address \"a way to join metrics \". Can you explain how that is achieved?","commit_id":"3382b1646d40cc9ba3f99ba24e9f597c22df16f1"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"5db5f3296bf3d3efc54bbfc5dbb1a7276dfefd53","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"edc14df6_8e72cc4e","in_reply_to":"cecfe329_944b8e87","updated":"2024-07-13 10:25:25.000000000","message":"I wanted to rate \"libvirt_domain_vcpu_current\" for example. It does not come from ceilometer but from libvirt_exporter.\nCloudkitty needs a project or a domain ID to do its job.\nThe libvirt_domain_vcpu_current doesn\u0027t have any metadata to address the project or domain of the metric:\nlibvirt_domain_vcpu_current{domain\u003d\"instance-00000001\", instance\u003d\"172.16.18.20:9177\", job\u003d\"libvirt_exporter\"} 2\n\nSo I can only attach to:\n- domain: the ID of the VM\n- instance: the hypervisor IP\n- job: what exported this metric\n\nWhich is not interesting regarding cloudkitty.\n\nHowever there is a meta metric \"libvirt_domain_openstack_info\" which can be used like a proxy between what CloudKitty needs and what libvirt exporter has to offer:\nlibvirt_domain_openstack_info{domain\u003d\"instance-00000001\", flavor_name\u003d\"smol_computer\", instance\u003d\"172.16.18.20:9177\", instance_id\u003d\"4aff5277-72aa-4dc1-8aa4-4a258f2c113f\", instance_name\u003d\"tititi-1\", job\u003d\"libvirt_exporter\", project_id\u003d\"4ee8fc9a5ce34c94a0c8c4a6bdb93aba\", project_name\u003d\"titi\", user_id\u003d\"ebfc50cdbf7c471e8dcc562147487a99\", user_name\u003d\"admin\"} 1\n\nWhere we have (only relevant metadata):\n- domain: the ID of the VM\n- project_id: The project ID\n\nSo here is how I saw it:\nCloudkitty asks for \"libvirt_domain_openstack_info\" and filter the project it wants to rate. However the value for this metric is always 1 and does not reflect the metric I want to rate. So I need to \"join\" the \"info\" metric with the \"vcpus\" metric.\n\nCloudkitty -\u003e libvirt_domain_openstack_info join libvirt_domain_vcpu_current\n\nJunctions are called vector matching in promql: https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching\n\nHowever, I couldn\u0027t find an easy way to join metrics and filter from its metadata.\nSo I ended up rating from metric \"libvirt_domain_openstack_info\" and added a big query_suffix to do the join and retrieve the metric\u0027s value from \"libvirt_domain_vcpu_current\". There are probably many things to improve from my commit.\n\nBeing able to retrieve multiple values from one \"info\" metric is interesting and I will try to implement that. But that was not my original goal, which is to rate prometheus metrics that does not come from ceilometer.\n\nThank you for your review.","commit_id":"3382b1646d40cc9ba3f99ba24e9f597c22df16f1"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"3e38e87acd65e96874a737d53670a416c6bc981a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b0e8f505_1857aad4","in_reply_to":"edc14df6_8e72cc4e","updated":"2024-07-15 21:07:01.000000000","message":"Acknowledged","commit_id":"3382b1646d40cc9ba3f99ba24e9f597c22df16f1"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"2060577a69d488cc28b9721926b2075bace2a4a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"a3448d50_e02fa5c1","updated":"2024-07-15 11:45:44.000000000","message":"Hi Arnould!! Nice patch! I have only a few considerations about it. But the overall code is good to me 😊","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"11e0a42bfbb97529b577c97efc5cbb3bf110c3c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6b0c7aa9_58fd30fa","updated":"2024-07-14 12:17:18.000000000","message":"recheck I am sure this is not deterministic testing. Try again and hope I get lucky this time.","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"a32f7dcba26de36bd0bac80be80ae932bd8fc58e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"156e9f4a_ac3ddb6a","updated":"2024-07-14 10:26:35.000000000","message":"recheck openstack-tox-cover and openstack-tox-py39 not my fault I guess please","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"652dd38bc9425e0df7e92ae9b0747da3dcc4dc65","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"78ce5c5f_ec424e7f","updated":"2024-10-21 13:54:09.000000000","message":"@corentin@keepcalm.dev: are you planning to update this patch further?","commit_id":"02b269bfd6f7dbf7958e2e46d06e396df77c02b0"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"3e38e87acd65e96874a737d53670a416c6bc981a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"cbc4c94c_1e5ded08","updated":"2024-07-15 21:07:01.000000000","message":"Thanks for your quick reply ! Really appreciate it 😊\nI tried to test it as much as reasonable.\nDo you have any idea why zuul is failing me ? I really don\u0027t know if it\u0027s my fault it keeps failing on some tests.","commit_id":"02b269bfd6f7dbf7958e2e46d06e396df77c02b0"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"1467b84abf65e67502c2b692132bfba2b192fcde","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"775b5dfc_651dbc56","in_reply_to":"78ce5c5f_ec424e7f","updated":"2024-10-21 15:52:28.000000000","message":"Idk what I should do next, the patch is ready for merging","commit_id":"02b269bfd6f7dbf7958e2e46d06e396df77c02b0"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"0df231c06a823c14373bd4ee8023cf583f158659","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a1c09a50_426d6f05","updated":"2024-11-11 11:17:16.000000000","message":"recheck","commit_id":"663e03e0f868c79425177de18498d1d3cd5681b6"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4b25ace09aa41a9aaf80819d09e3df9e622b9e71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"cd4b617b_8c39ea03","updated":"2025-01-20 20:23:53.000000000","message":"Hello Matt, the problem is not with your code, but with the code you refactored, the code was dirtying the original config dict and generating an error in the `get config` endpoint.","commit_id":"6babd2206c0587b74d13ce77a0b13af790bc4332"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"d8d0a3fa05f662169ef96bb046e1626067ed4a17","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"89472401_c552e424","updated":"2025-01-10 15:39:05.000000000","message":"Not got a solution to the failing test gabbi.suitemaker.test_gabbi_v1-info_get_config.test_request yet, but here\u0027s the relevant error:\n`wsgi_intercept.WSGIAppError: TypeError(\u0027Object of type Fraction is not JSON serializable\u0027) at /usr/lib/python3.10/json/encoder.py:179`\n\nI\u0027ve narrowed this down to the change of check_configuration in cloudkitty/collector/gnocchi.py. (i.e. reverting to the old code, so it doesn\u0027t call from the base collector, passes the test fine.) It\u0027s unclear to me yet why this causes a serialisation error though. Fraction objects are present in the schema in the old method too. \n\nFurther investigation needed","commit_id":"6babd2206c0587b74d13ce77a0b13af790bc4332"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"e75dad98987a4fae39f904186f3c82b6cb5adc50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"4602851e_0759768e","in_reply_to":"89472401_c552e424","updated":"2025-01-20 21:05:58.000000000","message":"Done","commit_id":"6babd2206c0587b74d13ce77a0b13af790bc4332"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"25597e6507f7fe90ed4ba461bb8653c10f595a4f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b9e88da1_2473ea54","updated":"2025-01-21 16:23:54.000000000","message":"Good to see this working, thanks both for the fixes.\n\nThis looks good to me now.","commit_id":"afa6f98a01031ae5e16f6cf67f82cccfa90aa286"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"e75dad98987a4fae39f904186f3c82b6cb5adc50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"ec46393d_5801757d","updated":"2025-01-20 21:05:58.000000000","message":"I didn\u0027t think about python\u0027s reference on complex structures, I should have.\nThank you two very much for helping me on that change!","commit_id":"afa6f98a01031ae5e16f6cf67f82cccfa90aa286"}],"cloudkitty/collector/__init__.py":[{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4b25ace09aa41a9aaf80819d09e3df9e622b9e71","unresolved":true,"context_lines":[{"line_number":202,"context_line":"                metric \u003d [metric]"},{"line_number":203,"context_line":"            for m in metric:"},{"line_number":204,"context_line":"                met \u003d metric_schema(m)"},{"line_number":205,"context_line":"                m.update(met)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"                names \u003d [metric_name]"},{"line_number":208,"context_line":"                alt_name \u003d met.get(\u0027alt_name\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"04f56fda_78681e57","line":205,"updated":"2025-01-20 20:23:53.000000000","message":"This update is dirtying the original config dict, it is replacing the original `factor` string to a `Fraction` element that is not JSON serializable. The reason why it was not catch before is because of the order of the tests are executed, now that you extracted this code from gnocchi collector to base collector, the tests ran this code before the `config get` test code, which dirties the config and breaks the test. So to fix it, you could remove that update, and use the variable \"met\" instead of \"m\" in the output metric assignment.","commit_id":"6babd2206c0587b74d13ce77a0b13af790bc4332"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"e75dad98987a4fae39f904186f3c82b6cb5adc50","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                metric \u003d [metric]"},{"line_number":203,"context_line":"            for m in metric:"},{"line_number":204,"context_line":"                met \u003d metric_schema(m)"},{"line_number":205,"context_line":"                m.update(met)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"                names \u003d [metric_name]"},{"line_number":208,"context_line":"                alt_name \u003d met.get(\u0027alt_name\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"f65980a4_15ad7e82","line":205,"in_reply_to":"04f56fda_78681e57","updated":"2025-01-20 21:05:58.000000000","message":"Done","commit_id":"6babd2206c0587b74d13ce77a0b13af790bc4332"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4b25ace09aa41a9aaf80819d09e3df9e622b9e71","unresolved":true,"context_lines":[{"line_number":216,"context_line":"                        \"alt_name for metric: {}\""},{"line_number":217,"context_line":"                        .format(new_metric_name, metric))"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"                output[new_metric_name] \u003d m"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"                if scope_key not in output[new_metric_name][\u0027groupby\u0027]:"},{"line_number":222,"context_line":"                    output[new_metric_name][\u0027groupby\u0027].append(scope_key)"}],"source_content_type":"text/x-python","patch_set":8,"id":"6f226aea_90a2f77b","line":219,"updated":"2025-01-20 20:23:53.000000000","message":"Here you should use \"met\" instead of \"m\"","commit_id":"6babd2206c0587b74d13ce77a0b13af790bc4332"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"e75dad98987a4fae39f904186f3c82b6cb5adc50","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                        \"alt_name for metric: {}\""},{"line_number":217,"context_line":"                        .format(new_metric_name, metric))"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"                output[new_metric_name] \u003d m"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"                if scope_key not in output[new_metric_name][\u0027groupby\u0027]:"},{"line_number":222,"context_line":"                    output[new_metric_name][\u0027groupby\u0027].append(scope_key)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3074a5fd_ef9516a9","line":219,"in_reply_to":"6f226aea_90a2f77b","updated":"2025-01-20 21:05:58.000000000","message":"Done","commit_id":"6babd2206c0587b74d13ce77a0b13af790bc4332"}],"cloudkitty/collector/prometheus.py":[{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"2060577a69d488cc28b9721926b2075bace2a4a7","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        metadata \u003d self.conf[metric_name].get(\u0027metadata\u0027, [])"},{"line_number":166,"context_line":"        query_prefix \u003d self.conf[metric_name][\u0027extra_args\u0027][\u0027query_prefix\u0027]"},{"line_number":167,"context_line":"        query_suffix \u003d self.conf[metric_name][\u0027extra_args\u0027][\u0027query_suffix\u0027]"},{"line_number":168,"context_line":"        query_metric \u003d metric_name.split(\u0027@#\u0027)[0]"},{"line_number":169,"context_line":"        period \u003d tzutils.diff_seconds(end, start)"},{"line_number":170,"context_line":"        time \u003d end"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"f60032ef_bfab0979","line":168,"updated":"2024-07-15 11:45:44.000000000","message":"Maybe you could create some unit tests to validate the new configurations parse","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"3e38e87acd65e96874a737d53670a416c6bc981a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        metadata \u003d self.conf[metric_name].get(\u0027metadata\u0027, [])"},{"line_number":166,"context_line":"        query_prefix \u003d self.conf[metric_name][\u0027extra_args\u0027][\u0027query_prefix\u0027]"},{"line_number":167,"context_line":"        query_suffix \u003d self.conf[metric_name][\u0027extra_args\u0027][\u0027query_suffix\u0027]"},{"line_number":168,"context_line":"        query_metric \u003d metric_name.split(\u0027@#\u0027)[0]"},{"line_number":169,"context_line":"        period \u003d tzutils.diff_seconds(end, start)"},{"line_number":170,"context_line":"        time \u003d end"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"966a12c3_48174952","line":168,"in_reply_to":"f60032ef_bfab0979","updated":"2024-07-15 21:07:01.000000000","message":"I separated the query building part from the querying part, hope it\u0027s ok","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"}],"doc/source/admin/configuration/collector.rst":[{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"5845fe1a2effba1f76a77dd0a64edfe1198df07f","unresolved":true,"context_lines":[{"line_number":414,"context_line":"* ``query_suffix``: Optional argument. An arbitrary suffix to add to the"},{"line_number":415,"context_line":"  Prometheus query generated by CloudKitty, separated by a space."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"* ``query_metric``: Optional argument. Will override the name of the metric"},{"line_number":418,"context_line":"  defined in the yaml section when sending the request to prometheus."},{"line_number":419,"context_line":"  It allows to use the same metric multiple time."},{"line_number":420,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"95100eee_db9bca5f","line":417,"updated":"2024-07-08 14:47:41.000000000","message":"Is this only to use the same metric in the backend multiple times in CloudKitty? Can we use a similar approach as we did in https://review.opendev.org/c/openstack/cloudkitty/+/861806? \n\nThen, we can have the same solution in both backends.","commit_id":"3382b1646d40cc9ba3f99ba24e9f597c22df16f1"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"a32f7dcba26de36bd0bac80be80ae932bd8fc58e","unresolved":false,"context_lines":[{"line_number":414,"context_line":"* ``query_suffix``: Optional argument. An arbitrary suffix to add to the"},{"line_number":415,"context_line":"  Prometheus query generated by CloudKitty, separated by a space."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"* ``query_metric``: Optional argument. Will override the name of the metric"},{"line_number":418,"context_line":"  defined in the yaml section when sending the request to prometheus."},{"line_number":419,"context_line":"  It allows to use the same metric multiple time."},{"line_number":420,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"cbde7f98_9ca5bbbc","line":417,"in_reply_to":"95100eee_db9bca5f","updated":"2024-07-14 10:26:35.000000000","message":"Done","commit_id":"3382b1646d40cc9ba3f99ba24e9f597c22df16f1"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"2060577a69d488cc28b9721926b2075bace2a4a7","unresolved":true,"context_lines":[{"line_number":427,"context_line":""},{"line_number":428,"context_line":"  metrics:"},{"line_number":429,"context_line":"    libvirt_domain_openstack_info:"},{"line_number":430,"context_line":"    - alt_name: cpu"},{"line_number":431,"context_line":"      unit: vCPU"},{"line_number":432,"context_line":"      groupby:"},{"line_number":433,"context_line":"      - project_id"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ec0a5ad6_9bd4564b","line":430,"updated":"2024-07-15 11:45:44.000000000","message":"I Guess a \u0027tab\u0027 is missing here to set the list inside the map.","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"f9b0f9aa821e7b70f2f8891b9ee008e33b8087d7","unresolved":false,"context_lines":[{"line_number":427,"context_line":""},{"line_number":428,"context_line":"  metrics:"},{"line_number":429,"context_line":"    libvirt_domain_openstack_info:"},{"line_number":430,"context_line":"    - alt_name: cpu"},{"line_number":431,"context_line":"      unit: vCPU"},{"line_number":432,"context_line":"      groupby:"},{"line_number":433,"context_line":"      - project_id"}],"source_content_type":"text/x-rst","patch_set":2,"id":"69c03640_cdaf6a2e","line":430,"in_reply_to":"4cd0fbf5_a4abdde4","updated":"2025-01-20 22:30:07.000000000","message":"Done","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"3e38e87acd65e96874a737d53670a416c6bc981a","unresolved":true,"context_lines":[{"line_number":427,"context_line":""},{"line_number":428,"context_line":"  metrics:"},{"line_number":429,"context_line":"    libvirt_domain_openstack_info:"},{"line_number":430,"context_line":"    - alt_name: cpu"},{"line_number":431,"context_line":"      unit: vCPU"},{"line_number":432,"context_line":"      groupby:"},{"line_number":433,"context_line":"      - project_id"}],"source_content_type":"text/x-rst","patch_set":2,"id":"4cd0fbf5_a4abdde4","line":430,"in_reply_to":"ec0a5ad6_9bd4564b","updated":"2024-07-15 21:07:01.000000000","message":"The spaces are not necessary, here is the recommandation: https://www.yaml.info/learn/bestpractices.html\n\nBut I can make a new patch if needed","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"2060577a69d488cc28b9721926b2075bace2a4a7","unresolved":true,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":".. code-block:: promql"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"  max("},{"line_number":446,"context_line":"     max_over_time("},{"line_number":447,"context_line":"        libvirt_domain_openstack_info{project_id\u003d\"\u003cPROJECT_ID\u003e\"}"},{"line_number":448,"context_line":"        [1h]"}],"source_content_type":"text/x-rst","patch_set":2,"id":"58049fb8_179ac1f4","line":445,"updated":"2024-07-15 11:45:44.000000000","message":"You could create some simple unit tests to validate this query with the new configs. I mean, to check if the generated query matches with a expected one.","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"},{"author":{"_account_id":37074,"name":"Corentin ARNOULD","display_name":"Corentin ARNOULD","email":"corentin@keepcalm.dev","username":"carnould"},"change_message_id":"3e38e87acd65e96874a737d53670a416c6bc981a","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":".. code-block:: promql"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"  max("},{"line_number":446,"context_line":"     max_over_time("},{"line_number":447,"context_line":"        libvirt_domain_openstack_info{project_id\u003d\"\u003cPROJECT_ID\u003e\"}"},{"line_number":448,"context_line":"        [1h]"}],"source_content_type":"text/x-rst","patch_set":2,"id":"b047c465_a6c10e9c","line":445,"in_reply_to":"58049fb8_179ac1f4","updated":"2024-07-15 21:07:01.000000000","message":"Done","commit_id":"e98b148ab9e416eb0651f9cc3829f64c5693d23c"}]}
