)]}'
{"doc/notification_samples/metrics-update.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4bb107b988d4506d1ac312d962d9508e4bb34cf5","unresolved":false,"context_lines":[{"line_number":10,"context_line":"         \"nodename\": \"fake-mini\","},{"line_number":11,"context_line":"         \"metrics\":["},{"line_number":12,"context_line":"            {"},{"line_number":13,"context_line":"               \"nova_object.version\": \"1.0\","},{"line_number":14,"context_line":"               \"nova_object.name\": \"MetricPayload\","},{"line_number":15,"context_line":"               \"nova_object.namespace\": \"nova\","},{"line_number":16,"context_line":"               \"nova_object.data\": {"},{"line_number":17,"context_line":"                  \"timestamp\": \"2012-10-29T13:42:11Z\","},{"line_number":18,"context_line":"                  \"source\": \"fake.SmallFakeDriver\","},{"line_number":19,"context_line":"                  \"numa_membw_values\": null,"},{"line_number":20,"context_line":"                  \"name\": \"cpu.iowait.percent\","},{"line_number":21,"context_line":"                  \"value\": 0"},{"line_number":22,"context_line":"               }"}],"source_content_type":"application/json","patch_set":5,"id":"5f7c97a3_9c697b27","line":19,"range":{"start_line":13,"start_character":15,"end_line":19,"end_character":44},"updated":"2018-07-17 14:25:19.000000000","message":"This is so redundant between all of these since only the metric name/value changes, but looking at how ResourceTracker._get_host_metrics sends the legacy compute.metrics.update notification today, and that payload being based on the MonitorMetricList which is a list of MonitorMetric objects, I guess this is consistent with the legacy notification which is what we\u0027re going for. It just seems like this could have been simpler as something like this:\n\n\"payload\": {\n      \"nova_object.version\": \"1.0\",\n      \"nova_object.name\": \"MetricsPayload\",\n      \"nova_object.namespace\": \"nova\",\n      \"nova_object.data\": {\n         \"host_ip\": \"10.0.2.15\",\n         \"host\": \"compute\",\n         \"nodename\": \"fake-mini\",\n         \"timestamp\": \"2012-10-29T13:42:11Z\",\n         \"source\": \"fake.SmallFakeDriver\",\n         \"numa_membw_values\": null,\n         \"metrics\": {\n             \"cpu.frequency\": 800,\n             \"cpu.idle.percent\": 97,\n             \"cpu.iowait.time\": 6121490000000,\n             ....\n          }\n    }\n\nBut maybe the source really does change in reality based on the metrics monitors used (even though we only have one, the CPU metric monitor, and in that case the source is always the same - the virt driver on the compute host).","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fe0cdea3c04f51d63d10a113eabb158f92d1b617","unresolved":false,"context_lines":[{"line_number":10,"context_line":"         \"nodename\": \"fake-mini\","},{"line_number":11,"context_line":"         \"metrics\":["},{"line_number":12,"context_line":"            {"},{"line_number":13,"context_line":"               \"nova_object.version\": \"1.0\","},{"line_number":14,"context_line":"               \"nova_object.name\": \"MetricPayload\","},{"line_number":15,"context_line":"               \"nova_object.namespace\": \"nova\","},{"line_number":16,"context_line":"               \"nova_object.data\": {"},{"line_number":17,"context_line":"                  \"timestamp\": \"2012-10-29T13:42:11Z\","},{"line_number":18,"context_line":"                  \"source\": \"fake.SmallFakeDriver\","},{"line_number":19,"context_line":"                  \"numa_membw_values\": null,"},{"line_number":20,"context_line":"                  \"name\": \"cpu.iowait.percent\","},{"line_number":21,"context_line":"                  \"value\": 0"},{"line_number":22,"context_line":"               }"}],"source_content_type":"application/json","patch_set":5,"id":"5f7c97a3_efc78145","line":19,"range":{"start_line":13,"start_character":15,"end_line":19,"end_character":44},"in_reply_to":"5f7c97a3_4766acbe","updated":"2018-07-18 01:56:25.000000000","message":"Currently \u0027timestamp\u0027, \u0027source\u0027 and \u0027numa_membw_values\u0027 (always null) are same value in all metrics.\nBut another metrics may be added in the future.\nIt is not sure that they have same value as existing metrics.\nSo it is better to have their parameters in each metric.","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4104735384b785b3c630b85d362a7d42c9e68361","unresolved":false,"context_lines":[{"line_number":10,"context_line":"         \"nodename\": \"fake-mini\","},{"line_number":11,"context_line":"         \"metrics\":["},{"line_number":12,"context_line":"            {"},{"line_number":13,"context_line":"               \"nova_object.version\": \"1.0\","},{"line_number":14,"context_line":"               \"nova_object.name\": \"MetricPayload\","},{"line_number":15,"context_line":"               \"nova_object.namespace\": \"nova\","},{"line_number":16,"context_line":"               \"nova_object.data\": {"},{"line_number":17,"context_line":"                  \"timestamp\": \"2012-10-29T13:42:11Z\","},{"line_number":18,"context_line":"                  \"source\": \"fake.SmallFakeDriver\","},{"line_number":19,"context_line":"                  \"numa_membw_values\": null,"},{"line_number":20,"context_line":"                  \"name\": \"cpu.iowait.percent\","},{"line_number":21,"context_line":"                  \"value\": 0"},{"line_number":22,"context_line":"               }"}],"source_content_type":"application/json","patch_set":5,"id":"5f7c97a3_4766acbe","line":19,"range":{"start_line":13,"start_character":15,"end_line":19,"end_character":44},"in_reply_to":"5f7c97a3_9c697b27","updated":"2018-07-17 14:42:59.000000000","message":"I don\u0027t know what is the reason we have so many small metric object in the metrics reporting code path instead of one big object with a metrics dict.\n\nI did see numa_membw_values is and odd key out of context in the original metric object but again I don\u0027t have the history to know the reason. \n\nI know it sounds bad but in the face of the unknown I defaulted to following what is in the legacy notification.","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"eaf5d35678dc9b21f3f958879008d4c7a8139e1d","unresolved":false,"context_lines":[{"line_number":640,"context_line":"                            {\u0027mon\u0027: monitor, \u0027exc\u0027: exc})"},{"line_number":641,"context_line":"        # TODO(jaypipes): Remove this when compute_node.metrics doesn\u0027t need"},{"line_number":642,"context_line":"        # to be populated as a JSONified string."},{"line_number":643,"context_line":"        metric_list \u003d metrics.to_list()"},{"line_number":644,"context_line":"        if len(metrics):"},{"line_number":645,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":646,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metric_list"},{"line_number":647,"context_line":"            metrics_info[\u0027host\u0027] \u003d self.host"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3ffa3d76","line":644,"range":{"start_line":643,"start_character":0,"end_line":644,"end_character":24},"updated":"2018-07-10 09:53:13.000000000","message":"this seems dangerous. If you rename metrics to metric_list then you should do len(metric_list) here as well","commit_id":"86c0f53b447677c34e86af9563b155d0cda18793"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"720189b4abd2d9d9607aba6a52baf2f97297bb7a","unresolved":false,"context_lines":[{"line_number":640,"context_line":"                            {\u0027mon\u0027: monitor, \u0027exc\u0027: exc})"},{"line_number":641,"context_line":"        # TODO(jaypipes): Remove this when compute_node.metrics doesn\u0027t need"},{"line_number":642,"context_line":"        # to be populated as a JSONified string."},{"line_number":643,"context_line":"        metric_list \u003d metrics.to_list()"},{"line_number":644,"context_line":"        if len(metrics):"},{"line_number":645,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":646,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metric_list"},{"line_number":647,"context_line":"            metrics_info[\u0027host\u0027] \u003d self.host"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_e944fd1c","line":644,"range":{"start_line":643,"start_character":0,"end_line":644,"end_character":24},"in_reply_to":"5f7c97a3_3ffa3d76","updated":"2018-07-11 00:23:11.000000000","message":"Done","commit_id":"86c0f53b447677c34e86af9563b155d0cda18793"}],"nova/compute/utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"eaf5d35678dc9b21f3f958879008d4c7a8139e1d","unresolved":false,"context_lines":[{"line_number":764,"context_line":"    :param host: the host emitting the notification"},{"line_number":765,"context_line":"    :param host_ip: the IP address of the host"},{"line_number":766,"context_line":"    :param nodename: the node name"},{"line_number":767,"context_line":"    :param monitor_metric_list: the monitor metric list object"},{"line_number":768,"context_line":"    \"\"\""},{"line_number":769,"context_line":"    payload \u003d metrics_notification.MetricsPayload("},{"line_number":770,"context_line":"            host\u003dhost,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_1fd421ba","line":767,"range":{"start_line":767,"start_character":36,"end_line":767,"end_character":55},"updated":"2018-07-10 09:53:13.000000000","message":"MonitorMetricList","commit_id":"86c0f53b447677c34e86af9563b155d0cda18793"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"720189b4abd2d9d9607aba6a52baf2f97297bb7a","unresolved":false,"context_lines":[{"line_number":764,"context_line":"    :param host: the host emitting the notification"},{"line_number":765,"context_line":"    :param host_ip: the IP address of the host"},{"line_number":766,"context_line":"    :param nodename: the node name"},{"line_number":767,"context_line":"    :param monitor_metric_list: the monitor metric list object"},{"line_number":768,"context_line":"    \"\"\""},{"line_number":769,"context_line":"    payload \u003d metrics_notification.MetricsPayload("},{"line_number":770,"context_line":"            host\u003dhost,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_69cd4d91","line":767,"range":{"start_line":767,"start_character":36,"end_line":767,"end_character":55},"in_reply_to":"5f7c97a3_1fd421ba","updated":"2018-07-11 00:23:11.000000000","message":"Done","commit_id":"86c0f53b447677c34e86af9563b155d0cda18793"}],"nova/notifications/objects/metrics.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4bb107b988d4506d1ac312d962d9508e4bb34cf5","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    fields \u003d {"},{"line_number":45,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":47,"context_line":"        \u0027numa_membw_values\u0027: fields.DictOfIntegersField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_bcfd573c","line":45,"range":{"start_line":45,"start_character":23,"end_line":45,"end_character":34},"updated":"2018-07-17 14:25:19.000000000","message":"Why isn\u0027t this MonitorMetricTypeField to match the MonitorMetric field type?","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ab8c9cae6666c7dd8d5a675e12acb473b2c7828d","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    fields \u003d {"},{"line_number":45,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":47,"context_line":"        \u0027numa_membw_values\u0027: fields.DictOfIntegersField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_47a46c4c","line":45,"range":{"start_line":45,"start_character":23,"end_line":45,"end_character":34},"in_reply_to":"5f7c97a3_67bf28ca","updated":"2018-07-17 14:54:54.000000000","message":"\u003e This seems pretty messy in the original design of the MonitorMetric object\n\nYup, the whole thing is a mess, and we said back in (I think) Newton that we didn\u0027t want to support native metrics gathering/reporting by nova anymore:\n\nhttps://docs.openstack.org/nova/latest/contributor/policies.html#metrics-gathering","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bfbb4e96302b5686e60701b8e5a70529e1a333cd","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    fields \u003d {"},{"line_number":45,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":47,"context_line":"        \u0027numa_membw_values\u0027: fields.DictOfIntegersField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_227b5ef4","line":45,"range":{"start_line":45,"start_character":23,"end_line":45,"end_character":34},"in_reply_to":"5f7c97a3_bcfd573c","updated":"2018-07-17 15:21:36.000000000","message":"Done","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4104735384b785b3c630b85d362a7d42c9e68361","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    fields \u003d {"},{"line_number":45,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":47,"context_line":"        \u0027numa_membw_values\u0027: fields.DictOfIntegersField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_67bf28ca","line":45,"range":{"start_line":45,"start_character":23,"end_line":45,"end_character":34},"in_reply_to":"5f7c97a3_bcfd573c","updated":"2018-07-17 14:42:59.000000000","message":"Good point. I missed that. \n\nActually there is NUMA_MEM_BW_MAX and NUMA_MEM_BW_CURRENT possible values of that enum so I think based on the value of the name the \u0027numa_membw_values\u0027 which is a dict or the \u0027value\u0027 which is just an int is filled in the object. This seems pretty messy in the original design of the MonitorMetric object","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4bb107b988d4506d1ac312d962d9508e4bb34cf5","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        MonitorMetricList object."},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        payloads \u003d []"},{"line_number":62,"context_line":"        for monitor_metric in monitor_metric_list.objects:"},{"line_number":63,"context_line":"            payloads.append(cls(monitor_metric))"},{"line_number":64,"context_line":"        return payloads"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_9c73bbe8","line":62,"range":{"start_line":62,"start_character":49,"end_line":62,"end_character":57},"updated":"2018-07-17 14:25:19.000000000","message":"nit: This is unnecessary, you can iterate versioned objects.","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bfbb4e96302b5686e60701b8e5a70529e1a333cd","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        MonitorMetricList object."},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        payloads \u003d []"},{"line_number":62,"context_line":"        for monitor_metric in monitor_metric_list.objects:"},{"line_number":63,"context_line":"            payloads.append(cls(monitor_metric))"},{"line_number":64,"context_line":"        return payloads"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_c27b8af0","line":62,"range":{"start_line":62,"start_character":49,"end_line":62,"end_character":57},"in_reply_to":"5f7c97a3_9c73bbe8","updated":"2018-07-17 15:21:36.000000000","message":"Done","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"}],"nova/tests/unit/compute/test_compute_utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4bb107b988d4506d1ac312d962d9508e4bb34cf5","unresolved":false,"context_lines":[{"line_number":880,"context_line":"            glance.generate_glance_url(self.context), uuids.fake_image_ref)"},{"line_number":881,"context_line":"        self.assertEqual(payload[\u0027image_ref_url\u0027], image_ref_url)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def test_notify_about_metrics_update(self):"},{"line_number":884,"context_line":"        monitor_metric_list \u003d objects.MonitorMetricList(objects\u003d["},{"line_number":885,"context_line":"            objects.MonitorMetric("},{"line_number":886,"context_line":"                name\u003d\u0027cpu.percent\u0027, value\u003d99,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_9c217bb8","line":883,"updated":"2018-07-17 14:25:19.000000000","message":"I\u0027m not sure how useful this is when we already have the functional notification samples test covering the same thing.","commit_id":"c6083bb1b190bf9dd0a837842b1f37a3edde7f3a"}]}
